了解如何在MQL5中处理日期和时间·综合运用
(3/3)·从datetime到tradeAtTime,用三篇篇幅把时间维度真正接进你的EA与指标
不少交易者把时间当成图表上的背景刻度,直到EA在跨周末跳空或夏令时切换时乱单才意识到datetime不是简单字符串。MQL5里时间以Unix秒存储,比较与运算都围绕这个数轴展开,理解偏差会直接翻译成账户里的异常成交。
时间过滤器下的静默日志
在 EA 的主循环里,若当前时间落在禁止交易区间,程序不会下单,而是直接打印一条提示:Trading is inactive based on time filter。 这条日志本身不产生任何订单操作,只是让用户在 MT5 的 Experts 标签页里确认策略因时间规则暂停。实盘中美盘休市前后常触发,属于无风险的状态反馈。 把该判断分支接在 OrderSend 之前,可以避免在非流动性时段误触手续费与滑点。打开 MT5 回放一段伦敦午休行情,就能看到这条输出稳定出现。
Print("Trading is inactive based on time filter"); } class=class="str">"cmt">//+------------------------------------------------------------------+
◍ 用定时开关卡住乱做的手
很多外汇、贵金属交易者吃亏不在策略错,而在非活跃时段瞎单。MT5 里可以用极短代码把交易权限锁到指定钟点,降低无谓暴露。 全局先放一个 input string openTime="10:00",这是外部可调参数;再声明 datetime lastTime 用来记上一次触发的允许时间,初值空。 OnTick 里每次报价都跑:datetime dtOpenTime=StringToTime(openTime) 把字符串转成时间数。判断 lastTime!=dtOpenTime 且 TimeCurrent()>dtOpenTime,才把 lastTime 刷新成 dtOpenTime 并打印一次“Now is the allowed time to trade”。 这套逻辑实测:若 openTime 设 10:00,服务器时间过 10:00 后日志仅出现一条该消息,不会每 tick 刷屏。外汇、贵金属杠杆高,定时交易只控频率,不预示盈亏。 代码逐行:input string openTime="10:00" 暴露参数给 EA 属性框;datetime lastTime 模块级变量存上次触发点;OnTick 内 dtOpenTime 由 StringToTime 算出来;if 双条件保证每天同一时刻只触发一次;Print 出日志便于肉眼核对。
class="kw">input class="type">class="kw">string openTime="class="num">10:class="num">00"; class="type">class="kw">datetime lastTime; class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| tradeAtTime.mq5 | class=class="str">"cmt">//+------------------------------------------------------------------+ class="kw">input class="type">class="kw">string openTime="class="num">10:class="num">00"; class="type">class="kw">datetime lastTime; class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">void OnTick() { class="type">class="kw">datetime dtOpenTime=StringToTime(openTime); if(lastTime !=dtOpenTime && TimeCurrent()>dtOpenTime) { lastTime=dtOpenTime; Print("Now is the allowed time to trade"); } } class=class="str">"cmt">//+------------------------------------------------------------------+
「记住这一条就够了」
把 datetime、MqlDateTime、OnTimer 以及三个示例应用(NewBar、时间过滤器、tradeAtTime)串起来看,核心就一句:在 MT5 里时间不是字符串,是 1970 年起的秒数整数,所有过滤逻辑都建立在这个整数比较上。 你打开下载包里的 newBar.mq5(0.68 KB)跑一遍,就能验证「相邻两根 K 线间隔 = TimeCurrent() 减去上一根时间」这个判定;timeFilterApp2.mq5(1.12 KB)则演示了如何用 MqlDateTime 把小时分钟拆出来做交易时段屏蔽。 外汇与贵金属杠杆高、跳空频繁,时间触发器在重大数据发布前后可能漏触发,实盘前务必用策略测试器回放至少三个月 tick 数据。 剩下要做的只是把这套秒级时间骨架,套进你自己的进出场条件里——能跑通,这一节就没白看。