prev_calculated - 页 2

 
Alexey Kozitsyn:
如果只是在0时重新计算整个指标呢?对我来说,这似乎是最好的解决方案。
对于一个有大量图形的重型指标来说--不是最好的。不,解决方案很简单--使用你自己的变量来代替prev_calculated、静态或全局变量。但这是一个拐杖,我们想要别的东西。
 
Alexey Kozitsyn:
:)这就是我的工作...
这就是我的理解,我只是引用了你的问题,但实际上我是在回答Alexander Puzanov。:)
 
Alexander Puzanov:
对于一个有大量图形的重型指标来说,这不是最好的解决方案。解决办法很简单--使用你自己的变量来代替prev_calculated、静态或全局变量。但这是一个拐杖,我们想要别的东西。

一个使用 "拐杖 "一词的人。

  • 要么是太懒了,不看文件
  • 或者还不知道应该如何正确。
唯一正确的解决方案:在prev_calculate==0时重新计算指标。

 
Alexander Puzanov:
对于一个有大量图形的重型指标来说--不是最好的。不,解决方案很简单--使用自己的变量来代替prev_calculated、静态 或全局变量。但这是一个拐杖,我们想要别的东西。
根本就不是一个拐杖。我就是这样做的
 
Karputov Vladimir:
而如果历史记录被调换了,就意味着可能会有新的条形图 被遗漏或者之前没有计算出来--也就是说,指标读数已经错了。

斯拉瓦

如果prev_calculated=0,这意味着必须进行全面的重新计算。在这种情况下,所有的标准指标都要重新计算。

这一切都很清楚,但可惜的是,这一切并没有取消这个。

亚历山大-普扎诺夫

这一切都很有用,但不能按照它的直接目的来使用--显示在前一次调用中处理了多少个 "条"--prev_calculated

指标是不同的;有些根本不需要条形计算,有些只需要实时刻度,有些对转换深度有限制--它们不关心历史上下一个变化是什么,有些需要跟踪图形对象,等等。他们不需要额外的函数来跟踪附在prev_calculated上的历史变化,他们只需要这个--"在前一次调用中处理过的条形图"。他们不需要它。

总之,程序员先生,请不要让加入者分心去'捕捉事件'。

 
Alexey Kozitsyn:
如果我简单地将整个指标重新计算为0呢?在我看来,这是最好的解决方案。

我不会说这是最好的解决方案。至少现在还没有。

我决定写一个指标,记录账户上当前的缩减量,这样我就不必在历史上重新计算什么了。第一行起初看起来是这样的。

if(prev_calculated == 0)  return(rates_total);
但启动后,我发现缓冲区不是空的,也没有归零。缓冲区里有一些价格,来历不明。我不得不将缓冲区强制为零...接下来,又发现了一个问题。prev_calculate被清零,指标被重新计算,分别将所有的缓冲区清零,直到最后一个棒。无论如何,我现在已经放弃了这个想法。
 
Alexey Viktorov:

我不会说这是最好的解决方案。至少现在还没有。

我决定写一个指标,记录账户上当前的缩减量,这样我就不必在历史上重新计算什么了。起初,第一行看起来是这样的。

if(prev_calculated == 0)  return(rates_total);
但在启动后,我发现缓冲区并不是空的,也没有归零。缓冲区里有一些价格,我不知道它是从哪里来的。不得不将缓冲区强制为零...接下来,又发现了一个问题。prev_calculate被清零,指标被重新计算,分别将所有的缓冲区清零,直到最后一个棒。总之,我现在已经放弃了这个想法。

"......一些来历不明的价格......"--这是指标缓冲区数组中未被初始化的元素的垃圾。应该做什么。

  • 在prev_calculate==0时,在循环中浏览指标缓冲区的所有元素,并给它们赋值。在这种情况下,你需要监测新条形图出现时的情况(rate_total减去prev_calculate将大于0)--指标缓冲区相应增加,这个新元素也应被初始化。

 

关于交易、自动交易系统和交易策略测试的论坛

虫子,虫子,问题

Alexey Viktorov, 2016.10.17 09:58

你明白你写的是什么吗?

最好解释一下如何摆脱垃圾的问题,FIRST 运行的指标。这些垃圾是从哪里来的?在将缓冲区链接到数组时不是应该有初始化吗? 还是在初始化过程中,空间垃圾进入了数组?为什么mql4中没有这些垃圾?

给我一个例子,如何在不使用不相干的额外静态或全局变量 的情况下从正常值中筛选出垃圾。

每个人都能很好地引用文件。


 

没有人欠别人什么。因此,在绑定之后,在你自己初始化数组的所有元素之前,指标缓冲区中会有一些垃圾。

已添加。

我现在要创造一个例子...

//+------------------------------------------------------------------+
//|                                              prev_calculated.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGray
#property indicator_label1  "prev_calculated"
//---- buffers
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   if(prev_calculated==0)
     {
      //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
      for(int i=0;i<rates_total;i++)
         ExtBuffer[i]=1.01;
      return(rates_total);
     }
//--- пересчитываем самый правый бар или самый правый бар и один предыдущий при появлении нового бара
   int limit=rates_total-prev_calculated+1;
   for(int i=rates_total-limit;i<rates_total;i++)
     {
      //--- визуализация пересчёта самого правого бара
      static bool drive=false;
      if(!drive)
         ExtBuffer[i]=1.03;
      else
         ExtBuffer[i]=1.02;
      drive=!drive;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
在M1上运行它。你会看到,只有最右边的柱子被重新计算。
附加的文件:
 
Karputov Vladimir:

没有人欠别人什么。因此,在绑定之后,在你自己初始化数组的所有元素之前,指标缓冲区中会有一些垃圾。

已添加。

我现在要创造一个例子...

//+------------------------------------------------------------------+
//|                                              prev_calculated.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGray
#property indicator_label1  "prev_calculated"
//---- buffers
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   if(prev_calculated==0)
     {
      //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
      for(int i=0;i<rates_total;i++)
         ExtBuffer[i]=1.01;
      return(rates_total);
     }
//--- пересчитываем самый правый бар или самый правый бар и один предыдущий при появлении нового бара
   int limit=rates_total-prev_calculated+1;
   for(int i=rates_total-limit;i<rates_total;i++)
     {
      //--- визуализация пересчёта самого правого бара
      static bool drive=false;
      if(!drive)
         ExtBuffer[i]=1.03;
      else
         ExtBuffer[i]=1.02;
      drive=!drive;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
在M1上运行它。你会看到,只有最右边的柱子被重新计算。

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

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

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

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

从哪一栏开始,它将是1.03?