是否有任何功能可以测试在MQL5中关闭的Candle Bar?

时间:2018-03-30 06:11:13

标签: mql4 mql5 metatrader5

我在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 个答案:

答案 0 :(得分:0)

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

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

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