类似于iBarShift - 页 14

 
fxsaber:

那么我就不明白为什么巴斯认为18:00:01属于M1-bar 18:01而不是18:00。

而这里的逻辑和我的女儿现在已经是第二个生日了,尽管她一周前才满一岁,但这也是一个事实。或者说今天是2018年4月9日,虽然00年1月1日是2017年3个月零8天。

顺便说一下,TimeCurrent需要用SYMBOL_TIME代替。

谢谢!我真的不知道有这样一个标识符。

 

顺便说一下,当我通过与MQL4中的Bars基准进行比较来测试iBars 算法的正确性,随机尝试不同的变体时,我发现Bars中有一个错误。

Print(Bars(_Symbol,PERIOD_MN1,D'2005.08.31 00:00:00',D'2005.08.31 23:00:00')); // 1  должен быть 0, т.к. временной диапазон находиться внутри одного бара.
Print(Bars(_Symbol,PERIOD_MN1,D'2006.08.31 00:00:00',D'2006.08.31 23:00:00')); // 0

在MQL5中没有这样的错误。

当然,这并不重要,因为它只出现在时间框架=MN1,日期30和31,stop_time=23,而且只出现在2005年之前:))

这里是MQL4的脚本,可以捕捉到它,而iBars原来比本地Bars更有参考价值。

附加的文件:
TestiBars.mq4  10 kb
 
fxsaber:


顺便说一下,TimeCurrent应该由SYMBOL_TIME代替。

不,你不需要。
它不会增加正确性,因为TimeCurrent()对所有符号都是通用的,因为它返回所有符号的最后到达报价时间,而不是当前的时间。

同时,与TimeCurrent()相比,SymbolInfoInteger(symbol_name,SYMBOL_TIME)非常慢,每次调用iBars 都需要这个时间。

 

对于那些有兴趣的人。

iBars的编辑版本(类似于内置的Bars,只是没有小毛病,速度更快)。

修正了一些错误。

如果你注意到你的MQL5代码突然挂起10-20秒,并且有Bars函数,可能会返回0,那么我强烈建议用这个版本替换它。
它的工作速度会更快,而且没有挂起。

int iBars(string symbol_name,ENUM_TIMEFRAMES  timeframe,datetime start_time,datetime stop_time)
  {
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;
   static datetime LastTime0=0;
   static int PerSec=0;
   static int PreBars=0;
   static datetime LastBAR=0;
   static datetime LastTimeCur=0;
   datetime TimeCur;
   if(stop_time<start_time) {TimeCur=stop_time; stop_time=start_time; start_time=TimeCur; }
   TimeCur=TimeCurrent();
   if(LastTimeFrame!=timeframe) if(timeframe==PERIOD_MN1) PerSec=2419200; else PerSec=::PeriodSeconds(timeframe);
   if(timeframe<PERIOD_W1) TimeCur-=TimeCur%PerSec;
   if(start_time>TimeCur) {LastSymb=NULL; return(0);}
   if(LastTimeFrame!=timeframe || LastSymb!=symbol_name || ((TimeCur-LastBAR)>0 && TimeCur!=LastTimeCur))
      LastBAR=(datetime)SeriesInfoInteger(symbol_name,timeframe,SERIES_LASTBAR_DATE);

   LastTimeCur=TimeCur;
   if(PerSec==0) return(0);
   if(start_time>LastBAR)
     {LastTimeFrame=timeframe; LastSymb=symbol_name; return(0);}

   datetime tS,tF=0;
   bool check=true;
   if(timeframe<PERIOD_W1) tS=start_time-(start_time-1)%PerSec-1;
   else if(timeframe==PERIOD_W1) tS=start_time-(start_time-259201)%PerSec-1;
   else
     {
      PerSec=2678400;
      MqlDateTime dt;
      TimeToStruct(start_time-1,dt);
      tS=dt.year*12+dt.mon;
     }
   if(stop_time<=LastBAR)
     {
      if(timeframe<PERIOD_W1) tF=stop_time-(stop_time)%PerSec;
      else if(timeframe==PERIOD_W1) tF=stop_time-(stop_time-259200)%PerSec;
      else
        {
         MqlDateTime dt0;
         TimeToStruct(stop_time,dt0);
         tF=dt0.year*12+dt0.mon;
        }
      if(tS==tF) {PreBars=0; check=false;}
     }
   if((LastTimeFrame!=timeframe || LastSymb!=symbol_name || tS!=LastTime || tF!=LastTime0) && check)
      PreBars=Bars(symbol_name,timeframe,start_time,stop_time);
   LastTime=tS; LastTime0=(datetime)tF;
   LastTimeFrame=timeframe;
   LastSymb=symbol_name;
   return(PreBars);
  }
 
Nikolai Semko:

iBars的编辑版(类似于内置的Bars,只是没有小毛病,速度更快)。

修正了一些错误。

内置的Bars()被重载。

1. int Bars(const string symbol_name,ENUM_TIMEFRAMES timeframe)
2. int Bars(const string symbol_name,ENUM_TIMEFRAMES timeframe,datetime start_time,datetime stop_time)

你只有一个通话表格。

 
Artyom Trishkin:

内置的Bars()被重载。

你只有一个表格可以调用。

如果你需要一个简短的表格,使用内置的就可以了。那里几乎没有任何故障。

 
Nikolai Semko:

不,这是没有必要的。
它不会增加正确性,因为TimeCurrent()对所有符号都是通用的,因为它返回所有符号的最后到达报价时间,而不是当前时间。

与TimeCurrent()相比,SymbolInfoInteger(symbol_name,SYMBOL_TIME)非常慢,每次调用iBars都需要这个时间。

除了感兴趣的那个人之外,所有的角色都可以去做Cotypes。

好的,看了新的来源。看到讨论过的编辑,还没有进行。我不干了。

 
为什么开发商不自己做呢?
 
对于用户来说,调用一个函数并获得几个仪器的同步(时间对齐)的行数会更方便。
 
顺便说一下,关于Bars()函数。这可能是导致成交的原因