指示器被破坏 - 页 6

 
Rosh:
好吧,我等着

20多个小时后,指标正常工作。我不知道该怎么说。


 

Rosh,放大/缩小,向左/右滚动。你在哪个平台上测试64/32位?

 
AnkaSoftware:

Rosh,放大/缩小,向左/右滚动。你在哪个平台上测试64/32位?

我可以在32位上复制这个一般问题。操作系统似乎与此有关的唯一方法是,为什么你的64位系统似乎在其条形历史的开始或中间定期获得 新数据,而你的32位系统(和RaptorUK的64位系统)却没有。不管怎么说,你似乎打算把你的指标给其他人,而改变条形历史是你在现实生活中肯定会遇到的问题,如果只是因为你的用户遭受经纪商断开连接,导致重新连接时缺少的条形被插入到历史中间。

正如我已经试图解释的那样,这个 "错误 "是在你的代码中还是在MT4中,是有争议的。在MT4中对指标的行为有一个预期,而你的指标并没有这样的行为。例如,当你用MetaEditor创建一个新指标时,它会为你插入一行 "int counted_bars=IndicatorCounted();"。你把这句话去掉,忽略了 IndicatorCounted()。

我可以用下面这个指标来复制一般的问题,这个指标在第一次启动时只是在最后10个柱状高点之间画一条线。

#property indicator_chart_window
#property indicator_color1 Red
#property indicator_buffers 1

double indicatorvalues[];

void init()
{
   SetIndexBuffer(0, indicatorvalues);
}

void start()
{
   static bool IsFirstCall = true;
   if (IsFirstCall) {
      IsFirstCall = false;
      for (int i = 0; i < 10; i++) {
         indicatorvalues[i] = High[i];      
      }
   }
}

然后你可以通过以下方式复制同样的问题。

* 打开一个任何符号的图表

* 将该指标添加到图表中

* 关闭 "图表自动滚动"(只是为了使下面的步骤更容易;而不是因为它对这个问题有任何影响)。

* 按 "主页",进入图表的起始位置

* 按Page Up键,强制下载额外的数据。(注意:除非这时有一些额外的数据被添加到图表中,否则没有问题。)

* 按 "结束 "键,进入图表的最后一页。现在高点之间的红线将不在原位。它将在时间上被向后移动。

[所有这些只是充实了RaptorUK已经确定的内容。]

 

好的,你能否确认,在这种缺失条形图/损坏指标的情况下,IndicatorCounted()将返回一个-V的数字?让我尝试 重新初始化指标阵列,并重新绘制回视条的移动。

 
AnkaSoftware:

好的,你能否确认,在这种缺失条形图/损坏指标的情况下,IndicatorCounted()将返回一个-V的数字?

不,正如我在第5页已经说过的,你也可以自己测试一下,当使用上述方法在历史开始时添加新条形图时,MT4会将IndicatorCounted()重置为零。这将导致一个正常的指标重新绘制其所有的历史值,因为它通常会使用Bars和IndicatorCounted()之间的差异来确定哪些条是 "脏 "的,需要更新。如果IndicatorCounted()为零,那么指标就会重新计算每个历史条数,即因为Bars - 0 = Bars。

IndicatorCounted()的文档(https://docs.mql4.com/customind/IndicatorCounted) 提供了一个这样做的例子,还有一些替代版本,如https://www.mql5.com/en/forum/132447,其目的是非常微弱地提高性能,因为https://docs.mql4.com/customind/IndicatorCounted 的标准代码不必要地重新计算一个 "干净 "的条形。
 

增加IndicatorCounted()检查并在IndicatorCounted()返回值为0时重新初始化指标,解决了插入历史或额外条形图 时引起的指标移动问题。

然而,还有一个指标损坏的问题,这似乎不是由插入历史条形图引起的。为了再现这个问题,你需要运行10小时以上,直到至少两次重新初始化指标,即IndicatorCounted()返回0(指标启动后)。

附加的文件: