错误、漏洞、问题 - 页 570

 

方案属性(#property)

tester_indicator

string

Имя пользовательского индикатора в формате "имя_индикатора.ex5". Необходимые для тестирования индикаторы определяются автоматически из вызова функций iCustom(), если соответствующий параметр задан константной строкой. Для остальных случаев (использование функции IndicatorCreate() или использование неконстантной строки в параметре, задающем имя индикатора) необходимо данное свойство

tester_file

string

Имя файла для тестера с указанием расширения, заключенное в двойные кавычки (как константная строка). Указанный файл будет передан тестеру в работу. Входные файлы для тестирования, если необходимы, должны указываться всегда

tester_library

string

Имя библиотеки с расширением, заключенное в двойные кавычки. Библиотека может быть как с расширением dll, так и с расширением ex5. Необходимые для тестирования библиотеки определяются автоматически. Однако, если какая-либо библиотека используется пользовательским индикатором, то необходимо использовать данное свойство

 
谢谢你。
 

在XAUUSD模拟账户 的滴答图上(在市场概览中),有一个持续的重置。

还有。

打开 "细节",将鼠标放在空处。

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете - Документация по MQL5
 
gumgum:

在XAUUSD模拟账户 的滴答图上(在市场概览中),有一个持续的重置。

还有。

打开 "细节",将鼠标放在空处。

我不太清楚永久重置是什么意思。

什么操作系统,什么操作系统和终端容量?

 
Rosh:

学习,因为它 文件的写作中说-技术指标

这意味着在指标第一次 启动时(第一次 切换 到新的时间框架时),指标值还没有被计算,因此prev_calculated=0。当你返回 到这个时间框架时,指标不会再被创建,因为它的句柄仍然是活的。因此,prev_calculated!=0

我正准备接受你的承诺,但我改变了主意。我对外得到的结果几乎可以说,一切并不总是那么顺利,也有一些例外......。但我仍然不明白,他们,这些例外情况,是否与把手有关,还是其他什么障碍?

"注意: 如果OnCalculate函数返回一个空值,指标值不会显示在客户终端的DataWindow中。" 我赶紧向你保证:如果我已经设法将我头脑中的结果与文件正确联系起来,并自己解释所产生的效果,那就更糟糕了。不仅是指标值不显示--整个指标停止工作,命令队列冻结,你无法等待下一个命令被处理。事实上,这是我在以前的一些文章中设法瞥见的。

正如已经提到的,该代码有很多Copy......不涉及句柄的,(即除了CopyBuffer 以外的一切)。如果复制的结果<=0,我们会得到return(0),之后"指标停止工作",指标得到全面瘫痪。

我想提醒你,最初的不画与随之而来的瘫痪发生在终端的无窗口模式下(即在周末或离线)。不要认为它不重要,因为没有人愿意在周末调试他们的指标,做不必要的手势,跑完时间框架,人为地--手动地--启动第一次绘图。而且这不仅仅是关于调试的问题。

说实话,我没有足够的心思把好心人提供的链接与文档中的例子联系起来,其中说到要增加对已经存在的手柄的引用计数器(以及与其他给出的答案)来解决现有的问题。我认为它根本没有从那里成长起来。

试着在以下条件下重现所附代码:代码中预设的时间框架是D1,终端中的当前时间框架是D1,终端处于离线模式。当指标被附加到指定的当前时间框架的图表上时,记录的结果将立即出现在专家标签中。

现在完全卸载终端,重新启动,并切换到D1 以外的时间框架。把指标--在你切换到任何其他(不一定是D1)时间框架之前,它不会改变。

由于这个令人不快的特点,一个好的想法随着承保的指标而消失了。

我相信开发人员可以为该指标的这种行为找到解释,但这是不公平的,当用户在该时间段时,TF主定义的数据可以完美显示,但如果他在另一个时间段,他必须做不必要的运动。在使用外部指标的手柄时,我支持时间框架的平等,其他TFs没有任何罪过。

P.S.: 所以...等等。我又检查了一次--事实证明,CopyHigh 甚至不影响这种瘫痪。现在我根本不明白什么。我所有的怀疑突然落在了OnInit 的一个手柄上......。

P.P.S.:添加了第二个代码例子--即使它没有反应。

附加的文件:
paralich.mq5  3 kb
paralich2.mq5  2 kb
 

问题的边界已经找到。

评论一下吧。

   SetIndexBuffer(0,FractalUpBuffer,INDICATOR_DATA);
   PlotIndexSetInteger(0,PLOT_ARROW,217);
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ArrowShift);

- 而问题就会消失,但这时就清楚地表明,通过SetIndexBuffer 的缓冲区绑定偶尔是不正确的。而这已经表明需要放弃使用 SetIndexBuffer ,而采用手动操作被监控的缓冲区的大小

此外,所附的例子明显表明BarsCalculated(handle)无法 及时计算 任何当前TF上被调用指标的值,除非它与预设的 值相吻合 ,或者原则上不愿意在第一时间计算任何东西(最可能是这种变体)。 在这种情况下,值将是<=0,返回(0)并作为结果停止。

附加的文件:
 
alexvd:

不太清楚永久重置的含义。

什么操作系统,什么操作系统和终端位?

W7和MT5 64位。

例子。

XAUUSD总是重设为起点(XAGUSD是一个比较)。

 
x100intraday:

找到问题的边界。

评论一下吧。

- 而问题将消失,但那时它将清楚地表明,通过SetIndexBuffer 偶尔会出现不正确的缓冲区绑定。而这已经表明需要放弃使用 SetIndexBuffer ,而采用手动操作被监控的缓冲区的大小

此外,所附的例子显然表明BarsCalculated(handle)无法及时计算任何当前TF上被调用指标的值,除非它与预设的值相吻合。在这种情况下,值将是<=0,返回(0)并作为结果停止。

对于第一个例子(没有看第二个例子),paralich指标有一个函数

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers(double &up_arrows[],datetime &up_times[],int ind_handle,int amount)
  {
   if(CopyBuffer(ind_handle,0,0,amount,up_arrows)<0) return(false);
   else CopyTime(_Symbol,PERIOD_D1,0,amount,up_times);

   return(true);
  }

所以,想象一下,你的指标是在D1,你试图从H1时间框架复制数据到它的指标缓冲区。元素的数量将不匹配。我想这就是你的问题所在--在复制数据之前没有检查。

每个技术指标的帮助中都有从其他时间段获取数据的指标实例。例如,https://www.mql5.com/ru/docs/indicators/iama。

//--- узнаем количество рассчитанных значений в индикаторе
   int calculated=BarsCalculated(handle);
   if(calculated<=0)
     {
      PrintFormat("BarsCalculated() вернул %d, код ошибки %d",calculated,GetLastError());
      return(0);
     }
//--- если это первый запуск вычислений нашего индикатора или изменилось количество значений в индикаторе iAMA
//--- или если необходимо рассчитать индикатор для двух или более баров (значит что-то изменилось в истории)
   if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
     {
      //--- если массив iAMABuffer больше, чем значений в индикаторе iAMA на паре symbol/period, то копируем не все 
      //--- в противном случае копировать будем меньше, чем размер индикаторных буферов
      if(calculated>rates_total) values_to_copy=rates_total;
      else                       values_to_copy=calculated;
     }
   else
     {
      //--- значит наш индикатор рассчитывается не в первый раз и с момента последнего вызова OnCalculate())
      //--- для расчета добавилось не более одного бара
      values_to_copy=(rates_total-prev_calculated)+1;
     }
Документация по MQL5: Технические индикаторы / iAMA
Документация по MQL5: Технические индикаторы / iAMA
  • www.mql5.com
Технические индикаторы / iAMA - Документация по MQL5
 
x100intraday:

试着在以下条件下重现所附代码:代码中预设的时间框架是D1,终端中的当前时间框架是D1,终端处于离线模式。当一个指标被附加到指定的当前时间框架的图表上时,记录的结果 将立即出现在专家标签中。

一般来说,你是否尝试过使用调试而不是记录,以避免得到大量的信息?MetaEditor的帮助程序开发调试
 
Rosh:

所以想象一下,你的指标是在D1,你正试图从H1时间框架复制数据到它的指标缓冲区。元素的数量将不匹配。我想这就是你的问题所在--在复制数据之前没有检查。

首先我要澄清:通过Copy...-functions 复制数值时,数组溢出的情况不是在客户终端的专家中引起溢出错误"Array out of range"吗?我记得这样的信息有时是在编译成功后产生的,而指标正在工作,但我不能确切地说。我认为这不是在Copy...-function 上,而是在对一个不存在的索引或类似东西的引用上。

第二,我赶紧向你保证,你关于没有检查的假说并不完全正确。它可能只说到不正确地生成了if-else-filter,但不说到它完全没有。我已经跌跌撞撞地走了十几次。最近,我在这里或 "傻瓜 "中提出了一个问题,即关于与目前不同的时间框架的比率_总数 的模拟,但我没有收到任何人的答复。问题是rate_total 是当前时间段的参数之一,对我来说绝对是无用的,因为我用很多其他时间段工作,如果我碰巧使用预设的时间段之一,我仍然使用universalcalculated=BarsCalculated(handle)进行计算而不是rate_total。也许我犯了一个大错误,但我看不出rate_total 对这个任务有什么用。

第三,我早就能做到,身处高位TF,我可以成功复制和重新分配低位TF的价值,反之亦然。我几天前举的那些例子是最小的,但也是详尽的,都在那里。两个不同TF的数量之间的差异可能有两种类型:短缺和过剩。第一种情况并不可怕,但我将检查第二种情况是否有溢出,如果有问题,将尝试限制它。但如果从另一个时间框架复制的条形图小于当前时间框架的条形图数量,它也会停滞。

第四,该指标已经出炉并验证了大约一周,它没有显示出任何明显的错误(无论是在编译时还是在操作过程中),只有一些隐含的问题,其中之一是在某些TFs中最初没有绘制条形图,并且在重新切换到M1 时计算时间急剧增加(在第一次计算时,一切都在2-3秒内完成)。该指标在计算时似乎窒息了(雪崩式内存泄漏?)我已经用CopyBuffer 限制了复制的元素数量------200个,而不是整个历史,但这并没有改变情况。我注意到,在离线情况下,M1 和其他地方的计算总是很快,因为第一次,在线情况发生了巨大变化(可能,问题就出在那个过滤器上,它在每个刻度上都跳过一些东西,尽管它不应该这样,因为重绘频率取决于重绘一个新的零条,不能早于其中一个手柄中最年轻的预设TF)。小而不愉快的问题是:只要试图用鼠标滚轮滚动图表,所有的分形就会消失,我们不得不等待它们被重新计算和绘制(尽管没有新的条形到达,似乎没有什么需要重新计算)。