使用MQL5经济日历进行交易(第一部分):精通MQL5经济日历的功能(基础篇)
把经济日历接进MQL5策略
MT5 内置的经济日历不只是给肉眼看的面板,它能被 MQL5 直接抓取,变成触发交易的事件源。2025 年 6 月 17 日上线的这组文章演示了如何在 EA 里监听央行决议、通胀数据发布,而不是靠手动盯盘。 对做外汇和贵金属的人而言,事件窗口的滑点和点差扩张是实打实的高风险,用代码自动识别「还有几分钟公布」比凭感觉挂单更可控。 本篇先铺底:经济日历对象在 MQL5 中通过标准接口访问,后续会拆到具体字段过滤与回调写法。你现在就可以开 MT5 按 F4 进编辑器,先确认终端「工具—选项—EA交易」里允许事件日历访问,否则代码跑出来是空数组。
「经济日历能喂给EA什么」
MT5 内置的经济日历不是装饰件,它把央行决议、就业、通胀这类宏观事件直接挂进终端数据流。对算法交易来说,真正有用的是这些事件带时间戳、影响等级和前值/预期/实际三组数字,EA 可以在事件前 N 分钟降杠杆、事件后读实际值再决定方向。 很多手动交易者只看弹窗标题,但 MQL5 允许你把同一条新闻的结构化字段拉出来:国家、货币、波动率评级、剩余秒数。拿到这些,策略就不再靠肉眼盯盘,而是用代码判断“高影响 + 美元相关 + 实际偏离预期”这种组合。 本文系列会先拆日历构成,再给可跑的 MQL5 实现,最后说集成进交易系统后能改掉哪些坏习惯。读完你至少能在 MT5 里建一个把新闻事件打印到图表角落的脚本,先验证数据字段是否如文档所说实时刷新。
◍ MT5里那张能编程读的经济日历
MT5自带的经济日历直接挂在 toolbox 里:顶栏点「视图」→「工具箱」,再切到 Calendar 标签页就能看到。它把利率、通胀、GDP、就业这些事件按影响程度标成低/中/高,并用颜色区分关联货币,界面不会堆满无用信息,短线和中长线交易者都能一眼抓重点。 数据区是8列结构:时间、货币符号、事件名、重要性、数据周期、实际值、预测值、前值/修正值。如果你做 AUDUSD,只关心澳大利亚或美国发布的新闻,中国数据对该货币对直接影响有限,这时候用右键筛选器按货币或国家砍掉噪音就行。 真正值钱的是它和 MQL5 打通了——日历不是只能肉眼看,EA 能用预定义函数把事件名、预定时间、国家、预测/实际值拉出来。这样你可以写逻辑:重大新闻前自动撤单、改止损,或者按预测方向开仓,不需要人盯屏幕。 外汇和贵金属受新闻跳空影响大,属于高风险品种;用日历做计划前先想清楚自己是要手动避波还是让 EA 自动响应,两条路在 MT5 里都走得通。
把经济日历接进EA:从取数到过滤USD新闻
在MT5里写EA不用从零啃文档。按F4进MetaEditor,Ctrl+N调出MQL向导,选EA模板一路下一步,文件名前加反斜杠可指定子目录(默认落进Experts\)。建完空壳先填版权、版本号(例如1.00),真正要碰的是三套结构体:MqlCalendarCountry(国家)、MqlCalendarEvent(事件)、MqlCalendarValue(数值)。 取数逻辑很直白。声明MqlCalendarValue数组values,用TimeTradeServer拿服务器时间,PeriodSeconds(PERIOD_D1)算偏移,把startTime设成前一天、endTime设成后一天,再调CalendarValueHistory灌进数组。该函数返回总数存进valuesTotal,编译后Print出ArraySize就能确认抓到多少条。初跑会看到一堆数字ID,得靠CalendarEventById按ID反查名称、国家、预测值等。
class=class="str">"cmt">// 取前后各24小时日历数值 MqlCalendarValue values[]; class="type">class="kw">datetime startTime = TimeTradeServer() - PeriodSeconds(PERIOD_D1); class="type">class="kw">datetime endTime = TimeTradeServer() + PeriodSeconds(PERIOD_D1); class="type">int valuesTotal = CalendarValueHistory(values, startTime, endTime, NULL, NULL); Print("事件总数: ", valuesTotal, " 数组大小: ", ArraySize(values));
class="type">class="kw">string currency_filter = "USD"; class="type">class="kw">string currency_base = SymbolInfoString(_Symbol, SYMBOL_BASE_CURRENCY); class="type">class="kw">string currency_quote = StringSubstr(_Symbol, class="num">3, class="num">3); if(currency_base != currency_filter && currency_quote != currency_filter){ Print("货币对与过滤器不匹配"); class="kw">return class="kw">false; }