Построение модели для ограничения диапазона сигналов по тренду (Часть 3): Обнаружение изменений трендов при использовании системы
Содержание
- Введение
- Способы обнаружения изменений рыночных трендов
- Использование скользящих средних для определения разворота тренда
- Использование свечных моделей для обнаружения разворота тренда
- Использование линий тренда для обнаружения разворота тренда
- Использование поддержки и сопротивления для обнаружения разворота
- Проблемы текущей системы.
- Внедрение новой функции в нашу программу с использованием MQL5
- Изучение результатов окончательной системы
- Видео с описанием результата
- Заключение
Введение
Как правило, рынки постоянно находятся в движении. Независимо от того, идет ли тренд вверх или вниз, могут произойти неожиданные сдвиги, когда рынок меняет свою траекторию. Системе крайне важно выявлять эти изменения и адаптироваться к ним. Даже продолжительная медвежья свеча D1 может сигнализировать об изменении динамики, если разворот происходит на более коротком таймфрейме. В этой статье рассматриваются различные методы, используемые для распознавания изменений в ценовых трендах. Поскольку трейдерам приходится ориентироваться в сложных условиях финансовых рынков, особенно важной является способность быстро адаптироваться к меняющимся условиям. Распознавание нюансов движения цен, понимание значимости ключевых индикаторов и интерпретация настроений рынка являются важнейшими компонентами, позволяющими оставаться на шаг впереди. Оттачивая мастерство определения изменений в тенденциях, трейдеры могут открывать позиции стратегически, чтобы извлекать выгоду из возможностей, возникающих в постоянно меняющемся финансовом мире.
Различные факторы влияют на рыночные тенденции и вызывают их изменения. Вот несколько примеров:
- поведение инвестора, то есть покупка и продажа
- экономические новости, такие как ВВП и занятость в несельскохозяйственном секторе
- денежно-кредитная политика
- глобальные события, такие как стихийные бедствия
- политические события, такие как войны и т. д.
Мы уже приобрели обширные знания о том, как вручную выявлять изменения в трендах. Сюда входит концепция анализа линии тренда, которая заключается в нанесении линий на ценовой график, соединяющих максимумы и минимумы движения цены актива, чтобы трейдеры могли получить представление о потенциальных изменениях тренда, когда цена поднимается выше или опускается ниже этих линий. Далее мы выберем один метод обнаружения изменений рыночного тренда и встроим его в наш индикатор ограничения тренда (Trend Constraint), используя MQL5. Сначала мы рассмотрим различные инструменты технического анализа, такие как скользящие средние, свечные модели, индекс относительной силы (см. часть 2) и линии тренда (см. Рис. 1) для определения потенциальных разворотов тренда. Мы продолжим модифицировать наш индикатор Trend Constraint на MQL5, чтобы включить эту новую функциональность.
Рис. 1. Тренды
На рисунке выше изображен типичный восходящий тренд с минимумами A и B, соединенными синей линией тренда, что указывает на восходящий тренд. В следующих примерах мы рассмотрим реальные экземпляры графиков для дальнейшего понимания трендов. Наша главная цель — распознавать изменения рыночных трендов и внедрить подходящий метод в нашу систему с использованием MQL5.
Способы обнаружения изменений рыночных трендов
Давайте начнем с определения рыночного тренда:
Рыночный тренд обозначает общее направление движения рынка с течением времени, отражая поведение покупателей и продавцов. Тренды могут быть восходящими (бычьими), нисходящими (медвежьими) или боковыми (консолидация), как показано на рисунке 1 во введении.
Дадим определение развороту тренда:
Разворот тренда происходит, когда движение цены меняется с восходящего на нисходящее или наоборот. Этот сдвиг можно определить, проанализировав ключевые технические индикаторы, такие как скользящие средние, линии тренда, свечные модели и уровни поддержки/сопротивления. Трейдеры и инвесторы внимательно отслеживают эти изменения, чтобы принимать обоснованные решения и соответствующим образом корректировать свои стратегии.
Использование скользящих средних для определения разворота тренда
В первой части серии мы создали индикатор пересечения быстро скользящих средних, который подает сигналы о продолжении тренда при возникновении пересечения. Однако скользящие средние с более длинным периодом могут указывать на существенное изменение тренда во время пересечения. В этой статье мы рассмотрим, как скользящие средние реагируют на изменение направления рынка.
Рис. 2. Пересечение скользящих средних как сигнал разворота тренда
Использование свечных моделей для обнаружения разворота тренда
Свечные модели можно эффективно использовать для определения возможных разворотов. На протяжении всей истории их анализировали на предмет способности существенно менять настроения рынка. Хомма Мунэхиса, автор Библии свечного анализа, обогатил наше понимание свечных графиков. Вот некоторые из наиболее распространенных свечных моделей разворотов рынка:
Свечная модель | Описание |
---|---|
молот | маленькое тело и длинная нижняя тень |
перевернутый молот | маленькое тело и длинная верхняя тень |
бычья модель поглощения | бычья свеча полностью поглощает предыдущую медвежью свечу |
медвежья модель поглощения | медвежья свеча полностью поглощает предыдущую бычью свечу |
доджи | маленькое тело и длинные верхние и нижние тени |
падающая звезда | маленькое тело и длинная верхняя тень |
повешенный | маленькое тело и длинная нижняя тень |
утренняя звезда | длинная медвежья свеча, за которой следует свеча с маленьким телом, более низким минимумом и более высоким максимумом |
вечерняя звезда | длинная бычья свеча, за которой следует свеча с маленьким телом, более высоким максимумом и более низким минимумом |
Использование линий тренда для обнаружения разворота тренда
На графике платформы MetaTrader 5 мы можем использовать объект "Трендовая линия" для построения трендов, соединяя последовательные минимумы в ценовом ряду. Разорванная линия тренда указывает на изменение тренда. Чтобы нарисовать линию тренда, просто кликните по инструменту "Трендовая линия", а затем кликните по первой впадине и перетащите линию к следующей. Линия тренда автоматически продлится до правой стороны графика.
Рис. 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), мы можем улучшить наши торговые стратегии и принимать более обоснованные решения. Вывод индикатора на исторических данных графика наглядно демонстрирует эффективность этих сигналов в прогнозировании движений рынка.
Рис. 4. Результаты Trend Constraint V1.03 на USDJPYmicroM1
Примечание: Если после добавления индикатора на графике не появляются стрелки сигналов, попробуйте обновить его, кликнув правой кнопкой мыши на графике и выбрав "Обновить" в появившемся меню.
Собранные данные впоследствии могут быть включены в системы машинного обучения и искусственного интеллекта для дальнейшего совершенствования. Систему можно обучить проводить расширенный анализ, что будет полезно для преодоления проблем, с которыми мы столкнулись в текущей модели. Сигналы на изображении выше соответствуют идее, но были и те, что вводили в заблуждение. Это типично для любой системы и служит мотивацией для изучения дополнительных методов улучшения нашей текущей системы. Синтетические инструменты могут обеспечить различные результаты при использовании этой системы.
Видео с описанием результата
На видео ниже можно оценить эффективность разработки нашей новой версии.
Заключение
Внедрение в нашу систему функций обнаружения изменений тренда значительно ее усовершенствовало. Хотя мы ограничиваем наши сигналы текущим рыночным трендом, нам удалось успешно минимизировать потенциальные убытки, которые могли возникнуть из-за ложных сигналов, подтвержденных на таймфрейме D1. Мы столкнулись с сигналами разворота, подаваемыми системой во время устойчивого тренда. Чтобы решить эту проблему, я решил увеличить период используемых скользящих средних. В следующих статьях я вернусь к этой теме, чтобы подробнее рассмотреть, как происходила эта корректировка. Надеюсь, вы нашли что-то полезное в статье. Я буду рад вашим мыслям в комментариях ниже. В будущих статьях я намерен расширить визуализацию системы с использованием гибкого языка MQL5.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/14853
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования