prev_calculated - 页 4

 
Alexey Viktorov:

也许开发者应该注意指标缓冲区的初始化问题?为什么在MT4中没有这样的问题?也许这不是完全的理解?问题是,即使在EACH中从图表上取下一个指标后强制初始化缓冲区,也不是所有的缓冲区都包含垃圾,你不能把它从那里弄出来。

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

你如何想象:"......在某些而不是所有的缓冲区中从图表中删除指标后......"?从图表中删除指标后,你以何种方式访问其指标缓冲区

让我们试着找到问题的细节。你需要一套标准:代码+你做了什么+你得到什么...

 
Karputov Vladimir:

你如何想象:"......在某些而不是所有的缓冲区中从图表中删除指标后......"?从图表中删除指标后,你能以何种方式访问其指标缓冲区

让我们试着找到问题的细节。你需要一套标准:代码+你做了什么+你得到什么...

纯粹的假设:在当前的缓冲区访问过程中,它可能会进入同一个内存区域,而这个区域被之前的缓冲区所占据。

我还没有进入对话,不要踢,Alexey想让缓冲区的数据在重新启动(终端的开关)时保持不变,还是只在prev_calculated = 0时保持不变(如果prev_calculated > 0之前)?

 
Karputov Vladimir:

你如何想象:"......在某些而不是所有的缓冲区中从图表中删除指标后......"?在从图表中删除指标后,你以何种方式访问其指标缓冲区

让我们试着找到问题的细节。你需要一套标准:代码+你做了什么+你得到什么...

以下是指标的代码

/********************************************************************\
|                                               BalansEquityTest.mq5 |
|                                                           Viktorov |
|                                                  v4forex@yandex.ru |
\********************************************************************/

#property copyright "Viktorov"
#property link      "v4forex@yandex.ru"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers   6
#property indicator_plots     3
#property indicator_type1     DRAW_COLOR_LINE
#property indicator_color1    clrGold, clrGreen, clrRed
#property indicator_width1    2
#property indicator_label1    "Balance"
#property indicator_type2     DRAW_HISTOGRAM2
#property indicator_color2    clrCrimson
#property indicator_width2    2
#property indicator_label2    "EquityMin"
#property indicator_type3     DRAW_HISTOGRAM2
#property indicator_color3    clrDarkViolet
#property indicator_width3    2
#property indicator_label3    "EquityMax"

double balance[];
double clrBalance[];
double equityMaxB[];
double equityMinB[];
double equityMax[];
double equityMin[];

double maxEquity, minEquity;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, balance, INDICATOR_DATA);
   SetIndexBuffer(1, clrBalance, INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2, equityMin, INDICATOR_DATA);
   SetIndexBuffer(3, equityMinB, INDICATOR_DATA);
   SetIndexBuffer(4, equityMax, INDICATOR_DATA);
   SetIndexBuffer(5, equityMaxB, INDICATOR_DATA);
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(4, PLOT_EMPTY_VALUE, 0.0);
   ArrayInitialize(balance, 0.0);    // принудительная
   ArrayInitialize(equityMax, 0.0);  // инициализация
   ArrayInitialize(equityMaxB, 0.0); // всех
   ArrayInitialize(equityMin, 0.0);  // буферов
   ArrayInitialize(equityMinB, 0.0); // индикатора
   ArraySetAsSeries(balance, true);    // все
   ArraySetAsSeries(clrBalance, true); // буферы
   ArraySetAsSeries(equityMax, true);  // индикатора
   ArraySetAsSeries(equityMaxB, true); // имеют
   ArraySetAsSeries(equityMin, true);  // флаг
   ArraySetAsSeries(equityMinB, true); // AS_SERIES
   IndicatorSetInteger(INDICATOR_DIGITS, 2);
   IndicatorSetString(INDICATOR_SHORTNAME, "Show Money");
//---
   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)
  return(rates_total);

  double bal = AccountInfoDouble(ACCOUNT_BALANCE);
  double equity = AccountInfoDouble(ACCOUNT_EQUITY);
  if(rates_total > prev_calculated)
   {
    minEquity = 0;
    maxEquity = 0;
   }
   minEquity = fmin((minEquity == 0 ? AccountInfoDouble(ACCOUNT_BALANCE) : minEquity), equity);
    maxEquity = fmax(maxEquity, equity);
    balance[0] = AccountInfoDouble(ACCOUNT_BALANCE);
    clrBalance[0] = 0.0;
    equityMinB[0] = balance[0];
    equityMin[0] = minEquity;
    equityMaxB[0] = balance[0];
    equityMax[0] = maxEquity;
    if(balance[0] > balance[1])
     clrBalance[0] = 1.0;
    if(balance[0] < balance[1])
     clrBalance[0] = 2.0;
    Comment(PositionsTotal());
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

我稍后会发一个视频,到时就清楚了。我无法在手指上比以前解释得更清楚。


我希望你不要介意下载和解压视频。

不幸的是,它从图表中移除并附加到图表上的事实没有被记录下来,但它有一个事实,即该指标在那里,然后它消失了,然后它又在那里。它只是删除并将其附加回来。

在重新安装指示器后,请注意数据窗口。即使在强制初始化缓冲区后,那里仍然有空间碎片。

附加的文件:
00.zip  2614 kb
 
Alexey Viktorov:

以下是该指标的代码

你需要做这样的实验:只留一个图表,并在上面放上和取下指标。而你需要有关终端和操作系统的信息(终端的日志标签)。
 
Karputov Vladimir:
我想做个实验:只留一个图表,用它来放和取指标。而且你需要有关终端和操作系统的信息(终端的 "日志 "选项卡)。

一个图表有什么关系呢?该指标只在一个图表上的事实还不够?


补充说。

虽然我不相信操作系统可以影响指标的行为,但这里有关于系统和终端的信息

2016.10.16 20:56:34.904 Terminal        D:\MetaTrader 5\MetaTrader 5
2016.10.16 20:56:34.904 Terminal        Windows 7 Home Premium (x64 based PC), IE 11.00, UAC, AMD FX-4170 Quad-Core Processor , RAM: 10531 / 12255 Mb, HDD: 55167 / 244198 Mb, GMT+03:00
2016.10.16 20:56:34.904 Terminal        MetaTrader 5 build 1455 started (MetaQuotes Software Corp.)
 
Alexey Viktorov:
一个图表有什么关系呢?该指标只在一个图表上,这还不够吗?
  1. 我正在努力缩小问题的范围。
  2. 我没有这样的问题。我的配置。
    2016.10.18 19:09:34.239 Terminal        MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)
    2016.10.18 19:09:34.266 Terminal        Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120 M  @ 2.50 GHz, RAM: 3638 / 8077 Mb, HDD: 39824 / 233310 Mb, GMT+02:00
    2016.10.18 19:09:34.266 Terminal        C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\038 C9E8FAFF9EA373522ECC6D5159962

 

所以...局势开始形成了。添加这个代码。

  {
//---
   if(prev_calculated==0)
     {
      Print("prev_calculated==0");

      return(rates_total);
     }

   double bal=AccountInfoDouble(ACCOUNT_BALANCE);
 
Karputov Vladimir:
  1. 我正在努力缩小问题的范围。
  2. 我没有这个问题。我的配置。
    2016.10.18 19:09:34.239 Terminal        MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)
    2016.10.18 19:09:34.266 Terminal        Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120 M  @ 2.50 GHz, RAM: 3638 / 8077 Mb, HDD: 39824 / 233310 Mb, GMT+02:00
    2016.10.18 19:09:34.266 Terminal        C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\038 C9E8FAFF9EA373522ECC6D5159962

开始执行了,但当我启动指标时,在一个缓冲区内几乎所有的历史都有瘟疫数字。

取出指示器后,过了一会儿再放进去,缓冲区就空了。

我以后会重复拆除和放回的过程。

 

初步结论。

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() 中通过整个数组或只通过改变的元素。

 
Karputov Vladimir:

所以...局势开始形成了。添加这样的代码。

  {
//---
   if(prev_calculated==0)
     {
      Print("prev_calculated==0");

      return(rates_total);
     }

   double bal=AccountInfoDouble(ACCOUNT_BALANCE);

像这样添加

Print("prev_calculated = ", prev_calculated);