prev_calculated - страница 9

 
Alexey Kozitsyn:
Да, про цикл, пожалуй, перебор. А вот если при prev_calculated = 0 (при ранее заполненном буфере) сбрасываются какие-то значения в этом буфере, пожалуй, это ошибка. Сейчас проверим...

Они не то чтобы сбрасываются, но весь индикатор, на всю глубину истории пересчитывается. Соответственно если мне нужно заполнять только самый правый индекс буфера, но при его смещении влево эти значения должны остаться, то получается два варианта:

1. При инициализации индикаторного буфера он полон мусора, который мешает и его надо-бы почистить.

2. Почистил, но при prev_calculated = 0 буфер заново чистится и удаляет все накопленные значения.


А в общем-то решение безумно простое. prev_calculated = 0 совместно с флагом решают эту проблему.

 
Alexey Viktorov:

...

А в общем-то решение безумно простое. prev_calculated = 0 совместно с флагом решают эту проблему.

Не решает. Будет обрыв связи длительностью несколько баров, несколько баров окажется не инициализированными с мусором. 
 
Alexey Viktorov:

Не прикидывайся... Всё понятно, но специально для вас картинка



Комп работал не выключаясь, график не закрывался, индикатор не снимался с графика...

Вопрос: Куда пропали 2 минутных бара???

Вероятнее всего, у Вас ошибка в коде. Сейчас написал тестовый индикатор, при сбросе по кнопке обновить размер буфера не изменяется, данные в буфере не изменяются...

#property indicator_buffers 1
#property indicator_plots 1
#property indicator_chart_window
#property indicator_type1 DRAW_NONE
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double buf[];
const double _price=98000;
bool _firstLaunch=true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,buf);
//---
   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)
     {
      if(_firstLaunch)
        {
         Print(__FUNCTION__,": Первый запуск! Размер буфера = ",ArraySize(buf));
         ArrayInitialize(buf,_price);
         _firstLaunch=false;
        }
      else
        {
         Print(__FUNCTION__,": prev_calculated после обновления = ",prev_calculated,". Размер буфера = ",ArraySize(buf));
         //--- Проверяем отличие значений от эталонного
         for(int i=rates_total-1; i>=0; i--)
            if(buf[i]!=_price)
               Print(__FUNCTION__,": Значение #",i," '"+DoubleToString(buf[i],_Digits)+
                     "' отличается от эталонного '"+DoubleToString(_price,_Digits));
        }
     }
   else
     {
      if(rates_total>prev_calculated)
         buf[rates_total-1]=_price;
     }
   return(rates_total);
  }
 

От prev_calculated до rates_total чистить буфер надо. 

 

 
 
Либо, как выше сказал Дмитрий, произошел обрыв связи в несколько баров... Кстати, prev_calculated при обрыве связи тоже 0 вернет?
 
Dmitry Fedoseev:
Код в студию. Посмеемся и объясним.

Мне уже смешно.

/********************************************************************\
|                                               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;

bool flag = true;
//+------------------------------------------------------------------+
//| 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);
   ArraySetAsSeries(balance, true);
   ArraySetAsSeries(clrBalance, true);
   ArraySetAsSeries(equityMax, true);
   ArraySetAsSeries(equityMaxB, true);
   ArraySetAsSeries(equityMin, true);
   ArraySetAsSeries(equityMinB, true);
   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)
  {
   Print("prev_calculated = ", prev_calculated);
   if(flag)
    {
     ArrayInitialize(balance, 0.0);
      ArrayInitialize(equityMax, 0.0);
       ArrayInitialize(equityMaxB, 0.0);
      ArrayInitialize(equityMin, 0.0);
     ArrayInitialize(equityMinB, 0.0);
      flag = false;
    }
   return(rates_total);
  }
  double bal = NormalizeDouble(AccountInfoDouble(ACCOUNT_BALANCE), 2);
  double equity = NormalizeDouble(AccountInfoDouble(ACCOUNT_EQUITY), 2);
  if(rates_total > prev_calculated)
   {
    minEquity = 0;
    maxEquity = 0;
   }
   minEquity = NormalizeDouble(fmin((minEquity == 0 ? bal : minEquity), equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);
    balance[0] = bal;
    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);
  }
//+------------------------------------------------------------------+

За ночь было вот столько обнулений prev_calculate

2016.10.19 08:42:23.309 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 05:47:04.915 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 05:47:04.075 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 04:46:15.300 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 04:46:15.030 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 04:45:37.590 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 04:45:37.100 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 01:40:31.224 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 00:00:32.196 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 00:00:31.806 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.18 20:33:02.954 BalansEquityTest (EURUSD,M1)    prev_calculated = 0 // Это время последнего запуска индикатора.
 
Dmitry Fedoseev:

От prev_calculated до rates_total чистить буфер надо. 

Если это мне ответ, то при первом запуске индикатора буфер полностью инициализируется заданным значением. При формировании нового бара - дозаписываются новые значения.
 
Alexey Kozitsyn:
Либо, как выше сказал Дмитрий, произошел обрыв связи в несколько баров... Кстати, prev_calculated при обрыве связи тоже 0 вернет?

Когда то раньше было, что при всех проблемах prev_calculated возвращал 0. Потом был разговор на форуме, что можно было бы не всегда сбрасывать до 0, а в некоторых случаях можно до последнего посчитанного значения, в теме Слава участвовал и пообещал позаниматься вопросом.

Спустя некоторое время заметил, что prev_calculated иногда имеет промежуточные значения. Сейчас не знаю как дело обстоит, не слежу же каждый день что там prev_calculated возвращает.    

 
Alexey Kozitsyn:
Если это мне ответ, то при первом запуске индикатора буфер полностью инициализируется заданным значением. При формировании нового бара - дозаписываются новые значения.
Не вам.
 
Alexey Viktorov:

Мне уже смешно.

/********************************************************************\
|                                               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;

bool flag = true;
//+------------------------------------------------------------------+
//| 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);
   ArraySetAsSeries(balance, true);
   ArraySetAsSeries(clrBalance, true);
   ArraySetAsSeries(equityMax, true);
   ArraySetAsSeries(equityMaxB, true);
   ArraySetAsSeries(equityMin, true);
   ArraySetAsSeries(equityMinB, true);
   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)
  {
   Print("prev_calculated = ", prev_calculated);
   if(flag)
    {
     ArrayInitialize(balance, 0.0);
      ArrayInitialize(equityMax, 0.0);
       ArrayInitialize(equityMaxB, 0.0);
      ArrayInitialize(equityMin, 0.0);
     ArrayInitialize(equityMinB, 0.0);
      flag = false;
    }
   return(rates_total);
  }
  double bal = NormalizeDouble(AccountInfoDouble(ACCOUNT_BALANCE), 2);
  double equity = NormalizeDouble(AccountInfoDouble(ACCOUNT_EQUITY), 2);
  if(rates_total > prev_calculated)
   {
    minEquity = 0;
    maxEquity = 0;
   }
   minEquity = NormalizeDouble(fmin((minEquity == 0 ? bal : minEquity), equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);
    balance[0] = bal;
    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);
  }
//+------------------------------------------------------------------+

Потенциально, косяк может быть здесь:

if(rates_total > prev_calculated)
   {
    minEquity = 0;
    maxEquity = 0;
   }
   minEquity = NormalizeDouble(fmin((minEquity == 0 ? bal : minEquity), equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);

При наступлении нового бара, Вы сбрасываете значения в 0 - хорошо. Но следом Вы на равенство проверяете minEquity и 0, способом не рекомендуемым.

В подтверждение своих слов - Ваш рисунок. По нему видно, что "мусорные" как Вы сказали значения примерно у нуля.
 

И лучше, конечно, на рисунок добавить окно данных с "мусорным" значением.