MQL5 编程基础:时间(基础篇)
「MQL5 里时间是怎么算的」
MQL5 中所有时间都以 1970-01-01 00:00 为起点的 Unix 时间戳(datetime 类型)表示,单位是秒。读取 K 线时间用 iTime(),读取当前服务器时间用 TimeCurrent(),两者差即行情延迟或周期跨度,可直接用于条件判断。
实际写 EA 时最容易踩的坑是本地时间与经纪商服务器时间不一致。比如 GMT+2 平台的日 K 收盘与 GMT+3 平台差一小时,回测和实盘信号可能因此错位,贵金属与外汇品种在夏令时切换时尤其明显,属于高风险细节。
下面这段取最近一根已完成 K 线开盘时间并换算成可读字符串,复制到 MT5 的脚本里就能跑:
class="type">class="kw">datetime barTime = iTime(_Symbol, PERIOD_H1, class="num">1); class="type">class="kw">string str = TimeToString(barTime, TIME_DATE|TIME_MINUTES); Print("Last closed H1 bar opened at: ", str);
◍ MQL5 时间处理到底要讲什么
这一节先把整篇关于时间的知识地图摊开,方便你后面在 MT5 里逐块验证。从时区、夏令时到 MQL5 内部的时间标准,再到日期时间格式和各类取数函数,都是实盘里容易踩坑的地方。 目录里列了确定当前服务器时间、本地时间,以及 TimeToString / TimeToStruct 这类格式化与分量拆解函数;也包含 CopyTime 的三个重载版本,用来按不同维度拉取 K 线时间数组。 后半段偏向实战工具:支点指标的两个备选写法、判断日内时间点、统计一周交易天数与交易时段,还有策略测试器中时间函数的特殊表现。跟着这条清单开 MT5 一个个跑,比通读文档来得快。 外汇与贵金属杠杆高、跳空频繁,时间错一位可能导致信号整体偏移,所有结论都只是概率倾向,请以自己回测为准。
时间处理到底卡在哪
MQL5 里处理时间的函数本身不难,但真实盘面上的时间坑比函数多。常见任务就两类:在指定时间点触发动作(比如每天固定时刻、某周几、或绝对日期时间),以及在某个时间区间内开关逻辑(日内时段、跨天时段、指定日期范围)。 真正的麻烦来自报价环境而非语法。短周期 M1、M5、M15 上常因无价格变动而缺柱,长周期也偶发;部分交易中心的周日柱实际算作周一;周末结构里周五直接连周一,但有些中心整个周末都在连续报价。再加上服务器与本地时区差、夏令时切换,时间点计算很容易偏。 外汇和贵金属属高风险品种,这类时间错位可能导致 EA 在非预期时段下单。建议开 MT5 随便拖一个 M1 图表,数一下周末前后缺了几根柱,先建立直观认知再写代码。 这篇内容较长,刚接触 MQL5 的新手别想一次吞下,拆三天以上慢慢验证更稳。
「为什么MT5里的“一天”不是星空里的真一天」
做跨周期回测时,很多人直接拿 24 小时当一根日线,却没意识到这个时间刻度本身是人造的。地球绕自轴相对恒星转一圈是恒星日,长度 23 时 56 分 4 秒;而相对太阳转一圈的太阳日更长,因为地球在自转同时还绕太阳逆时针公转,必须多转一点才正对太阳。 我们用的 24 小时制建立在太阳日上,一年里的太阳日数不是整数,而是 365 天零 6 小时。所以历法每四年补一天(2 月 29 日),但补法仍不精确:整百年(100 倍数)不闰,除非同时是 400 倍数。1900 年不是闰年,2000 年是,2100 年也不是,下一个百年闰年是 2400 年。 对外汇和贵金属交易者来说,这直接意味着:用 MT5 的 D1 周期做多年季节性统计,2 月天数跳变和百年非闰会让“每年相同日历日”的样本数不一致。开 MT5 调出 1999–2001 的日线,数一下 2000 年 2 月是不是 29 根,就能验证这套历法规则对 K 线计数的真实扰动。
◍ 时区怎么切分,为什么外汇日历会错位
地球自转带来昼夜,但交易用的“时间”是被人为切过的。按经度把圆周 360 度均分成 24 份,每份 15 度算一个时区,这是最原始的几何定义。 实际边界并不严格沿经线走,而是顺着国界、行政区划线,所以同一个经度的城市可能分属不同时区。基准是本初子午线(格林威治),其标准时间向两侧各扩 7.5 度,向东 +1 到 +12、向西 -1 到 -12。 注意一个易错点:-12 与 +12 之间只有 7.5 度宽,不是 15 度,它们夹在 180 度经线两侧的“国际日期变更线”附近。若格林威治是 12:00,则 -12 区是当日 00:00,而 +12 区已是次日 00:00——钟面相同,日期已跨天。 现实里 -12 区基本不用,由 +12 替代;-11 也被 +13 顶上。萨摩亚(+13)因与日本经贸紧密,宁可与东京更接近也不跟自家西边对齐。还有 -04:30、+05:45 这种非整点时区。Windows 时间设置里能拉出全量列表,开 MT5 前先确认平台服务器时区,否则回测里的“昨日收盘”可能和你本地差一天。外汇与贵金属杠杆高、跳空频繁,时区误读会直接干歪你的日内统计。
交易时段随夏令时跳格
全球约 80 个国家实行夏令时,但切换节奏并不统一,这直接改写了主要市场的重叠窗口。欧美在 3 月切夏令时、10–11 月退回标准时;澳洲新西兰在南半球夏季反向操作,流动性高峰会整点错位。 美国在三月份第二个周日 02:00 拨快、十一月第一个周日 02:00 拨回。欧洲则是三月最后一个周日 02:00 进夏令时、十月最后一个周日 03:00 退,且全欧按各自时区同步跳变:伦敦 02:00、柏林 03:00 同时触发。 俄罗斯 2011 年 3 月 27 日最后一次拨快后未再回拨,等于永久留在夏令时偏移上。日本不实行,东京时段与欧美重叠关系全年固定。 开 MT5 看「市场观察」里 XAUUSD 的纽约–伦敦重叠成交量:每年 3 月第二个周一起,重叠起点大概率从北京时间 20:00 提前到 19:00,外汇与贵金属跳空和滑点分布随之变化,属高风险品种需自行核对。