Как и зачем разрабатывать собственную систему для алгоритмической торговли
Введение
Без сомнения можно утверждать, что важность разработки и программирования растет с каждым днем во всех сферах нашей жизни. Программирование не только облегчает нашу жизнь, но и позволяет выполнять некоторые вещи точнее, а кроме того и помогает четко придерживаться выбранной стратегии.
В замечательном мире трейдинга программирование привносит простоту и систематичность, оно автоматизирует определенные действия и выполняет за нас огромную часть работы. Несомненно одно — программирование несет с собой огромное количество преимуществ, но на мой взгляд, одно из самых важных из них — это дисциплина, поскольку все мы знаем, как сложно быть дисциплинированным при принятии и реализации торговых решений. Очень часто дисциплина напрямую влияет на результаты торговли и инвестирования. Как я люблю говорить, дисциплина — ключ к успеху в трейдинге и в целом в жизни. В упрощенном виде дисциплину можно объяснить как способность совершать необходимые действия в нужное время независимо от окружающих обстоятельств. Самодисциплина — вещь очень сложная, ведь приходится сознательно контролировать собственные действия. И вот именно здесь на помощь приходит программирование.
Чаще всего быть дисциплинированными при торговле нам мешают эмоции, то есть нам нужно как-то убрать эти эмоции или предотвратить их негативное влияния на принимаемые торговые решения. А представьте, если вместо нас торгует определенная система, которая совершает операции независимо от человека на основе неких предустановленных параметров. Такая автоматическая система позволит избежать негативного влияния спонтанных человеческих эмоций. А ведь уже есть готовый инструмент, с помощью которого можно создать такую систему. Об этом инструменте мы и поговорим в данной статье — это язык программирования MQL (MetaQuotes Language) для торговой платформы MetaTrader. С помощью этого языка можно запрограммировать торговую систему, которая будет работать по заданным нами параметрам, чтобы гарантированно совершать определенные действия и принимать определенные торговым решения.
Чтобы помочь вам лучше понять эту концепцию, я приведу пример. Предположим, есть два инвестора, A и B, торгующие по совершенно одинаковым стратегиям: покупка и удержание позиции при растущем тренде и продажа при развороте. Но ведут они себя по-разному: инвестор A торгует дисциплинированно, в отличие от B. Посмотрите на эти изображения:
Видно, что дисциплина необходима для получения хороших результатов. И наоборот — без дисциплины результаты не такие хорошие.
В этой статье мы рассмотрим основы языка программирования MQL5 и попробуем написать собственную автоматическую торговую систему на основе пересечения скользящих средних. В статье приводится много примеров кодов на MQL5, которые помогут лучше понять тему. Здесь приводится общий обзор того, что же можно сделать, используя язык программирования в торговой платформе.
Основная цель этой статьи — помочь новичкам научиться разрабатывать собственные алгоритмические торговые системы на MQL5. Мы рассмотрим некоторые основы MQL5 и шаг за шагом разработаем простую торговую систему. В итоге должен получиться исполняемый код, результат которого мы увидим в конце статьи. Чтобы лучше понять все, о чем здесь будет говориться, я рекомендую читателям самостоятельно проработать каждый представленный в статье фрагмент кода и повторить весь процесс в собственной программе. Обратите внимание, что все фрагменты кода, представленные в статье, приводятся исключительно с целью изучения возможностей программирования и не предназначены для других целей. Все коды будут написаны на языке MQL5.
Что нужно для разработки собственного торгового алгоритма
В этой части рассмотрим, какие же инструменты нам понадобятся для разработки системы:
- Торговая платформа MetaTrader 5 (или торговый терминал MetaTrader 5). Итоговый код исполняется в терминале, где собственно и совершаются все торговые ордеры. Это очень популярная торговая платформа с огромными возможностями.
Демо-счет. Нужно будет открыть демо-счет у выбранного брокера, на котором можно будет проверять стратегии, не рискуя реальными деньгами, но в условиях реального рынка. Убедитесь, что не запускаете учебные программы на реальном счете. Обязательно нужен демо-счет, ведь создаваемая программа будет совершать на этом счете торговые операции.
Редактор MetaEditor, в котором и будет писаться код программы. Редактор устанавливается вместе с терминалом MetaTrader 5. На скриншотах ниже показано, как его запустить. Есть три способа запустить редактор.
- В меню "Сервис" выберите MetaQuotes Language Editor:
Или нажмите на иконку MetaEditor в тулбаре:
Или нажмите F4 на клавиатуре при открытом терминале.
Основная работа по созданию кода собственной торговой системы будет проводиться именно в редакторе. Вот как он выглядит:
Итак, создадим в редакторе нашу первую программу, файл, в котором и будем писать код.
Если нажать на New, будут показаны доступные виды программ, которые можно создать в редакторе:
Итак, можно выбрать создать советник, пользовательский индикатор и скрипт. Рассмотрим, что все это означает.
- Торговый советник — это программа, работающая в терминале, которая позволяет автоматизировать анализ котировок и торговлю в соответствии с заданными параметрами.
- Пользовательский индикатор — программа, позволяющая графически отобразить некие рассчитанные числовые зависимости.
- Скрипт — программа, предназначенная для однократного выполнения действия по аналитике или торговле, исполняется такая программа по запросу.
Программа Hello World!
В этой части мы напишем свой первый код и свою первую программу на MQL5. Путь в любом языке программирования начинается с написания первой программы — Hello World. Мы тоже напишем первую программу, которая будет выводить на экран надпись “Hello World”. Итак, начнем.
Открываем MetaEditor, создаем новую программу, выбираем тип программы скрипт (Script), нажимаем "Далее".
<Откроется следующее окно, в котором необходимо указать параметры:
- Название — название скрипта
- Автор — имя автора скрипта
- Ссылка — ссылка на ваш сайт
- Параметры — параметры работы будущего скрипта. Для нашего скрипта параметры не нужны, поэтому пропускаем этот шаг.
После этого появится собственно то самое окно, в котором мы и будем писать код программы. Напомню, мы пишем программу, которая будет выводить надпись “Hello World!” в окне терминала. Начнем писать наш код внутри фигурных скобок.
Какие элементы тут используем:
- Алерт: выводит на экран некое заданное сообщение, в нашем примере именно эта функция будет выводить на экран надпись “Hello World!”
- ( “ ”): внутри кавычек напишем нужный нам текст - это "Hello World!" или любое другое нужное вам сообщение.
- ; - используется как разделитель.
Получается такой пример кода:
//+----------------------------------------------------------+ //| Hello World!.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+----------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+----------------------------------------------------------+ //| Script program start function | //+----------------------------------------------------------+ void OnStart() { Alert("Hello World!"); } //+----------------------------------------------------------+
После того, как мы написали текст кода, его надо скомпилировать. Для этого нажимаем кнопку "Compile". На этом этапе важно, чтобы в программе не было ошибок и предупреждений. На вкладке Ошибок не должно быть никаких сообщений — только в этом случаем можно ожидать, что программа будет работать именно так, как нам нужно. Теперь нажимаем F4 и переходим в терминал, чтобы протестировать работу получившейся программы.
Идея торговой стратегии (пересечение двух скользящих средних)
В этой части мы научимся писать торговую стратегию. Представлена она здесь исключительно в целях изучения основ языка программирования MQL5 и работы с редактором.
Примечание
Любая информация предоставлена "как есть" исключительно в информационных целях и не должна быть использована в качестве торговых целей или рекомендаций. Никакие прошлые результаты работу не могут гарантировать таких же результатов в будущем. Если вы решите использовать какой-либо код, используйте его на свой страх и риск.
Смысл такой торговой стратегии — торговать по тренду при получении подтверждения сигнала от двух простых скользящих средних:
- Простая скользящая средняя — запаздывающий индикатор, который рассчитывает среднюю цену закрытия за определенный период, сигнал от такого индикатора получается позже, чем от индикаторов ценового действия.
- Стратегия торговли:
- Если короткая скользящая средняя (с периодом 20) пересекает длинную скользящую среднюю (с периодом 50) снизу вверх, это сигнал на покупку.
- Если короткая скользящая средняя (с периодом 20) пересекает длинную скользящую среднюю (с периодом 50) сверху вниз, это сигнал на продажу.
Далее мы будем писать программу, которая реализует эту стратегию.
Схема алгоритмической торговой системы
В этой части статьи рассмотрим очень важный этап при разработке торговых систем. На этом этапе мы разработаем схему работы стратегии/схему торговой идеи в виде последовательности шагов, которые должна выполнять система. Такая система дает четкое понимание необходимых шагов разработки. Для нашей системы на основе пересечения двух скользящих средних схема работы четко покажет, какой код нам нужно написать и что мы в итоге хотим получить.
Для начала рассмотрим некоторые основные понятия зыка MQL5 — то, с чем мы будем работать.
Переменные и их типы. Использование переменных
В этой части рассмотрим:
- Что такое переменная
- Типы переменных
- Использование
В общем виде, данные в программах могут быть двух типов: константы и переменные. Значения переменных могут меняться пользователем или программой. Переменная находится в памяти. Имя переменной ассоциируется с ее местоположением в памяти. По этому адресу и хранятся данные. Программа на MQL5 может содержать десятки и сотни переменных. Важным свойством переменной является возможность использовать ее значение в программе. Ограничение этой возможности связано с областью видимости переменной, которая означает часть программы, в которой эта переменная доступна. Каждая переменная имеет свою область видимости.
По области видимости в MQL5 есть два типа переменных: локальные и глобальные. Локальная переменная — это переменная, объявленная внутри функции. Областью видимости локальной переменной является тело функции, в которой она объявлена. Локальная переменная может быть инициализирована константой или выражением, соответствующим ее типу. Глобальные переменные объявляются вне всех функций. Область видимости переменных, объявленных на глобальном уровне — вся программа. Глобальная переменная может быть инициализирована только константой, соответствующей ее типу (но не выражением). Глобальные переменные инициализируются только один раз перед выполнением специальных функций.
Независимо от области видимости переменных, переменные могут быть следующих типов:
- int — числовой тип; существуют разные типы целочисленных переменных для хранения числовых значений разной длины.
- double. Для написания программы, работающей с числовыми значениями в трейдинге, нужен такой тип данных, который может работать с числами с плавающей запятой. В MetaTrader для работы с такими данными есть два типа: float и double. Разница между ними заключается в байтах, выделенных в памяти: 4 для float и 8 для double. Для этих данных возможны следующие минимальные и максимальные значения:
- float - минимум 1.175494351e-38, максимум 3.402823466e+38
- double - минимум 2.2250738585072014e-308, максимум 1.7976931348623158e+308
Для объявления этих типов используются ключевые слова float и double. - string — еще один важный тип данных, который часто используется в программировании, в том числе и в MQL5. Строковые данные String позволяют хранить и обрабатывать буквенно-цифровые последовательности символов.
- bool - логический тип, который может принимать значения true или false.
Посмотрим примеры использования переменных:
//+------------------------------------------------------------------+ //| Variables.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { int myInteger = 5; double myDouble = 10.56; string myString = "My name is Mohamed"; bool myBoolean = true; Alert(myInteger); Alert(myDouble); Alert(myString); Alert(myBoolean); } //+------------------------------------------------------------------+
Если скомпилировать этот код и запустить в терминале, в окне будет показано сообщение:
Рассмотрим еще один пример.
- Значение переменной message1
- Значение переменной C
- Значение переменной result
- Значение переменной message2
//+------------------------------------------------------------------+ //| Variables 2.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { int A = 10; int B = 5; int C; double var1 = 2.5; double var2 = 4; double result = var1 / var2; string greeting = "Hello"; string space = " "; string name = "Mohamed"; string message1; string message2; C = A + B; message1 = greeting + space + name; message2 = "Value of A is: " + string(A); Alert(message1); Alert(C); Alert(result); Alert(message2); } //+------------------------------------------------------------------+
Логические операции
Тип данных возвращает значение логической операции true или false.
- == равенство
- != не равно
- < меньше, чем
- <= меньше, чем или равно
- > больше, чем
- >= больше, чем или равно
//+------------------------------------------------------------------+ //| Boolean Operations.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { bool result = 4 < 5; Alert (result); //true } //+------------------------------------------------------------------+
Должно вернуться true, так как 4 < 5.
Цикл While
Оператор while состоит из проверяемого выражения и оператора, который необходимо выполнить. Если выражение истинно, оператор выполняется до тех пор, пока выражение не станет ложным. В следующем примере программа уведомляет о начале и окончании цикла, а также проверяет значение счетчика и отображает его, если это значение меньше трех. Далее к предыдущему результату будет добавляться единица, пока выражение не станет ложным, то есть = или > 3, а затем покажет последнее сообщение по завершению цикла. При исполнении программы на экране должны появиться следующие сообщения: Start of script, 1, 2, Loop has finished.//+------------------------------------------------------------------+ //| While Loop.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //While (Loop) Alert("Start of script"); int counter = 1; while(counter < 3) //true? { Alert(counter); counter = counter + 1; } Alert("Loop has finished"); }
Цикл For
Оператор for состоит из трех выражений и выполняемого оператора:
for(выражение1; выражение2; выражение3)
operator;
Выражение1 описывает инициализацию цикла. Выражение2 проверяет условие завершение цикла. Если оно истинно, то выполняется оператор тела цикла for. Все повторяется, пока выражение2 не станет ложным. Если оно ложно, цикл заканчивается и управление передается следующему оператору. ВыражениеЗ вычисляется после каждой итерации.
Таким образом, в следующем примере цикла for можно ожидать, что выполнение кода приведет к пяти сообщениям Hello (I = 0, I = 2, …………, I = 4), затем будет = 5 и цикл будет прерван.
//+------------------------------------------------------------------+ //| For Loop.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { for(int i=0; i<5 ; i++) { Alert("Hello"); } } //+------------------------------------------------------------------+
Выражение IF, Else
Оператор IF - ELSE используется, когда нужно сделать выбор. Синтаксис выглядит следующим образом:
if (expression)
operator1
else
operator2
Если выражение истинно, выполняется оператор operator1, а управление передается оператору, следующему за оператором operator2 (operator2 не исполняется). Если выражение ложно, выполняется operator2.
Например: в следующем примере нужно сначала отобразить сообщение со значением цены Bid, затем определить, правда ли Bid > 1.146600, и в этом случае показать сообщение “Цена выше 1.146600 -> BUY”. Если нет, показать сообщение “Цена ниже 1.146600 -> SELL”. Далее показан код и результат исполнения.
//+------------------------------------------------------------------+ //| If-else statement.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { double level = 1.146600; double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); Alert("Bid Price = " + string(Bid)); if(Bid > level) { Alert ("Цена выше " + string(level) + " -> BUY"); } // А если условие ложно и нужно совершить другое действие, можно использовать функцию else, а не писать новый код if else { Alert ("The price is below " + string(level) + " -> SELL"); } } //+------------------------------------------------------------------+
Входные параметры
Далее рассмотрим, как определить наши входные данные или параметры для программы.
Параметры (#property): Каждая MQL5-программа позволяет указать дополнительные специфические параметры с директивой #property, которые помогают клиентскому терминалу правильно исполнять программы.
script_show_inputs: Отображать окно со свойствами перед запуском скрипта и отключать это окно подтверждения
Входные параметры: Класс input определяет внешние переменные. Модификатор input указывается перед типом данных.
//+------------------------------------------------------------------+ //| Trader Inputs.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property script_show_inputs //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ input int TakeProfit = 10; input int StopLoss = 10; void OnStart() { double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double TakeProfitLevel = Bid + TakeProfit * 0.00001; // 0.00001 (5 digits broker, so multiplied by 10) double StopLossLevel = Bid - StopLoss * 0.00001; Alert("Price now = " + string(Bid)); Alert ("TakeProfitLevel = ", TakeProfitLevel); Alert ("StopLossLevel = ", StopLossLevel); } //+------------------------------------------------------------------+
Открытие ордеров
Рассмотрим код, открывающий ордера:
//+------------------------------------------------------------------+ //| TEST.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property script_show_inputs #include <Trade\Trade.mqh> CTrade trade; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ input int TakeProfit = 150; input int StopLoss = 100; void OnStart() { double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double Balance = AccountInfoDouble(ACCOUNT_BALANCE); double Equity = AccountInfoDouble(ACCOUNT_EQUITY); double TakeProfitLevel = (Ask+TakeProfit*0.00001); double StopLossLevel = (Ask-StopLoss*0.00001); if(Equity >= Balance) trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL); for (int i=PositionsTotal()-1; i>=0; i--) { ulong ticket = PositionGetTicket(i); ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE)); Alert (" Order Ticket # ", ticket); Alert("TakeProfit = ", TakeProfitLevel); Alert("StopLoss = ", StopLossLevel); } } //+------------------------------------------------------------------+
Обработка ошибок
При работе программы что-то может пойти не так, могут возникать ошибки. Поэтому нужно добавить такой код, который будет проверять создание ордеров или исполнение соответствующего кода и уведомлять, если что-то пошло не так. Другими словами, это защита трейдера и средств от непредвиденных ситуаций.
//+------------------------------------------------------------------+ //| TEST.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property script_show_inputs #include <Trade\Trade.mqh> CTrade trade; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ input int TakeProfit = 150; input int StopLoss = 100; void OnStart() { double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double Balance = AccountInfoDouble(ACCOUNT_BALANCE); double Equity = AccountInfoDouble(ACCOUNT_EQUITY); double TakeProfitLevel = (Ask+TakeProfit*0.00001); double StopLossLevel = (Ask-StopLoss*0.00001); if(Equity >= Balance) trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL); for (int i=PositionsTotal()-1; i>=0; i--) { ulong ticket = PositionGetTicket(i); ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE)); if (ticket <= 0) { Alert("Error!"); //предупреждение появляется в случае возникновения ошибок или если ордер не смог открыться } else { Alert("Your ticket # is: " + string(ticket)); Alert("TakeProfit = ", TakeProfitLevel); Alert("StopLoss = ", StopLossLevel); } } } //+------------------------------------------------------------------+
Настройки закрытия ордеров
Давайте рассмотрим код, который открывает и закрывает ордера.//+------------------------------------------------------------------+ //| TEST.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property script_show_inputs #include <Trade\Trade.mqh> CTrade trade; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ input int TakeProfit = 150; input int StopLoss = 100; void OnStart() { double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double Balance = AccountInfoDouble(ACCOUNT_BALANCE); double Equity = AccountInfoDouble(ACCOUNT_EQUITY); double TakeProfitLevel = (Ask+TakeProfit*0.00001); double StopLossLevel = (Ask-StopLoss*0.00001); trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL); for (int i=PositionsTotal()-1; i>=0; i--) { ulong ticket = PositionGetTicket(i); ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE)); Alert (" Order Ticket # ", ticket); Alert("TakeProfit = ", TakeProfitLevel); Alert("StopLoss = ", StopLossLevel); Sleep(2000); trade.PositionClose(ticket,-1); Alert("Order Closed..."); } } //+------------------------------------------------------------------+
Работа с ордерами с функцией OrderModify
Данный код позволяет модифицировать установленные ордера. Он изменяет характеристики ранее открытых или отложенных ордеров.
//+------------------------------------------------------------------+ //| TEST.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property script_show_inputs #include <Trade\Trade.mqh> CTrade trade; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ input int TakeProfit = 150; input int StopLoss = 100; void OnStart() { double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double Balance = AccountInfoDouble(ACCOUNT_BALANCE); double Equity = AccountInfoDouble(ACCOUNT_EQUITY); double TakeProfitLevel = (Ask+TakeProfit*0.00001); double StopLossLevel = (Ask-StopLoss*0.00001); double TakeProfitLevel2 = (TakeProfitLevel+0.00100); double StopLossLevel2 = (StopLossLevel-0.00050); trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL); for (int i=PositionsTotal()-1; i>=0; i--) { ulong ticket = PositionGetTicket(i); ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE)); Alert (" Order Ticket # ", ticket); Alert("TakeProfit = ", TakeProfitLevel); Alert("StopLoss = ", StopLossLevel); Sleep(5000); trade.PositionModify(ticket,StopLossLevel2,TakeProfitLevel2); Alert("Order Modified..."); Alert("Modified TakeProfit = ", TakeProfitLevel2); Alert("Modified StopLoss = ", StopLossLevel2); } } //+------------------------------------------------------------------+
Система на пересечении двух скользящих средних
Давайте соберем все вместе и создадим систему, которая торгует на основе сигналов от пересечения двух скользящих средних. Работать программа будет согласно схеме, которую мы рассмотрели выше.
Чтобы написать систему, создадим в редакторе MetaEditor новый файл с типом Советник.
Давайте еще раз вспомним подробную схему работы:
- Если короткая скользящая средняя (с периодом 20) пересекает длинную скользящую среднюю (с периодом 50) снизу вверх, это сигнал на покупку.
- Если короткая скользящая средняя (с периодом 20) пересекает длинную скользящую среднюю (с периодом 50) сверху вниз, это сигнал на продажу.
//+------------------------------------------------------------------+ //| SMA crossover.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Тиковая функция эксперта | //+------------------------------------------------------------------+ void OnTick() { //create an array for several prices double myMovingAverageArray1[], myMovingAverageArray2[]; //определим свойства скользящих - простые MA с периодами 20 и 50 int movingAverage1 = iMA(_Symbol, _Period, 20, 0, MODE_SMA, PRICE_CLOSE); int movingAverage2 = iMA(_Symbol,_Period,50,0,MODE_SMA,PRICE_CLOSE); //sort the price arrays 1, 2 from current candle ArraySetAsSeries(myMovingAverageArray1,true); ArraySetAsSeries(myMovingAverageArray2,true); //Параметры MA1, MA2 - линия - текущая свеча, 3 свечи - сохраним результат CopyBuffer(movingAverage1,0,0,3,myMovingAverageArray1); CopyBuffer(movingAverage2,0,0,3,myMovingAverageArray2); //Проверка сигнала на покупку if ( (myMovingAverageArray1[0]>myMovingAverageArray2[0]) && (myMovingAverageArray1[1]<myMovingAverageArray2[1]) ) { Comment("BUY"); } //Проверка сигнала на продажу if ( (myMovingAverageArray1[0]<myMovingAverageArray2[0]) && (myMovingAverageArray1[1]>myMovingAverageArray2[1]) ) { Comment("SELL"); } } //+------------------------------------------------------------------+
После выполнения программа выведет комментарии на график с текущим сигналом (покупка или продажа) на основе выбранной стратегии. Вот как это должно выглядеть:
После запуска программы двойным кликом или перетаскиванием появится такое окно:
Разрешите автоматическую торговлю Allow Algo Trading и нажмите ОК. Советник будет запущен на графике, а на вкладке Журнал появится сообщение об успешном запуске:
Итак, мы создали и выполнили программу, автоматически торгующую на основе пересечения двух скользящих средних. Это простейший пример того, как можно создать собственную программу автоматической торговли в терминале. С языком программирования MQL5 вы можете реализовать и автоматизировать практически любую торговую стратегию.
Повторюсь, основная цель не в том, чтобы использовать эту стратегию, а в том, чтобы изучить основы MQL5 и познакомиться с возможностями программирования, которые могут сделать трейдинг проще и прибыльнее. Чтобы использовать эту стратегию, ее обязательно нужно доработать, потому что весь код — учебный.
Заключение:
MQL5 — великолепный инструмент, который помогает сделать торговлю проще и прибыльнее за счет разработки хороших алгоритмических торговых систем. А любые инвестиции в изучение и использование этого инструмента окажутся очень полезными и выгодными.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/10293
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
К сожалению как обычно, человек "знающий" пишет статью для "знающих", очень бы хотелось что бы "знающий" писал для "не знающих"...