了解如何在MQL5中处理日期和时间·综合运用
⏱️

了解如何在MQL5中处理日期和时间·综合运用

(3/3)·从datetime到tradeAtTime,用三篇篇幅把时间维度真正接进你的EA与指标

偏理论 第 3/3 篇

不少交易者把时间当成图表上的背景刻度,直到EA在跨周末跳空或夏令时切换时乱单才意识到datetime不是简单字符串。MQL5里时间以Unix秒存储,比较与运算都围绕这个数轴展开,理解偏差会直接翻译成账户里的异常成交。

时间过滤器下的静默日志

在 EA 的主循环里,若当前时间落在禁止交易区间,程序不会下单,而是直接打印一条提示:Trading is inactive based on time filter。 这条日志本身不产生任何订单操作,只是让用户在 MT5 的 Experts 标签页里确认策略因时间规则暂停。实盘中美盘休市前后常触发,属于无风险的状态反馈。 把该判断分支接在 OrderSend 之前,可以避免在非流动性时段误触手续费与滑点。打开 MT5 回放一段伦敦午休行情,就能看到这条输出稳定出现。

MQL5 / C++
   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 出日志便于肉眼核对。

MQL5 / C++
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 数据。 剩下要做的只是把这套秒级时间骨架,套进你自己的进出场条件里——能跑通,这一节就没白看。

把时间诊断交给小布盯盘
这些时间相关的异常排查,小布盯盘的AIGC已内置,打开对应品种页即可看到会话时段冲突与定时器状态的提示,你只需聚焦策略本身。

常见问题

datetime内部以Unix秒计,基准是1970-01-01 GMT,打印或转换时才会按终端时区呈现,写跨时区逻辑要显式处理。
OnTimer靠定时器毫秒触发,精度高但耗资源;NewBar靠柱体闭合判断,更轻量,定时不苛刻时倾向用后者。
用静态变量记录上次执行日期时间,或在时间过滤器里限定唯一窗口,防止同根柱内多次进入交易分支。
可以,小布盯盘的品种页会标记会话段冲突与定时器空转之类问题,省去你手动翻日志核对时间逻辑。
那是回归年的近似秒数,考虑了闰年漂移,做长期时间跨度运算时用它比硬编码365天更贴近真实日历。