类似于iBarShift - 页 11

 
Nikolai Semko:

是的,对于一个标准函数来说,这其实是很奇怪的行为。毕竟,我们所处理的正是与它的 "基准 "相适应的数值。

MQL4的标准函数iBarShift,当请求的时间落入一个洞时,返回左边的条数(即本例中的星期六),而iBarShift3返回洞中的右边条数(即星期一),这更合理。

如果我们在洞里,返回左栏,即最后的已知值,但不返回未来,这是合乎逻辑的。

 
Vitaly Muzichenko:

如果我们在一个洞里,合乎逻辑的做法是返回左栏,即最后一个已知值,但不是未来。

对了,我没有想清楚。我把过去和未来混淆了)。可能是因为1(过去)>0(未来)。程式化。
 
Alain Verleyen:


在大多数情况下,这个函数返回错误的结果

PS: 是否需要发布英文版本或俄文翻译是正确的?

是的,翻译是正确的。

运行这个脚本,你会发现这些函数 产生的结果完全相同。

你能举个例子,说明这些函数的值在什么时间段是不同的吗?

顺便说一下,你的功能经常被误解。返回值为-1

2018.04.04 22:51:05.666 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:45:00
2018.04.04 22:50:46.867 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:46:00
2018.04.04 22:50:41.255 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:47:00
2018.04.04 22:50:23.496 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:45:00
2018.04.04 22:50:05.596 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:47:00
2018.04.04 22:48:38.638 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:47:00
附加的文件:
 
Alain Verleyen:

要求是将ONLY作为mql4的一个版本


你的函数在使用exact=true参数时不能正确工作。

这可以在这个脚本中看到。

这里是iBarShift函数的 一个完整的工作类似物,有确切的参数。

int iBarShift1(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   int Res=Bars(Symb,TimeFrame,time+1,UINT_MAX);
   if(exact) if((TimeFrame!=PERIOD_MN1 || time>TimeCurrent()) && Res==Bars(Symb,TimeFrame,time-PeriodSeconds(TimeFrame)+1,UINT_MAX)) return(-1);
   return(Res);
  }

没有这个参数,它可以简化为这种形式。

Bars(Symb,TimeFrame,time+1,UINT_MAX);
附加的文件:
 
Nikolai Semko:

是的,翻译是正确的。

运行这个脚本,你会发现这些函数 产生的结果完全相同。

你能举个例子,说明这些函数的值在什么时间段是不同的吗?

顺便说一下,你的功能经常被误解。返回值为-1

请认真对待。我的代码是针对mql5的。

它返回-1,因为Bars()函数在MT4下是不可靠的。

...   
   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);
     }
...

脚本在澳元兑美元的M5图表上运行。

这在MT5中没有发生。

 
Alain Verleyen:

请认真对待。我的代码是针对mql5的。

它返回-1,因为Bars()函数在MT4下是不可靠的。

脚本在澳元兑美元的M5图表上运行。

这在MT5中没有发生。

你说它应该像在MQL4中那样工作

但这个脚本也可以在MQL5上运行

2018.04.05 09:52:40.760 TestBarShift2 (EURUSD,M12)      PERIOD_M3  BarShift1 = -1  BarShift2 = 0    2018.08.10 18:39:49   exact = true
2018.04.05 09:52:40.760 TestBarShift2 (EURUSD,M12)      PERIOD_M10  BarShift1 = -1  BarShift2 = 0    2018.04.15 00:25:08   exact = true
2018.04.05 09:52:40.761 TestBarShift2 (EURUSD,M12)      PERIOD_M6  BarShift1 = -1  BarShift2 = 0    2018.04.21 04:26:03   exact = true
2018.04.05 09:52:40.761 TestBarShift2 (EURUSD,M12)      PERIOD_M15  BarShift1 = -1  BarShift2 = 0    2018.05.29 17:10:52   exact = true
2018.04.05 09:52:40.761 TestBarShift2 (EURUSD,M12)      PERIOD_M12  BarShift1 = -1  BarShift2 = 0    2018.09.16 13:10:33   exact = true
2018.04.05 09:52:40.762 TestBarShift2 (EURUSD,M12)      PERIOD_M10  BarShift1 = -1  BarShift2 = 0    2018.09.25 21:24:50   exact = true
2018.04.05 09:52:40.762 TestBarShift2 (EURUSD,M12)      PERIOD_M10  BarShift1 = -1  BarShift2 = 0    2018.05.30 20:04:10   exact = true
2018.04.05 09:52:40.762 TestBarShift2 (EURUSD,M12)      PERIOD_M5  BarShift1 = -1  BarShift2 = 0    2018.04.29 16:12:16   exact = true

如果exact=True和未来时间,你必须返回-1。

我的脚本也发现了一个奇怪的错误。

这个错误被这个检查所证实。

Print (iBarShift2(_Symbol,PERIOD_MN1,D'2015.12.31 21:03:54',true)); // -1
Print (iBarShift1(_Symbol,PERIOD_MN1,D'2015.12.31 21:03:54',true)); // 28
所以我对你的算法中存在异常情况 的看法毕竟是正确的。
附加的文件:
 

从我所做的所有分析中,我们可以得出结论,这个完全模拟的iBarShift。

int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   int Res=Bars(Symb,TimeFrame,time+1,UINT_MAX);
   if(exact) if((TimeFrame!=PERIOD_MN1 || time>TimeCurrent()) && Res==Bars(Symb,TimeFrame,time-PeriodSeconds(TimeFrame)+1,UINT_MAX)) return(-1);
   return(Res);
  }

是迄今为止最正确的,同时也是最快的,而且是最简单和最短的算法。

如果你不需要确切的参数,你可以使用简化版本。

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

或者直接使用这个等价的版本,而不调用该函数

Bars(Symb,TimeFrame,time+1,UINT_MAX);
还是我错了?
 
沉默是一种同意的表示。
 
Nikolai Semko:
沉默是一种同意的表示。

在ME中通过CTRL+SHIFT+F搜索了 "BarShift"。结果发现我没有使用类似的功能。显然,我自己不需要它。

曾经写过一个变体,可以在一行中把MT4的EA转换到MT5。似乎是写这篇文章的唯一原因。

我不与酒吧合作,不明白为什么其他人不这样做。

没有进入你的代码。但当你得到一个快速的解决方案时,总是很高兴。

 
fxsaber:

在ME中通过CTRL+SHIFT+F搜索了 "BarShift"。结果发现我没有使用类似的功能。显然,我自己不需要它。

曾经写过一个变体,将MT4的EA转换为MT5,只需一行。似乎是写这篇文章的唯一原因。

我不与酒吧合作,不明白为什么其他人不这样做。

没有进入你的代码。但当你得到一个快速的解决方案时,总是很高兴。

我明白你的意思,但与酒吧合作对我来说仍然很紧迫。也许有一天它也会成为我的一个基本功。