类似于iBarShift - 页 9

 
Alain Verleyen:

你发现了什么问题?

下面是一个你的函数在 "BarShift1 "名称下虚假工作的例子


 
Aleksey Vyazmikin :

下面是一个你的函数虚假工作的例子--它在 "BarShift1 "的名字下工作。


事实上,它只显示了相反的情况,我的版本是唯一正确的。(而这段代码 中原来的iBarShift1是正确的)。

我的版本被设计成一个独立的功能,就像mql4的iBarShift

它没有针对多次查询进行优化,所以时间比较是不相关的。@nicholishen 发表了一个 为大量调用而优化的好库


事实上,它显示的只是反面,我的版本是唯一正确的。(同时这段代码 中的原iBarShift1也是正确的)。

我的版本被设想为作为一个独立的功能,与mql4 iBarShift 完全一样。

它没有针对多个请求进行优化,所以时间比较是不相关的。@nicholishen 发表了一个很好的库,为批量调用进行了优化。

iBarShift
iBarShift
  • 投票: 46
  • 2013.10.25
  • Alain Verleyen
  • www.mql5.com
Многие ищут функцию iBarShift, которая была в языке MQL4 (например, 1,2,3). В языке MQL5 ее нет, но есть все возможности для ее реализации в виде библиотеки. В качестве альтернативы многие программисты предложили свои варианты реализации этой функции на MQL5. Обнаружилось, что все 4 версии содержат ошибки (не воспроизводят в точности работу...
 
Alain Verleyen:

事实上,它只显示了相反的情况,我的版本是唯一正确的。(而这段代码 中原来的iBarShift1是正确的)。

我的版本被设计成一个独立的功能,就像mql4的iBarShift

它没有针对多次查询进行优化,所以时间比较是不相关的。@nicholishen 发表了一个 为大量调用而优化的好库


事实上,它显示的只是反面,我的版本是唯一正确的。(同时这段代码 中的原iBarShift1也是正确的)。

我的版本被设想为作为一个独立的功能,与mql4 iBarShift 完全一样。

它没有针对多个请求进行优化,所以时间比较是不相关的。@nicholishen 发表了一个很好的库,为批量调用进行了优化。

我不是在说处理时间,我是在说条数。

在图片中,你可以看到,在8:37,代码认为最近的酒吧是前一天23:00的酒吧,但实际上最近的酒吧是10:00。它在数学和逻辑上都比较接近。

 
Aleksey Vyazmikin:

我说的不是处理时间,我说的是酒吧的数量。

图片显示,在8:37,代码认为最近的条形是前一天23:00的条形,但实际上最近的条形是10:00。他在数学和逻辑方面都比较接近。

让我们把它简化一下。

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

类似于iBarShift

Alain Verleyen, 2018.04.05 00:18

事实上,它只显示了相反的情况,我的版本是唯一正确的。(而这段代码 中原来的iBarShift1是正确的)。

我的版本被设想为一个独立的功能,就mql4 iBarShift 一样。

试试mql4,比较一下,同样的情况。
 
Alain Verleyen:
让我们把它简化一下。
试试mql4,比较一下,同样的情况。

我明白你的论点。我不会检查它。显然,是我的任务与公认的逻辑不同。

 
Alain Verleyen:

你发现了什么问题?

我很久以前就写过这个。我已经不记得了,但有些东西让我感到困惑。
不管怎样,现在我只发现了一种异常情况。
当尚未加载的符号数据可能返回-1,而应该返回0。

这可以用我所附的MQL4的脚本来检查。

这个脚本采取随机的时间和随机的时间框架。如果iBarShiftX的值与常规的iBarShift函数 不匹配,则通过Print发送消息。

如果你在一个新打开的符号上运行这个脚本,你会看到错误。在同一个符号上重新运行脚本,不会出现错误。

但这是一件小事。在我的版本中也有同样的问题。

我对你的版本只有一个抱怨:它非常复杂和缓慢。

这里是你的变体。

int iBarShift2(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)
      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);
  }

这是我的函数,它做同样的事情,但算法简单,速度更快。

  int iBarShift1(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time)
  {
   return(Bars(Symb,TimeFrame,time+1,UINT_MAX));
  }

你可以用一个更短的,没有功能的。

Bars(Symb,TimeFrame,time+1,UINT_MAX);

试图证明这一点。找到一个单一的参数组合,当你的函数和我的函数会显示不同的值。

只是我没有实现其中的最后一个参数,因为我不明白为什么需要它。我个人从不需要它。

但如果有人真的需要,就可以实施。

我留下了iBarShift3的变体,因为它不正确地处理了历史漏洞。它可以被修复,但我不认为有什么意义,因为上面的选项已经足够了。

附加的文件:
 
Nikolai Semko:


我留下了iBarShift3选项,因为它不能正确处理历史漏洞。它可以被修复,但我不认为有什么意义,因为上面的选项已经足够了。

窟窿是因为酒吧里没有亲友交易,还是其他的?而且,这种不准确是如何表现出来的?

 
Aleksey Vyazmikin:

窟窿是由于酒吧里缺乏亲情交易,还是其他?那么不准确的地方在哪里呢?

让我们把没有交易的星期天作为任何时间。

Print("iBarShift  = "+IntegerToString(iBarShift (_Symbol,PERIOD_H1,D'01.04.2018 10:00:00')));  
Print("iBarShift3 = "+IntegerToString(iBarShift3(_Symbol,PERIOD_H1,D'01.04.2018 10:00:00'))); // показывает на единицу меньше
 
Nikolai Semko:

假设我们把星期天作为没有交易的任何时间。

所以它显示的是星期一?这就是我想要的...:)

 
你为什么不试试我的功能呢?那里有一个解决方案,在时间上中和了酒吧的开始和结束。它似乎能正确计算一切。而且在时间上比你的最快版本3还要快。还是分支更重要?)还是那里也有错误?)我已经用了很久了....