简介金融市场的运转首先是交易业务。正如我们儿时熟知的,依照自己的直觉执行买卖。但是外汇交易却有些不同。本文将解析外汇交易的一部分想法和外汇交易程序MQL 4。
回顾历史从课本上我们得知在古老人类时代是不运用金钱的 – 他们享受自然的产物。金钱的发明和创造自身就是人类一部伟大的进度。运用钱币的民众可以通过金钱执行相互交换产物。无论是国家和国家之间的相互交换,依旧时代的变迁,钱币总是能够很容易的储存或是运输,比如,黄金或白银。诚然,每个国家都有自己的历史,风俗和货币。但是远古期间的贸易活动均为通过商人带着货物从一个国家到其他国家执行货物交换。货物的交换可以是地方性的或是世界性的,比如,黄金。
我们的时代如今,贵重金属不能够作为实用的支付工具。所以国家开始策划付款支付货物的交换。在国家与国家的贸易中付款支付货物的交换继而造成了货币与货币之间的汇率。比如, EUR/USD 之间的汇率为 1.25。这就代表着一欧元可以兑换1.25 美元。 所以,在两个自由货币之间务必计算货币汇率。大型的外汇交换一般是通过银行来实施输入/输出业务,所以造成了标准货币对和标准交换总量。货币对的名称在MetaTrader 4客户终端中以货币的简写形式显现。比如, 欧元兑美元表明在美元欧中元的汇率, 英镑兑日元 -在日元英中镑的汇率。既第一个货币总是指定在第二个货币规模内的汇率。
货币存款尽管在交易过程中可以存在多种货币,但结果却总是写入一种货币 - 货币存款。假使货币存款为美元( US ),盈利和亏损全将以美元表明。假使是欧元,盈利和亏损自然会以欧元表明。对于货币存款的有关信息你可以查看运用 AccountCurrency() 函数。可以用来转换交易结果。
标准份额大小 - 标准手数在一种货币与此外一种货币交换时,运用的单位为"标准手数"。以标准手数来执行买卖。对于不同的货币对标准手数存在不同值。 当前,最大的货币对标准手数值等于100 000 。但什么是 100 000呢?当我们买进时,需要支付金钱。当我们出售时,可以获取金钱。但是对于货币对,我们买卖的同期也可以得到一定盈利。这就是为何一般我们获取第一个货币价格关系到第二弟货币的原因。对于 欧元兑美元标准手数为100 000欧元。假使我们买进一个 欧元兑美元标准手,代表着我们用 100 000 欧元并换取一定数量的美元。受于收入和开支务必维持平衡 100 000 欧元 = X 美元。那么我们怎样去计算呢? 让我们在表达式中用美元还原欧元:
EURO= k*USD
k 表明 欧元兑美元的交换汇率;
100 000 (k*USD) = X USD => X= k*100 000;
假使目前 欧元兑美元汇率为 1.25, 就是X=125 000。
由上面的计算可以得出 欧元兑美元标准手数, 我们的 100 000 欧元可以换获得到125 000 美元。有时有人说 - 买进欧元和出售美元就是表明买进 欧元兑美元 。对于货币对的标准手数的信息您可以运用 MarketInfo() 函数获取。比如:
- MarketInfo(Symbol(), MODE_LOTSIZE);
复制代码您同样可以得到货币对名称文本和函数
- MarketInfo("欧元兑美元",MODE_LOTSIZE);
复制代码将返回100 000。会被写入帮助文件: MODE_LOTSIZE 是在货币对基础的比例大小。对于欧元兑美元 货币对的基础货币为 EUR (*)。对于 瑞郎兑日元货币对的基础货币对为瑞士法郎,有关的单价将令以瑞士法郎表明。
交易结果让我们来说一看其余的示例。我们以1.2500价格买进 1标准手。目前价格为1.2600,所以我们决定收盘,就是出售1标准手的 欧元兑美元。
写下的水准:
以1.2500买进1 标准手的 欧元兑美元 : + 100 000 欧元 - 125 000美元。
以1.2600出售1个标准手的欧元兑美元 : - 100 000 欧元 + 126 000 US美元。
交易业务的盈利结果: 0 EURO + $ 1000。
结论: 从 欧元兑美元 交易业务的盈利结果用美元来表明,即货币对的第二种货币。试图计算其余交易的结果: 以2。30价格买进一个标准手的 英镑兑瑞郎而且以 2.40价格收盘。得到的会是什么结果呢?
杠杆和保证金在金融市场的交易中允许从保证金获取盈利。就我们的范例来说,买进1个标准手的 欧元兑美元,我们需要胜过100 000 美元 (125 000汇率为 1。25)。大部分经纪允许交易者调用‘杠杆’。杠杆的值会表示对于开仓可用的次数。金钱总数需要以保证金命名开仓。在没有杠杆情形下,1个标准手的 欧元兑美元 需花费 100 000欧元或125 000 美元(汇率为 1。2500)假使经纪供应给您100的杠杆, 如此金钱的总数在开仓位置将被降低100次而且为1250 美元。 如此我们已经计算出的盈利值依然相同。对于杠杆值您可以在交易账户中运用 AccountLeverage()函数查看。 自此,开仓标准手的保证金被指定为:
保证金(基础货币对) = 标准手价格 (基础回避对) / 保证金_大小。
基础货币对的单价在货币存款中是基础货币对和货币存款之间的比率。
保证金计算范例:
MarketInfo("英镑兑日元", MODE_LOTSIZE) 给出的值 70 000 (LS)。
AccountCurrency() 函数返回 "EUR" (AC)。
AccountLeverage() 函数返回50 (AL)。
我们怎样计算目前时刻 英镑兑日元的单价(M)?
基础货币为 GBP,如此
M = 70000 GBP / AL = 70 000*GBPEUR / AL = 70000 / 欧元兑英镑 / AL。
假使此时 欧元兑英镑的汇率为0.6786,那么
M = 70000 / 0.6786 / 50 = 2063.07 EURO。
假使杠杆等于100,保证金将少于两倍 - 1031.54 欧元。对于10的杠杆,保证金会是:
M = 70000 / 0.6786 / 10 = 10315.36。
自此可以看出,杠杆的大小只影响开仓位的保证金大小,但是不会影响获取盈利的多少。同样需要注意的是在欧元(货币存款)当中保证金的大小将令和 欧元兑英镑汇率一起波动,应为基础货币为英镑。在我们的范例中,我们可以用 1/欧元兑英镑还原GBPEUR。由于货币对只能够获取 欧元兑英镑。
点数 - 最小价格更改在外汇交易中的货币对每种货币的差异不仅在自己的特性上,同样在他们汇率的小数点数量上。比如, 英镑兑日元的汇率,2006年12月29号为 233。18,同一天 英镑兑美元 的汇率为1.9587。小数点的总数可以运用函数设置
- MarketInfo(Symbol(), MODE_DIGITS);
-
复制代码比如,函数
- MarketInfo("英镑兑日元", MODE_DIGITS);
-
复制代码将返回2。
相应地,对于目前不同的货币对最小价格的更改也将不同。这个值一般等于 0。01,对于货币对 欧元兑美元 为 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] = {"","美元兑瑞郎","英镑兑美元","欧元兑美元","美元兑日元",
- "澳元兑美元","美元兑加元","欧元兑英镑","欧元兑澳元","欧元兑瑞郎","欧元兑日元","英镑兑日元","英镑兑瑞郎"};
- //+------------------------------------------------------------------+
- //| 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);
- }
- //+------------------------------------------------------------------+
复制代码*大部分情形下,货币对的基础货币是在货币对的第一名,诚然,也存在不同的服务器设定。