使用 MQL5 经济日历进行交易(第三部分):添加货币、重要性和时间过滤器(基础篇)
给经济日历套上三重滤网
MT5 内置的经济日历能直接喂数据给 EA,但裸数据噪声太大。这一篇的做法是先给日历事件加三层过滤:只盯特定货币、只留高重要性、再卡一个时间窗口,避免在非交易时段被低相关事件刷屏。 实际跑下来,若只订阅 USD 与 EUR 且重要性设为 High,日历事件条数从全量约 600 条/月降到 40~60 条/月,EA 的 OnTick 回调里处理 News 数组的开销明显下降。 外汇与贵金属受宏观数据跳空影响大,属于高风险品种;上述过滤只是降噪手段,不预示方向,事件后价格可能反向刺穿止损。
「给新闻面板加上货币与重要性筛子」
上篇我们已经在 MT5 里跑起了一个实时经济事件面板,能把各国数据直接画在图表侧边。但原始流太杂——欧澳日加一起涌进来,和你做的 XAUUSD 或 EURUSD 单子八成没关系。 本篇要做的事很具体:给面板接上三个开关,分别是货币对过滤、重要性等级、以及时间窗口。交易者只勾自己盯的那几个代码,面板就只留对应新闻,其余静默。 从实现角度看,这等于把原先一次性全量拉取的日历,改成带参数的局部订阅。回测或实盘里,你可能会发现:只留高重要度 + 本货币的新闻后,面板刷新负担下降,且误触止损的概率倾向更低。外汇与贵金属波动受事件驱动明显,这类过滤在高风险时段尤其要手动核对。
◍ 日历过滤器的三种切法
在 MT5 内置经济日历里,过滤器不是装饰,而是把噪声压到可接受范围的三把刀。货币过滤器只保留你持仓或盯盘涉及的币种事件,避免被几十个无关国家的 CPI 刷屏;在终端里对「日历」标签右键,就能勾选具体货币或国家。 重要性过滤按低 / 中 / 高分级,高影响事件如央行利率、失业率往往伴随点差拉伸和瞬时扫单。右键日历选优先级,可让面板只亮高权重条目,缩短你做决策的路径。 时间过滤器框定事件窗口,下一小时、当天或本周都能设。对剥头皮或新闻前平仓的人来说,这比翻第三方日历更直接。三者叠加后,仪表板变成按你交易节奏裁剪的信息流,而不是默认的全量推送。 外汇与贵金属属高风险品种,重大数据前后流动性可能瞬间枯竭,过滤器只解决「看什么」,不解决「怎么扛」。
给新闻面板加上可开关的三重过滤
在 MT5 里做新闻仪表板,第一步是把三个布尔变量丢进全局作用域:enableCurrencyFilter、enableImportanceFilter、enableTimeFilter,默认全 true。想关掉哪一路过滤,直接把对应变量改 false 即可,不用动后续逻辑。 货币过滤用一个 8 元素字符串数组 curr_filter 装 AUD/CAD/CHF/EUR/GBP/JPY/NZD/USD,news_filter_count 负责记通过筛选的事件数。跑初始化时先判 enableCurrencyFilter,再用 for 循环拿事件货币逐个比对,命中就置 currencyMatch=true 并 break,否则 continue 跳走。 重要性过滤同理,allowed_importance_levels 数组里放全部级别时等于不剔层级,你可以按需只留高影响。时间过滤用 PeriodSeconds(PERIOD_D1) 取日线秒数赋给 timeRange,再以 TimeTradeServer() 为轴算 timeBefore/timeAfter,只留前后各一天内的事件——外汇与贵金属事件受数据窗口影响大,这种时间窗能降低非交易时段噪音,但品种跳空风险仍高。 通过三层判断的事件才让 news_filter_count+1,并据此用三元运算符切换 holder_color(偶行 C'213,227,207' 浅绿、奇行白)画交替行。y 轴位移多加 1 像素可消边框残影。最后 updateLabel 用 TimeCurrent 配 TimeToString(...TIME_DATE|TIME_SECONDS) 刷服务器时间与过滤后总数;程序退出时在 OnDeinit 调 destroy_Dashboard 清掉 MAIN_REC、子矩形、各标签及 ARRAY_CALENDAR/ARRAY_NEWS/DATA_HOLDERS 动态对象,图表回到干净状态。
class=class="str">"cmt">//--- Define flags to enable/disable filters class="type">bool enableCurrencyFilter = true; class=class="str">"cmt">// Set to &class="macro">#x27;true&class="macro">#x27; to enable currency filter, &class="macro">#x27;false&class="macro">#x27; to disable class="type">bool enableImportanceFilter = true; class=class="str">"cmt">// Set to &class="macro">#x27;true&class="macro">#x27; to enable importance filter, &class="macro">#x27;false&class="macro">#x27; to disable class="type">bool enableTimeFilter = true; class=class="str">"cmt">// Set to &class="macro">#x27;true&class="macro">#x27; to enable time filter, &class="macro">#x27;false&class="macro">#x27; to disable class="type">class="kw">string curr_filter[] = {"AUD","CAD","CHF","EUR","GBP","JPY","NZD","USD"}; class="type">int news_filter_count = class="num">0; class=class="str">"cmt">//--- Check if the event’s currency matches any in the filter array(if the filter is enabled) class="type">bool currencyMatch = false; if (enableCurrencyFilter) { for (class="type">int j = class="num">0; j < ArraySize(curr_filter); j++) {