А теперь - супер-пупер-мега-вопрос: каков контекст жизни создаваемых в MQL5 ресурсов? Терминал целиком, какие-либо внутренние контейнеры вроде потоков "символ-таймфрейм", чарт или еще что? В справке про это не написано.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Последовательность выполнение Init() и DeInit()
Nikolai Semko, 2017.04.16 09:42
Конечно ресурсы - мне они кажутся оптимальным решением, т.к. невидимы, в отличии от глоб. переменных терминала и файлов, и быстры. А так же через них можно передавать массивы, как и через файлы, но только быстрее, т.к. все происходит в ОЗУ. А так же они принадлежат окну, а не терминалу, как в случае с глобальными. Тем более можно создавать один ресурс на все одинаковые индикаторы в окне.
Просто поверил, поэтому сделал через ресурсы. Изначально было через глобальные.
И есть еще один вопрос - что будет, если индикатор создан из эксперта?
Хм...
Интересные переопределения функций...
А как оно работает ? Скажем, на примере функции инициализации ?
Тааак...
Значит, поскольку библиотека вставляется вначале, то, при компиляции OnInit() библиотеки регистрируется, как функция инициализации.
Причем, в ней происходит проверка синхронизации, а затем вызывается функция OldOnInit(). А что это за функция ? Она ж еще не определена !
Ага... Дальше - идентификатор OnInit() дефайном определяется, как OldOnInit(). В дальнейшем, когда будет определена "старая" функция OnInit() - она будет заменена на OldOnInit() - ту самую, которую будет вызывать OnInit() библиотеки.
Мдя. Оригинальное использование дефайнов. На мой взгляд, довольно опасное, с точки зрения дальнейшей поддержки и возможностей изменения порядка объявления идентификаторов. (Мне казалось, что нельзя использовать необъявленные идентификаторы). Но, с точки зрения использования - все чисто и правильно.
На мой взгляд, довольно опасное, с точки зрения дальнейшей поддержки и возможностей изменения порядка объявления идентификаторов.
Не нашел опасного примера.
На моей памяти, это единственная такая библиотека, когда #include есть, но нигде в коде ничего из нее не вызывается пользователем.
Я прошу прощения. Ввел в заблуждение.
Если поюзать пустой индикатор с таким 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), а при новой загрузке терминала создавать вновь ресурс, передавая данные из глобальной ПТ (или файла) с последующим удалением ГПТ (или файла), чтоб глаза не мозолили (тогда глобальная переменная терминала будет существовать только в момент закрымия и открытия терминала).
С одной стороны это хорошо, т.к. возникают интересные возможности по передачи данных и синхронизации между окнами и вообще всего в терминале,с другой стороны добавляет код и некоторые заморочки.
Сорри еще раз за выдачу непроверенной информации.
Зато теперь есть ясность с плохо документированными ресурсами. И, кстати, весьма ценный инструмент.
Ресурс принадлежит терминалу, а не окну. Следовательно целесообразно в имя ресурса добавлять скажем хэндл окна.
return("::" + (string)::ChartID() + (string)INIT_SYNC::crc64(Bytes) + ::MQLInfoString(MQL_PROGRAM_NAME));
Вроде, ничего больше не нужно.
Кстати, возможно, без хэндла окна в некоторых ситуациях может быть удобно, когда копия индикатора должна быть ОДНА на весь терминал.
ЗЫ Обновленная версия содержит данное исправление.
Кстати, возможно, без хэндла окна в некоторых ситуациях может быть удобно, когда копия индикатора должна быть ОДНА на весь терминал.
Ага, я тоже об этом подумал
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Init_Sync:
Библиотека делает синхронизированными Init/Deinit индикаторов
Если в MT изменить таймфрейм или имя символа чарта, то все индикаторы на чарте выгрузятся с чарта и загрузятся на него снова. При этом, в отличие от MT4, в MT5 последовательность выгрузиться/загрузиться не определена из-за особенности внутренней архитектуры.
Данное обстоятельство иногда вызывает не сразу очевидные проблемы, связанные с тем, что OnInit новой загруженной копии индикатора может выполниться раньше OnDeinit выгружаемой копии.
Автор: fxsaber