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线业务逻辑 } }
逻辑说明
- 用
isInitialized标记初始化状态,彻底规避初始0时间Tick的干扰 - 首次获取有效K线时间时仅记录不触发返回,确保只有下一个新生成的K线才会返回true(即你需要的首个完整新K线)
- 后续Tick中,通过对比当前K线时间与历史记录,稳定检测新K线生成
内容的提问来源于stack exchange,提问作者Dragon
相关产品推荐
相关产品推荐

