Статьи по MQL4
Глобальные переменные

Глобальные переменные


например, forex
Наш последний советник обладает только одним недостатком. В блоке init() имеется процедура открытия файла и чтения данных из него. При однократном прогоне в тестере это не страшно, но если мы захотим провести оптимизацию, то возникают две проблемы:
  1. падает скорость оптимизации, так как операции чтения из файлов на порядок (несколько порядков) медленнее, чем чтение из оперативной памяти;
  2. многократные операции открытия/закрытия файлов нежелательны для жесткого диска.
Программы в MQL-IV имеют глобальные переменные, объявленные в теле кода вне любой функции. Эти значения сохраняются в течение всей работы программы, и доступны из любой точки (функции) этой программы. Но для работы оптимизатора стратегий требуется некое иное решение, которое сохраняет значения переменных между запусками программ. В оптимизаторе мы многократно запускаем одну и ту же программу-советник, и иногда требуется помнить состояние некоторых переменных между отдельными запусками.

Для этих случаев существуют специальные переменные – Global Variables. В отличие от глобальных переменных на уровне одного кода/программы, эти переменные являются глобальными на уровне терминала. Таким образом, мы можем создать некую глобальную переменную в скрипте и задать ее значение (GlobalVariableSet()), а потом в индикаторе или советнике проверить это значение (GlobalVariableGet()).

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

Для освоения методики применения глобальных переменных сначала создадим скрипт. Этот скрипт будет создавать глобальный массив значение. Важно: глобальные переменные могут иметь только тип double. Не существует возможности создать массив глобальных переменных, но мы можем легко обойти это ограничение. Функции проверки и задания значений глобальных переменных оперируют именем этой переменной, заданной в текстовом формате. Поэтому, значение для массива по индексу мы можем задать как Имя_массива+индекс.

Назовем скрипт GlobalArray.mq4. Вместо глобального массива мы создадим массив глобальных переменных:

 
 


Код демонстрирует типичную работу с глобальными переменными – сначала проверяем наличие нужной переменной (GlobalVariableCheck(Имя_переменной)), а потом задаем ее значение. Запускаем скрипт на любом графике, жмем F3 и видим окно со списком глобальных переменных.

 
 


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

Все необходимые функции мы найдем в справочной системе MetaEditor. Функция GlobalVariableSetOnCondition() нам пока не нужна, остальные понятны.

 
 


Берем советник из предыдущей статьи, сохраняем его под именем CTL+GV.mq4(Global Variables). Делаем минимальные изменения в функции init(). Первым делом проверяем наличие глобальной переменной с именем FileOpened (файл уже открывали) , и если этой переменной еще нет – открываем файл, создаем множество глобальных переменных, содержащих сигналы на открытие позиций.

 
 


Также меняем немного функцию определения сигнала:

 
 


Как видите, пришлось внести минимальные изменения. Компилируем советника и запускаем тестер. После окончания тестирования жмем кнопку F3 и видим вновь созданные глобальные переменные.

 
 


Теперь мы можем проводить оптимизацию для наших входов – подбирать размер стопа и другие параметры трейлинга без замедления скорости оптимизации.

 
 


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

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


Каждый сам может в какой-то момент понять необходимость их использования для повышения устойчивости работы МТС. Файлы доступны на форуме
Перейти к статье «Поиск экстремумов цены».
 
+7 (495) 710-76-76
8 (800) 200-01-31
по России бесплатно

закрыть

Вход в личный кабинет

Для счета alpari.classic введите номер счета (буква и 4 цифры) и пароль в ЛК.

Для счетов alpari.micro и alpari.partner введите логин и пароль в МТ.

Зарегистрироваться!Забыли пароль?

 
Rambler's Top100