MQL5 中是否有测试 Candle Bar 收盘的函数?

Is there any function for testing Candle Bar closed in MQL5?

我在 MQL5 中尝试了以下代码但出现错误。我猜这段代码来自 MQL4。

代码:

int OnInit()
{
// if you don't want to execute on the first tick
  IsBarClosed(-1,false);
  return(1);
  if(!IsBarClosed(0,true)) // true/false here allows to keep old bar for check again later in the code and reset
      return(0);
}


//+------------------------------------------------------------------+
//| check if new bar has formed
//+------------------------------------------------------------------+
bool IsBarClosed(int timeframe,bool reset)
{
    static datetime lastbartime;
    if(timeframe==-1)
    {
        if(reset)
            lastbartime=0;
        else
            lastbartime=iTime(NULL,timeframe,0);
        return(true);
    }
    if(iTime(NULL,timeframe,0)==lastbartime) // wait for new bar
        return(false);
    if(reset)
        lastbartime=iTime(NULL,timeframe,0);
    return(true);
}

输出:

'iTime' - function not defined  testing lines and trdae.mq5     243     25
'iTime' - function not defined  testing lines and trdae.mq5     246     8
'iTime' - function not defined  testing lines and trdae.mq5     249     21
3 error(s), 0 warning(s)                4       1

请帮助我使用 MQL5 正确完成它。我正在尝试检测蜡烛条的收盘时间而不是开盘时间。我只想在酒吧关门的时候尝试一下。

  1. iTime() 函数在 MQl5 中不存在,仅在 MQL4 中存在。使用 CopyRates()SeriesInfoInteger(_Symbol,_Period,SERIES_LASTBAR_DATE).
  2. static 是 MQL4/5 中的关键字,具有非常特殊的属性。它的许多版本以下列方式工作:如果您将 ea 附加到图表,static 为零,然后更新。如果你重新连接 - 从零到实际。如果您更改 ea/ind 的时间范围或设置 - 静态保持不变(它不会取消初始化,不会变为零,然后变为实际值)。最早的 1000+ 版本的 MT4 就是这样工作的(从现在开始有两次更新)。也许有人发现此关键字在 mql4 中很有用,它允许将变量与其函数放在一起,而不是在全局变量中;当然记住上面的问题或者忽略它。但是没有理由在 MQL5 中使用这个词。如果您需要一组函数 - 创建一个 class 并保持所有变量与其相关。这样你就不会遇到没有重新初始化的静态变量的问题了。
  3. 酒吧收盘时间是个有趣的概念,我不太明白你的意思。如果您有一根柱线(例如,使用 MqlRates),您可以获得它的开盘时间。未报告关闭时间。你当然可以自己算(open time + PeriodSeconds(_Period)-1)。
  4. IsNewBar() 函数/ class 有一个重要的功能 - 它检查每个报价并说明新柱是否已经开始。可以判断新柱开始,因为 TimeCurrent() 或最后一个报价时间 >= 最后一个已知柱的时间 + 60*Period()。同时,无法判断柱是否已关闭(好吧,如果创建了新柱,则可以判断柱已关闭,这是唯一的方法)因为许多订单号可能会在之后到达那(即使在栏的最后一秒)。

我不知道为什么你需要在你的代码中重新设置参数,试试下面的方法:

datetime iTime=(datetime)(SeriesInfoInteger(_Symbol,Period(),SERIES_LASTBAR_DATE)/PeriodSeconds()*PeriodSeconds()); 

然后用 iTime 变量替换代码中的 iTime(),这可能会有所帮助