Обсуждение статьи "Основы программирования на MQL5: Глобальные переменные терминала" - страница 3

 
Dmitry Fedoseev:
Решаемо через префиксы глобальных переменных.
через префиксы решаемо, но это некрасивое решение :-( возникает вопрос генерации уникальных префиксов и в обзоре переменных по F3 выходит треш и угар..действительно-же нехватает переменным пространст имён. А то придётся префикс генерировать из DC,аккаунта,счёта,чарта..и помниться что длина имени ограниченна, особо с префиксами не разгуляться :-)
 

Хорошие статьи для начинающих.

The GlobalVariableTemp() function creates a temporary global variable (that exists till the terminal is stopped). In a few years that I develop EAs on MQL5, I have never faced the need for such a variable. Moreover, the very concept of a temporary global variable contradicts the basic principle of their application — long-term data storage not affected by the terminal relaunches.

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

Часть про мьютекс очень интересная, у меня есть один вопрос и одно замечание.

Может случиться так, что во время выполнения функции OnTick() какой-нибудь советник удаляется с графика, но функция Mutex_Release() не выполняется.

Как можно удалить советника и не выполнить функцию Mutex_Release()? Если удалить советника с графика обычным способом (закрыть график, удалить советника или закрыть терминал), то это никогда не остановит поток исполнения. Я что-то упускаю?

Итак, мое замечание: единственный способ, при котором функция Mutex_Release() не может быть выполнена - это "жесткая" остановка, отказ питания или оборудования и т.д..., поэтому ваши глобальные переменные mutex - идеальный кандидат для создания временных переменных с помощью GlobalVariableTemp().

 

Работают ли глобальные переменные во время тестирования стратегий?

Например, если индикатор сохраняет значения в GV, а советник считывает их, будет ли тестер стратегий вовремя получать значения во время симуляции?

 
Admiral Thrawn:

Работают ли глобальные переменные во время тестирования стратегии?

Например, если индикатор сохраняет значения в GV, а советник считывает их, будет ли тестер стратегий вовремя получать значения во время симуляции?

Да

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

У меня глобальные переменные пропали после закрытия терминала мт5 bild 2361.  При том на 2-х разных терминалах МТ5. GlobalVariablesFlush() выполняется. Бред. Терминалы запускаются с ключом   /portable, может в этом дело?

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

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Глобальные переменные создаются путем размещения их объявлений вне описания какой-либо функции. Глобальные переменные определяются на том же уровне, что и функции, т. е. не локальны ни в каком блоке. Область видимости глобальных переменных - вся программа, глобальные переменные доступны из всех функций, определенных в программе...
 
Konstantin Efremov:

У меня глобальные переменные пропали после закрытия терминала мт5 bild 2361.  При том на 2-х разных терминалах МТ5. GlobalVariablesFlush() выполняется. Бред. Терминалы запускаются с ключом   /portable, может в этом дело?

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

В терминале или в тестере? В МТ5 есть разница.

 
Dmitry Fedoseev:

В терминале или в тестере? В МТ5 есть разница.

В терминале.

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

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

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Глобальные переменные создаются путем размещения их объявлений вне описания какой-либо функции. Глобальные переменные определяются на том же уровне, что и функции, т. е. не локальны ни в каком блоке. Область видимости глобальных переменных - вся программа, глобальные переменные доступны из всех функций, определенных в программе...
 
Я прочитал все это, это большая польза, но последняя часть немного сложна, временные переменные все еще полезны У меня есть торговая панель в советнике, панель включает кнопку для открытия функции трейлинг-стопа, временная переменная может запомнить значение переменной и затем переключить циклы Я могу получить статус оригинальной кнопки и перерисовать ее Спасибо за вашу статью!
 

Здравствуйте, Дмитрий,

Я понимаю, что вашей статье уже несколько лет, но я подумал, что мог бы поделиться кое-чем и, надеюсь, также задать вопрос!

Вы упомянули, что не нашли применения глобальной переменной Temp. Я как раз разрабатываю то, что требует именно этого. Я ломал голову, пытаясь найти способ реализовать обмен хэндлом порта завершения IO через глобальные переменные, в частности, при падении или обычном перезапуске. Я разрабатываю систему обработки заказов с использованием портов завершения IO Windows. Поскольку мы можем создавать потоки Win32 из MQL5, я не могу создать пул потоков при создании IOCP-сервера, поэтому мой обходной путь с использованием служб заключается в следующем;

  1. Создаю IOCP-сервер, вместо создания потоков (что мы не можем сделать), я сохраняю IOCP Handle в глобальной переменной.
  2. Затем я открываю по крайней мере 2 другие службы, которые действуют как рабочие потоки, и они считывают IOCP Handle из Global Var и регистрируют себя в IOCP.

В случае перезапуска терминала, аномального или иного, я хочу, чтобы IOCP Handle исчез при запуске терминала, чтобы я мог создать новый IOCP Handle для нового запуска. Это делает реализацию намного чище.

Мне также интересно, насколько быстро работают глобальные переменные и насколько они надежны?

Спасибо за отличную статью, было приятно читать,

Шеп


 
Это то, что нужно для интеграции с Python, чтобы отправлять данные в Python и из Python в советники MLQ. Тогда советник, разработанный на Python, можно будет протестировать в тестере стратегий, если только нет какой-то невозможности, о которой я не знаю.