prev_calculated - 页 6

 
你只是不需要用坚果敲击铁器。
 
Alexey Viktorov:
这不在文件中因此,这是一篇关于自由主题的论文。就像我说的自动初始化,甚至更酷。至少我的有一个免责声明...

在文件中不可能绝对地描述一切。

如果 "prev_calculate==0"--这意味着我们必须浏览整个指标缓冲区。如果 "prev_calculate!=0",那么只有最右边的柱子或几个新的柱子会被计算(我们使用limit)。

                const int &spread[])
  {
//---
   if(prev_calculated==0)
     {
      Print("prev_calculated==0");
            for(int i=0;i<rates_total;i++)
              {
               //--- здесь принудительно каждому элементу массива присваиваем значение (мне лень писать эти массивы :) )
      
              }
      return(rates_total);
     }
//--- экономный пересчёт только самого правого бара или новых баров
   int limit=rates_total-prev_calculated+1;

//--- а ниже нужно использовать цикл для обсчета самого правого бара или новых баров
   for(int i=0;i<limit;i++)
     {
      ExtBuffer[i]=чевой-то там;
     }
 
Karputov Vladimir:

在文件中不可能绝对地描述一切。

如果 "prev_calculate==0"--这意味着我们必须浏览整个指标缓冲区。如果 "prev_calculate!=0",那么只有最右边的柱子或几个新的柱子会被计算(我们使用limit)。

                const int &spread[])
  {
//---
   if(prev_calculated==0)
     {
      Print("prev_calculated==0");
            for(int i=0;i<rates_total;i++)
              {
               //--- здесь принудительно каждому элементу массива присваиваем значение (мне лень писать эти массивы :) )
      
              }
      return(rates_total);
     }
//--- экономный пересчёт только самого правого бара или новых баров
   int limit=rates_total-prev_calculated+1;

//--- а ниже нужно использовать цикл для обсчета самого правого бара или новых баров
   for(int i=0;i<limit;i++)
     {
      ExtBuffer[i]=чевой-то там;
     }




价值是什么?除了最右边的栏,我不需要任何数值。但是!!!。然后当这个最右边的人向左移动时,这个数据必须被保存......

你不必写所有的缓冲区,但你可以考虑到我的愿望来写一个。如果是第一次运行,所有历史记录应该是空的。如果prev_calculated由于历史互换而被重置,所有 被放入缓冲区的东西 都应该保持不变。即使有漏洞。

 
Karputov Vladimir:

初步结论。

1.指标不能依赖OnInit()中的指标数组的初始化

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
...
   ArrayInitialize(balance, 0.0);    // принудительная
   ArrayInitialize(equityMax, 0.0);  // инициализация
   ArrayInitialize(equityMaxB, 0.0); // всех
   ArrayInitialize(equityMin, 0.0);  // буферов
   ArrayInitialize(equityMinB, 0.0); // индикатора

...
//---
   return(INIT_SUCCEEDED);
  }

2.在指标中,有必要在OnCalculate()中通过整个数组或只通过改变的元素。

你在胡说八道什么?如果这个初始化是在OnCalculate 中实现的,它将在没有任何循环的情况下被初始化。但如果我们将prev_calculated清零,就会清除工作中积累的所有数据。
 
Alexey Viktorov:
你为什么要胡说八道呢?如果这个初始化被放到OnCalculate中,它就会被清零,没有任何循环。但如果我们将prev_calculated清零,就会清除所有在操作中积累的数据......
请使用表达方式。再看看标准交付集的指标实例:Data Catalogue/MQL5/Indicators/Examples/。
 
Alexey Viktorov:

有什么价值呢?我不需要除最右边一栏以外的任何值。但是!!!。然后当这个最右边的人向左移动时,这个数据就需要被保存......

...

我已经提出了一个方法。

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

prev_calculated

Karputov Vladimir, 2016.10.18 15:11

很抱歉延迟回复。保存某个时间段的计算值的唯一方法是将它们保存到一个文件中。你需要处理好同步问题--这样当从文件中读取数据时,数据就会被放在它们的柱子上。最合理的方式是与条形图的打开时间 同步,但可能有一些细微的差别:例如,条形图的打开时间(保存到文件中)是2016.09.05. 25:02,但现在图表上有一个条形图,时间等于2016.09.05. 25:01

一个指标不是一个数据库或资料库。

因此,如果指标显示的数据然后不能在历史上计算,那么只需要将指标缓冲区保存到文件中,然后(在历史互换的情况下)读取并同步文件和条形图。
 
Karputov Vladimir:

我已经提出了一个方法。

一个指标不是一个数据库或资料库。

因此,如果指标显示的数据,然后不能在历史上计算,那么我们只需要将指标缓冲区保存在一个文件中,然后(在历史交换的情况下)进行读取并同步文件和条形图。

阿列克谢-维克多罗夫

...而且最好不要写到文件里,更不要写到GV里。

prev_calculated
prev_calculated
  • www.mql5.com
Форум трейдеров MQL5.community
 

Vladimir,既然你专门为prev_calculated提供了这个话题,那就在这个话题上让它发挥作用。首先,你应该说明这个变量通常出现的问题。如果你对这些问题不熟悉,我将提出

---

a--尽管它在帮助中说

prev_calculated  // обработано баров на предыдущем вызове

原因是(它写在帮助中+由开发人员告知),当校验和改变时,变量被重置为零,通常是因为历史交换。

---

b - 你也不能用prev_calculated == 0作为第一次运行onCalculate 的标志。出于同样的原因

---

c - 你也不能用prev_calculated == 0作为历史分页标志。

---

为了减少对用户的损耗,措辞应该简明扼要:如果在当前调用OnCalculate时还没有发生历史分页,prev_calculated包含在上一次调用时处理的条数如果它发生了 - 它被重置为零

---

所列的3个问题都可以用拐杖解决。然而,既然MT5顾名思义不能有拐杖,弗拉基米尔,你能否为这三个问题创造一个有吸引力的解决方案?一个丑陋的是这样的。

#property indicator_chart_window
#property indicator_buffers  0
#property indicator_plots    0


struct BROWNIE {
  int   i_Prew_Calculated;  // кол-во посчитанных баров
  bool  b_First_Run;        // флаг первого запуска
  bool  b_History_Updated;  // флаг обновления истории
  
  BROWNIE() {
    i_Prew_Calculated = WRONG_VALUE;
    b_First_Run = true;
    b_History_Updated = false;
  }
  
  void f_Reset(bool b_Reset_First_Run = true) {
    i_Prew_Calculated = WRONG_VALUE;
    if(b_Reset_First_Run) b_First_Run = true;
    b_History_Updated = false;
  }
  
  void f_Update(int i_New_Prew_Calculated = WRONG_VALUE) {
    if(i_New_Prew_Calculated > -1) {
      b_History_Updated = i_New_Prew_Calculated == 0 && i_Prew_Calculated > WRONG_VALUE;
      if(b_First_Run) b_First_Run = false;
      
      if(i_Prew_Calculated == WRONG_VALUE) i_Prew_Calculated = i_New_Prew_Calculated;
      else if(i_New_Prew_Calculated > 0) i_Prew_Calculated = i_New_Prew_Calculated;
    }
  }
};
BROWNIE go_Brownie;


int OnInit(void) {return(INIT_SUCCEEDED);}


void OnDeinit(const int reason) {
  go_Brownie.f_Reset(reason != REASON_CHARTCHANGE);
}



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 &TickVolume[],
    const long &Volume[],
    const int &Spread[]
) {
  if(go_Brownie.b_First_Run) {/* обработка 1го запуска */}
  if(go_Brownie.b_History_Updated) {/* обработка обновления истории */}
  go_Brownie.f_Update(prev_calculated);
  
  return(rates_total);
}

免责声明:代码--只是一个想法,我没有在图表上尝试。

在OnDeinit中,有一个样本--对不使用缓冲区的指标进行处理,它不关心TF和符号,在TF/符号的每一次变化中,没有必要从头开始。例如,它与现有的图形元素一起工作,输出有关账户状态、订单等信息。

---

顺便说一下

Karputov Vladimir:

如果该选项被启用,只需要将指标缓冲区保存到文件中,然后(在历史分页的情况下)读取并同步文件和条形图。

你不必销毁磁盘,你可以把它保存在图表项中
 
Alexey Viktorov:
...而且最好不要写到文件中,更不要写到GV中。
对你有好处吗?
 
Konstantin Gruzdev:
也许 对你有好处?

我没有细说,但这是通过这行代码解决的。将一个数组复制到自身,并进行索引移动。

double arr[5];
ArrayCopy(arr, arr, 0, 1, 4);
// и дальнейшее заполнение 4го индекса массива.
你可以把它倒过来,从零号索引复制,从第一个索引粘贴。然后,数组的零索引将被填入。而这是完全不同的事情......))