- 显示:
- 18
- 等级:
- 已发布:
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
问题
大多数新闻过滤器都会读取 MQL5 经济日历(CalendarValueHistory)。由于该日历在策略测试器中并不存在,因此这些过滤器在回测中会悄无声息地失效:EA 会直接在非农就业数据(NFP)、消费者物价指数(CPI)或利率决议发布时进行交易,导致回测结果与实际交易行为不再一致。 在我的一次测试中,一笔XAUUSD的挂单在美国CPI数据发布前5分钟被成交,止损被触发时出现了45美元的滑点——单笔交易损失了计划风险额的6.5倍。
第二个较少为人知的问题:交易终端会使用“当前”服务器时差来转换历史日历时间。如果在夏季从GMT+2/GMT+3时区的经纪商处导出数据,每个冬季事件的时间都会推迟一小时(非农数据显示为16:30,而非服务器时间的15:30)。 基于这些时间构建的过滤器会在一年中的半数时间里错误地屏蔽了该小时段。
解决方案——三个文件
NewsCalendarExport.mq5(脚本)——将事件导出至 Terminal\Common\Files\NewsCalendar.csv,并根据每个事件所属日期的服务器时差重新计算时间。最后,它会执行自我检查:美元相关事件最常见的时间在冬季和夏季必须完全一致。
NewsFilter.mqh(类 CNewsFilter)——一个既适用于实时交易又适用于回测的过滤器。 在实盘交易中,它读取经济日历(每分钟最多查询一次);在策略测试器中,它读取 CSV 文件。仅使用该交易品种的货币(EURUSD:EUR + USD,XAUUSD:USD,以美元报价的指数差价合约:USD)。
NewsFilter_Example.mq5——一个最简化的EA,用于在新闻窗口开始和结束时输出提示,并在图表上标注被屏蔽的窗口,以便您在策略测试器的可视化模式下观察过滤器的运行情况。
使用方法
将 NewsFilter.mqh 复制到 MQL5\Include 目录,将 NewsCalendarExport.mq5 复制到 MQL5\Scripts 目录,将 NewsFilter_Example.mq5 复制到 MQL5\Experts 目录。编译脚本和示例程序(.mqh 文件将随它们一起编译)。
在已连接终端的任意图表上运行一次 NewsCalendarExport。在“专家”选项卡中,您应看到:“OK:冬夏时间一致”。
在您的 EA 中,添加以下代码:
C++
#include <NewsFilter.mqh>
CNewsFilter news;
int OnInit()
{
news.Init(_Symbol, 30, 30); // 屏蔽每个事件前后各30分钟的数据
return(INIT_SUCCEEDED);
}
void OnTick()
{
if(news.IsBlocked())
return; // 新闻期间无新条目
// ... 您的入场逻辑 ...
}
按常规进行回测。日志会显示该交易品种加载了多少个事件。
脚本输入参数
从以下时间开始导出事件:导出的起始日期。
同时导出未来 N 天内的计划事件:包括即将发生的事件。
货币:以逗号分隔的列表(默认 USD,EUR,GBP,JPY,CAD,AUD,NZD,CHF)。
重要性:仅限高影响事件,或中、高影响事件。
经纪商服务器夏令时规则:美国规则(默认,服务器 = 纽约 + 7 小时,大多数 GMT+2/+3 经纪商)、欧盟规则,或无夏令时。
文件名:存储在 Terminal\Common\Files 中。
CNewsFilter::Init(symbol, minutesBefore, minutesAfter, mediumToo = false, csvFile = "NewsCalendar.csv")
注意事项与限制
已在 FTMO(GMT+2 / GMT+3,采用美国夏令时规则)和 IC Markets 欧盟服务器上进行测试。 输出示例:导出 5645 条事件,其中 1897 条时间偏移了一小时;修正前,美元最常见的时间是冬季 16:30 和夏季 15:30,修正后两个季节均为 15:30。
如果自检仍显示冬夏时间不同,请尝试另一种“经纪商服务器夏令时规则”。
MQL5日历的历史数据有限且取决于交易终端;在我的终端上,历史数据始于2020年,因此更早的回测将不包含任何事件。
仅使用该交易品种的货币,因此对于指数和商品,报价货币决定适用哪些事件。
远程和云代理无法读取 Common\Files 文件夹——请使用本地代理进行优化。
某些货币在MQL5日历中的高影响事件非常少(例如澳元)。对于这些货币,请使用“中等+高影响”选项。
该过滤器仅告知您的EA何时“不应”开立新仓位。已开仓位的管理则由您的EA自行决定。
请不时重新运行该脚本以纳入新事件。
需要集成帮助吗?
如果您不是程序员,但希望将此新闻过滤器集成到现有的EA中,或者您需要针对自营交易公司评估量身定制的风险管理规则,请通过我的MQL5自由职业者个人资料直接联系我。我很乐意为您编写代码!
版本 1.00 - 首次发布(示例 EA 1.01:在图表上绘制被屏蔽的新闻窗口)。
由MetaQuotes Ltd译自英文
原代码: https://www.mql5.com/en/code/77617
CSetupLedger: a per-setup win rate ledger for Expert Advisors
将EA中的每种交易策略分别记录在独立的记录中,而不是将其合并到一条净值曲线上。该工具在初始化时会根据账户的交易历史自动重建自身,因此重启不会导致记录丢失。在原始胜率旁边显示威尔逊评分下限,这样三笔交易的连胜就不再看起来像是一种优势了。
Session Candle Counter: candles numbered from the cash open, DST aware
从法兰克福、伦敦、纽约或东京的现货开盘开始,对当前交易日的每根K线进行编号。基准时间会从交易所当地时间转换为经纪商服务器时间,并自动调整夏令时,因此无论夏季还是冬季,开盘后的第一根K线始终编号为1。
Safe Risk Manager EA - Daily Loss, Break-Even and Trailing Stop
用于MT5对冲账户的培训交易面板,具备风险控制、点差保护、持久的每日亏损锁定、盈亏平衡和追踪止损功能。
Trade Reporter Lite - Telegram trade notifications
将您的MT5开仓和平仓信息发布到Telegram聊天群:交易方向、交易品种、入场点、止损和目标点(以点为单位)、手数,以及平仓时的结果、点数、R倍数和持仓时间。支持重试队列,重启后数据不丢失,绝不进行交易。适用于MT5的免费Telegram和Discord交易通知工具