Поюзайте этот примитивный пример. И поймете "однозначность" при переключения ТФ.
В этом примере в 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_plots0//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+intOnInit()
{
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);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
if(UninitializeReason() != REASON_CHARTCHANGE) // ПРОВЕРКА ПРИЧИНЫ ДЕИНИЦИАЛИЗАЦИИ РЕШАЕТ ТВОЮ ПРОБЛЕМУ НА РАЗ...
{
ObjectDelete(0,"InitDeinit");
ChartRedraw(0); // ЭТО НУЖНО ТОЛЬКО НА ВЫХОДНЫЕ. В РАБОЧИЕ ДНИ НЕ БУДЕТ ЛИШНИМ, НО С ПРИХОДОМ НОВОГО ТИКА ОБЪЕКТ БУДЕТ НЕДОСТУПЕН.
Print(__FUNCTION__, " InitDeinit удалён");
}
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+intOnCalculate (constint rates_total, // размер массива price[]constint prev_calculated, // обработано баров на предыдущем вызовеconstint begin, // откуда начинаются значимые данныеconstdouble& price[]) // массив для расчета
{
datetime t = TimeCurrent();
double pr = SymbolInfoDouble(Symbol(),SYMBOL_BID);
ObjectMove(0,"InitDeinit",0,t,pr);
return(rates_total);
}
//+------------------------------------------------------------------+
Во всех остальных случаях, за исключением выдёргивания вилки питания компьютера, объект будет удалён.
Вы продемонстрировали решение частной задачи обсуждения. Общая формулируется так
fxsaber:
Надежная передача любой информации из OnDeinit старой копии в OnInit новой.
Что, как следствие, требует четкой последовательности выполнения OnDeinit/OnInit. Мне такое никогда не нужно было, но идею решения реализовал без проблем.
fxsaber: Вы продемонстрировали решение частной задачи обсуждения. Общая формулируется так
Что, как следствие, требует четкой последовательности выполнения OnDeinit/OnInit. Мне такое никогда не нужно было, но идею решения реализовал без проблем.
Да я-то не против. Но чесать правое ухо мизинцем левой ноги не для меня. Вместо такой простейшей проверки писать "это" ... я даже не знаю как назвать. Пусть это будет на любителя, ведь мазохизм имеет право на существование. При всём уважении к вашему профессионализму в программировании.
fxsaber: Ну так Вы не поняли сути обсуждаемой в этой ветке проблемы.
Я-то понял, но вы перевели обсуждение проблемы к своим способностям (не малым).
И ведь мой ответ был на конкретный пример кода двоечника, а не в ответ на ваши способности и пример передачи данных с регулированием последовательности выполнения On_Init и On_Deinit.
Какая цель продолжать диалог? Пытаетесь убедить меня что чесать правое ухо мизинцем левой ноги очень приятно? Или другая цель?
Пример, который Вы переделали, не идеально соответствовал обсуждаемой проблеме. Можно показать другой пример, который не будет иметь решения через UninitializeReason.
В принципе, можно и одной строчкой обойтись.
Ну где же она однозначная.
Поюзайте этот примитивный пример. И поймете "однозначность" при переключения ТФ.
В этом примере в OnInit создается объект и координатами текущего времени и цены. В OnCalculate этот объек движется вместе с ценой.
В OnDeinit он просто ( что логично) удаляется.
При переключении ТФ выясняется, что объект то появляется, то и исчезает.
Почему так происходит?
Потому, что иногда OnDeinit старого ТФ удаляет то что уже создано в OnInit нового ТФ. Это что не баг! Что должен должен думать программист, который создал этот пример и не читал данной ветки?
Какой смысл юзать примитивный пример двоечника?
Поюзай лучше пример ПОЧТИ правильного кода
Поюзай лучше пример ПОЧТИ правильного кода
Так то же самое. Объект может быть удален через Deinit не актуальной копии индикатора. А OnInit актуальной выполнен ДО этого события.
Но гораздо лучше показать передачу любой информации из OnDeinit старой копии в OnInit новой. Собственно, в этом суть.
Так то же самое. Объект может быть удален через Deinit не актуальной копии индикатора. А OnInit актуальной выполнен ДО этого события.
Во всех остальных случаях, за исключением выдёргивания вилки питания компьютера, объект будет удалён.
Но гораздо лучше показать передачу любой информации из OnDeinit старой копии в OnInit новой. Собственно, в этом суть.
Во всех остальных случаях, за исключением выдёргивания вилки питания компьютера, объект будет удалён.
Надежная передача любой информации из OnDeinit старой копии в OnInit новой.
Что, как следствие, требует четкой последовательности выполнения OnDeinit/OnInit. Мне такое никогда не нужно было, но идею решения реализовал без проблем.
Вы продемонстрировали решение частной задачи обсуждения. Общая формулируется так
Что, как следствие, требует четкой последовательности выполнения OnDeinit/OnInit. Мне такое никогда не нужно было, но идею решения реализовал без проблем.
Да я-то не против. Но чесать правое ухо мизинцем левой ноги не для меня. Вместо такой простейшей проверки писать "это" ... я даже не знаю как назвать. Пусть это будет на любителя, ведь мазохизм имеет право на существование. При всём уважении к вашему профессионализму в программировании.
Вместо такой простейшей проверки писать "это" ...
Ну так Вы не поняли сути обсуждаемой в этой ветке проблемы.
Я-то понял, но вы перевели обсуждение проблемы к своим способностям (не малым).
И ведь мой ответ был на конкретный пример кода двоечника, а не в ответ на ваши способности и пример передачи данных с регулированием последовательности выполнения On_Init и On_Deinit.
Какая цель продолжать диалог? Пытаетесь убедить меня что чесать правое ухо мизинцем левой ноги очень приятно? Или другая цель?
Или другая цель?