使用iClose/iOpen时间序列访问等工作时的MQL5错误。

 
你好!
 

#属性tester_everytick_calculate 可能会解决问题?

MQL5:为自定义指标添加了新的属性 #属性 tester_everytick_calculate。它用在策略测试器中,允许强行启用每个tick的指标计算。

25.测试者:现在,在非视觉测试/优化期间,所有使用的指标(标准和自定义)都只通过请求数据来计算。一个例外是包含EventChartCustom函数的调用并使用OnTimer处理程序的指标以前,在策略测试器中,当任何一个tick出现时(甚至来自另一个符号),所有的指标都是无条件地计算。这一创新大大加快了测试和优化的速度。

要强制在每个tick计算指标,请在程序中添加#属性tester_everytick_calculate。

由以前版本的编译器编译的指标,将像以前一样计算--在每一个刻度。
 

也总是建议,如果你用另一个时间框架工作 - 那么每分钟你需要从这个时间框架获得OHLC(任何CopyXXXX功能)。

因此,它出来了--当与别人的时间框架一起工作时,没有必要使用iXXXXXX Atavisms,而是使用CopyXXXXXX功能。

 
Vladimir Karputov:

也总是建议,如果你用另一个时间框架工作 - 那么每分钟你需要从这个时间框架获得OHLC(任何CopyXXXX功能)。

因此,当与另一个时间框架一起工作时 - 你不需要使用iXXXXXX Atavisms, 但你必须使用CopyXXXXXX函数。

这并不严重!

那为什么:iHigh(Symbol(),TF,i)。

P.S.从mt4诞生的第一天起,一切都在顺利进行,为什么不在mt5中也这样做,这样就不会有任何手鼓声了?如果它在mt4中工作 - 那么它也有可能在mt5中工作。
 
Vitaly Muzichenko:

不是认真的!

那为什么:iHigh(Symbol(),TF,i)。

P.S. 在mt4中,从它存在的第一天起,一切都没有问题,为什么不在mt5中也这样做,这样就不会有手鼓了?如果它在mt4中工作 - 这意味着它也有可能在mt5中工作。

另外,我们一直建议,如果你用另一个时间段工作--你必须每分钟从这个时间段获得一次OHLC(任何CopyXXXX功能)。这种情况一直存在。

 
double high_k = NormalizeDouble(iHigh(Symbol(),TimeFrames, k),DigitsM);
double low_k = NormalizeDouble(iLow(Symbol(),TimeFrames, k),DigitsM);
double open_k = NormalizeDouble(iOpen(Symbol(),TimeFrames, k),DigitsM);
double close_k = NormalizeDouble(iClose(Symbol(),TimeFrames, k),DigitsM);

在通过RefreshRates更新报价之前,请尝试更新报价。

 
Dmitry Fedorchenko:

尝试事先通过RefreshRates刷新报价。

"RefreshRates "是一个不存在的函数。

 
Vladimir Karputov:

"RefreshRates "是一个不存在的函数。

我大约
https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/csymbolinfo/csymbolinforefreshrates

有一个类似的问题,只是在EA,它帮助了我。

 
Farkhat Guzairov:
该指标的MQL4版本已经工作了2年多,没有发现此类问题/错误。

没有CopyXXX会帮助你。这是一个MT5的bug,从build 30开始,从build 44开始就没有被修复。阅读https://www.mql5.com/ru/forum/285631/page29 的最后5-6页,你就不会感到孤独。

Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5
Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5
  • 2018.11.13
  • www.mql5.com
26 октября 2018 года будет выпущена обновленная версия платформы MetaTrader 5...
 
Farkhat Guzairov:

日安!

我目前正在将以前写的指标 从MQL4转移到MQL5。我没有跳过很多舞,一切似乎都很好,但....

在某些时候,指标数据停止更新,我无法找出错误的确切位置,只是偶然发现iClose/iOpen等停止更新,即它们返回相同的值。

有趣的是,即使我重新编译源代码,指标也不会正确更新,但我看到它执行的是函数。

只有当你打开指标的属性并通过 "Ok "关闭它时,数据才会被正确地更新和显示,但到某个时候可能会发生这种情况(但100%会发生)。在这种情况下,指标在2018.11.14 00:00停止更新数据,一般来说,它在一段时间后会定期发生。

早些时候又发现了一个错误,函数iBars(Symbol(),TimeFrames)/Bars(Symbol(),TimeFrames)返回零值。幸运的是,这不是一个持续的错误,但它仍然发生,我们必须控制它。

事实证明,MQ停止支持MQL4。 这很好,但MQL5会有这样的bug。

那么,如何解决上述问题?

1) 测量一个OnTick/OnCalculate计算的运行时间,以微秒为单位,并将其打印在日志中。

这样你就可以看到你在打勾计算上花了多少时间。然后估计在这个速度下,你每秒能计算出多少个刻度。你可能会发现不超过十几个虱子,而且每秒钟会得到更多的虱子。


2)测量附属于图表/时间框架的指标上的每个OnCalculate的时间,你从中提取数据。

可能有类似的情况。由于计算速度慢,终端会等待,直到计算出的符号:时间框架被解锁。正是这些缓慢的指标,特别是在深厚的历史上,导致了其他人的图表的报酬被冻结。


在制定指标时,你应该把绩效问题和经济上的重新计算放在首位。否则,你将杀死你周围的一切。

 
Renat Fatkhullin:

是制动指标,特别是在深层历史上,导致了其他人的图表被冻结。

然后告诉我,为什么冻结会发生在我身上?我有一个在指标查询功能之前冻结OnTick的输出,即M1的CopyTime 更新作为一个触发器,启动OnTick的其他处理,但在CopyTime之前,没有任何功能或指标查询。

而为什么在Build 30之前没有这样的问题,而从2017年10月开始,一切工作都很正常?

原因: