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

MQL5 IsNewBar函数忽略1970.01.01失效问题求助

MQL5新K线检测函数问题排查与修复

问题根源分析

你的需求核心是初始化阶段忽略时间为0的无效Tick,仅在首个完整新K线生成时返回true,原函数未实现该逻辑的常见原因:

  • 全局变量初始值为0,会把首次时间为0的Tick误判为“新K线”
  • 未区分「初始化后首个有效K线」和「后续新K线」的逻辑,无法过滤初始无效Tick并等待首个完整K线

修正后的IsNewBar函数

// 全局变量:记录上一次有效K线时间,标记是否完成首次有效K线初始化
static datetime lastBarTime = 0;
static bool isInitialized = false;

bool IsNewBar()
{
    datetime currentBarTime = iTime(_Symbol, _Period, 0);
    
    // 直接忽略时间为0的无效Tick
    if(currentBarTime == 0)
    {
        return false;
    }
    
    // 首次获取到有效K线时间,完成初始化但不返回true(等待下一个新K线)
    if(!isInitialized)
    {
        lastBarTime = currentBarTime;
        isInitialized = true;
        return false;
    }
    
    // 检测到新K线时更新时间并返回true
    if(currentBarTime != lastBarTime)
    {
        lastBarTime = currentBarTime;
        return true;
    }
    
    return false;
}

测试用OnTick代码

void OnTick()
{
    if(IsNewBar())
    {
        Print("首个完整新K线生成,当前K线时间:", TimeToString(iTime(_Symbol, _Period, 0)));
        // 此处添加你的新K线业务逻辑
    }
}

逻辑说明

  1. 用isInitialized标记初始化状态,彻底规避初始0时间Tick的干扰
  2. 首次获取有效K线时间时仅记录不触发返回,确保只有下一个新生成的K线才会返回true(即你需要的首个完整新K线)
  3. 后续Tick中,通过对比当前K线时间与历史记录,稳定检测新K线生成

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:08:17