日线周期EA调用iLow获取H1周期K线低点为何返回昨日数据?
问题分析与解决:日线EA获取H1周期K线时的时间错位问题
核心原因
你的EA运行在日线周期,但调用iLow(NULL, PERIOD_H1, i)时,MQL的跨周期索引是基于当前EA运行周期的「当前K线」来对齐的,而非直觉中的H1周期实时K线:
- 当你在8点触发逻辑时,今日的H1 K线可能还未完全生成(或平台时间对齐逻辑导致),此时
iLow会回溯到昨日已完成的H1 K线填充索引,所以拿到的是昨日数据。 - 换其他时间触发时,今日已经生成了足够的H1 K线,索引就会对应今日的K线,因此时好时坏。
- 另外,代码中
currentTime变量未定义,若误用Time[0](日线K线的开盘时间)而非TimeCurrent()(服务器当前时间),会进一步加剧时间错位。
解决方法
用时间锚点替代索引获取H1数据
跳过跨周期索引对齐的坑,直接通过指定H1 K线的起始时间来获取对应低点:tradeTime = D'08:00:00'; void OnTick() { datetime currentTime = TimeCurrent(); if (TimeHour(currentTime) == TimeHour(tradeTime) && TimeMinute(currentTime) == TimeMinute(tradeTime) && tradeFlag == 1) { datetime today = currentTime - (currentTime % 86400); // 获取今日0点整时间 for(int i = 1; i <= 7; i++) { datetime targetH1Time = today + i * 3600; // 计算第i根H1 K线的起始时间 double low = iLow(NULL, PERIOD_H1, targetH1Time); Print(low); } } }将EA切换到H1周期运行
如果策略核心依赖H1数据,直接在H1周期运行EA。此时iLow(NULL, PERIOD_H1, i)的索引就是直观的「当前H1 K线往前数i根」,完全避免跨周期对齐问题。延迟触发时间
若必须在日线周期运行,可将触发时间从8点延后几分钟(比如8:05),确保目标H1 K线已经生成并被平台计入已完成K线列表,此时索引就能正确指向今日的H1数据。修正时间变量定义
确保currentTime使用TimeCurrent()(服务器实时时间),而非Time[0](日线K线的开盘时间),避免时间判断逻辑基于日线K线时间而非实际当前时间。
内容的提问来源于stack exchange,提问作者mohaddese abbasi
相关产品推荐
相关产品推荐

