Последовательность выполнение Init() и DeInit() - страница 23

 
fxsaber:

В принципе, можно и одной строчкой обойтись.

Сделал одной строчкой.
 
Nikolai Semko:


Ну где же она однозначная.

Поюзайте этот примитивный пример. И поймете "однозначность" при переключения ТФ.

В этом примере в OnInit создается объект и координатами текущего времени и цены. В OnCalculate этот объек движется вместе с ценой.

В OnDeinit он просто ( что логично) удаляется.

При переключении ТФ выясняется, что объект то появляется, то и исчезает. 
Почему так происходит?
Потому, что иногда OnDeinit старого ТФ удаляет то что уже создано в OnInit нового ТФ. Это что не баг! Что должен должен думать программист, который создал этот пример и не читал данной ветки?



Какой смысл юзать примитивный пример двоечника?

Поюзай лучше пример ПОЧТИ правильного кода

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots   0

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {

   datetime t = TimeCurrent();
   double pr  = SymbolInfoDouble(Symbol(),SYMBOL_BID);
   if(ObjectFind(0, "InitDeinit") < 0)                 // ПРОВЕРКА СУЩЕСТВОВАНИЯ ОБЪЕКТА ПЕРЕД ЕГО СОЗДАНИЕМ ОБЯЗАТЕЛЬНА!!!
    {
     ObjectCreate(0,"InitDeinit",OBJ_ARROW_THUMB_UP,0,t,pr);
     Print(__FUNCTION__, " создан InitDeinit");
    }
    
   ObjectSetInteger(0,"InitDeinit",OBJPROP_WIDTH,50); 
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(UninitializeReason() != REASON_CHARTCHANGE)      // ПРОВЕРКА ПРИЧИНЫ ДЕИНИЦИАЛИЗАЦИИ РЕШАЕТ ТВОЮ ПРОБЛЕМУ НА РАЗ...
    {
     ObjectDelete(0,"InitDeinit");
     ChartRedraw(0); // ЭТО НУЖНО ТОЛЬКО НА ВЫХОДНЫЕ. В РАБОЧИЕ ДНИ НЕ БУДЕТ ЛИШНИМ, НО С ПРИХОДОМ НОВОГО ТИКА ОБЪЕКТ БУДЕТ НЕДОСТУПЕН.
     Print(__FUNCTION__, "  InitDeinit удалён");
    }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер массива price[]
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const int begin,            // откуда начинаются значимые данные
                 const double& price[])      // массив для расчета
  {

   datetime t = TimeCurrent();
   double pr  = SymbolInfoDouble(Symbol(),SYMBOL_BID);
   ObjectMove(0,"InitDeinit",0,t,pr);
   return(rates_total);
  }
//+------------------------------------------------------------------+
Файлы:
 
Alexey Viktorov:

Поюзай лучше пример ПОЧТИ правильного кода

Так то же самое. Объект может быть удален через Deinit не актуальной копии индикатора. А OnInit актуальной выполнен ДО этого события.

Но гораздо лучше показать передачу любой информации из OnDeinit старой копии в OnInit новой. Собственно, в этом суть.

 
fxsaber:
Так то же самое. Объект может быть удален через Deinit не актуальной копии индикатора. А OnInit актуальной выполнен ДО этого события.
if(UninitializeReason() != REASON_CHARTCHANGE)
 {
  // Если причина деинициализации смена периода графика сюда не попадаем и объекты не удаляются.
 }

Во всех остальных случаях, за исключением выдёргивания вилки питания компьютера, объект будет удалён.

 
fxsaber:


Но гораздо лучше показать передачу любой информации из OnDeinit старой копии в OnInit новой. Собственно, в этом суть.

Я давно заметил что простые решения не твой конёк. :-)))
 
Alexey Viktorov:

Во всех остальных случаях, за исключением выдёргивания вилки питания компьютера, объект будет удалён.

Вы продемонстрировали решение частной задачи обсуждения. Общая формулируется так
fxsaber:

Надежная передача любой информации из OnDeinit старой копии в OnInit новой.

Что, как следствие, требует четкой последовательности выполнения OnDeinit/OnInit. Мне такое никогда не нужно было, но идею решения реализовал без проблем.

 
fxsaber:
Вы продемонстрировали решение частной задачи обсуждения. Общая формулируется так

Что, как следствие, требует четкой последовательности выполнения OnDeinit/OnInit. Мне такое никогда не нужно было, но идею решения реализовал без проблем.

Да я-то не против. Но чесать правое ухо мизинцем левой ноги не для меня. Вместо такой простейшей проверки писать "это" ... я даже не знаю как назвать. Пусть это будет на любителя, ведь мазохизм имеет право на существование. При всём уважении к вашему профессионализму в программировании.

 
Alexey Viktorov:

Вместо такой простейшей проверки писать "это" ...

Ну так Вы не поняли сути обсуждаемой в этой ветке проблемы.
 
fxsaber:
Ну так Вы не поняли сути обсуждаемой в этой ветке проблемы.

Я-то понял, но вы перевели обсуждение проблемы к своим способностям (не малым).

И ведь мой ответ был на конкретный пример кода двоечника, а не в ответ на ваши способности и пример передачи данных с регулированием последовательности выполнения On_Init и On_Deinit.

Какая цель продолжать диалог? Пытаетесь убедить меня что чесать правое ухо мизинцем левой ноги очень приятно? Или другая цель?

 
Alexey Viktorov:

Или другая цель?

Пример, который Вы переделали, не идеально соответствовал обсуждаемой проблеме. Можно показать другой пример, который не будет иметь решения через UninitializeReason.
Причина обращения: