Торговый советник на MQL4: учимся программировать с нуля
Содержание статьи
Торговый советник на MQL4: учимся программировать с нуля
В этом руководстве по MQL4 вы научитесь программировать свой собственный торговый советник в MetaEditor.
Прежде чем мы начнем, убедитесь, что вы понимаете следующие типы данных. Каждая переменная, которую мы будем использовать, для начала должна быть определена одним из следующих типов данных:
- int – это обычное число. Например: 1, 15, 521.
- double – число с десятичным знаком. Например: 1,154, 0,0144, 255,145.
- string – строка, слово, фраза. Например: «Ордер на покупку», «Ордер на продажу успешно размещен».
- bool – принимает значения либо false, либо true.
Скоро вы увидите, как их можно использовать.
Торговый советник три белых солдата
Для того, чтобы создать свой собственный торговый советник, для начала вы должны переключиться на MetaEditor. Вы смоете сделать это, нажав на иконку MetaEditor. В MetaEditor нажмите «Создать» и выберите «Советник (шаблон)». В следующем окне напишем имя нашего эксперта, нажмем на кнопку «Далее» и добавим первые стандартные переменные, нажав на кнопку «Добавить».
Мы добавим TakeProfit, StopLoss, LotSize, Slippage и MagicNumber. Все они являются типом int, кроме LotSize. LotSize должен иметь тип double.
Затем нажимаем «Далее» и «Готово». Мы видим, что MetaEditor сгенерировал файл с вашими предопределенными переменными.
Вы можете увидеть 3 области. Области OnInit(), OnDeinit() и OnTick(). Весь код, который вы пишете, попадает в одну из этих областей.
Код, который мы хотим вызвать, если прикрепим советник к графику, выполняется в области OnInit(). Код в OnDeinit() выполняется, когда мы отсоединяем советник. И, наконец, область, в которой мы будем работать больше всего – область OnTick(). Функция OnTick() вызывается каждый раз, когда мы получаем от брокера новую цену (тик) торгового инструмента, к которому прикреплен советник.
Если вы скомпилируете советника с помощью F7 и вернетесь в Metatrader, вы сможете найти советника в «Навигаторе» MetaTrader (Crtl + N). Если вы попытаетесь присоединить его к графику и перейдете на вкладку «Входные параметры», вы сможете увидеть наши предопределенные переменные.
Мы научимся программировать советника, который торгует по паттерну 3 белых солдата. Это простая стратегия, когда советник открывает сделку на покупку, когда последние 3 свечи были бычьими. Давайте начнем!
Добавим следующие строчки кода:
Для этой стратегии мы используем предопределенную переменную Close[], который является типом double. Close[] дает нам цену закрытия (например, 1.24577) для каждого свечи текущего графика. Close[0] означает текущую цену закрытия. Close[1] – предыдущую цену, и так далее. То же самое справедливо для предопределенных переменных Open[], Low[] и High[].
//Ордер на покупку – это подсказка для нас, что мы создали здесь функцию открытия ордера на покупку. Две обратных черты (//) означают, что эта строка закомментирована. Советник будет игнорировать ее при компиляции.
Если вы поместите курсор на предопределенную функцию или переменную и нажмете F1, откроется справка по MQL4, где вы сможете прочитать, что делает эта данная функция или переменная.
Далее мы используем функцию OrderSend, чтобы отправить ордер на покупку нашему брокеру. Добавим следующий код:
Что из себя представляет функция OrderSend?
- _Symbol – возвращает текущий торговый инструмент, к которому прикреплен советник.
- OP_BUY – мы хотим открыть ордер на покупку.
- LotSize – размер лота, который мы определили в самом начале.
- Ask – текущая цена Ask, по которой открываются ордера на покупку.
- Slippage – размер проскальзывания.
- StopLoss – это наш StopLoss. Или цена Ask за вычетом цены StopLoss. Запомните, что StopLoss – это целое число (500 пунктов), а Ask – это цена (например, 1.20521). Теперь, чтобы вычесть стоп-лосс из цены Ask, мы должны умножить его на 0,00001 или 0,001. Мы делаем это с помощью предопределенной переменной _Point, которая отражает текущие значением пунктов торгового инструмента.
- TakeProfit – то же самое, как и StopLoss.
- Комментарий – комментарий, который должен появиться в журнале, когда торговый советник разместит наш ордер.
- MagicNumer – магическое число, которое было определено нами вначале.
Нажмите F7, чтобы скомпилировать советник и проверить результат его работы в тестере стратегий. Вы получите что-то вроде этого:
Наш торговый советник выставляет ордера на покупку на каждом тике, если 3 последних бара были бычьими. Это не то что мы хотим, но, по крайней мере, что-то происходит.
Мы должны запрограммировать новую функцию, которая позволит нашему советнику одновременно открывать только одну сделку. MQL4 уже имеет свои предопределенные функции, например, OrderSend(). Но мы также можем написать свою собственную функцию, в которой мы можем вызвать другие пользовательские или предопределенные функции.
Давайте перейдем к концу нашего файла и запрограммируем новую функцию под названием TotalOpenOrders. Эта функция будет иметь тип int. Она будет возвращать количество открытых ордеров.
Затем добавим данную функцию в область OnTick и добавим проверку на количество открытых ордеров. Если общее количество сделок равно 0, наш торговый советник продолжает свою работу с кодом внутри скобок.
Что из себя представляет функция TotalOpenOrders?
В этой функции у нас есть счетчик (total_orders), который в конце возвращает общее количество открытых ордеров. Также у нас есть цикл for, который перебирает все открытые ордера. Если советник найдет ордер, соответствующий вашему символу и MagicNumer, счетчик увеличится на 1 (это записывается с помощью ++).
Теперь у нас все еще есть проблема. Если свеча слишком длинная, советник открывает вторую сделку на покупку непосредственно после того, как первая сделка на покупку закрывается с помощью StopLoss или TakeProfit. Мы должны добавить вторую функцию «IsNewBar».
Эта функция будет представлять тип bool. Она вернет true, если в Metatrader сгенерирована новая свеча, иначе она вернет false.
Давайте поместим эту функцию прямо над функцией TotalOpenOrder и вызовем ее в области OnTick вместе с TotalOpenOrders().
4-5 или 2-3 значные котировки
Давайте разберемся с проблемой котировок, которые могут предоставлять нам разные брокеры.
Сейчас мы используем предопределенную переменную _Point для преобразования TakeProfit и StopLoss. Но мы хотим создать функцию, которая предоставит нам одинаковое значение для 4 и 5 и соответственно 2-х и 3-х торговых инструментов. Для начала мы создаем глобальные переменные MyPoint и MySlippage. Поместим их прямо под нашими входными параметрами:
Теперь мы создаем функцию, которая сохраняет правильное значение в этих 2 переменных (MyPoint и MySlippage) и помещаем их в наши пользовательские функции:
Мы должны рассчитать эти значения только один раз. Только когда мы прикрепляем наш торговый советник к графику. Поэтому мы вызываем эти функции в разделе OnInit():
Теперь мы можем возвратить наши TakeProfit, StopLoss и Slippage к номальным значениям:
Далее мы заменяем все Slippage и _Point в функциях OnTick нашими 2 новыми глобальными переменными MyPoint и MySlippage. Таким образом, функция OrderSend будут выглядеть следующим образом:
Торговый советник и ECN брокеры
На ECN брокерах мы не можем отправить ордер с TakeProfit или StopLoss. Сначала нам придется отправить наш ордер без них, а затем изменить его.
Сначала мы сохраняем номер тикета из только что открытого ордера в переменной int ticket. Затем мы проверяем, получен ли мы данный ticket от нашего брокера. Далее мы вызываем функцию OrderModify. Функция OrderModify возвращает true или false, которые мы сохраняем в переменной bool res. Мы проверяем результат с помощью if (! Res) (так же, как if (res == false)) и выводим соответствующее сообщение.
Советники на основе индикаторов
Автоматизация рутинного труда трейдера при наличии стабильной торговой стратегии — одна из ключевых задач опытного профессионала. Когда все процессы полностью отлажены, остается создать специальную программу, которая будет выполнять все действия по закрытию и открытию ордеров вместо трейдера. Новички часто используют торговых роботов, которые есть в наличии в свободном доступе в Сети. Рассмотрим несколько популярных советников на основе индикаторов — простых в обращении и настройке.
Советник по индикатору RSI — Ilan
К настоящему времени в Интернете насчитывается несколько десятков модификаций популярной автоматической торговой системы Ilan. В классическом варианте используются два индикатора — CCI и RSI. В нашем случае применяется только последний.
Суть работы советника по индикатору RSI предельно проста. Сделки на покупку валюты робот открывает только в том случае, когда показания индикатора опускаются ниже уровня 30. Система продает валюту при нахождении линии RSI выше отметки в 30. Конечно, такой подход является несколько примитивным, поэтому робот не фиксирует убытки в четко оговоренном месте. Роль стоп-лоссов отведена новым ордерам в том же направлении, что и первый. Это называется принципом Мартингейла.
Если первая сделка не была закрыта по профиту, открывается еще необходимое количество ордеров, при этом тейк-профит передвигается до того уровня, на котором будет зафиксирована усредненная прибыль по всем операциям, не менее изначально запланированной. Скачать советник на основе индикатора RSI Ilan вы можете по ссылке. Как его настроить?
Сразу следует заметить, что установка автоматической торговой системы на таймфрейм ниже М30 вряд ли даст хорошие результаты. Также работа робота сильно зависит от выбранного брокера. Важно, чтобы в компании, предоставляющей вам выход на валютный рынок Форекс, не было задержек с открытием ордеров, реквот и прочих технических неисправностей. Рекомендуем работать с брокером Forex4you или RoboForex.
В настройках советника по индикатору вы найдете следующие параметры:
Первый элемент в перечне настроек отвечает за увеличение лота при открытии каждого последующего ордера, если первый оказался убыточным. Настройки, изображенные на рисунке выше, являются довольно агрессивными. Рекомендуется выставлять значение параметра Lot Exponent в диапазоне от 1,5 до 2.
Элемент списка под названием Lots содержит информацию о стартовой величине лота, с которой советник начнет свою торговлю. Следующая строка предназначена для указания системы исчисления лотов (целые числа, десятичные или сотые). Может принимать значение от 0 до 2. В строке Take Profit вы можете самостоятельно указать количество пунктов прибыли для первого ордера, при достижении которых сделка будет закрыта.
Строка Pip Step отвечает за расстояние между открываемыми сделками в сетке. Этот параметр вместе с коэффициентом увеличения лота лучше подобрать экспериментальным путем с помощью тестера стратегий. Максимально возможное проскальзывание нужно указать в строке Slip. Если фактическая величина будет больше указанной, сделка просто не откроется. Именно поэтому так важно выбрать хорошего брокера.
Строчка Max Trades содержит значение максимального количества сделок в серии, которое будет открыто для усреднения убытков, без учета первой. Этот параметр также лучше выбрать на основании тестирования и размера вашего капитала. Magic Number является идентификатором, который используется для того, чтобы советник не путал ордера, открытые им и другим роботом. Если другие автоматические системы на этом торговом счете у вас не установлены, в этом поле достаточно указать любую цифру, отличную от нуля или же оставить предустановленную.
Недостатком советника на основе индикатора RSI является большой риск. Даже если вы ограничите максимальное число ордеров в серии, вы все равно рискуете не дождаться разворота тренда в сторону первой сделки и потерять значительную часть депозита.
Советник 3 Moving Average
Следующий советник вы можете скачать здесь. Его алгоритм работы настолько прост, что будет понятен даже новичку. В его основе лежат три скользящие средние с настраиваемыми параметрами. Сделки на покупку открываются, когда все три мувинга направлены вверх. В случае нисходящего направления скользящих средних автоматическая торговая система будет продавать пару.
Стоп-лосс, тейк-профит и объем ордера вы устанавливаете в настройках самостоятельно. Там же вы можете указать период, метод и вид цен для каждой Moving Average. Закрывать сделки советник может по-разному. За это отвечает первый в списке настроек параметр — Exit Signal MA Summ.
Он может принимать значение от одного до трех. В первом случае ордер будет закрыт роботом, если любая из средних изменит направление на противоположное. Если в этом поле вы укажете значение 2, вам придется ждать поворота двух мувингов для закрытия. При установленной цифре 3 операция будет завершена только после полного разворота всех трех мувингов. Оптимальным считается значение от одного до двух. Так выглядят на практике настройки советника.
Советник по индикатору Стохастик
Следующий советник открывает сделки по сигналам индикатора Стохастик. Он покупает валютную пару, когда линия индикатора выходит за пределы уровня 30 вверх, и продает, когда она же спускается ниже уровня 70, но это еще не все. Такой алгоритм был бы слишком примитивным и скорее всего проигрышным. В советник по индикатору Стохастик добавлены элементы Мартингейла.
На рисунке ниже вы можете увидеть возможные настройки советника, который скачать можно прямо на сайте.
Вы можете указать объем первоначального и максимального лота, уровень стоп-лосса и тейк-профита, допустимый размер проскальзывания. В строке OnlyOneopenPose обязательно должно стоять значение True, чтобы одновременно робот открывал не более одной сделки и одной серии.
Перечисленные в статье советники не являются универсальным инструментом для зарабатывания денег на рынке Форекс на полном автопилоте. Они нуждаются в тестировании и настройке. Прежде, чем вы запустите автоматическую торговую систему на реальных деньгах, изучите ее работу на демонстрационном счете.
Помним, что прибыльность торговли очень сильно зависит от выбранного вами брокера!
Источник https://traderblog.net/torgovyj-sovetnik-na-mql4/
Источник https://forex-invest.tv/stati-foreks/sovetniki-na-osnove-indikatorov.html
Источник
Источник