//найти бар на котором продали
Bar_sell_H4=Bars(Symbol(),PERIOD_H4,P_opentime,32000000000)-1;
if(Bar_sell_H4<=0)
{
Bar_time_sell_H4=Time_H4[0];
}
else
{
Bar_time_sell_H4=Time_H4[Bar_sell_H4];
}
int iBarShift1(conststring Symb,constENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
{
return(iBars(Symb,TimeFrame,time+1,UINT_MAX));
}
// ИЛИ БОЛЕЕ СОКРАЩЕННЫЙ БЕЗ ФУНКЦИИ:iBars(Symb,TimeFrame,time+1,UINT_MAX);
你说过,一切都应该在MQL4中工作。
但这个脚本也可以在MQL5中运行
在精确=True和未来时间的情况下,你应该返回-1
我的脚本也发现了一个奇怪的错误。
这个错误被这个检查所证实。
所以我对你的算法中存在异常情况 的看法毕竟是正确的。你终于发现了错误,这很好
我会去看看的,谢谢你。
大家晚上好。也许我误解了什么,但还是--不太清楚标准函数有什么问题,在Bars()的开头已经建议过了。我一直在使用它,它没有引起任何问题。唯一的问题是,在使用TimeCurrent() 时,你可能会遇到 "数组超出范围 "或负值,但这时你需要做一个检查。例子。
大家晚上好。也许我误解了什么,但还是--不太清楚标准函数有什么问题,在Bars()的开头已经建议过了。我一直在使用它,它没有引起任何问题。唯一的问题是,在使用TimeCurrent() 时,你可能会遇到 "数组超出范围 "或负值,但这时你需要做一个检查。例子。
从数字32000000000来看,这也是我的创作。UINT_MAX只是更短,看起来更牢固。))
关键是,事实证明,这种变体更正确。
而不是
几乎没有外部差异。但是上面的变量非常精确地重复了MQL4的标准iBarShift函数
从数字32000000000来看,这也是我的创作。UINT_MAX只是看起来更短,更稳固。))
关键是,事实证明,这种变体更正确。
而不是
几乎没有外部差异。但上面的变量非常精确地重复了MQL4的标准iBarShift功能。
那么,什么是最简单和正确的呢?
那么,什么是最简单、最正确的事情呢?
到目前为止,这个变体,但现在我想补充它,以绕过Bars 功能冻结的错误,关于这个问题,我已经向服务台报告。
这个错误的本质是,如果在Bars函数中,start_time 和stop_time 都在一个柱状体内或在未来(零柱的右边),那么这个函数会挂起超过10秒。
也许我以后会做一个适当的更快但更麻烦的版本。
我已经决定走一条不同的路。
我不会重做iBarShift,但会重做故障的Bars功能。
而新的iBars功能不仅会绕过打嗝的毛病,也会比原来的Bars更快。
其他人将能够使用这一功能,已经到位的算法将更快地工作。
我只是需要时间。我将在一天后才能够做到这一点。
我决定走一条不同的路线。
我不会重做iBarShift,但会重做故障的Bars功能。
而新的iBars功能不仅会绕过打嗝的毛病,也会比原来的Bars更快。
其他人将能够使用这一功能,已经到位的算法将更快地工作。
我只是需要时间。在某一天之前不会做。
非常好!期待着!
从我所做的所有分析中,我们可以得出结论,这个完全模拟的iBarShift。
是迄今为止最正确的,同时也是最快的,而且是最简单和最短的算法。
这很好,但有些东西让我感到困惑......
将不得不测试它 )
iBars功能相当麻烦,但我仍然建议使用它而不是普通的Bars,直到MQ修复了其中的挂起错误。
iBar在逻辑上应该返回0的时候却挂了。作为一项规则,它的返回时间超过10秒。在MQL4中没有这样的错误。
在大多数任务中,iBars会比普通的Bars工作得更快,因为它不仅会避免这个错误,而且由于保存前值的算法,尽可能不使用Bars 和SeriesInfoInteger函数。
我已经对这个功能进行了广泛的测试。它似乎是Bars的完整副本。
也许可以用一种更优雅的方式来完成。如果你有愿望,我们欢迎你。如果你发现错误,我们将予以纠正。
所以...
那么iBarsShift函数的完整类似物将有以下形式。
而没有最后一个参数的变体,在绝大多数情况下都会采用这种形式。
显示iBars功能与内置Bars和iBarShift功能相比性能的指标,来自@Alain Verleyen
功能执行时间,以微秒为单位。