Библиотеки: Init_Sync

 

Init_Sync:

Библиотека делает синхронизированными Init/Deinit индикаторов

Если в MT изменить таймфрейм или имя символа чарта, то все индикаторы на чарте выгрузятся с чарта и загрузятся на него снова. При этом, в отличие от MT4, в MT5 последовательность выгрузиться/загрузиться не определена из-за особенности внутренней архитектуры.

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

Автор: fxsaber

 
А теперь - супер-пупер-мега-вопрос: каков контекст жизни создаваемых в MQL5 ресурсов? Терминал целиком, какие-либо внутренние контейнеры вроде потоков "символ-таймфрейм", чарт или еще что? В справке про это не написано.
 
Stanislav Korotky:
А теперь - супер-пупер-мега-вопрос: каков контекст жизни создаваемых в MQL5 ресурсов? Терминал целиком, какие-либо внутренние контейнеры вроде потоков "символ-таймфрейм", чарт или еще что? В справке про это не написано.
Не проверял

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

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

Nikolai Semko, 2017.04.16 09:42

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

Просто поверил, поэтому сделал через ресурсы. Изначально было через глобальные.

 
fxsaber:
Не проверял

Просто поверил, поэтому сделал через ресурсы. Изначально было через глобальные.

Интересно было бы какой-нить официальный источник информации услышать.
 
И есть еще один вопрос - что будет, если индикатор создан из эксперта?
 
Stanislav Korotky:
И есть еще один вопрос - что будет, если индикатор создан из эксперта?
Попробуйте.
 

Хм...

Интересные переопределения функций...

А как оно работает ? Скажем, на примере функции инициализации ?

Тааак...

Значит, поскольку библиотека вставляется вначале, то, при компиляции OnInit() библиотеки регистрируется, как функция инициализации.

Причем, в ней происходит проверка синхронизации, а затем вызывается функция OldOnInit(). А что это за функция ? Она ж еще не определена !


Ага... Дальше - идентификатор OnInit() дефайном определяется, как OldOnInit(). В дальнейшем, когда будет определена "старая" функция OnInit() - она будет заменена на OldOnInit() - ту самую, которую будет вызывать OnInit() библиотеки. 


Мдя. Оригинальное использование дефайнов. На мой взгляд, довольно опасное, с точки зрения дальнейшей поддержки и возможностей изменения порядка объявления идентификаторов. (Мне казалось, что нельзя использовать необъявленные идентификаторы). Но, с точки зрения использования - все чисто и правильно.  

 
George Merts:

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

Не нашел опасного примера.


На моей памяти, это единственная такая библиотека, когда #include есть, но нигде в коде ничего из нее не вызывается пользователем.

 
fxsaber:
Не проверял

Просто поверил, поэтому сделал через ресурсы. Изначально было через глобальные.


Я прошу прощения. Ввел в заблуждение.

Если поюзать пустой индикатор с таким OnInit (без удаления ресурса):

int OnInit()
  {
   uint set[1];
   set[0]=3;
   uint w=1,h=1;
   if(ResourceReadImage("::Res_name",set,w,h))
      Print("ресурс уже существует set[0] = "+DoubleToString(set[0],0));
   else
     {
      if(ResourceCreate("::Res_name",set,1,1,0,0,0,COLOR_FORMAT_XRGB_NOALPHA))
         Print("Создан новый ресурс");
      else Print("Не смогли создать ресурс");
     }

   return(INIT_SUCCEEDED);
  }

то можно о ресурсе сделать следующие выводы:

1. Ресурс принадлежит терминалу, а не окну. Следовательно целесообразно в имя ресурса добавлять скажем хэндл окна.

2. Время жизни ресурса, пока жив терминал, при перезагрузки терминала ресурс удаляется. Поэтому будет разумно в деюните при закрытии терминала ( код причины - REASON_CLOSE) сохранять необходимые данные в глобальной переменной терминала ( или файле через ResourceSave), а при новой загрузке терминала создавать вновь ресурс, передавая данные из глобальной ПТ (или файла) с последующим удалением ГПТ (или файла), чтоб глаза не мозолили (тогда глобальная переменная терминала будет существовать только в момент закрымия и открытия терминала).

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

Зато теперь есть ясность с плохо документированными ресурсами. И, кстати, весьма ценный инструмент.

 
Nikolai Semko:

Ресурс принадлежит терминалу, а не окну. Следовательно целесообразно в имя ресурса добавлять скажем хэндл окна.

Тогда в код добавить это
return("::" + (string)::ChartID() + (string)INIT_SYNC::crc64(Bytes) + ::MQLInfoString(MQL_PROGRAM_NAME));

Вроде, ничего больше не нужно.


Кстати, возможно, без хэндла окна в некоторых ситуациях может быть удобно, когда копия индикатора должна быть ОДНА на весь терминал.


ЗЫ Обновленная версия содержит данное исправление.

 
fxsaber:

Кстати, возможно, без хэндла окна в некоторых ситуациях может быть удобно, когда копия индикатора должна быть ОДНА на весь терминал.


Ага, я тоже об этом подумал

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