|
本帖最后由 FxTrading 于 2015-10-12 18:01 编辑
简介
金融市场的运作首先是交易业务。正如我们儿时熟知的,按照自己的直觉进行买卖。但是外汇交易却有些不同。本文将解析外汇交易的一些想法和外汇交易程序MQL 4。
回顾历史
从课本上我们得知在古老人类时代是不使用金钱的 – 他们享受自然的产物。金钱的发明和创造本身就是人类一部伟大的进程。使用钱币的人们可以通过金钱进行相互交换产物。无论是国家和国家之间的相互交换,还是时代的变迁,钱币总是能够很容易的储存或是运输,例如,黄金或白银。当然,每个国家都有自己的历史,风俗和货币。但是远古时期的贸易活动都是通过商人带着货物从一个国家到另一个国家进行货物交换。货物的交换可以是地方性的或是世界性的,例如,黄金。
我们的时代
如今,贵重金属不能够作为实用的支付工具。所以国家开始制定付款支付货物的交换。在国家与国家的贸易中付款支付货物的交换继而产生了货币与货币之间的汇率。例如, EUR/USD 之间的汇率为 1.25。这就意味着一欧元可以兑换1.25 美元。 因此,在两个自由货币之间必须计算货币汇率。大型的外汇交换通常是通过银行来执行输入/输出业务,所以产生了标准货币对和标准交换总量。货币对的名称在MetaTrader 4客户终端中以货币的简写形式显现。例如, EURUSD表示在美元中欧元的汇率, GBPJPY -在日元中英镑的汇率。既第一个货币总是指定在第二个货币范围内的汇率。
货币存款
虽然在交易过程中可以存在多种货币,但结果却总是写入一种货币 - 货币存款。如果货币存款为美元( US ),盈利和亏损都会以美元显示。如果是欧元,盈利和亏损自然会以欧元显示。对于货币存款的相关信息你可以查看使用 AccountCurrency() 函数。可以用来转换交易结果。
标准份额大小 - 标准手数
在一种货币与另外一种货币交换时,使用的单位为"标准手数"。以标准手数来进行买卖。对于不同的货币对标准手数存在不同值。 目前,最大的货币对标准手数值等于100 000 。但什么是 100 000呢?当我们买进时,需要支付金钱。当我们卖出时,可以获取金钱。但是对于货币对,我们买卖的同时也可以获得一定盈利。这就是为什么通常我们获取第一个货币价格关系到第二弟货币的原因。对于 EURUSD标准手数为100 000欧元。如果我们买进一个 EURUSD标准手,意味着我们用 100 000 欧元并换取一定数量的美元。由于收入和支出必须保持平衡 100 000 欧元 = X 美元。那么我们怎样去计算呢? 让我们在表达式中用美元还原欧元:
EURO= k*USD
k 表示 EURUSD的交换汇率;
100 000 (k*USD) = X USD => X= k*100 000;
如果当前 EURUSD汇率为 1.25, 就是X=125 000。
由上面的计算可以得出 EURUSD标准手数, 我们的 100 000 欧元可以换取得到125 000 美元。有时有人说 - 买进欧元和卖出美元就是表示买进 EURUSD 。对于货币对的标准手数的信息您可以使用 MarketInfo() 函数获取。例如:
- MarketInfo(Symbol(), MODE_LOTSIZE);
复制代码 您同样可以获得货币对名称文本和函数
- MarketInfo("EURUSD", MODE_LOTSIZE);
复制代码 将返回100 000。会被写入帮助文件: MODE_LOTSIZE 是在货币对基础的份额大小。对于EURUSD 货币对的基础货币为 EUR (*)。对于 CHFJPY货币对的基础货币对为瑞士法郎,相关的价格将会以瑞士法郎表示。
交易结果
让我们来看一看其他的示例。我们以1.2500价格买进 1标准手。当前价格为1.2600,所以我们决定收盘,就是卖出1标准手的 EURUSD。
写下的水平:
以1.2500买进1 标准手的 EURUSD : + 100 000 欧元 - 125 000美元。
以1.2600卖出1个标准手的EURUSD : - 100 000 欧元 + 126 000 US美元。
交易业务的盈利结果: 0 EURO + $ 1000。
结论: 从 EURUSD 交易业务的盈利结果用美元来表示,即货币对的第二种货币。尝试计算其他交易的结果: 以2。30价格买进一个标准手的 GBPCHF并且以 2.40价格收盘。得到的将是什么结果呢?
杠杆和保证金
在金融市场的交易中允许从保证金获取盈利。就我们的范例而言,买进1个标准手的 EURUSD,我们需要超过100 000 美元 (125 000汇率为 1。25)。大多数经纪允许交易者调用‘杠杆’。杠杆的值会指出对于开仓可用的次数。金钱总数需要以保证金命名开仓。在没有杠杆情况下,1个标准手的 EURUSD 需花费 100 000欧元或125 000 美元(汇率为 1。2500)如果经纪提供给您100的杠杆, 这样金钱的总数在开仓位置将被减少100次并且为1250 美元。 这样我们已经计算出的盈利值仍然相同。对于杠杆值您可以在交易账户中使用 AccountLeverage()函数查看。 由此,开仓标准手的保证金被指定为:
保证金(基础货币对) = 标准手价格 (基础回避对) / 保证金_大小。
基础货币对的价格在货币存款中是基础货币对和货币存款之间的比率。
保证金计算
范例:
MarketInfo("GBPJPY", MODE_LOTSIZE) 给出的值 70 000 (LS)。
AccountCurrency() 函数返回 "EUR" (AC)。
AccountLeverage() 函数返回50 (AL)。
我们怎样计算当前时刻 GBPJPY的价格(M)?
基础货币为 GBP,这样
M = 70000 GBP / AL = 70 000*GBPEUR / AL = 70000 / EURGBP / AL。
如果此时 EURGBP的汇率为0.6786,那么
M = 70000 / 0.6786 / 50 = 2063.07 EURO。
如果杠杆等于100,保证金将少于两倍 - 1031.54 欧元。对于10的杠杆,保证金将是:
M = 70000 / 0.6786 / 10 = 10315.36。
由此可以看出,杠杆的大小只影响开仓位的保证金大小,但是不会影响获取盈利的多少。同样需要注意的是在欧元(货币存款)当中保证金的大小将会和 EURGBP汇率一起波动,应为基础货币为英镑。在我们的范例中,我们可以用 1/EURGBP还原GBPEUR。因为货币对只能够获取 EURGBP。
点数 - 最小价格改变
在外汇交易中的货币对每种货币的差异不仅在自己的特性上,同样在他们汇率的小数点数量上。例如, GBPJPY的汇率,2006年12月29日为 233。18,同一天 GBPUSD 的汇率为1.9587。小数点的总数可以使用函数设置
- MarketInfo(Symbol(), MODE_DIGITS);
复制代码 例如,函数
- MarketInfo("GBPJPY", MODE_DIGITS);
复制代码 将返回2。
相应地,对于当前不同的货币对最小价格的改变也将不同。这个值通常等于 0。01,对于货币对 EURUSD 为 0。0001。在当前开价中这个最小价格改变被称为 点,可以使用函数获取:
- MarketInfo(Symbol(), MODE_POINT);
复制代码 对于当前货币对,函数的值
- MarketInfo(Symbol(), MODE_POINT); and MarketInfo(Symbol(), MODE_TICKSIZE);
复制代码 相同。
在货币存款中的价格点
估测风险,当价格移动至一定点数交易者必须知道开仓的亏损数量。或者相反,在亏损点上计算可以接受的亏损量。这样,需要使用函数
- MarketInfo(Symbol(), MODE_TICKVALUE);
复制代码 在货币存款中返回点值。
必须要注意的是对于货币对点值将会改变,第二个值不是货币存款。
每个标准手的保证金
最后的函数考虑到
- MarketInfo(Symbol(), MODE_MARGINREQUIRED);
复制代码 以卖出价 返回一个标准手的价格。
以上范例的函数使用
下面您可以看到脚本显示的上面12组货币对的函数数据。必须注意脚本的自定义函数 MarginCalculate()以买入价返回的标准手数。脚本允许学习申请 MQL4 函数使用到智能交易的金钱管理和风险管理的计算中。
- //+------------------------------------------------------------------+
- //| SimplySpecification.mq4 |
- //| Copyright © 2007, MetaQuotes Software Corp. |
- //| http://www.metaquotes.net/ |
- //+------------------------------------------------------------------+
- string SymbolsArray[13] = {"","USDCHF","GBPUSD","EURUSD","USDJPY",
- "AUDUSD","USDCAD","EURGBP","EURAUD","EURCHF","EURJPY","GBPJPY","GBPCHF"};
- //+------------------------------------------------------------------+
- //| string SymbolByNumber |
- //+------------------------------------------------------------------+
- string GetSymbolString(int Number)
- {
- //----
- string res = "";
- res = SymbolsArray[Number];
- //----
- return(res);
- }
- //+------------------------------------------------------------------+
- //| A very simple function to calculate margin for Forex symbols。 |
- //| It automatically calculates in the account's base currency and |
- //| does not work for complicated rates that do not have direct |
- //| recalculation into the trade account's base currency。 |
- //+------------------------------------------------------------------+
- double MarginCalculate(string symbol, double volume)
- {
- string first = StringSubstr(symbol,0,3); // the first symbol, for example, EUR
- string second = StringSubstr(symbol,3,3); // the second symbol, for example, USD
- string currency = AccountCurrency(); // deposit currency, for example, USD
- double leverage = AccountLeverage(); // leverage, for example, 100
- // contract size, for example, 100000
- double contract = MarketInfo(symbol, MODE_LOTSIZE);
- double bid = MarketInfo(symbol, MODE_BID); // Bid price
- //---- allow only standard forex symbols like XXXYYY
- if(StringLen(symbol) != 6)
- {
- Print("MarginCalculate: '",symbol,"' must be standard forex symbol XXXYYY");
- return(0.0);
- }
- //---- check for data availability
- if(bid <= 0 || contract <= 0)
- {
- Print("MarginCalculate: no market information for '",symbol,"'");
- return(0.0);
- }
- //---- check the simplest variations - without cross currencies
- if(first == currency)
- return(contract*volume / leverage); // USDxxx
- if(second == currency)
- return(contract*bid*volume / leverage); // xxxUSD
- //---- check normal cross currencies, search for direct conversion through deposit currency
- string base = currency + first; // USDxxx
- if(MarketInfo(base, MODE_BID) > 0)
- return(contract / MarketInfo(base, MODE_BID)*volume / leverage);
- //---- try vice versa
- base = first + currency; // xxxUSD
- if(MarketInfo(base, MODE_BID) > 0)
- return(contract*MarketInfo(base, MODE_BID)*volume / leverage);
- //---- direct conversion is impossible
- Print("MarginCalculate: can not convert '",symbol,"'");
- return(0.0);
- }
- //+------------------------------------------------------------------+
- //| script program start function |
- //+------------------------------------------------------------------+
- int start()
- {
- //----
- for(int i = 1; i < 13; i++)
- {
- Print("Symbol=",GetSymbolString(i)," spread=",MarketInfo(GetSymbolString(i),
- MODE_SPREAD)," margin at 1 lot=",MarginCalculate(GetSymbolString(i),1),
- " MODE_TICKVALUE=",MarketInfo(GetSymbolString(i),MODE_TICKVALUE),
- ", MODE_TICKSIZE=",MarketInfo(GetSymbolString(i),MODE_TICKSIZE),
- " MODE_MARGINREQUIRED=",MarketInfo(GetSymbolString(i),MODE_MARGINREQUIRED));
- }
- //----
- return(0);
- }
- //+------------------------------------------------------------------+
复制代码 *大多数情况下,货币对的基础货币是在货币对的第一位,当然,也存在不同的服务器设定。
|
|