English 中文 Español Deutsch 日本語 Português
preview
Как работать с линиями средствами MQL5

Как работать с линиями средствами MQL5

MetaTrader 5Трейдинг | 17 января 2023, 14:56
2 101 4
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Введение

Линии при торговле помогают наблюдать за важными уровнями, которые используются для принятия или подтверждения торговых решений и для анализа в целом. Поскольку эти уровни так важны для трейдеров, возникает вопрос, существует ли способ для автоматического построения линий и даже принятия решений на их основе в автоматическом режиме — в таком виде использование линий было бы еще более удобным. Ответ — да. И сделать это можно с помощью языка программирования MQL5 (MetaQuotes Language 5).

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

В статье рассмотрим следующие темы:

  1. Трендовые линии и MQL5
  2. Линии поддержки и MQL5
  3. Линии сопротивления и MQL5
  4. Заключение

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

Мы узнаем, что из себя представляют линии, научимся определять их типы, посмотрим, как их строить вручную и как использовать линии в торговле. Главное, рассмотрим, как можно использовать язык MQL5 для работы с линиями тренда, поддержки и сопротивления. Основная цель — научиться автоматизировать процессы , чтобы сделать торговлю проще и улучшить результаты. В этой статье будем использовать язык программирования MQL5 (MetaQuotes Language 5), встроенный в терминал MetaTrader 5, а также редактор MetaEditor для написания кода. Вы можете почитать о том, как установить MetaTrader 5 или использовать MetaEditor, в разделе "Как написать MQL5-код в редакторе MetaEditor" в статье, опубликованной ранее.

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

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


Линии тренда и MQL5

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

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

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

Ниже приведена линия восходящего тренда:

 Восходящая линия тренда

На рисунке выше показано восходящее движение. Если соединить три минимальные точки линией, окажется, что они находятся на одной линии, направленной вверх.

Ниже показан пример растущей трендовой линии:

Восходящая линия тренда

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

Ниже приведена линия нисходящего тренда:

Нисходящая линия тренда

На рисунке явное движение вниз. Если соединить три максимальные точки линией, окажется, что они находятся на одной линии, направленной вниз.

Ниже показан пример нисходящей трендовой линии:

Нисходящая линия тренда

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


    1. Система восходящей линии тренда

      Теперь давайте создадим программу, которую можно использовать для автоматического создания линии восходящего тренда в MetaTrader 5. Отображаться она будет под ценами, позволяя видеть потенциальное движение вверх. Программа на каждом тике будет проверять минимумы цены и определять, не образовался ли восходящий тренд. Также будем удалять старую линию, если такая была, и создавать новую линию синего цвета под ценой. 

      Рассмотрим по шагам, что для этого требуется сделать.

      Для определения первой свечи создадим integer-переменную, значением которой будет значение типа long соответствующего свойства текущего графика — используем функцию ChartGetInteger со следующими параметрами:

      • chart_id — идентификатор графике, 0 означает текущий график.
      • prop_id — определяем идентификатор свойства графика, используем значения перечисления ENUM_CHART_PROPERTY_INTEGER. У нас это будет значение CHART_FIRST_VISIBLE_BAR.
      • sub_window=0 — номер подокна графика. Используем значение 0 — главное окно графика.
      int candles=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);

      Создаем массив со значениями цен минимум, получаем переменные типа double для pLow.

      double pLow[];

      Сортируем созданный массив текущих данных с помощью функции ArraySetAsSeries, которая возвращает значение типа bool (true в случае успеха или false в противном случае.

      ArraySetAsSeries(pLow,true);

      Заполняем созданный массива pLow данными с помощью функции CopyLow — значение минимума текущего символа на текущем таймфрейме. Параметры функции:

      • symbol_name — имя символ, _Symbol означает текущий символ графика.
      • timeframe — таймфрейм для расчета, _Period означает текущий таймфрейм графика.
      • start_pos — начальная позиция для копирования элементов, у нас это будет 0.
      • count — количество копируемых элементов, используем предварительно созданную переменную candles.
      • low_array[] — целевой массив для копирования элементов, pLow.
      CopyLow(_Symbol,_Period,0,candles,pLow);

      Создаем и вычисляем минимальное значение candle — для этого создаем переменную candleLow типа integer, равной минимальному элементу в массиве. Чтобы вернуть минимальное значение, используем функцию ArrayMinimum. Параметры функции:

      • array[] — массив, в котором анализируем элементы, pLow.
      • start=0 — индекс элемента, с которого начинается проверка, используем 0.
      • count=WHOLE_ARRAY — количество проверяемых элементов, у нас оно равно candles.
      int candleLow = ArrayMinimum(pLow,0,candles);

      С помощью функции MqlRates создаем массив pArray, в нем хранится информация о ценах, объемах и спредах.

      MqlRates pArray[];

      Сортируем ценовой массив pArray с помощью функции ArraySetAsSeries.

      ArraySetAsSeries(pArray,true);

      Копируем данные о ценах в массив цен после, предварительно создали integer-переменную Data, далее используем CopyRates для получения исторических данных структуры MqlRates. Параметры функции:

      • symbol_name — имя символа, используем _Symbol для работы с символом текущего графика.
      • timeframe — определяем таймфрейм, _Period означает текущий таймфрейм.
      • start_pos — установим позицию начала расчета, укажем 0.
      • count — количество копируемых элементов, используем предварительно созданную переменную candles.
      • rates_array[] — массив, в который копируем данные; pArray - массив цен.
      int Data = CopyRates(_Symbol,_Period,0,candles,pArray);

      Удаляем ранее созданную линию, чтобы обновить ее. Для этого используем функцию ObjectDelete, которая удаляет любой указанный объект с любого указанного графика. Параметры функции:

      • chart_id — идентификатор графика, _Symbol — график текущего символа.
      • name — имя объекта, который нужно удалить с графика. У нас это "UpwardTrendline".
      ObjectDelete(_Symbol,"UpwardTrendline");

      Создаем новую линию тренда, используя ObjectCreate для создания объекта трендовой линии. Параметры функции:

      • chart_id — график символа, на котором будет построен объект, _Symbol — график текущего символа.
      • name — название объекта, в качестве имени укажем "UpwardTrendline".
      • type — тип объекта, OBJ_TREND — трендовая линия.
      • nwin — индекс окна, 0 — главное окно графика.
      • time1 — время первой точки привязки, pArray[candleLow].time.
      • price1 — цена первой точки привязки, pArray[candleLow].low.
      • timeN — время N-ной точки привязки, pArray[0].time.
      • priceN — цена N-ной точки привязки, pArray[0].low.
      ObjectCreate(_Symbol,"UpwardTrendline",OBJ_TREND,0,pArray[candleLow].time,pArray[candleLow].low,pArray[0].time,pArray[0].low);

      Определим цвет трендовой линии с помощью функции ObjectSetInteger со значением цвета для объекта. Параметры функции:

      • chart_id — идентификатор графика, используем 0 — текущий график.
      • name — название объекта, UpwardTrendline - предопределенное название для нашей трендовой линии.
      • prop_id — идентификатор свойства объекта, используем значение OBJPROP_COLOR из перечисления ENUM_OBJECT_PROPERTY_INTEGER.
      • prop_value — значение свойства, у нас это Blue - цвет нашей трендовой линии.
      ObjectSetInteger(0,"UpwardTrendline",OBJPROP_COLOR,Blue);

      Определим стиль линии, снова используем функцию ObjectSetInteger, но в этот раз используем другое значение перечисления ENUM_OBJECT_PROPERTY_INTEGER, это OBJPROP_STYLE, значение prop_value = STYLE_SOLID — сплошная линия в качестве стиля создаваемой трендовой линии.

      ObjectSetInteger(0,"UpwardTrendline",OBJPROP_STYLE,STYLE_SOLID);

      Определим толщину линии. Функцию ObjectSetInteger используем со значением OBJPROP_WIDTH из перечисления ENUM_OBJECT_PROPERTY_INTEGER, значение переменной равно 3 — собственно толщина создаваемой трендовой линии.

      ObjectSetInteger(0,"UpwardTrendline",OBJPROP_WIDTH,3);

      Сделаем так, чтобы линия продолжалась вправо. Функцию ObjectSetInteger используем со значением OBJPROP_RAY_RIGHT из перечисления ENUM_OBJECT_PROPERTY_INTEGER, значение переменной равно true, то есть продолжим линию вправо.

      ObjectSetInteger(0,"UpwardTrendline",OBJPROP_RAY_RIGHT,true);

      Ниже показан полный код программы, которая автоматически построит линию растущего тренда:

      //+------------------------------------------------------------------+
      //|                                       UpwardTrendline System.mq5 |
      //+------------------------------------------------------------------+
      void OnTick()
        {
         int candles=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
         double pLow[];
         ArraySetAsSeries(pLow,true);
         CopyLow(_Symbol,_Period,0,candles,pLow);
         int candleLow = ArrayMinimum(pLow,0,candles);
         MqlRates pArray[];
         ArraySetAsSeries(pArray,true);
         int Data = CopyRates(_Symbol,_Period,0,candles,pArray);
         ObjectDelete(_Symbol,"UpwardTrendline");
         ObjectCreate(_Symbol,"UpwardTrendline",OBJ_TREND,0,pArray[candleLow].time,pArray[candleLow].low,pArray[0].time,pArray[0].low);
         ObjectSetInteger(0,"UpwardTrendline",OBJPROP_COLOR,Blue);
         ObjectSetInteger(0,"UpwardTrendline",OBJPROP_STYLE,STYLE_SOLID);
         ObjectSetInteger(0,"UpwardTrendline",OBJPROP_WIDTH,3);
         ObjectSetInteger(0,"UpwardTrendline",OBJPROP_RAY_RIGHT,true);
        }
      //+------------------------------------------------------------------+
      

      После написания кода его нужно скомпилировать. При компиляции не должно быть ошибок. После этого скомпилированная программа должна появиться в Навигаторе в торговом терминале:

       Программа Lines в Навигаторе

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

       Окно программы Lines

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

       Пример построения восходящей трендовой линии

      Индикация в правом верхнем углу графика означает, что на этом графике работает советник. Кроме того, под ценой советник построил синюю линию восходящего тренда.


        2. Система нисходящей линии тренда

          Теперь давайте создадим программу, которую можно использовать для автоматического создания линии нисходящего тренда в MetaTrader 5. Отображаться на графике она будет выше цен, позволяя видеть потенциальное движение вниз. Программа на каждом тике будет проверять максимумы цены и определять, не образовался ли нисходящий тренд. Затем она удалит старую линию, если такая была, и создаст новую линию синего цвета выше максимумов цены. 

          Полный код программы, в которой реализован этот функционал, показан ниже.

          //+------------------------------------------------------------------+
          //|                                     DownwardTrendline System.mq5 |
          //+------------------------------------------------------------------+
          void OnTick()
            {
             int candles=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
             double pHigh[];
             ArraySetAsSeries(pHigh,true);
             CopyHigh(_Symbol,_Period,0,candles,pHigh);
             int candleHigh = ArrayMaximum(pHigh,0,candles);
             MqlRates pArray[];
             ArraySetAsSeries(pArray,true);
             int Data = CopyRates(_Symbol,_Period,0,candles,pArray);
             ObjectDelete(_Symbol,"DnwardTrendline");
             ObjectCreate(_Symbol,"DnwardTrendline",OBJ_TREND,0,pArray[candleHigh].time,pArray[candleHigh].high,pArray[0].time,pArray[0].high);
             ObjectSetInteger(0,"DnwardTrendline",OBJPROP_COLOR,Blue);
             ObjectSetInteger(0,"DnwardTrendline",OBJPROP_STYLE,STYLE_SOLID);
             ObjectSetInteger(0,"DnwardTrendline",OBJPROP_WIDTH,3);
             ObjectSetInteger(0,"DnwardTrendline",OBJPROP_RAY_RIGHT,true);
            }
          //+------------------------------------------------------------------+
          

          Отличия в этом коде:

          Создаем массив с ценами максимумов.

          double pHigh[];

          Сортируем данные, начиная с текущих.

          ArraySetAsSeries(pHigh,true);

          Заполняем массив данными.

          CopyHigh(_Symbol,_Period,0,candles,pHigh);

          Создаем переменную candle и вычисляем максимальное значение.

          int candleHigh = ArrayMaximum(pHigh,0,candles);

          Удаляем ранее созданную линию нисходящего тренда с графика

          ObjectDelete(_Symbol,"DnwardTrendline");

          Создаем новую трендовую линию

          ObjectCreate(_Symbol,"DnwardTrendline",OBJ_TREND,0,pArray[candleHigh].time,pArray[candleHigh].high,pArray[0].time,pArray[0].high);

          Устанавливаем цвет линии нисходящего тренда синим, для этого используем свойство OBJPROP_COLOR

          ObjectSetInteger(0,"DnwardTrendline",OBJPROP_COLOR,Blue);

          Для стиля линии выбираем сплошную линию, установив свойство OBJPROP_STYLE в значение STYLE_SOLID

          ObjectSetInteger(0,"DnwardTrendline",OBJPROP_STYLE,STYLE_SOLID);

          Устанавливаем толщину линии нисходящего тренда равной трем, для этого используем свойство WIDTH

          ObjectSetInteger(0,"DnwardTrendline",OBJPROP_WIDTH,3);

          Устанавливаем свойство луча OBJPROP_RAY_RIGHT в значение true

          ObjectSetInteger(0,"DnwardTrendline",OBJPROP_RAY_RIGHT,true);

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

          Пример построения нисходящей трендовой линии

          В правом верхнем углу графика отображается значок эксперта, над ценами отображается нисходящая линия тренда синего цвета.


          Уровни поддержки и MQL5

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

           Уровень поддержки

          Пример уровня поддержки на рынке:

          Уровень поддержки 1

          На графике выше показана зеленая линия поддержки ниже цен, от которой цены отскакивают вверх.

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

          //+------------------------------------------------------------------+
          //|                                          Support Line System.mq5 |
          //+------------------------------------------------------------------+
          void OnTick()
            {
             int candles=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
             double pLow[];
             ArraySetAsSeries(pLow,true);
             CopyLow(_Symbol,_Period,0,candles,pLow);
             int candleLow = ArrayMinimum(pLow,0,candles);
             MqlRates pArray[];
             ArraySetAsSeries(pArray,true);
             int Data = CopyRates(_Symbol,_Period,0,candles,pArray);
             ObjectDelete(_Symbol,"supportLine");
             ObjectCreate(_Symbol,"supportLine",OBJ_HLINE,0,pArray[candleLow].time,pArray[candleLow].low,pArray[0].time,pArray[0].low);
             ObjectSetInteger(0,"supportLine",OBJPROP_COLOR,Green);
             ObjectSetInteger(0,"supportLine",OBJPROP_STYLE,STYLE_SOLID);
             ObjectSetInteger(0,"supportLine",OBJPROP_WIDTH,3);
             ObjectSetInteger(0,"supportLine",OBJPROP_RAY,true);
            }
          //+------------------------------------------------------------------+
          

          Отличия в этом коде:

          Если на графике найден объект с именем supportLine

          ObjectDelete(_Symbol,"supportLine");

          Создаем новую линию поддержки, указав OBJ_HLINE в качестве типа создаваемого объекта

          ObjectCreate(_Symbol,"supportLine",OBJ_HLINE,0,pArray[candleLow].time,pArray[candleLow].low, pArray[0].time,pArray[0].low);

          Установим цвет линии поддержки с помощью OBJPROP_COLOR

          ObjectSetInteger(0,"supportLine",OBJPROP_COLOR,Green);

          Определяем стиль линии поддержки - свойству OBJPROP_STYLE устанавливаем значение STYLE_SOLID

          ObjectSetInteger(0,"supportLine",OBJPROP_STYLE,STYLE_SOLID);

          Установим толщину линии в свойстве OBJPROP_WIDTH

          ObjectSetInteger(0,"supportLine",OBJPROP_WIDTH,3);

          Линия будет продолжаться вправо, для этого используем свойство OBJPROP_RAY

          ObjectSetInteger(0,"supportLine",OBJPROP_RAY,true);

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

          Линия поддержки

          На графике выше работает Support System EA, под ценой отобразилась линия поддержки.


          Уровни сопротивления и MQL5

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

           Уровень сопротивления

          Ниже приведен пример уровня сопротивления на рынке:

           Уровень сопротивления 1

          На графике выше над ценами показана красная линия. Цены касаются ее снизу и отскакивают от нее. 

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

          //+------------------------------------------------------------------+
          //|                                       Resistance Line System.mq5 |
          //+------------------------------------------------------------------+
          void OnTick()
            {
             int candles=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
             double pHigh[];
             ArraySetAsSeries(pHigh,true);
             CopyHigh(_Symbol,_Period,0,candles,pHigh);
             int candleHigh = ArrayMaximum(pHigh,0,candles);
             MqlRates pArray[];
             ArraySetAsSeries(pArray,true);
             int Data = CopyRates(_Symbol,_Period,0,candles,pArray);
             ObjectDelete(_Symbol,"resistanceLine");
             ObjectCreate(_Symbol,"resistanceLine",OBJ_HLINE,0,pArray[candleHigh].time,pArray[candleHigh].high,pArray[0].time,pArray[0].high);
             ObjectSetInteger(0,"resistanceLine",OBJPROP_COLOR,Red);
             ObjectSetInteger(0,"resistanceLine",OBJPROP_STYLE,STYLE_SOLID);
             ObjectSetInteger(0,"resistanceLine",OBJPROP_WIDTH,3);
             ObjectSetInteger(0,"DnwardTrendline",OBJPROP_RAY_RIGHT,true);
            }
          //+------------------------------------------------------------------+
          

          Отличия в этом коде:

          Если на графике уже есть линия с названием resistanceLine, удаляем ее.

          ObjectDelete(_Symbol,"resistanceLine");

          Создаем новую линию сопротивления, указав OBJ_HLINE в качестве типа создаваемого объекта

          ObjectCreate(_Symbol,"resistanceLine",OBJ_HLINE,0,pArray[candleHigh].time,pArray[candleHigh].high,pArray[0].time,pArray[0].high);

          Установим цвет линии сопротивления с помощью OBJPROP_COLOR

          ObjectSetInteger(0,"resistanceLine",OBJPROP_COLOR,Red);

          Определяем стиль линии - свойству OBJPROP_STYLE устанавливаем значение STYLE_SOLID

          ObjectSetInteger(0,"resistanceLine",OBJPROP_STYLE,STYLE_SOLID);

          Установим толщину линии в свойстве OBJPROP_WIDTH

          ObjectSetInteger(0,"resistanceLine",OBJPROP_WIDTH,3);

          Сделаем так, чтобы линия продолжалась вправо. Для этого используем свойство луча OBJPROP_RAY_RIGHT со значением true

          ObjectSetInteger(0,"DnwardTrendline",OBJPROP_RAY_RIGHT,true);

          После этого компилируем код советника. Если все правильно и программа скомпилировалась без ошибок, файл советника появится в окне Навигатора в терминале, запускаем, как и предыдущую программу. На графике запустится советник Resistance System EA:

          Линия сопротивления

          На графике выше запустился советник Resistance System EA — об этом свидетельствует иконка советника в правом верхнем углу графика. Также выше максимумов отображается красная линия поддержки.


          Заключение

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

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

          Если вам понравилась эта статья, если вы считаете ее полезной, рекомендую ознакомиться и с другими моими статьями, посвященными разработке торговых систем с использованием популярных технических индикаторов, таких как Индикатор скользящей средней, RSI, Сохастик, Parabolic SAR и др.

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

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

          Прикрепленные файлы |
          Support_System.mq5 (1.04 KB)
          Последние комментарии | Перейти к обсуждению на форуме трейдеров (4)
          MrBrooklin
          MrBrooklin | 2 мар. 2023 в 08:03
          MetaQuotes:

          Опубликована статья "Как работать с линиями средствами MQL5":

          Автор: Mohamed Abdelmaaboud

          Интересная статья для начинающих, но для корректной работы советников требуется небольшая доработка кодов.

          С уважением, Владимир.

          //+------------------------------------------------------------------+
          //|                                       UpwardTrendline System.mq5 |
          //+------------------------------------------------------------------+
          void OnTick()
            {
             int candles = (int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
             double pLow[];
             ArraySetAsSeries(pLow,true);
             int copy_low = CopyLow(_Symbol,_Period,0,candles,pLow);
             if(copy_low>0)
               {
                int candleLow = ArrayMinimum(pLow,0,candles);
                MqlRates pArray[];
                ArraySetAsSeries(pArray,true);
                int Data = CopyRates(_Symbol,_Period,0,candles,pArray);
                ObjectDelete(0,"UpwardTrendline");
                ObjectCreate(0,"UpwardTrendline",OBJ_TREND,0,pArray[candleLow].time,pArray[candleLow].low,
                             pArray[0].time,pArray[0].low);
                ObjectSetInteger(0,"UpwardTrendline",OBJPROP_COLOR,Blue);
                ObjectSetInteger(0,"UpwardTrendline",OBJPROP_STYLE,STYLE_SOLID);
                ObjectSetInteger(0,"UpwardTrendline",OBJPROP_WIDTH,3);
                ObjectSetInteger(0,"UpwardTrendline",OBJPROP_RAY_RIGHT,true);
               }
            }
          //+------------------------------------------------------------------+


          //+------------------------------------------------------------------+
          //|                                     DownwardTrendline System.mq5 |
          //+------------------------------------------------------------------+
          void OnTick()
            {
             int candles = (int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
             double pHigh[];
             ArraySetAsSeries(pHigh,true);
             int copy_high = CopyHigh(_Symbol,_Period,0,candles,pHigh);
             if(copy_high>0)
               {
                int candleHigh = ArrayMaximum(pHigh,0,candles);
                MqlRates pArray[];
                ArraySetAsSeries(pArray,true);
                int Data = CopyRates(_Symbol,_Period,0,candles,pArray);
                ObjectDelete(0,"DnwardTrendline");
                ObjectCreate(0,"DnwardTrendline",OBJ_TREND,0,pArray[candleHigh].time,pArray[candleHigh].high,
                             pArray[0].time,pArray[0].high);
                ObjectSetInteger(0,"DnwardTrendline",OBJPROP_COLOR,Blue);
                ObjectSetInteger(0,"DnwardTrendline",OBJPROP_STYLE,STYLE_SOLID);
                ObjectSetInteger(0,"DnwardTrendline",OBJPROP_WIDTH,3);
                ObjectSetInteger(0,"DnwardTrendline",OBJPROP_RAY_RIGHT,true);
               }
            }
          //+------------------------------------------------------------------+
          


          //+------------------------------------------------------------------+
          //|                                          Support Line System.mq5 |
          //+------------------------------------------------------------------+
          void OnTick()
            {
             int candles = (int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
             double pLow[];
             ArraySetAsSeries(pLow,true);
             int copy_low = CopyLow(_Symbol,_Period,0,candles,pLow);
             if(copy_low>0)
               {
                int candleLow = ArrayMinimum(pLow,0,candles);
                MqlRates pArray[];
                ArraySetAsSeries(pArray,true);
                int Data = CopyRates(_Symbol,_Period,0,candles,pArray);
                ObjectDelete(0,"supportLine");
                ObjectCreate(0,"supportLine",OBJ_HLINE,0,pArray[candleLow].time,pArray[candleLow].low,
                             pArray[0].time,pArray[0].low);
                ObjectSetInteger(0,"supportLine",OBJPROP_COLOR,Green);
                ObjectSetInteger(0,"supportLine",OBJPROP_STYLE,STYLE_SOLID);
                ObjectSetInteger(0,"supportLine",OBJPROP_WIDTH,3);
                ObjectSetInteger(0,"supportLine",OBJPROP_RAY,true);
               }
            }
          //+------------------------------------------------------------------+
          


          //+------------------------------------------------------------------+
          //|                                       Resistance Line System.mq5 |
          //+------------------------------------------------------------------+
          void OnTick()
            {
             int candles=(int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
             double pHigh[];
             ArraySetAsSeries(pHigh,true);
             int copy_high = CopyHigh(_Symbol,_Period,0,candles,pHigh);
             if(copy_high>0)
               {
                int candleHigh = ArrayMaximum(pHigh,0,candles);
                MqlRates pArray[];
                ArraySetAsSeries(pArray,true);
                int Data = CopyRates(_Symbol,_Period,0,candles,pArray);
                ObjectDelete(0,"resistanceLine");
                ObjectCreate(0,"resistanceLine",OBJ_HLINE,0,pArray[candleHigh].time,pArray[candleHigh].high,
                             pArray[0].time,pArray[0].high);
                ObjectSetInteger(0,"resistanceLine",OBJPROP_COLOR,Red);
                ObjectSetInteger(0,"resistanceLine",OBJPROP_STYLE,STYLE_SOLID);
                ObjectSetInteger(0,"resistanceLine",OBJPROP_WIDTH,3);
                ObjectSetInteger(0,"DnwardTrendline",OBJPROP_RAY_RIGHT,true);
               }
            }
          //+------------------------------------------------------------------+
          
          Mohamed Abdelmaaboud
          Mohamed Abdelmaaboud | 20 мар. 2023 в 15:43
          MrBrooklin #:

          Интересная статья для начинающих, но для корректной работы советников требуется небольшая доработка кодов.

          С уважением, Владимир.




          Спасибо за добрый комментарий, я его пересмотрю.
          MrBrooklin
          MrBrooklin | 13 янв. 2024 в 09:01
          Mohamed Abdelmaaboud #:
          Спасибо за добрый комментарий, я его пересмотрю.

          Почти 10 месяцев прошло, а никакие изменения в свои коды автор статьи так и не внёс. ))

          С уважением, Владимир.

          Mohamed Abdelmaaboud
          Mohamed Abdelmaaboud | 13 янв. 2024 в 14:50
          MrBrooklin #:

          Почти 10 месяцев прошло, а никакие изменения в свои коды автор статьи так и не внёс. ))

          С уважением, Владимир.

          Спасибо за ваше напоминание и вклад. Он будет отправлен на редактирование.

          Эксперименты с нейросетями (Часть 3): Практическое применение Эксперименты с нейросетями (Часть 3): Практическое применение
          Нейросети наше все. Проверяем на практике, так ли это. MetaTrader 5 как самодостаточное средство для использования нейросетей в трейдинге. Простое объяснение.
          Бегущая строка котировок: базовая версия Бегущая строка котировок: базовая версия
          Здесь я покажу, как создать в терминале бегущую строку, которая обычно используется для отображения котировок на бирже. Создавать такую строку мы будем только при помощи MQL5, не используя никакое другое внешнее программирование.
          Популяционные алгоритмы оптимизации: Оптимизация инвазивных сорняков (Invasive Weed Optimization - IWO) Популяционные алгоритмы оптимизации: Оптимизация инвазивных сорняков (Invasive Weed Optimization - IWO)
          Удивительная способность сорняков выживать в самых разнообразных условиях послужило идеей создания мощного алгоритма оптимизации. IWO — один из лучших среди рассмотренных ранее.
          Популяционные алгоритмы оптимизации: Алгоритм летучих мышей (Bat algorithm - BA) Популяционные алгоритмы оптимизации: Алгоритм летучих мышей (Bat algorithm - BA)
          Сегодня изучим алгоритм летучих мышей (Bat algorithm - BA), который отличается удивительной сходимостью на гладких функциях.