类似于iBarShift - 页 7

 

这里是所有TFs上最快的、正确的工作版本。

int iBarShift3(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time)
  {
   static int Res=-1;
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;
   static int PerSec=::PeriodSeconds(LastTimeFrame);

   if(LastTimeFrame!=TimeFrame) PerSec=::PeriodSeconds(TimeFrame);
   if(TimeFrame<PERIOD_D1) time-=time%PerSec;

   if((time!=LastTime) || (Symb!=LastSymb) || (TimeFrame!=LastTimeFrame))
     {
      Res=::Bars(Symb,TimeFrame,time,UINT_MAX);
      if(TimeFrame<PERIOD_D1) Res--;
      if(Res<0) Res=0;

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }

   return(Res);
  }

TF D1、W1和MN1的速度减慢了

这里有一个测试指标,清楚地显示了不同版本的反应,以及它们的速度(第二个数字。 数字越小,功能越快)。


第3版和第4版都能正常工作。但第3个更快。

带有CopyTime的变体是最慢的。

这可以在MQL4中检查(见所附指标)。

我没有说明不同变体的作者,因为我已经被搞糊涂了。
但第三个最有用的方法是80%来自@fxsaber。我只是稍微调整了一下。

附加的文件:
 
Nikolai Semko:

选项3和4都能正确工作。但3是最快的。CopyTime的变体是最慢的。

关于交易、自动交易系统和策略测试的论坛

关于 "交易者的生活秘诀:将ForEach混入定义中(#define)"的讨论

fxsaber, 2018.02.14 11:58

ZZY功能速度测量应该在一个对性能很重要的环境中进行测量--测试者。

 
fxsaber:

测量结果在这里其实并不重要。你可以看到,该逻辑是最快的。

 
Nikolai Semko:

这里是所有TFs上最快的、正确的工作版本。

TF D1、W1和MN1的速度减慢了

这里有一个测试指标,清楚地显示了不同版本的反应,以及它们的速度(第二个数字。 数字越小,功能越快)。


第3版和第4版都能正常工作。但第3个更快。

带有CopyTime的变体是最慢的。

可以在MQL4中检查(见所附指标)。

我没有指出不同变体的作者,因为我已经很困惑了。
但第三种,最有效的变体是80%来自@fxsaber。我只是稍微调整了一下。

我已经在你的指标中加入了TF--前两种算法根本没有用。

在数字中,目前的TF是H1,计算是基于每日费率。



 
Renat Akhtyamov:
是的(强调)。

-1是一个1的减号(澄清),由错误函数返回,表示没有这样的酒吧

所以我的函数

还需要完善

虽然...

文件。

"注意

如果在调用Bars() 函数时,具有指定参数的时间序列的数据尚未在终端生成,或者在调用函数的时刻,时间序列的数据没有与交易服务器同步,那么 函数 将返回0值。"

====

如果res==0,那么我们将从函数中捕获-1,因为它是。

===

因此,这一切都很有效,利用它来发挥你的优势吧!

在上面的指标上,你可以清楚地看到这种方法是多么错误。

 
Nikolai Semko:

这里是所有TFs上最快的、正确的工作版本。

TF D1、W1和MN1的速度减慢了

这里有一个测试指标,清楚地显示了不同版本的反应,以及它们的速度(第二个数字。 数字越小,功能越快)。


第3版和第4版都能正常工作。但第3个更快。

带有CopyTime的变体是最慢的。

可以在MQL4上检查(见所附指标)。

我没有说明不同变体的作者,因为我已经被搞糊涂了。
但第三种,最有效的变体是80%来自@fxsaber。我只是稍微调整了一下。

iBarShift3 变体不能正常工作

 

这是我的版本。似乎对初级和高级框架都有效。速度比iBarshift3快一点。


int iBarShift(string symbol, ENUM_TIMEFRAMES timeframe, datetime time){

datetime t1 = TimeCurrent()+10000000;

int ps = PeriodSeconds(timeframe);

double div = time/(double)ps;

double mant = div - MathFloor(div)。

int ret = Bars(symbol, timeframe, (datetime)(time(ps*mant)), t1)-1;

return(ret)。

}

 
Vitaly Muzichenko:

iBarShift3 选项不能正确工作

我可以有一个不能正常工作的例子吗?

那么就只剩下第四个方案了?

 
Vitaly Muzichenko:

iBarShift3 选项不能正常工作

词汇是我们的一切。

 
Nikolai Semko:

词汇是我们的一切。

我做了一个快速检查:有一个函数已经工作了一天多,我用iBarShift3 代替,得到的EA工作不正确。这就是我得出的结论。

这是我使用的一种方法

int iBarShift(string symbol,ENUM_TIMEFRAMES timeframe,datetime time,bool exact=false) {
 datetime LastBAR;
  if(!SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE,LastBAR)) {
   datetime opentimelastbar[1];
    if(CopyTime(symbol,timeframe,0,1,opentimelastbar)==1)
      LastBAR=opentimelastbar[0];
    else
      return(-1);
  }
//--- if time > LastBar we always return 0
  if(time>LastBAR)
    return(0);
//---
 int shift=Bars(symbol,timeframe,time,LastBAR);
 datetime checkcandle[1];

  if(CopyTime(symbol,timeframe,time,1,checkcandle)==1) {
   if(checkcandle[0]==time)
     return(shift-1);
   else if(exact && time>checkcandle[0]+PeriodSeconds(timeframe))
     return(-1);
   else
     return(shift);
  }
  return(-1);
 }