Вы хотите самостоятельно создавать и изменять под себя форекс индикаторы, советники и скрипты? В этом разделе вы найдете уроки по программированию на языке MQL4 автоматических систем, предназначенных для использования в торговом терминале MetaTrader 4. Обучение представлено в форме видео-уроков, причем к каждому уроку прилагается код, даются домашние задания, выполнив которые, вы сможете применить полученные знания на практике. Торговый терминал MetaTrader 4 по достоинству оценили сотни тысяч трейдеров во всем мире. Использование встроенного языка программирования MQL4 выводит трейдеров на качественно новый уровень торговли – автотрейдинг.
Номер переменной в массиве называют индексом (от латинского index – указательный палец). При объявлении массива в квадратных скобках указывается его размер (количество элементов), а при обращении к переменной – индекс элемента. Сетка строится на расстоянии, равном значению входного параметра DistanceToGrid от цены Ask для ордеров Buy Stop и Bid для сетки Sell Stop. В случае, если это значение меньше минимально разрешённого, сетка строится на расстоянии Sell Stop для данного символа.
Функции расчета торгового лота
Например, первый вызов функции в виде ArrayResize(Array, 10, 1000) увеличит размер массива до 10 элементов, но физически память под массив будет выделена, как если бы он содержал 1010 элементов. Теперь при увеличении или уменьшении размера массива в пределах 1010 элементов физического распределения памяти не будет. Если же размер увеличить, скажем, до 1011, то выделится еще 1000 резервных элементов, и так далее. В нашем советнике пирамида будет строиться в виде сетки отложенных ордеров, которая представляет собой установленные на определённом расстоянии друг от друга ордера Buy Stop или Sell Stop.
Общие параметры торговли
Массивы можно передавать в функции только по ссылке, то есть в функцию передаётся только адрес существующего массива, а не его копия. Она только производит действия над массивом в целом или над его отдельными элементами. Если предполагается, что лот каждого нового ордера или шаг, на котором он выставляется от предыдущего, изменяется в прогрессии, происходит вызов служебной функции GetProgressionMember(). Эта функция возвращает n-ый член арифметической или геометрической прогрессии.
И, наконец, решение о закрытии пирамиды можно принимать на основе технического анализа при первых признаках разворота или затухании текущей тенденции. Другой распространённый способ – закрытие пирамиды при достижении определённого уровня прибыли. В этом случае трейдер сам определяет величину прибыли, достаточную для закрытия пирамиды. Как уже отмечалось ранее, пирамидинг – это метод увеличения прибыли при торговле по тренду. Очевидно, что для диапазонной (флетовой) торговли такой подход не годится и может обернуться полной потерей депозита. Поэтому перед построением пирамиды трейдеру важно определить начало тренда.
MQL4: Пишем советник по стратегии «Пирамидинг»
- Именно этот механизм мы будем использовать при создании советника и позже разберём более подробно.
- Универсальную структуру, подходящую для использования массивов любого типа, к сожалению, создать не получится.
- Следуя поговорке «лучше один раз увидеть, чем сто раз услышать», посмотрим, как на реальном графике может выглядеть пирамида отложенных ордеров, которую будет строить наш советник.
- Полученные решения можно применять при создании пользовательских индикаторов и торговых советников.
- В данном случае переменная-счётчик последовательно примет значения 1, 3, 5, 7, 9, 11, а в журнал выведет 1, 3, 5, 7, 9.
Сильные тренды, на которых можно хорошо заработать с пирамидой ордеров, случаются не так часто, а во флете данная стратегия ведёт к потере денег. Поэтому задача идентификации трендового движения остаётся главной в пирамидинге как при ручной, так и при автоматической торговле. Опираясь именно на собранную функцией RefreshState() статистику, советник отслеживает текущую обстановку на торговом счёте и определяет, на каком именно шаге алгоритма он находится. Можно сгруппировать по какому-то критерию не только определённые данные, но и действия над этими данными.
Операторы break и continue могут использоваться в теле цикла любого типа. Напишем советник, который после прикрепления его к графику начинает обрабатывать поступающие тики не сразу, а спустя какое-то время, заданное нами в секундах. При этом советник должен сообщать с помощью комментария на графике, сколько секунд осталось до его запуска. Очевидно, что такую задержку надо поместить внутрь обработчика OnInit(), так как форекс трейдер эта функция выполняется при инициализации советника.
Конечно, в этом случае прибыль ожидаемо больше, но пропорционально растёт и просадка. Начнём реализацию алгоритма, опираясь на размещённую выше блок-схему. При этом блок «Новый тик» соответствует обработчику OnTick(), внутри которого мы будем производить вызов прочих функций.
Так выглядит эта же пирамида, когда первые четыре Sell Stop ордера были активированы при движении цены вниз. Теперь у нас открыты четыре рыночных ордера и шесть отложенных. В этом примере поля структуры open, close, high, volume, time доступны только из метода GetCandleParam().
Оператор continue удобно применять, если тело цикла довольно большое. Можно не усложнять конструкции ветвления внутри цикла, а сразу пропустить все последующие операторы и перейти к новой итерации. В данном коде мы реализовали задержку с выводом оставшегося до запуска времени в секундах при помощи цикла do while. Функция GetTickCount() возвращает количество миллисекунд, прошедших с момента старта системы. Мы использовали её для вычисления количества прошедших и оставшихся секунд. Здесь мы объявили переменную-счётчик до оператора цикла, а её инкрементацию поместили в тело цикла.