English 中文 Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
preview
Как и зачем разрабатывать собственную систему для алгоритмической торговли

Как и зачем разрабатывать собственную систему для алгоритмической торговли

MetaTrader 5Трейдинг | 15 марта 2022, 14:07
4 024 1
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Введение

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

В замечательном мире трейдинга программирование привносит простоту и систематичность, оно автоматизирует определенные действия и выполняет за нас огромную часть работы. Несомненно одно — программирование несет с собой огромное количество преимуществ, но на мой взгляд, одно из самых важных из них — это дисциплина, поскольку все мы знаем, как сложно быть дисциплинированным при принятии и реализации торговых решений. Очень часто дисциплина напрямую влияет на результаты торговли и инвестирования. Как я люблю говорить, дисциплина — ключ к успеху в трейдинге и в целом в жизни. В упрощенном виде дисциплину можно объяснить как способность совершать необходимые действия в нужное время независимо от окружающих обстоятельств. Самодисциплина — вещь очень сложная, ведь приходится сознательно контролировать собственные действия. И вот именно здесь на помощь приходит программирование.

Чаще всего быть дисциплинированными при торговле нам мешают эмоции, то есть нам нужно как-то убрать эти эмоции или предотвратить их негативное влияния на принимаемые торговые решения. А представьте, если вместо нас торгует определенная система, которая совершает операции независимо от человека на основе неких предустановленных параметров. Такая автоматическая система позволит избежать негативного влияния спонтанных человеческих эмоций. А ведь уже есть готовый инструмент, с помощью которого можно создать такую систему. Об этом инструменте мы и поговорим в данной статье — это язык программирования MQL (MetaQuotes Language) для торговой платформы MetaTrader. С помощью этого языка можно запрограммировать торговую систему, которая будет работать по заданным нами параметрам, чтобы гарантированно совершать определенные действия и принимать определенные торговым решения.

Чтобы помочь вам лучше понять эту концепцию, я приведу пример. Предположим, есть два инвестора, A и B, торгующие по совершенно одинаковым стратегиям: покупка и удержание позиции при растущем тренде и продажа при развороте. Но ведут они себя по-разному: инвестор A торгует дисциплинированно, в отличие от B. Посмотрите на эти изображения:


2- Investor_B


Видно, что дисциплина необходима для получения хороших результатов. И наоборот — без дисциплины результаты не такие хорошие.

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

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


Что нужно для разработки собственного торгового алгоритма

В этой части рассмотрим, какие же инструменты нам понадобятся для разработки системы:

  • Торговая платформа MetaTrader 5 (или торговый терминал MetaTrader 5). Итоговый код исполняется в терминале, где собственно и совершаются все торговые ордеры. Это очень популярная торговая платформа с огромными возможностями.



3- MT5 platform

Демо-счет. Нужно будет открыть демо-счет у выбранного брокера, на котором можно будет проверять стратегии, не рискуя реальными деньгами, но в условиях реального рынка. Убедитесь, что не запускаете учебные программы на реальном счете. Обязательно нужен демо-счет, ведь создаваемая программа будет совершать на этом счете торговые операции.

Редактор MetaEditor, в котором и будет писаться код программы. Редактор устанавливается вместе с терминалом MetaTrader 5. На скриншотах ниже показано, как его запустить. Есть три способа запустить редактор.

  • В меню "Сервис" выберите MetaQuotes Language Editor:

4- MetaEditor opening  

                   

Или нажмите на иконку MetaEditor в тулбаре:

   5- MetaEditor opening

Или нажмите F4 на клавиатуре при открытом терминале.

Основная работа по созданию кода собственной торговой системы будет проводиться именно в редакторе. Вот как он выглядит:

   6- MetaEditor window

 

Итак, создадим в редакторе нашу первую программу, файл, в котором и будем писать код.

Если нажать на New, будут показаны доступные виды программ, которые можно создать в редакторе:

7- MetaEditor window



8- MetaEditor - New



Итак, можно выбрать создать советник, пользовательский индикатор и скрипт. Рассмотрим, что все это означает.

  • Торговый советник — это программа, работающая в терминале, которая позволяет автоматизировать анализ котировок и торговлю в соответствии с заданными параметрами.
  • Пользовательский индикатор — программа, позволяющая графически отобразить некие рассчитанные числовые зависимости.
  • Скрипт — программа, предназначенная для однократного выполнения действия по аналитике или торговле, исполняется такая программа по запросу.

Программа Hello World!

В этой части мы напишем свой первый код и свою первую программу на MQL5. Путь в любом языке программирования начинается с написания первой программы — Hello World. Мы тоже напишем первую программу, которая будет выводить на экран надпись “Hello World”. Итак, начнем.

Открываем MetaEditor, создаем новую программу, выбираем тип программы скрипт (Script), нажимаем "Далее".


9- MetaEditor - New file - Script


<Откроется следующее окно, в котором необходимо указать параметры:

  • Название — название скрипта
  • Автор — имя автора скрипта
  • Ссылка — ссылка на ваш сайт
  • Параметры — параметры работы будущего скрипта. Для нашего скрипта параметры не нужны, поэтому пропускаем этот шаг.
Жмем "Готово".

10- MetaEditor - Script info


После этого появится собственно то самое окно, в котором мы и будем писать код программы. Напомню, мы пишем программу, которая будет выводить надпись “Hello World!” в окне терминала. Начнем писать наш код внутри фигурных скобок.


 11 - Codes place

Какие элементы тут используем:

  • Алерт: выводит на экран некое заданное сообщение, в нашем примере именно эта функция будет выводить на экран надпись “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 и переходим в терминал, чтобы протестировать работу получившейся программы.

12- Hello World code

В терминале, в окне навигатора, в подразделе скриптов находим получившуюся программу с заданным именем — в нашем случае это "Hello World!". Запустим скрипт, перетащив его на график или дважды щелкнув на нем. После этого на графике появится тот самый алерт, который мы определили в скрипте. Выглядит он так:

13- Hello World alert



Идея торговой стратегии (пересечение двух скользящих средних)

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

Примечание
Любая информация предоставлена "как есть" исключительно в информационных целях и не должна быть использована в качестве торговых целей или рекомендаций. Никакие прошлые результаты работу не могут гарантировать таких же результатов в будущем. Если вы решите использовать какой-либо код, используйте его на свой страх и риск.

Смысл такой торговой стратегии — торговать по тренду при получении подтверждения сигнала от двух простых скользящих средних:

  • Простая скользящая средняя — запаздывающий индикатор, который рассчитывает среднюю цену закрытия за определенный период, сигнал от такого индикатора получается позже, чем от индикаторов ценового действия.
  • Стратегия торговли:
    • Если короткая скользящая средняя (с периодом 20) пересекает длинную скользящую среднюю (с периодом 50) снизу вверх, это сигнал на покупку.
    • Если короткая скользящая средняя (с периодом 20) пересекает длинную скользящую среднюю (с периодом 50) сверху вниз, это сигнал на продажу.

Далее мы будем писать программу, которая реализует эту стратегию.

15- Trading Idea1


14- Trading Idea


Схема алгоритмической торговой системы

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

    16- Simple 2MA-Blueprint-–-MQL5


      Для начала рассмотрим некоторые основные понятия зыка 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); 
        }
      //+------------------------------------------------------------------+
      
      

      Если скомпилировать этот код и запустить в терминале, в окне будет показано сообщение:

      18- Variables

      Рассмотрим еще один пример.

        Здесь надо запомнить следующие переменные и их значения: A и ее значение 10, B = 10, C = 10 + 5, var1 = 2.5, var2 = 4, result = 2.5/4, message1 = Hello Mohamed, и message2 = Value of A is: 10. Если скомпилировать и запустить код, на экране должны отобразиться четыре сообщения:
        • Значение переменной 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);
          }
        //+------------------------------------------------------------------+
        
        


         19- Variables 2

        Логические операции

        Тип данных возвращает значение логической операции 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.

         20- Boolean Operations

        Цикл 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");
          }
        
        


         21- While Loop


        Цикл 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");
           }
          }
        //+------------------------------------------------------------------+
        
        


        22- For Loop

        Выражение 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");
           } 
            
          }
        //+------------------------------------------------------------------+
        
        


         23- If-Else Statement


        Входные параметры

        Далее рассмотрим, как определить наши входные данные или параметры для программы.

        Параметры (#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);
          }
        //+------------------------------------------------------------------+
        
        

        24- Trader Input 1


        24- Trader Input 2


         24- Trader Input 3


        24- Trader Input 4


        Открытие ордеров

        Рассмотрим код, открывающий ордера:

        //+------------------------------------------------------------------+
        //|                                                         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);
           }
          }
        //+------------------------------------------------------------------+
        
          Результат исполнения скрипта будет такой:

          25- Opening orders


          Обработка ошибок

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

          //+------------------------------------------------------------------+
          //|                                                         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);
                  }
                }
            }
          //+------------------------------------------------------------------+
          
          

          26- Errors programming techniques 1


          27- Errors programming techniques 2


          Настройки закрытия ордеров

          Давайте рассмотрим код, который открывает и закрывает ордера.
          //+------------------------------------------------------------------+
          //|                                                         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...");
             }
          
            }
          //+------------------------------------------------------------------+
          


           28- Closing orders

          Работа с ордерами с функцией 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);
             }
          
            }
          //+------------------------------------------------------------------+
          
          

          29- Modifying orders



          Система на пересечении двух скользящих средних

          Давайте соберем все вместе и создадим систему, которая торгует на основе сигналов от пересечения двух скользящих средних. Работать программа будет согласно схеме, которую мы рассмотрели выше.

          Чтобы написать систему, создадим в редакторе MetaEditor новый файл с типом Советник.

          Давайте еще раз вспомним подробную схему работы:

          16- Simple 2MA-Blueprint-–-MQL5


          Нам надо написать код, реализующий нашу стратегию:
          • Если короткая скользящая средняя (с периодом 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");
                   }          
            }
          //+------------------------------------------------------------------+
          
          


          После выполнения программа выведет комментарии на график с текущим сигналом (покупка или продажа) на основе выбранной стратегии. Вот как это должно выглядеть:


          30- SMA - comment


           31- SMA - Sell comment

          Скриншоты ниже показывают, как найти созданную нами систему в терминале и как запустить ее:

          32- Simple MA program place

          После запуска программы двойным кликом или перетаскиванием появится такое окно:

          33- Simple MA program interface

          Разрешите автоматическую торговлю Allow Algo Trading и нажмите ОК. Советник будет запущен на графике, а на вкладке Журнал появится сообщение об успешном запуске:


           34- Simple MA program activated1


          35- Simple MA program activated2

          Итак, мы создали и выполнили программу, автоматически торгующую на основе пересечения двух скользящих средних. Это простейший пример того, как можно создать собственную программу автоматической торговли в терминале. С языком программирования MQL5 вы можете реализовать и автоматизировать практически любую торговую стратегию.

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


          Заключение:

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

          Перевод с английского произведен MetaQuotes Ltd.
          Оригинальная статья: https://www.mql5.com/en/articles/10293

          Прикрепленные файлы |
          Closing_Orders.mq5 (1.79 KB)
          For_Loop.mq5 (0.85 KB)
          Hello_Worldb.mq5 (0.76 KB)
          Opening_orders.mq5 (1.71 KB)
          Trader_Inputs.mq5 (1.25 KB)
          Variables_2.mq5 (1.22 KB)
          Variables.mq5 (1.01 KB)
          Последние комментарии | Перейти к обсуждению на форуме трейдеров (1)
          Константин Сандалиди
          Константин Сандалиди | 16 мар. 2022 в 04:26


          К сожалению как обычно, человек "знающий" пишет статью для "знающих", очень бы хотелось что бы "знающий" писал для "не знающих"...

          Как разрабатывать системы на основе скользящих средних Как разрабатывать системы на основе скользящих средних
          Есть множество различных способов для фильтрации сигналов, генерируемых какой-либо стратегией. Вероятно, простейший из них — это использование скользящей средней. Об этом мы и поговорим в этой статье.
          Что можно сделать с помощью скользящих средних Что можно сделать с помощью скользящих средних
          В данной статье мне захотелось собрать некоторые способы применения индикатора "Скользящая средняя". Практически к каждому способу, если требуется анализ кривых, сделаны индикаторы, визуализирующие полезную идею. В большинстве случаев идеи подсмотрены у других авторов, однако, собранные все вместе, они помогут точнее видеть основные направления и — надеюсь — принимать более правильные торговые решения. Уровень знания языка MQL5 — начальный.
          Графика в библиотеке DoEasy (Часть 99): Перемещаем расширенный графический объект одной контрольной точкой Графика в библиотеке DoEasy (Часть 99): Перемещаем расширенный графический объект одной контрольной точкой
          В прошлой статье мы создали возможность перемещения опорных точек расширенного графического объекта при помощи форм управления. Теперь сделаем перемещение составного графического объекта при помощи одной точки (формы) управления графическим объектом.
          Математика в трейдинге: Коэффициенты Шарпа и Сортино Математика в трейдинге: Коэффициенты Шарпа и Сортино
          Доходность является самым очевидным показателем, который используют инвесторы и начинающие трейдеры для анализа эффективности торговли. Профессиональные трейдеры пользуются более надежными инструментами для анализа стратегии, среди них — коэффициенты Шарпа и Сортино.