You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MQL5中是否有测试K线收线的函数?及代码报错求助

MQL5中判断K线收线的解决方案

嘿,我来帮你搞定这个问题!首先明确一点:MQL5里并没有内置的IsBarClosed()函数——这正是你运行MQL4代码报错的核心原因。不过别担心,我们可以用MQL5自带的函数实现完全相同的功能,甚至更灵活。

为什么你的代码报错?

你贴的代码里调用了IsBarClosed(),这个函数是MQL4独有的,MQL5的API里没有这个接口,所以编译器会直接报错。另外你的OnInit()函数里还有个小问题:return(1);语句之后的代码永远不会被执行,这会导致后面的收线判断逻辑完全失效,得调整一下顺序。

MQL5里判断K线收线的常用方法

我们可以通过对比K线的时间戳来判断是否收线,这里提供两种实用的实现方式:

1. 自定义IsBarClosed()函数(模拟MQL4行为)

如果你习惯了MQL4的调用方式,可以自己写一个替代函数,逻辑和MQL4的IsBarClosed()一致:

// 模拟MQL4的IsBarClosed函数,判断指定K线是否已收线
bool IsBarClosed(const int shift, const bool checkCurrent = true)
{
    datetime barTime = iTime(_Symbol, _Period, shift);
    datetime nextBarTime = iTime(_Symbol, _Period, shift - 1);
    
    // 如果是判断当前K线(shift=0),额外检查当前时间是否超过K线周期
    if(shift == 0 && checkCurrent)
    {
        return (TimeCurrent() >= barTime + PeriodSeconds(_Period));
    }
    
    // 对于历史K线,只要下一根K线存在(时间戳不同),说明当前K线已收线
    return (nextBarTime != barTime);
}

2. 直接在代码中判断(更轻量)

如果不需要封装函数,也可以直接在逻辑里写判断,比如:

// 判断当前K线(shift=0)是否已收线
bool currentBarClosed = (TimeCurrent() >= iTime(_Symbol, _Period, 0) + PeriodSeconds(_Period));

// 判断上一根K线(shift=1)是否已收线
bool lastBarClosed = (iTime(_Symbol, _Period, 1) != iTime(_Symbol, _Period, 2));

修正你的OnInit代码

结合上面的方法,修正你的初始化函数逻辑(注意调整return语句的位置):

int OnInit() 
{ 
    // 如果你不想在第一根tick执行,先判断上一根K线是否收线
    if(!IsBarClosed(1)) // 这里用shift=1代表上一根K线,对应MQL4的-1,可按需调整
    {
        return(0);
    }
    
    // 其他初始化逻辑...
    return(1); 
} 

// 自定义的IsBarClosed函数
bool IsBarClosed(const int shift, const bool checkCurrent = true)
{
    datetime barTime = iTime(_Symbol, _Period, shift);
    datetime nextBarTime = iTime(_Symbol, _Period, shift - 1);
    
    if(shift == 0 && checkCurrent)
    {
        return (TimeCurrent() >= barTime + PeriodSeconds(_Period));
    }
    
    return (nextBarTime != barTime);
}

注意事项

  • MQL5的shift索引和MQL4一致:0是当前最新K线,1是上一根,以此类推;
  • PeriodSeconds(_Period)可以获取当前时间周期的秒数,比如H1周期返回3600;
  • 如果是在EA的OnTick()里判断新K线,更常用的方法是记录上一次的K线时间,每次tick对比是否变化——这种方式比实时判断收线更高效。

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

火山引擎 最新活动