prev_calculated - страница 4

 
Alexey Viktorov:

А может лучше обратить внимание разработчиков на проблему инициализации индикаторных буферов? Почему-же в МТ4 такой проблемы нет? Может опять не полное понимание? Проблема в том что даже при принудительной инициализации буферов после снятия индикатора с чарта в НЕКОТОРЫХ, не во всех буферах остаётся мусор и ничем оттуда его не выковырять...

Лично я не против костылей, но только если эти костыли не слишком сложны и с положительным эффектом. Но запись в файл с последующим чтением это корявый костыль.

Как Вы себе это представляете: "... после снятия индикатора с чарта в НЕКОТОРЫХ, не во всех буферах ..."? Это каким образом, после удаления индикатора с графика, Вы имеет доступе с его индикаторным буферам?

Давайте подробнее попробуем найти проблему. Нужен стандартный набор: код + что делали + что получили... 

 
Karputov Vladimir:

Как Вы себе это представляете: "... после снятия индикатора с чарта в НЕКОТОРЫХ, не во всех буферах ..."? Это каким образом, после удаления индикатора с графика, Вы имеет доступе с его индикаторным буферам?

Давайте подробнее попробуем найти проблему. Нужен стандартный набор: код + что делали + что получили... 

Чисто предположение: может быть, попадание в ту же область памяти при текущем обращении к буферам, которая была занята предыдущими буферами.

Я в разговор не сильно вникал, не пинайте, Алексей хочет, чтобы при перезапуске (вкл/выкл терминала) индикатора данные в буферах оставались или только при 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-3120M  @ 2.50GHz, 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\038C9E8FAFF9EA373522ECC6D5159962

 

Такс... Начинает вырисовываться ситуация. Добавьте такой код:

  {
//---
   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-3120M  @ 2.50GHz, 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\038C9E8FAFF9EA373522ECC6D5159962

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

После снятия индикатора и постановке его взад через некоторое время буферы пустые.

Позже повторю снятие и постановку.

 

Предварительные выводы:

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);
Причина обращения: