You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

日线周期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()(服务器当前时间),会进一步加剧时间错位。

解决方法

  1. 用时间锚点替代索引获取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);
            }
        }
    }
    
  2. 将EA切换到H1周期运行
    如果策略核心依赖H1数据,直接在H1周期运行EA。此时iLow(NULL, PERIOD_H1, i)的索引就是直观的「当前H1 K线往前数i根」,完全避免跨周期对齐问题。

  3. 延迟触发时间
    若必须在日线周期运行,可将触发时间从8点延后几分钟(比如8:05),确保目标H1 K线已经生成并被平台计入已完成K线列表,此时索引就能正确指向今日的H1数据。

  4. 修正时间变量定义
    确保currentTime使用TimeCurrent()(服务器实时时间),而非Time[0](日线K线的开盘时间),避免时间判断逻辑基于日线K线时间而非实际当前时间。

内容的提问来源于stack exchange,提问作者mohaddese abbasi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 03:42:18