0
883
内容目录
- 概述
- 点的概念
- 点值
- 点差成本
- 输出全部外汇货币对的点差成本
- 测试
- 结论
测试
测试方法是:通过实际交易,将开仓后的初始亏损值与计算得到的点差成本作比较。
1. 测试参数
- 平台:MT5
- 服务器:IMPACT-Demo
- 账户类型:美元账户、英镑账户
- 交易手数:1标准手
- 交易货币对:EURUSD,CADJPY,EURGBP,XAUEUR,EURHKD
- 交易时段:亚洲时段或点差平稳时段
选取的测试货币对思路是:
1). 在美元账户中,EURUSD对应的是公式(6)“利润货币为账户货币”,CADJPY、EURHKD对应的是公式(5)“利润货币的直盘货币对基础货币为账户货币”,EURGBP、XAUEUR对应的是公式(7)“利润货币的直盘货币对基础货币非账户货币”,点差成本的三种公式条件都已包含;
2). 在英镑账户中,EURGBP对应的是公式(6)“利润货币为账户货币”,EURUSD、CADJPY对应的是公式(5)“利润货币的直盘货币对基础货币为账户货币”,XAUEUR对应的是公式(7)“利润货币的直盘货币对基础货币非账户货币”,点差成本的三种公式条件都已包含;而在服务器IMPACT-Demo的报价中不存在GBP与HKD组成的货币对报价,因此选EURHKD作为测试货币对。
注意:使用测试EA时,点差最好平稳无变化,因此交易时段最好选择亚洲时段或点差平稳时段。
2. 测试结果
1). 美元账户
货币对 | 计算时的当前点差 | 实际交易时的点差 | 计算得到的点差成本 | 实际交易时的点差成本 |
---|---|---|---|---|
EURUSD | 5 | 5 | 5.00(USD/1 lot) | 5.00(USD/1 lot) |
CADJPY | 13 | 13 | 11.96(USD/1 lot) | 11.96(USD/1 lot) |
EURGBP | 6 | 6 | 8.48(USD/1 lot) | 8.48(USD/1 lot) |
XAUEUR | 57 | 57 | 70.79(USD/1 lot) | 70.79(USD/1 lot) |
EURHKD | 67 | 67 | 8.57(USD/1 lot) | 8.57(USD/1 lot) |
2). 英镑账户
货币对 | 计算时的当前点差 | 实际交易时的点差 | 计算得到的点差成本 | 实际交易时的点差成本 |
---|---|---|---|---|
EURUSD | 6 | 6 | 4.24(GBP/1 lot) | 4.24(GBP/1 lot) |
CADJPY | 12 | 12 | 7.81(GBP/1 lot) | 7.81(GBP/1 lot) |
EURGBP | 9 | 9 | 9.00(GBP/1 lot) | 9.00(GBP/1 lot) |
XAUEUR | 57 | 57 | 50.09(GBP/1 lot) | 50.09(GBP/1 lot) |
EURHKD | 67 | 67 | 6.07(GBP/1 lot) | 6.07(GBP/1 lot) |
通过比较发现,在美元账户和英镑账户下,计算得到的点差成本与实际交易得到的点差成本完全一致。由于价格的波动,某些货币对输出的点差成本可能与实际点差成本有略微的差别。
3. 测试EA代码
//+------------------------------------------------------------------+ //| EA_TestSpreadCost.mq5 | //| Copyright 2017, Yupeng Xiao | //| shaw_yp@126.com | //+------------------------------------------------------------------+ #include "SpreadCost.mqh" #include <Trade\Trade.mqh> //+------------------------------------------------------------------+ //| Global var | //+------------------------------------------------------------------+ const double TestLots = 1.0; string g_symbols[] = {"EURUSD","CADJPY","EURGBP","XAUEUR","EURHKD"}; int g_totalnum = 5; int g_spread_output[5]; //output spread double g_cost_output[5];//putput cost int g_spread_test[5]; //test spread by trade double g_cost_test[5]; //test cost by trade CTrade otrade; CSpreadCost oSpreadCost(TestLots); int OnInit() { oSpreadCost.GetSymbolsSpreadCost(g_symbols,g_spread_output,g_cost_output); TradeSymbols(); PrintInfo(); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Print spread and Trade Cost Info | //+------------------------------------------------------------------+ void PrintInfo() { string AccountCurrency = "USD"; for(int i=0;i<g_totalnum;i++) { AccountCurrency = AccountInfoString(ACCOUNT_CURRENCY); Print(i+1,". ",g_symbols[i]," OutputSpread is:",g_spread_output[i],", TestSpread is:",g_spread_test[i], ", OutputCost is:",DoubleToString(g_cost_output[i],2),"(",AccountCurrency,"), TestCost is:", DoubleToString(g_cost_test[i],2),"(",AccountCurrency,")!!"); } return; } //+------------------------------------------------------------------+ //| Trade get test cost | //+------------------------------------------------------------------+ void TradeSymbols() { MqlTick latest_price; for(int i = 0; i < g_totalnum; i++) { otrade.Buy(TestLots,g_symbols[i],latest_price.ask); PositionSelect(g_symbols[i]); g_spread_test[i] = (int)SymbolInfoInteger(g_symbols[i],SYMBOL_SPREAD); g_cost_test[i] = MathAbs(PositionGetDouble(POSITION_PROFIT)); otrade.PositionClose(g_symbols[i],g_spread_output[i]*2); } }
TradeSymbols()函数执行开仓平仓操作,并将当前仓位的点差和点差成本保存下来。测试结果通过Print函数输出到MT5平台终端“专家”栏目内。
总结
通过全文的介绍,我们了解了点的概念、不同账户类型下点值及其计算公式、点差的概念及点差成本的计算公式以及如何输出平台报价中所有外汇货币对的点差成本,并通过测试比较,输出的点差成本与实际交易得到的点差成本一致。