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

 
Alexey Viktorov:

Дмитрий вы, как мне кажется, образованный программист. Вас не учили правилам хорошего тона в программировании?

А в остальном можно писать и как в старом mql4 с возможностью выхода за пределы массива например и прочими допущениями. В ответ получили ошибку... ну и флаг ей взад... пойдём дальше, нам некогда... А потом нарываемся на проблему, которая и выеденного яйца не стоит, в более строгом языке и начинаем предъявлять претензии разработчикам...

Христос воскрес.


При создании существующего объекта ничего страшного не происходит, не страшного тоже не происходит, просто объект не создается и все.
 
Nikolai Semko:

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

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

Первое, что пришло в голову - через ChartSaveTemplate.


Отказаться от глобальных - видимо, ресурсы.

 
fxsaber:

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

Первое, что пришло в голову - через ChartSaveTemplate.


Отказаться от глобальных - видимо, ресурсы.


Конечно ресурсы - мне они кажутся оптимальным решением, т.к. невидимы, в отличии от глоб. переменных терминала и файлов, и быстры. А так же через них можно передавать массивы, как и через файлы, но только быстрее, т.к. все происходит в ОЗУ. А так же они принадлежат окну, а не терминалу, как в случае с глобальными. Тем более можно создавать один ресурс на все  одинаковые индикаторы в окне.

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

 
Nikolai Semko:

Мой пример создавался чтобы показать проблему неоднозначной последовательности выполнения Юнита нового ТФ и Деюнита старого ТФ, а не как ее решение.

Ты просто обошел проблему, а не решил ее. 
В моем примере как раз важно, чтобы в Деюните старого ТФ удалялся объект в любом случае, в том числе и при смене ТФ, а в Юните нового объекта он был создан вновь. 

Если последовательность сначала Деюнит старого ТФ, потом Юнит нового ТФ, как должно быть по логике. Тогда объкт удаляется а потом создается вновь.

Если же последовательность - сначала Юнит нового ТФ, потом Деюнит старого ТФ, тогда объкт при попытке его создать в Юните просто модифицируется, т.к. он еще не удален. А потом удаляется Деюнитом старого ТФ. В этом и есть баг.

В этом смысл был этого примера - показать то, с чем может столкнуться любой программист, не прочитавший данной ветки и не знающий данную "особенность". 
Этот пример не рассматривался, как какое-то решение. Как варианты решения представлены здесь и здесь. Думаю я тоже добавлю чуть позже решение, но без применения глобальных переменных терминала и файлов, а также чтобы данное решение работало , если даже в одном окне установлено несколько одинаковых индикаторов. А тебе слабо попробовать решить такую задачку? Или ты только и способен на поиски ошибок в чужом коде, особенно когда их там нет.


Грех сегодня ругаться матом, но так хочется...

Даже прочесть до конца твой бред не смог.

Повторяю ещё раз НЕ ВЫСАСЫВАЙ ПРОБЛЕМУ ОТТУДА ГДЕ ЕЁ НЕТ.

Ответ на все вопросы в твоём коде был здесь

Alexey Viktorov:

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

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

на абсолютность я не рассчитывал.

Всё... изыди сатана, не доводи до греха.

 
Alexey Viktorov:

Грех сегодня ругаться матом, но так хочется...

Даже прочесть до конца твой бред не смог.

Повторяю ещё раз НЕ ВЫСАСЫВАЙ ПРОБЛЕМУ ОТТУДА ГДЕ ЕЁ НЕТ.

Ответ на все вопросы в твоём коде был здесь

на абсолютность я не рассчитывал.

Всё... изыди сатана, не доводи до греха.


Ооо...Братан, да тебе на другой форум нужно. Где психотерапевты советы дают. Я понимаю, понимаю. Дефицит любви в детстве, хочется внимания и любви. Сочувствую. Если что обращайся, помогу. Пиши в личку. Я не шучу

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

ВОИСТИНУ ВОСКРЕСЕ!

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

fxsaber, 2017.04.14 13:52

Небольшой лайфхак почти на тему сабжа
Без каких-либо претензий к разработчикам.
Прикольный лайфхак! Запускаем
#property indicator_chart_window
#property indicator_plots   0

void OnInit()
{
  Print(__FUNCTION__ + (string)ChartIndicatorGet(0, 0, MQLInfoString(MQL_PROGRAM_NAME)));
}

void OnDeinit( const int Reason )
{
  Print(__FUNCTION__);
}

int OnCalculate (const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double& price[])
{
  return(rates_total);
}

И переключаем ТФ. Ни одного Deinit не будет! Все индикаторы будут незаметно выполняться, сжирая ресурсы. А всего лишь хотел

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2016.09.22 16:14

Как в индикаторе узнать свой хэндл на чарте? Через ChartIndicatorName не подходит, т.к. он возвращает короткое имя. А с таким же именем может уже быть уже запущен этот же индикатор с другими входными параметрами.

Получается, что если хочется узнать свой хэндл, то надо использовать ChartIndicatorGet, но, как показано в примере выше, будет страшный облом - индикатор станет неудаляемым.

Какой-то бажище.


Нельзя даже это

Нельзя узнать из индикатора, в какое sub_window он попал. Какие-то сплошные обломы.

 
fxsaber:

Нельзя узнать из индикатора, в какое sub_window он попал. Какие-то сплошные обломы.

https://www.mql5.com/ru/docs/chart_operations/chartwindowfind
Документация по MQL5: Операции с графиками / ChartWindowFind
Документация по MQL5: Операции с графиками / ChartWindowFind
  • www.mql5.com
Операции с графиками / ChartWindowFind - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber:
Прикольный лайфхак! Запускаем

И переключаем ТФ. Ни одного Deinit не будет! Все индикаторы будут незаметно выполняться, сжирая ресурсы. А всего лишь хотел

Получается, что если хочется узнать свой хэндл, то надо использовать ChartIndicatorGet, но, как показано в примере выше, будет страшный облом - индикатор станет неудаляемым.

Какой-то бажище.

Сталкивался с подобным. Разработчики посоветовали внимательнее читать справку, т.к. там есть пример:

//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart() 
  { 
   //--- количество окон на графике (всегда есть хотя бы одно главное окно) 
   int windows=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL); 
   //--- про ходим по окнам 
   for(int w=0;w<windows;w++) 
     { 
      //--- сколько индикаторов в данном окне/подокне 
      int total=ChartIndicatorsTotal(0,w); 
      //--- переберем все индикаторы в окне 

      for(int i=0;i<total;i++) 
        { 
         //--- получим короткое имя индикатора 
         string name=ChartIndicatorName(0,w,i); 
         //--- получим хэндл индикатора 
         int handle=ChartIndicatorGet(0,w,name); 
         //--- выведем в журнал 
         PrintFormat("Window=%d,  index=%d,  Name=%s,  handle=%d",w,i,name,handle); 
         //--- обязательно освобождаем хендл индикатора, как только он становится ненужным 
         IndicatorRelease(handle); 
        } 
     } 
  }
Однако, потом добавили, что поведение будет "скорректировано". Но, видимо, все еще корректируют.
 

Спасибо, но тут то же ограничение - без shortname (а как его узнать?) никак.

 
Alexey Kozitsyn:

Сталкивался с подобным. Разработчики посоветовали внимательнее читать справку, т.к. там есть пример:

Однако, потом добавили, что поведение будет "скорректировано". Но, видимо, все еще корректируют.

А вот это реально помогло, Спасибо!

Главное, не делать IndicatorRelease в Deinit.

Причина обращения: