- 显示:
- 6609
- 等级:
- 已发布:
- 2016.03.29 12:13
- 已更新:
- 2016.11.22 07:33
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
描述:
- 我们的想法是开发一个根据新闻事件进行自动交易的EA. 基本面交易者EA不能根据历史数据进行回溯测试, 它只能向前测试, 因为它的设置就是等待下一个新闻事件, 然后根据真实与预测或者真实与之前数据的差距来决定交易.
- 基本面交易者EA非常简单, 在下载了日程表后, 它确定在DailyFx日程表中下一个新闻事件, 然后就等待那个新闻事件的发布, 一旦数据发布后, EA就做出交易的决定. 基本面交易者EA可以应用于任何图表和任何时段, 因为它只是利用图表进行订单的执行.
基本面交易者的设置是支持每个在DailyFx日历上的国家, 详细信息请参见下方.
注意:
- 为了使EA正常工作, 您必须按照要求在设置来以下的主要文件:
- https://www.mql5.com/zh/articles/1502
- 本EA是根据以上链接的指标代码基础上构造的. 您首先 必须 根据以上链接的指导, 设置以下文件:
- getright_setup.zip
- Time.mq4
- Time.mqh
- 请确认您已经把下载目录正确设置到日历将要被下载的目录, 否则EA不能正常工作.
- 请确认您已经仔细阅读了那篇文章, 并且确保遵守了每项指示.
- 您可以阅读所有那些文件, 了解它们的功能. 那篇文章在解释指标如何执行, 怎样在图表窗口上显示新闻事件等方面写的很好.
- 首先在图表上设置指标和显示新闻是个不错的主意, 这样之后EA运行就没有任何问题了.
- 指标的源代码已经改成了EA, 根据新闻进行交易而不是仅仅显示它们.
- 当您设置以上列表中的文件时, 您可以把EA和"str2double.dll"一起下载, 然后EA就能够根据DailyFx发布的新闻进行交易了. 把 "str2double.dll" 文件放到根目录, 例如C:\Program Files\Interbank FX Trader 4\
交易逻辑:
- 交易背后的逻辑如下: 发生的新闻事件有两种类型.
- 第一种: 有实际数据, 可以与预测的经济数据作比较.
- 第二种: 有实际数据, 可以与之前的经济数据做比较.
- 经济数据之间的差异, 可能影响货币价格的方向, 经济数据百分率之间的差异有很大可能引起市场在某个方向上的反应.
- 您可以访问 www.pfxglobal.com 获得更多的基本面交易信息.
- 当经济数据有更高的百分比差异时, EA会以更大的手数执行订单.
- 当经济数据的百分比差异较小时, EA执行订单的手数也小.
- 当EA附加在图表上时, 我们指定了以下的手数变量:
- lot1, lot2, lot3, lot4, lot5, lot6......lot18
- EA会根据经济数据之间的百分比差异来选择指定的手数.
风险/回报比例:
- 基本面交易者EA的设置是1:3, 风险/回报比例, 默认值为 risk=20, reward=3.
- Risk 是止损的点数, 而 reward 是倍数, 所以如果EA的风险是20个点, 它的目标就是获利60个点.
- 这些数字在把EA附加到图表时可以修改.
等待新闻即将发布的时间:
- 新闻数据并不是恰好在计划的时间中发布, 需要给EA设置一个时间范围来等待新闻时间的发布.
- 以下代码段决定了EA将要等待新闻发布的时间, 当新闻等待时间超过了以后, EA会转向下一个新闻事件.
- xTime 是一个当您第一次把EA应用于图表时可以修改的变量. 默认值是 27 分钟.
if(Date>(TimeCurrent()-(xTime*60)))
等待订单关闭的时间:
- 您也可以设置一个EA在关闭订单前等待的时间范围.
- 比如, 在新闻事件发布之后, 仓位执行了, 等待30分钟后就关闭订单, 不论获利还是亏损. 这是 MQL4 用户 "ebenv" 所建议的.
- 控制这个函数有 (3) 个变量:
- MagicNumber | 用户用于跟踪订单的数字
- enable_close_time | 设为true可以使EA监控订单执行后过去的时间
- wait_time | 关闭订单前等待的时间
基本面交易者EA支持的国家:
基本面交易者EA支持 dailyfx.com/calendar 中的每个货币.
以下的代码段基于发布新闻的国家指定了交易的货币. 以下是货币列表: EUR, USD, JPY, GBP, CHF, AUD, CAD, NZD
if(stCurrency=="EUR" ){ordercurrency="EURUSD";} //交易 eurusd if(stCurrency=="USD" ){ordercurrency="EURUSD";} //交易 eurusd if(stCurrency=="JPY" ){ordercurrency="USDJPY";} //交易 usdjpy if(stCurrency=="GBP" ){ordercurrency="GBPUSD";} //交易 usdgbp if(stCurrency=="CHF" ){ordercurrency="USDCHF";} //交易 usdchf if(stCurrency=="AUD" ){ordercurrency="AUDUSD";} //交易 audusd if(stCurrency=="CAD" ){ordercurrency="USDCAD";} //交易 usdcad if(stCurrency=="NZD" ){ordercurrency="NZDUSD";} //交易 nzdusd
交易决定:
-
以下的代码段描述了EA在有可用的预测经济数据, 等待真实经济数据时, 如何做出交易决定.
当预测数据不可用时, EA使用之前的数据来进行交易.
以下代码段解释了如何基于预测数据与真实数据执行交易. 当EA根据之前与实际经济数据来作交易决定的算法是一样的.
if(StringToDouble(stActual)>StringToDouble(stForecast)) { Aert("Stronger(actual vs forecast): "+stCurrency+" "+"Time: "+stTime); int total=OrdersTotal(); for(int cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); //check opened orders if(OrderComment()==stCurrency+stActual+stForecast+"BUY"|| OrderComment()==stCurrency+stActual+stForecast+"SELL") { FileClose(file);Comment("\n"+"Live Trade Open"+OrderTicket());return(0); } } int historytotal=OrdersHistoryTotal(); for(cnt=0;cnt<historytotal;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY); //check opened orders if(OrderComment()==stCurrency+stActual+stForecast+"BUY"|| OrderComment()==stCurrency+stActual+stForecast+"SELL"){ FileClose(file);Comment("\n"+"Trade Executed"+OrderTicket());return(0); } } if(stCurrency=="EUR"||stCurrency=="GBP"||stCurrency=="AUD") { double ask=MarketInfo(ordercurrency,MODE_ASK); double point1=MarketInfo(ordercurrency,MODE_POINT); OrderSend(ordercurrency,OP_BUY,lot_p,ask,3,ask-(risk*point1), ask+reward*risk*point1),stCurrency+stActual+stForecast+"BUY");} if(stCurrency=="CHF"||stCurrency=="CAD"|| stCurrency=="NZD"||stCurrency=="JPY"||stCurrency=="USD") { double bid=MarketInfo(ordercurrency,MODE_BID); double point2=MarketInfo(ordercurrency,MODE_POINT); OrderSend(ordercurrency,OP_SELL,lot_p,bid,3,bid+risk*point2), bid-(reward*risk*point2),stCurrency+stActual+stForecast+"SELL");}
第一: EA对每个新闻事件只会执行一个订单, 所以首先需要检查是否已经执行了订单, 如果已经建立了订单, EA就退出.
第二: EA判断订单是否已经执行并关闭, 如果已经执行并关闭, 无论获利还是亏损, EA也退出.
这两项检查确保不会有重复的订单, 这样EA就对一个新闻事件只会进行一次交易.
然后, 它判断数据是哪个国家发布的, 然后当经济数据发布时使用OrderSend函数来进行交易.
以上代码的作用是: 当真实数据大于预测数据, 还有真实数据小于预测数据, 算法是相同的, 差别只是交易的方向.
比较以前数据和实际数据的算法也是相同的.
手数大小:
EA比较 (真实数据与预测数据), 或者 (实际数据与以前数据), 新闻数据差距的百分比决定了交易的手数.
以下代码段展示了EA如何计算差距百分比, 并指定手数大小, 手数大小是外部变量, 可以修改, 以支持不同的经纪商.
当用户把EA应用于图表时可以修改手数. 默认的手数是 (0.01, 0.02, 0.03...0.17).
double percent_d_AF=MathAbs((MathAbs(StringToDouble(stActual)- StringToDouble(stForecast))/StringToDouble(stForecast))*100); double lot_p=0; if((percent_d_AF>0 && percent_d_AF<=3)){lot_p=lot1;}//0.1 手 if((percent_d_AF>3 && percent_d_AF<=6)){lot_p=lot2;}//0.2 手 if((percent_d_AF>6 && percent_d_AF<=9)){lot_p=lot3;}//0.3 手 if((percent_d_AF>9 && percent_d_AF<=12)){lot_p=lot4;}//0.4 手 if((percent_d_AF>12 && percent_d_AF<=15)){lot_p=lot5;}//0.5 手 if((percent_d_AF>15 && percent_d_AF<=18)){lot_p=lot6;}//0.6 手 if((percent_d_AF>18 && percent_d_AF<=21)){lot_p=lot7;}//0.7 手 if((percent_d_AF>21 && percent_d_AF<=24)){lot_p=lot8;}//0.8 手 if((percent_d_AF>24 && percent_d_AF<=27)){lot_p=lot9;}//0.9 手 if((percent_d_AF>27 && percent_d_AF<=30)){lot_p=lot10;}//1 手 if((percent_d_AF>30 && percent_d_AF<=40)){lot_p=lot11;}//2 手 if((percent_d_AF>40 && percent_d_AF<=50)){lot_p=lot12;}//3 手 if((percent_d_AF>50 && percent_d_AF<=60)){lot_p=lot13;}//4 手 if((percent_d_AF>60 && percent_d_AF<=70)){lot_p=lot14;}//5 手 if((percent_d_AF>70 && percent_d_AF<=80)){lot_p=lot15;}//6 手 if((percent_d_AF>80 && percent_d_AF<=90)){lot_p=lot16;}//7 手 if((percent_d_AF>90 && percent_d_AF<=100)){lot_p=lot17;}//8 手 if((percent_d_AF>100)) {lot_p=lot18;}//8 手
图表信息:
基础新闻数据的屏幕截图
当EA首先应用于图表时, 您可以设置 "xTime", "risk", "reward", "MagicNumber", "enable_close_time", "wait_time" 并指定您的最小和最大手数大小, 确保文件已经正确安装到默认位置.
EA将下载 dialyfx 日历, 并确定下一个是什么新闻事件. 它将会以注释的方式在图表上显示以下数据: 日期(Date), 时间(Time), 时区(TimeZone), 货币(Currency), 描述(Description), 重要性(Importance), 实际数据(Actual), 预测数据(Forecast), 以及之前数据(Previous)的新闻数据, 如上图所示.
在上图中, EA正在等待将要在 2:00AM 发布的新闻事件, 您可以看到, 之前经济数据已经知道了 (73,5%), 所以EA在等待真实数据. 当经济数据将要发布时, EA会比较数据, 根据之前与实际的经济数据来做出交易的决定.
最后, EA会从新闻事件计划的发布时间开始, 每分钟下载日历数据.
基本面交易者EA概览:
本EA根据 dailyfx.com/calendar 上以CSV格式发布的每个经济事件进行交易.
日历是使用"get right"程序下载的.
当新闻数据计划发布时, EA每隔一分钟下载日历数据.
EA分析日历并确定下一个将要到来的新闻事件, 然后等待新闻发布27分钟.
一旦经济数据发布, 它判断它是 (真实与预测) 还是 (真实与过去) 的数据.
EA会确定手数大小, 交易的货币, 以及根据经济日历事件进行交易的方向, 这些数据当EA运行时也可以在图表上找到.
订单以 1:3 的风险/回报比例执行.
EA设置为每个新闻事件只执行一个订单. 如果 "enable_close_time" 被设为 "true" 的值, EA会等待在 "wait_time" 中指定的分钟数, 然后关闭订单.
请记住遵守以下链接中的指导 https://www.mql5.com/zh/articles/1502, 这样日历就能正确下载, 而您的经纪商时间也能正确设置, 因为需要处理的新闻, dailyfx.com/calendar 的数据时区是GMT.
如果您有任何问题, 建议或批评, 请写下您的评论.由MetaQuotes Ltd译自英文
原代码: https://www.mql5.com/en/code/8491

2005 年 10 月期刊 - "FRAMA - 分形自适应移动均线" 长度将被强制为偶数。. 奇数将被上调到临近的偶数。

UploadExport 脚本程序是一个通用的程序工具. 它可以减轻每天使用ELWAVE程序进行波段分析的分析员和交易者的工作.