English Español Deutsch 日本語
preview
Построение модели ограничения тренда свечей (Часть 3): Обнаружение изменений трендов при использовании системы

Построение модели ограничения тренда свечей (Часть 3): Обнаружение изменений трендов при использовании системы

MetaTrader 5Трейдинг | 3 октября 2024, 12:21
41 0
Clemence Benjamin
Clemence Benjamin

Содержание


Введение

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

Различные факторы влияют на рыночные тенденции и вызывают их изменения. Вот несколько примеров:

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

Мы уже приобрели обширные знания о том, как вручную выявлять изменения в трендах. Сюда входит концепция анализа линии тренда, которая заключается в нанесении линий на ценовой график, соединяющих максимумы и минимумы движения цены актива, чтобы трейдеры могли получить представление о потенциальных изменениях тренда, когда цена поднимается выше или опускается ниже этих линий. Далее мы выберем один метод обнаружения изменений рыночного тренда и встроим его в наш индикатор ограничения тренда (Trend Constraint), используя MQL5. Сначала мы рассмотрим различные инструменты технического анализа, такие как скользящие средние, свечные модели, индекс относительной силы (см. часть 2) и линии тренда (см. Рис. 1) для определения потенциальных разворотов тренда. Мы продолжим модифицировать наш индикатор Trend Constraint на MQL5, чтобы включить эту новую функциональность. 

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

тренд

Рис. 1. Тренды

Изображение выше создано вручную в учебных целях. Это не график реального инструмента.

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


Способы обнаружения изменений рыночных трендов

Давайте начнем с определения рыночного тренда:

Рыночный тренд обозначает общее направление движения рынка с течением времени, отражая поведение покупателей и продавцов. Тренды могут быть восходящими (бычьими), нисходящими (медвежьими) или боковыми (консолидация), как показано на рисунке 1 во введении.

Дадим определение развороту тренда:

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


Использование скользящих средних для определения разворота тренда

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

USDJPYmicroM5 показывает, как скользящие средние могут сигнализировать о развороте

Рис. 2. Пересечение скользящих средних как сигнал разворота тренда

Использование свечных моделей для обнаружения разворота тренда

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

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


Использование линий тренда для обнаружения разворота тренда

На графике платформы MetaTrader 5 мы можем использовать объект "Трендовая линия" для построения трендов, соединяя последовательные минимумы в ценовом ряду. Разорванная линия тренда указывает на изменение тренда. Чтобы нарисовать линию тренда, просто кликните по инструменту "Трендовая линия", а затем кликните по первой впадине и перетащите линию к следующей. Линия тренда автоматически продлится до правой стороны графика.

Прорыв линии тренда индекса B300

Рис. 3. Линия тренда как инструмент для обнаружения разворота тренда

Использование поддержки и сопротивления для обнаружения разворота тренда

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

Проблемы текущей системы

Мы успешно настроили нашу систему так, чтобы ее сигнал соответствовал форме тренда D1, и включили в нее такие индикаторы, как SMA 400 в части 2. Однако в исторических данных наблюдаются существенные проблемы. Мы должны учитывать колебания на более коротких таймфреймах, которые потенциально могут изменить первоначальные настроения в начале дня. Например, день может начаться с медвежьего движения, но завершиться пин-баром или бычьими настроениями. Сигналы разворота часто появляются на более коротких таймфреймах, побуждая нас адаптировать сигнальный механизм системы для учета изменений тренда, даже если изначально они ограничивались ежедневными настроениями рынка.


Внедрение функции обнаружения изменения тренда с помощью MQL5

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

Наш обработчик скользящих средних объявлен следующим образом.

MA_handle3 = iMA(NULL, PERIOD_CURRENT, 100, 0, MODE_EMA, PRICE_CLOSE); // For EMA 100

MA_handle4 = iMA(NULL, PERIOD_CURRENT, 200, 0, MODE_SMA, PRICE_CLOSE); // For SMA 200

Приведенный ниже код показывает условия кроссовера на языке MQL5 в рамках итерационной функции.

//Indicator Buffer 3
      if(MA3[i] > MA4[i]
      && MA3[i+1] < MA4[i+1] //Moving Average crosses above Moving Average
      )
        {
         Buffer3[i] = Low[i]; //Set indicator value at Candlestick Low
         if(i == 1 && Time[1] != time_alert) myAlert("indicator", "Buy Reversal"); //Alert on next bar open
         time_alert = Time[1];
        }
      else
        {
         Buffer3[i] = EMPTY_VALUE;
        }
      //Indicator Buffer 4
      if(MA3[i] < MA4[i]
      && MA3[i+1] > MA4[i+1] //Moving Average crosses below Moving Average
      )
        {
         Buffer4[i] = High[i]; //Set indicator value at Candlestick High
         if(i == 1 && Time[1] != time_alert) myAlert("indicator", "Sell Reversal"); //Alert on next bar open
         time_alert = Time[1];
        }
      else
        {
         Buffer4[i] = EMPTY_VALUE;
        }

Trend Constraint из предыдущей статьи включал два буфера: один - для сигналов покупки, а другой - для сигналов продажи для продолжения тренда. Для достижения нашей цели мы хотим добавить еще два буфера: один - для продажи, а другой - для покупки. Все они будут представлять собой сигналы разворота при кроссовере. В программе они последовательно названы Buffer3 и Buffer4. Мы оптимизировали новый стиль отображения для этой функции. Отображение индикатора можно настроить, выбрав объект Wingdings. Здесь я использовал объект номер 236 для сигнала разворота на покупку и объект номер 238 для сигнала разворота на продажу.

// under OnInit() function. The wingding objects can be customized by altering those highlighted values choosing from wingding listing.
  SetIndexBuffer(2, Buffer3);
   PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetInteger(2, PLOT_DRAW_BEGIN, MathMax(Bars(Symbol(), PERIOD_CURRENT)-PLOT_MAXIMUM_BARS_BACK+1, OMIT_OLDEST_BARS+1));
   PlotIndexSetInteger(2, PLOT_ARROW, 236);
   SetIndexBuffer(3, Buffer4);
   PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetInteger(3, PLOT_DRAW_BEGIN, MathMax(Bars(Symbol(), PERIOD_CURRENT)-PLOT_MAXIMUM_BARS_BACK+1, OMIT_OLDEST_BARS+1));
   PlotIndexSetInteger(3, PLOT_ARROW, 238);

Другой аспект — цветовая кодировка с использованием MQL5. Эти цвета можно оптимизировать с помощью входных параметров MetaTrader 5. Каждый цвет представлен уникальным кодом в программе, например "C'0,0,0'"  представляет черный цвет, см. фрагмент кода ниже

#property indicator_type3 DRAW_ARROW
#property indicator_width3 1  // with can be adjusted up to 5 times.
#property indicator_color3 0x04CC04 //color for buy reversal
#property indicator_label3 "buy reversal"

#property indicator_type4 DRAW_ARROW
#property indicator_width4 1              //with can be adjusted up to 5 times.
#property indicator_color4 0xE81AC6  // Color code for sell reversal
#property indicator_label4 "sell reversal"

Более подробная информация и комментарии приведены в основном коде ниже, где все части и идеи объединены вместе.

///Indicator Name: Trend Constraint
#property copyright "Clemence Benjamin"
#property link      "https://mql5.com"
#property version   "1.03"
#property description "A model that seek to produce sell signal when D1 candle is Bearish only and  buy signal when it is Bullish"

//+------------------------------------------------------------------------------------------------------------------------------+
//--- indicator settings
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots 4

#property indicator_type1 DRAW_ARROW
#property indicator_width1 5
#property indicator_color1 0xFF3C00
#property indicator_label1 "Buy"

#property indicator_type2 DRAW_ARROW
#property indicator_width2 5
#property indicator_color2 0x0000FF
#property indicator_label2 "Sell"

#property indicator_type3 DRAW_ARROW
#property indicator_width3 1
#property indicator_color3 0x04CC04
#property indicator_label3 "Buy Reversal"

#property indicator_type4 DRAW_ARROW
#property indicator_width4 1
#property indicator_color4 0xE81AC6
#property indicator_label4 "Sell Reversal"

#define PLOT_MAXIMUM_BARS_BACK 5000
#define OMIT_OLDEST_BARS 50

//--- indicator buffers
double Buffer1[];
double Buffer2[];
double Buffer3[];
double Buffer4[];

input double Oversold = 30;
input double Overbought = 70;
datetime time_alert; //used when sending alert
input bool Audible_Alerts = true;
input bool Push_Notifications = true;
double myPoint; //initialized in OnInit
int RSI_handle;
double RSI[];
double Open[];
double Close[];
int MA_handle;
double MA[];
int MA_handle2;
double MA2[];
int MA_handle3;
double MA3[];
int MA_handle4;
double MA4[];
double Low[];
double High[];

void myAlert(string type, string message)
  {
   if(type == "print")
      Print(message);
   else if(type == "error")
     {
      Print(type+" | Trend Constraint V1.03 @ "+Symbol()+","+IntegerToString(Period())+" | "+message);
     }
   else if(type == "order")
     {
     }
   else if(type == "modify")
     {
     }
   else if(type == "indicator")
     {
      if(Audible_Alerts) Alert(type+" | Trend Constraint V1.03 @ "+Symbol()+","+IntegerToString(Period())+" | "+message);
      if(Push_Notifications) SendNotification(type+" | Trend Constraint V1.03 @ "+Symbol()+","+IntegerToString(Period())+" | "+message);
     }
  }

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {   
   SetIndexBuffer(0, Buffer1);
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, MathMax(Bars(Symbol(), PERIOD_CURRENT)-PLOT_MAXIMUM_BARS_BACK+1, OMIT_OLDEST_BARS+1));
   PlotIndexSetInteger(0, PLOT_ARROW, 241);
   SetIndexBuffer(1, Buffer2);
   PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetInteger(1, PLOT_DRAW_BEGIN, MathMax(Bars(Symbol(), PERIOD_CURRENT)-PLOT_MAXIMUM_BARS_BACK+1, OMIT_OLDEST_BARS+1));
   PlotIndexSetInteger(1, PLOT_ARROW, 242);
   SetIndexBuffer(2, Buffer3);
   PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetInteger(2, PLOT_DRAW_BEGIN, MathMax(Bars(Symbol(), PERIOD_CURRENT)-PLOT_MAXIMUM_BARS_BACK+1, OMIT_OLDEST_BARS+1));
   PlotIndexSetInteger(2, PLOT_ARROW, 236);
   SetIndexBuffer(3, Buffer4);
   PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetInteger(3, PLOT_DRAW_BEGIN, MathMax(Bars(Symbol(), PERIOD_CURRENT)-PLOT_MAXIMUM_BARS_BACK+1, OMIT_OLDEST_BARS+1));
   PlotIndexSetInteger(3, PLOT_ARROW, 238);
   //initialize myPoint
   myPoint = Point();
   if(Digits() == 5 || Digits() == 3)
     {
      myPoint *= 10;
     }
   RSI_handle = iRSI(NULL, PERIOD_CURRENT, 14, PRICE_CLOSE);
   if(RSI_handle < 0)
     {
      Print("The creation of iRSI has failed: RSI_handle=", INVALID_HANDLE);
      Print("Runtime error = ", GetLastError());
      return(INIT_FAILED);
     }
   
   MA_handle = iMA(NULL, PERIOD_CURRENT, 7, 0, MODE_SMMA, PRICE_CLOSE);
   if(MA_handle < 0)
     {
      Print("The creation of iMA has failed: MA_handle=", INVALID_HANDLE);
      Print("Runtime error = ", GetLastError());
      return(INIT_FAILED);
     }
   
   MA_handle2 = iMA(NULL, PERIOD_CURRENT, 400, 0, MODE_SMA, PRICE_CLOSE);
   if(MA_handle2 < 0)
     {
      Print("The creation of iMA has failed: MA_handle2=", INVALID_HANDLE);
      Print("Runtime error = ", GetLastError());
      return(INIT_FAILED);
     }
   
   MA_handle3 = iMA(NULL, PERIOD_CURRENT, 100, 0, MODE_EMA, PRICE_CLOSE);
   if(MA_handle3 < 0)
     {
      Print("The creation of iMA has failed: MA_handle3=", INVALID_HANDLE);
      Print("Runtime error = ", GetLastError());
      return(INIT_FAILED);
     }
   
   MA_handle4 = iMA(NULL, PERIOD_CURRENT, 200, 0, MODE_SMA, PRICE_CLOSE);
   if(MA_handle4 < 0)
     {
      Print("The creation of iMA has failed: MA_handle4=", INVALID_HANDLE);
      Print("Runtime error = ", GetLastError());
      return(INIT_FAILED);
     }
   
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
   int limit = rates_total - prev_calculated;
   //--- counting from 0 to rates_total
   ArraySetAsSeries(Buffer1, true);
   ArraySetAsSeries(Buffer2, true);
   ArraySetAsSeries(Buffer3, true);
   ArraySetAsSeries(Buffer4, true);
   //--- initial zero
   if(prev_calculated < 1)
     {
      ArrayInitialize(Buffer1, EMPTY_VALUE);
      ArrayInitialize(Buffer2, EMPTY_VALUE);
      ArrayInitialize(Buffer3, EMPTY_VALUE);
      ArrayInitialize(Buffer4, EMPTY_VALUE);
     }
   else
      limit++;
   datetime Time[];
   
   datetime TimeShift[];
   if(CopyTime(Symbol(), PERIOD_CURRENT, 0, rates_total, TimeShift) <= 0) return(rates_total);
   ArraySetAsSeries(TimeShift, true);
   int barshift_M1[];
   ArrayResize(barshift_M1, rates_total);
   int barshift_D1[];
   ArrayResize(barshift_D1, rates_total);
   for(int i = 0; i < rates_total; i++)
     {
      barshift_M1[i] = iBarShift(Symbol(), PERIOD_M1, TimeShift[i]);
      barshift_D1[i] = iBarShift(Symbol(), PERIOD_D1, TimeShift[i]);
   }
   if(BarsCalculated(RSI_handle) <= 0) 
      return(0);
   if(CopyBuffer(RSI_handle, 0, 0, rates_total, RSI) <= 0) return(rates_total);
   ArraySetAsSeries(RSI, true);
   if(CopyOpen(Symbol(), PERIOD_M1, 0, rates_total, Open) <= 0) return(rates_total);
   ArraySetAsSeries(Open, true);
   if(CopyClose(Symbol(), PERIOD_D1, 0, rates_total, Close) <= 0) return(rates_total);
   ArraySetAsSeries(Close, true);
   if(BarsCalculated(MA_handle) <= 0) 
      return(0);
   if(CopyBuffer(MA_handle, 0, 0, rates_total, MA) <= 0) return(rates_total);
   ArraySetAsSeries(MA, true);
   if(BarsCalculated(MA_handle2) <= 0) 
      return(0);
   if(CopyBuffer(MA_handle2, 0, 0, rates_total, MA2) <= 0) return(rates_total);
   ArraySetAsSeries(MA2, true);
   if(BarsCalculated(MA_handle3) <= 0) 
      return(0);
   if(CopyBuffer(MA_handle3, 0, 0, rates_total, MA3) <= 0) return(rates_total);
   ArraySetAsSeries(MA3, true);
   if(BarsCalculated(MA_handle4) <= 0) 
      return(0);
   if(CopyBuffer(MA_handle4, 0, 0, rates_total, MA4) <= 0) return(rates_total);
   ArraySetAsSeries(MA4, true);
   if(CopyLow(Symbol(), PERIOD_CURRENT, 0, rates_total, Low) <= 0) return(rates_total);
   ArraySetAsSeries(Low, true);
   if(CopyHigh(Symbol(), PERIOD_CURRENT, 0, rates_total, High) <= 0) return(rates_total);
   ArraySetAsSeries(High, true);
   if(CopyTime(Symbol(), Period(), 0, rates_total, Time) <= 0) return(rates_total);
   ArraySetAsSeries(Time, true);
   //--- main loop
   for(int i = limit-1; i >= 0; i--)
     {
      if (i >= MathMin(PLOT_MAXIMUM_BARS_BACK-1, rates_total-1-OMIT_OLDEST_BARS)) continue; //omit some old rates to prevent "Array out of range" or slow calculation   
      
      if(barshift_M1[i] < 0 || barshift_M1[i] >= rates_total) continue;
      if(barshift_D1[i] < 0 || barshift_D1[i] >= rates_total) continue;
      
      //Indicator Buffer 1
      if(RSI[i] < Oversold
      && RSI[i+1] > Oversold //Relative Strength Index crosses below fixed value
      && Open[barshift_M1[i]] >= Close[1+barshift_D1[i]] //Candlestick Open >= Candlestick Close
      && MA[i] > MA2[i] //Moving Average > Moving Average
      && MA3[i] > MA4[i] //Moving Average > Moving Average
      )
        {
         Buffer1[i] = Low[i]; //Set indicator value at Candlestick Low
         if(i == 1 && Time[1] != time_alert) myAlert("indicator", "Buy"); //Alert on next bar open
         time_alert = Time[1];
        }
      else
        {
         Buffer1[i] = EMPTY_VALUE;
        }
      //Indicator Buffer 2
      if(RSI[i] > Overbought
      && RSI[i+1] < Overbought //Relative Strength Index crosses above fixed value
      && Open[barshift_M1[i]] <= Close[1+barshift_D1[i]] //Candlestick Open <= Candlestick Close
      && MA[i] < MA2[i] //Moving Average < Moving Average
      && MA3[i] < MA4[i] //Moving Average < Moving Average
      )
        {
         Buffer2[i] = High[i]; //Set indicator value at Candlestick High
         if(i == 1 && Time[1] != time_alert) myAlert("indicator", "Sell"); //Alert on next bar open
         time_alert = Time[1];
        }
      else
        {
         Buffer2[i] = EMPTY_VALUE;
        }
      //Indicator Buffer 3
      if(MA3[i] > MA4[i]
      && MA3[i+1] < MA4[i+1] //Moving Average crosses above Moving Average
      )
        {
         Buffer3[i] = Low[i]; //Set indicator value at Candlestick Low
         if(i == 1 && Time[1] != time_alert) myAlert("indicator", "Buy Reversal"); //Alert on next bar open
         time_alert = Time[1];
        }
      else
        {
         Buffer3[i] = EMPTY_VALUE;
        }
      //Indicator Buffer 4
      if(MA3[i] < MA4[i]
      && MA3[i+1] > MA4[i+1] //Moving Average crosses below Moving Average
      )
        {
         Buffer4[i] = High[i]; //Set indicator value at Candlestick High
         if(i == 1 && Time[1] != time_alert) myAlert("indicator", "Sell Reversal"); //Alert on next bar open
         time_alert = Time[1];
        }
      else
        {
         Buffer4[i] = EMPTY_VALUE;
        }
     }
   return(rates_total);
  }
//Thank you for getting this far, you are amazing.
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+


Изучение результатов окончательной системы

Результаты работы системы впечатляют. Теперь мы можем ограничить нашу сигнальную систему рыночными настроениями D1, а также получать сигналы, когда происходит разворотный импульс через пересечение EMA (100) и SMA (200). На рисунке ниже приведены выходные данные индикатора на реальной истории графика. Система, судя по всему, демонстрирует исключительные результаты в улавливании изменений настроений рынка и выявлении потенциальных точек разворота. Сосредоточившись на настроениях рынка D1 и используя сигналы пересечения EMA(100) и SMA(200), мы можем улучшить наши торговые стратегии и принимать более обоснованные решения. Вывод индикатора на исторических данных графика наглядно демонстрирует эффективность этих сигналов в прогнозировании движений рынка.

USDJPYM1 и Trend Constraint v1.03

Рис. 4. Результаты Trend Constraint V1.03 на USDJPYmicroM1

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

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


Видео с описанием результата

На видео ниже можно оценить эффективность разработки нашей новой версии.




Заключение

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




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

Прикрепленные файлы |
Разрабатываем мультивалютный советник (Часть 18): Автоматизация подбора групп с учётом форвард-периода Разрабатываем мультивалютный советник (Часть 18): Автоматизация подбора групп с учётом форвард-периода
Продолжим автоматизировать шаги, которые ранее мы выполняли вручную. В этот раз вернёмся к автоматизации второго этапа, то есть выбора оптимальной группы одиночных экземпляров торговых стратегий, дополнив его возможностью учитывать результаты экземпляров на форвард-периоде.
Алгоритм искусственного орошения — Artificial Showering Algorithm (ASHA) Алгоритм искусственного орошения — Artificial Showering Algorithm (ASHA)
В статье представлен Алгоритм Искусственного Орошения (ASHA) – новый метаэвристический метод, разработанный для решения общих задач оптимизации. Основанный на моделировании процессов потоков и накопления воды, этот алгоритм выстраивает концепцию идеального поля, в котором каждая единица ресурса (вода) вызывается для поиска оптимального решения. Узнайте, как ASHA адаптирует принципы потока и накопления для эффективного распределения ресурсов в условиях поискового пространства, а также познакомьтесь с его реализацией и итогами тестирования.
Введение в MQL5 (Часть 7): Руководство для начинающих по созданию советников и использованию кода от ИИ в MQL5 Введение в MQL5 (Часть 7): Руководство для начинающих по созданию советников и использованию кода от ИИ в MQL5
В этой статье мы представим полное руководство для начинающих по созданию советников (EA) на MQL5. Вы найдете пошаговые инструкции по созданию экспертов с использованием псевдокода и возможностей кода, сгенерированного ИИ. Эта статья предназначена для тех, кто только начинает свой пусть в алготрейдинге, а также для всех, кто хочет улучшить навыки разработки эффективных советников.
Возможности Мастера MQL5, которые вам нужно знать (Часть 20): Символьная регрессия Возможности Мастера MQL5, которые вам нужно знать (Часть 20): Символьная регрессия
Символьная регрессия — это форма регрессии, которая начинается с минимальных или нулевых предположений относительно того, как будет выглядеть базовая модель, отображающая изучаемые наборы данных. Несмотря на то, что ее можно реализовать с помощью байесовских методов или нейронных сетей, мы рассмотрим, как реализация с использованием генетических алгоритмов может помочь настроить класс сигналов советника, пригодный для использования в Мастере MQL5.