prev_calculated - 页 3

 
Alexey Viktorov:

回答错误问题的惊人能力...

现在向我解释一下,如果发生了什么。

1.重新计算的100个条形图,输入到从0到99的缓冲区(让我们把方向视为时间序列)的值1.03。

2.突然间,历史被加载,prev_calculated变成了0。

从指标中的哪个柱子开始,数值将是1.03?

  1. 为了像时间序列那样计算索引,我们应该在指标缓冲区的 OnInit()中设置AS_SERIES标志--这就是为什么我更喜欢使用 "最右边的柱子 "这个概念--这样就不会有人错误地被告知。
  2. 这里是答案。
       if(prev_calculated==0)
         {
          //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
          for(int i=0;i<rates_total;i++)
             ExtBuffer[i]=1.01;
          return(rates_total);
         }
    在 "prev_calculated==0 "时,指标缓冲区的所有元素将被重新初始化为 "1.01 "的值,并立即以 "return(rate_total); "退出。也就是说,以前的 "1.03 "值不会在指标缓冲区中留下痕迹。
 
Alexey Viktorov:

最好第一次启动指标说明如何 处理垃圾。

这很简单--忘记prev_calculated,创建你自己的没有 "边上的洞 "的副本。如果你想跟踪以前计算过的条形图--如例子中的fxsaber
fxsaber:
完全不是一个拐杖。我就是这样做的
如果一个简单的标志首次运行/不再首次运行就足够了,用静态的bool b_First_Run取代prev_calculated。或者你可以把缓冲区的初始化放到OnInint上
 
Karputov Vladimir:
  1. 为了考虑像时间序列那样的索引,我们应该在指标缓冲区的 OnInit()中设置AS_SERIES标志--这就是为什么我更喜欢使用 "最右边的柱子"--这样就不会有人被错误地告知。
  2. 答案就在这里。
       if(prev_calculated==0)
         {
          //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
          for(int i=0;i<rates_total;i++)
             ExtBuffer[i]=1.01;
          return(rates_total);
         }
    在 "prev_calculated==0 "时,指标缓冲区的所有元素将被重新初始化为 "1.01 "的值,并立即以 "return(rate_total); "退出。也就是说,以前的 "1.03 "值不会在指标缓冲区中留下痕迹。

因此,这就是应该解决的问题。我不需要垃圾(不是真的,但它会干扰显示),但我需要保存指标以前的计算结果。当你第一次启动指示器时,缓冲区会变成垃圾,当加载历史记录时,所有插入缓冲区的内容都应该被保存......而且最好不要把它保存到文件或GV中。


补充说。

这样做的目的是为了每分钟实时估计缩水。专家顾问不间断地工作了一个星期,我们将看到的不是每周的显示,而是最后的数值,即使没有指标也能看到。

 
Alexander Puzanov:
如果一个简单的首次运行/不再首次运行标志就足够了,用静态的bool b_First_Run取代prev_calculated。而你可以把缓冲区的初始化放在OnInint中
不,那里的目的并不那么原始。
 
fxsaber:
不,那里的目标并不那么原始。
这不是你的建议,Alexey Viktorov,根据我的理解,它只需要在第一次启动时将缓冲区归零,并且在任何分页过程中不碰其中的任何东西。
 
Alexey Viktorov:

因此,这就是需要解决的问题。我不需要垃圾(我不需要它,但它会干扰显示),但我需要保存指标以前的计算结果。当你第一次启动指示器时,缓冲区会变成垃圾,当加载历史记录时,所有插入缓冲区的内容都应该被保存......而且最好不要把它保存到文件或GV中。


补充说。

这是对每分钟缩减量的实时估计。专家顾问工作了一个星期,没有停止,而不是每周显示,我们将只看到最后的价值,即使没有指标也是可见的。

О!现在它更有意义了。我将在晚上回复。
 
Alexander Puzanov:
Alexey Viktorov,按照我的理解,只需要这样--在第一次启动时将缓冲区归零,在各种分页过程中不碰其中的任何东西。
当然,我开始在OnInit()中初始化缓冲区,但有些地方不对。 我不记得是什么,我在OnCalculate中初始化了它们,prev_calculated == 0
 

重新检查了如果缓冲区阵列 在OnInit()中被初始化 会发生什么。

即使将指标从图表中删除 并重新设置,不是所有的,而是一些缓冲区仍有旧的值。甚至不完全是以前的样子,但其中一个数值延伸到了几个小节。

 
Karputov Vladimir:
哦!这下子就更有意义了。我今晚会给你答复。
很抱歉延迟回复。保存这个时间段的计算值的唯一方法是把它们保存到一个文件中。这需要同步--从文件中读取数据时,数据应该分布在它们的条上。最合理的方式是与条形图的打开时间 同步,但可能有一些细微的差别:例如,条形图的打开时间(保存到文件中)是2016.09.05. 25:02,但现在图表上有一个条形图,时间等于2016.09.05. 25:01
 
Karputov Vladimir:
很抱歉延迟回复。保存某个时间段的计算值的唯一方法是将它们保存到一个文件中。你需要处理好同步问题--这样当从文件中读取数据时,数据就会被放在它们的柱子上。最合理的解决方案是根据条形图的打开时间 进行同步,但可能存在一些微妙的问题:例如,条形图的打开时间(保存到文件中)是2016.09.05. 25:02,但现在我们在图表上有一个条形图,时间等于2016.09.05. 25:01

或者说,让开发者注意到指标缓冲区的初始化问题会更好?为什么在MT4中没有这样的问题?也许又是没有完全理解?问题是,即使在EACH中从图表上取下一个指标后强制初始化缓冲区,也不是所有的缓冲区都包含垃圾,我们不能从那里卸载它。

我个人并不介意拐杖,但前提是这些拐杖不能太复杂,而且要有积极作用。但是,写到一个文件,然后再读它,是一个蹩脚的拐杖。