English 中文 Español Deutsch 日本語
preview
Разработка инструментария для анализа движения цен (Часть 11): Советник Heikin Ashi Signal

Разработка инструментария для анализа движения цен (Часть 11): Советник Heikin Ashi Signal

MetaTrader 5Примеры |
671 0
Christian Benjamin
Christian Benjamin

Введение

Математические формулы служат краеугольным камнем анализа ценового движения, предоставляя объективный метод расшифровки рыночных данных и принятия торговых решений. Например, на южноафриканском рынке Форекс трейдер, оценивающий пару ZARUSD, может использовать 50-дневную простую скользящую среднюю для обнаружения разворотов тренда, одновременно применяя стандартное отклонение для оценки волатильности рынка и подтверждения потенциальных прорывов. Использование формул для определения размера позиции и управления рисками, таких как расчет размера сделки на основе установленного процента риска и расстояния стоп-лосса, позволяет трейдеру эффективно управлять рисками и устанавливать четкие цели прибыли с помощью таких инструментов, как уровни коррекции Фибоначчи.

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

Начнем с определения понятия Heikin Ashi и изучения его происхождения. Затем, без лишних отступлений, мы перейдем непосредственно к стратегии, чтобы вы могли понять, как именно она работает. Мы также рассмотрим другие ключевые функции, предоставим полный код и, наконец, рассмотрим результаты, прежде чем завершить статью. Теперь давайте взглянем на содержание.


Heikin Ashi

Методика Heikin Ashi была разработана Мунэхисой Хоммой, японским торговцем рисом, жившим в XVIII веке, которого также считают пионером в области построения графиков японских свечей — основополагающего инструмента технического анализа. Индикатор Heikin Ashi был разработан в Японии, чтобы помочь трейдерам получить более четкое представление о рыночных тенденциях, сосредоточившись на среднем движении цены, а не на отдельных свечных паттернах. В переводе с японского Heikin означает "средний" или "баланс", в то время как Ashi означает "столбец" или "свеча". Это название отражает основной принцип графиков Heikin Ashi — сглаживание ценовых данных для получения более сбалансированного и менее волатильного представления о рыночных движениях. Рисунок ниже иллюстрирует, как традиционный график свечей преобразуется в более сглаженный график Heikin Ashi.

Традиционный свечной график и Heikin Ashi

Рис 1. Сглаженный график

В таблице ниже сравниваются традиционный свечной график и Heikin Ashi.

Свойство Традиционные свечи Свечи Heikin Ashi
Основа расчета
Использует фактические цены открытия, максимума, минимума и закрытия.
Использует модифицированную формулу усреднения данных о ценах.
Отображение волатильности
Показывает реальные колебания цен и разрывы.
Сглаживает движение цен, уменьшая шум.
Четкость тренда
Может быть изменчивым, с чередованием красных и зеленых свечей даже в трендах.
Обеспечивает более плавные переходы цвета с меньшим количеством изменений.
Видимость разрывов
Показывает ценовые разрывы между свечами.
Редко показывает разрывы из-за формулы усреднения.
Сигналы разворота
Демонстрирует быстрые развороты и тени.
Развороты отображаются медленнее, но являются более сильными, если подтверждаются.
Представление цен
Отражает реальные рыночные цены.
Усредненные цены, то есть последняя цена не соответствует реальной рыночной цене.


Стратегия

Данная стратегия построена вокруг четырех основных функций советника MQL5: расчета Heikin Ashi, подтверждения тренда, идентификации сигнала разворота и подтверждения сигнала с помощью RSI. Давайте подробно рассмотрим каждую из них ниже.

Расчет Heikin Ashi

Графики Heikin Ashi строятся с использованием четырех ключевых точек данных: цены открытия, максимума, минимума и закрытия для каждого периода. Эти значения обрабатываются для создания свечей Heikin Ashi, которые отличаются от традиционных свечей. Вместо того чтобы отражать сырое ценовое движение, свечи Heikin Ashi используют расчеты усредненных цен, объединяя цены открытия и закрытия, а также максимальные и минимальные цены, чтобы создать более гибкое представление рыночных тенденций. 

Этот сглаживающий эффект минимизирует влияние резких колебаний цен, снижая рыночный шум и облегчая выявление трендов. В результате свечи Heikin Ashi часто имеют меньшее тело и более длинные тени, что подчёркивает рыночный импульс и отфильтровывает краткосрочную волатильность. Для реализации стратегии Heikin Ashi следующая блок-схема демонстрирует, как традиционные данные свечей преобразуются в плавный, ориентированный на тренд график Heikin Ashi. Этот процесс отфильтровывает рыночный шум и обеспечивает более четкое представление о преобладающей тенденции. Ниже приведено пошаговое описание того, как это работает:

Свеча Heikin Ashi

Рис 2. Блок-схема

На блок-схеме показано, как традиционные данные OHLC преобразуются в свечи Heiken Ashi. Процесс начинается с необработанных рыночных данных, которые затем сглаживаются путем расчета среднего значения цены закрытия (haClose). Цена открытия (haOpen) определяется с использованием значений предыдущей свечи для создания непрерывности, в то время как haHigh и haLow позволяют убедиться, что свеча отражает весь диапазон движения цен. В результате получается свеча, которая снижает краткосрочную волатильность, делая общие тенденции более заметными. Ниже представлен фрагмент кода MQL5 для функции расчета свечей Heikin Ashi.

void CalculateHeikinAshi()
{
   MqlRates rates[];
   int copied = CopyRates(_Symbol, _Period, 0, Bars(_Symbol, _Period), rates);

   if(copied < TrendCandles + 2)
   {
      Print("Failed to copy rates. Copied: ", copied);
      return;
   }

   ArraySetAsSeries(rates, true);

   // Resize arrays to match the number of copied bars
   ArrayResize(haClose, copied);
   ArrayResize(haOpen, copied);
   ArrayResize(haHigh, copied);
   ArrayResize(haLow, copied);

   // Calculate Heikin-Ashi values for each bar
   for(int i = copied - 1; i >= 0; i--)
   {
      haClose[i] = (rates[i].open + rates[i].high + rates[i].low + rates[i].close) / 4.0;
      haOpen[i] = (i == copied - 1) ? (rates[i].open + rates[i].close) / 2.0
                                   : (haOpen[i + 1] + haClose[i + 1]) / 2.0;
      haHigh[i] = MathMax(rates[i].high, MathMax(haOpen[i], haClose[i]));
      haLow[i] = MathMin(rates[i].low, MathMin(haOpen[i], haClose[i]));
   }

   Print("Heikin-Ashi Calculation Complete");
}

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

Подтверждение тренда

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

int consecutive = 0;
for(int i = 2; i <= TrendCandles + 1; i++)
{
   if((haClose[i] > haClose[i + 1] && isBullish) || (haClose[i] < haClose[i + 1] && !isBullish))
      consecutive++;
   else
      break;
}
if(consecutive < ConsecutiveCandles)
   return false;

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

Обнаружение сигнала разворота

После подтверждения установившегося тренда советник приступает к выявлению потенциальных сигналов разворота, внимательно изучая структуру следующей свечи Heikin Ashi. На этом этапе советник рассчитывает тело свечи как абсолютную разницу между haClose и haOpen и измеряет тень в зависимости от интересующего направления, уделяя особое внимание нижней тени для бычьего разворота и верхней тени для медвежьего разворота. Ключевым условием является то, что соотношение тени и тела должно превышать заданный порог. Такое высокое соотношение тени и тела свидетельствует о том, что рынок решительно отверг преобладающую тенденцию, о чем свидетельствует длинная тень по отношению к небольшому телу. Такой паттерн служит надежным индикатором того, что может начаться разворот.

// Check for a strong reversal candlestick
double body = MathAbs(haClose[1] - haOpen[1]);
double shadow = (direction > 0) ? MathAbs(haLow[1] - haOpen[1])
                                : MathAbs(haHigh[1] - haOpen[1]);

// Avoid division by zero and confirm shadow-to-body ratio
if(body == 0.0 || (shadow / body) < ShadowToBodyRatio)
   return false;

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

Подтверждение сигнала с помощью RSI

Последний шаг стратегии включает подтверждение сигнала разворота с помощью индекса относительной силы (RSI), что добавляет дополнительный уровень проверки. Как только с помощью критериев Heikin Ashi определяется потенциальный разворот, советник извлекает последнее значение RSI для оценки рыночного импульса. Для сигнала бычьего разворота RSI должен быть ниже заданного порога покупки, что указывает на перепроданность актива; и наоборот, для медвежьего разворота RSI должен превышать заданный порог продажи, что указывает на перекупленность актива. Только когда выполняются как паттерн Heikin Ashi, так и условие RSI, советник генерирует торговый сигнал, например, рисуя на графике стрелку покупки или продажи. Такой подход с двойным подтверждением помогает сократить количество ложных сигналов, гарантируя, что сделки будут совершаться только тогда, когда несколько индикаторов подтверждают разворот рынка.

// Get RSI Value
double rsiValue;
if(!GetRSIValue(rsiValue))
{
   Print("Failed to retrieve RSI value.");
   return;
}

// Detect potential reversals with RSI confirmation
if(DetectReversal(true) && rsiValue < RSI_Buy_Threshold)  // Bullish reversal with RSI confirmation
{
   DrawArrow("BuyArrow", iTime(NULL, 0, 0), SymbolInfoDouble(_Symbol, SYMBOL_BID), 233, BuyArrowColor);
   Print("Bullish Reversal Detected - RSI:", rsiValue);
}
else if(DetectReversal(false) && rsiValue > RSI_Sell_Threshold)  // Bearish reversal with RSI confirmation
{
   DrawArrow("SellArrow", iTime(NULL, 0, 0), SymbolInfoDouble(_Symbol, SYMBOL_ASK), 234, SellArrowColor);
   Print("Bearish Reversal Detected - RSI:", rsiValue);
}

Подтверждение RSI добавляет уровень анализа импульса. Объединяя ценовое действие через (Heikin Ashi) с импульсом через (RSI), советник повышает надежность сигналов, гарантируя, что сделки открываются только при совпадении показаний нескольких индикаторов.


Прочие функции

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

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

input int TrendCandles = 3;                 // Number of candles for trend detection
input double ShadowToBodyRatio = 1.5;       // Shadow-to-body ratio for reversal detection
input int ConsecutiveCandles = 2;           // Consecutive candles to confirm trend
input int RSI_Period = 14;                  // RSI Period
input double RSI_Buy_Threshold = 34.0;      // RSI level for buy confirmation
input double RSI_Sell_Threshold = 65.0;     // RSI level for sell confirmation
input color BuyArrowColor = clrGreen;       // Buy signal color
input color SellArrowColor = clrRed;        // Sell signal color

Эти параметры дают нам контроль над ключевыми аспектами стратегии. TrendCandles определяет, сколько свечей Heikin Ashi необходимо учитывать при определении трендов. ShadowToBodyRatio гарантирует, что мы рассматриваем только сильные разворотные свечи. ConsecutiveCandles отфильтровывает слабые тренды, требуя как минимум двух свечей для подтверждения направления. RSI_Buy_Threshold и RSI_Sell_Threshold добавляют еще один уровень подтверждения с помощью RSI. BuyArrowColor и SellArrowColor позволяют нам настраивать отображение сигналов на графике.

Глобальные переменные

Чтобы обеспечить эффективность наших вычислений, мы объявляем глобальные массивы для хранения значений Heikin Ashi, а также хэндл индикатора RSI.

double haClose[], haOpen[], haHigh[], haLow[];
int rsiHandle;

Мы используем эти переменные для хранения вычисленных значений Heikin Ashi и динамического извлечения показаний RSI в нашем советнике.

Инициализация (OnInit)

Когда мы прикрепляем советник к графику, сначала запускается функция OnInit(). Она настраивает массивы Heikin Ashi и инициализирует индикатор RSI.

int OnInit()
{
   ArraySetAsSeries(haClose, true);
   ArraySetAsSeries(haOpen, true);
   ArraySetAsSeries(haHigh, true);
   ArraySetAsSeries(haLow, true);

   if(Bars(_Symbol, _Period) < TrendCandles + 2)
   {
      Print("Not enough bars for initialization.");
      return INIT_FAILED;
   }

   rsiHandle = iRSI(_Symbol, _Period, RSI_Period, PRICE_CLOSE);
   if(rsiHandle == INVALID_HANDLE)
   {
      Print("Failed to create RSI indicator.");
      return INIT_FAILED;
   }

   Print("EA Initialized Successfully");
   return INIT_SUCCEEDED;
}

Здесь мы устанавливаем наши массивы в обратном порядке, поэтому последняя свеча всегда имеет индекс 0. Перед выполнением расчетов мы проверяем наличие достаточного количества баров. Мы инициализируем индикатор RSI и обрабатываем любые ошибки в случае его сбоя. Если все настроено правильно, советник выводит сообщение с подтверждением и начинает работу.

Обработка тиков (OnTick)

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

void OnTick()
{
   if(Bars(_Symbol, _Period) < TrendCandles + 2)
   {
      Print("Not enough bars for tick processing.");
      return;
   }

   CalculateHeikinAshi();

   double rsiValue;
   if(!GetRSIValue(rsiValue))
   {
      Print("Failed to retrieve RSI value.");
      return;
   }

   if(DetectReversal(true) && rsiValue < RSI_Buy_Threshold)
   {
      DrawArrow("BuyArrow", iTime(NULL, 0, 0), SymbolInfoDouble(_Symbol, SYMBOL_BID), 233, BuyArrowColor);
      Print("Bullish Reversal Detected - RSI:", rsiValue);
   }
   else if(DetectReversal(false) && rsiValue > RSI_Sell_Threshold)
   {
      DrawArrow("SellArrow", iTime(NULL, 0, 0), SymbolInfoDouble(_Symbol, SYMBOL_ASK), 234, SellArrowColor);
      Print("Bearish Reversal Detected - RSI:", rsiValue);
   }
}

Мы генерируем уникальное имя для каждой стрелки на основе временной метки сигнала. Если найдена существующая стрелка с таким же именем, мы удаляем ее, чтобы не загромождать страницу. Затем мы создаем новый объект стрелки и задаем его свойства (цвет, размер и тип). В случае успеха мы выводим сообщение, подтверждающее размещение стрелки.

Очистка при деинициализации (OnDeinit)

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

void OnDeinit(const int reason)
{
   if(rsiHandle != INVALID_HANDLE)
      IndicatorRelease(rsiHandle);
}

Эта функция обеспечивает корректное удаление индикатора RSI при остановке работы советника.


Код MQL5

//+------------------------------------------------------------------+
//|                                        Heikin Ashi Signal EA.mq5 |
//|                              Copyright 2025, Christian Benjamin. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, Christian Benjamin."
#property link      "https://www.mql5.com/en/users/lynnchris"
#property version   "1.00"
#property strict

//--- Input parameters
input int TrendCandles = 3;                 // Number of candles for trend detection
input double ShadowToBodyRatio = 1.5;       // Shadow-to-body ratio for reversal detection
input int ConsecutiveCandles = 2;           // Consecutive candles to confirm trend
input int RSI_Period = 14;                  // RSI Period
input double RSI_Buy_Threshold = 34.0;      // RSI level for buy confirmation
input double RSI_Sell_Threshold = 65.0;     // RSI level for sell confirmation
input color BuyArrowColor = clrGreen;       // Buy signal color
input color SellArrowColor = clrRed;        // Sell signal color

//--- Global variables
double haClose[], haOpen[], haHigh[], haLow[];
int rsiHandle;

//+------------------------------------------------------------------+
//| Expert initialization                                            |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArraySetAsSeries(haClose, true);
   ArraySetAsSeries(haOpen, true);
   ArraySetAsSeries(haHigh, true);
   ArraySetAsSeries(haLow, true);

   if(Bars(_Symbol, _Period) < TrendCandles + 2)
     {
      Print("Not enough bars for initialization.");
      return INIT_FAILED;
     }

// Initialize RSI indicator
   rsiHandle = iRSI(_Symbol, _Period, RSI_Period, PRICE_CLOSE);
   if(rsiHandle == INVALID_HANDLE)
     {
      Print("Failed to create RSI indicator.");
      return INIT_FAILED;
     }

   Print("EA Initialized Successfully");
   return INIT_SUCCEEDED;
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(Bars(_Symbol, _Period) < TrendCandles + 2)
     {
      Print("Not enough bars for tick processing.");
      return;
     }

// Calculate Heikin-Ashi
   CalculateHeikinAshi();

// Get RSI Value
   double rsiValue;
   if(!GetRSIValue(rsiValue))
     {
      Print("Failed to retrieve RSI value.");
      return;
     }

// Detect potential reversals with RSI confirmation
   if(DetectReversal(true) && rsiValue < RSI_Buy_Threshold)  // Bullish reversal with RSI confirmation
     {
      DrawArrow("BuyArrow", iTime(NULL, 0, 0), SymbolInfoDouble(_Symbol, SYMBOL_BID), 233, BuyArrowColor);
      Print("Bullish Reversal Detected - RSI:", rsiValue);
     }
   else
      if(DetectReversal(false) && rsiValue > RSI_Sell_Threshold)  // Bearish reversal with RSI confirmation
        {
         DrawArrow("SellArrow", iTime(NULL, 0, 0), SymbolInfoDouble(_Symbol, SYMBOL_ASK), 234, SellArrowColor);
         Print("Bearish Reversal Detected - RSI:", rsiValue);
        }
  }

//+------------------------------------------------------------------+
//| Calculate Heikin-Ashi                                            |
//+------------------------------------------------------------------+
void CalculateHeikinAshi()
  {
   MqlRates rates[];
   int copied = CopyRates(_Symbol, _Period, 0, Bars(_Symbol, _Period), rates);

   if(copied < TrendCandles + 2)
     {
      Print("Failed to copy rates. Copied: ", copied);
      return;
     }

   ArraySetAsSeries(rates, true);

// Resize arrays to match the number of copied bars
   ArrayResize(haClose, copied);
   ArrayResize(haOpen, copied);
   ArrayResize(haHigh, copied);
   ArrayResize(haLow, copied);

// Calculate Heikin-Ashi
   for(int i = copied - 1; i >= 0; i--)
     {
      haClose[i] = (rates[i].open + rates[i].high + rates[i].low + rates[i].close) / 4.0;
      haOpen[i] = (i == copied - 1) ? (rates[i].open + rates[i].close) / 2.0 : (haOpen[i + 1] + haClose[i + 1]) / 2.0;
      haHigh[i] = MathMax(rates[i].high, MathMax(haOpen[i], haClose[i]));
      haLow[i] = MathMin(rates[i].low, MathMin(haOpen[i], haClose[i]));
     }

   Print("Heikin-Ashi Calculation Complete");
  }

//+------------------------------------------------------------------+
//| Detect Reversals with Trend Confirmation                         |
//+------------------------------------------------------------------+
bool DetectReversal(bool isBullish)
  {
   int direction = isBullish ? 1 : -1;

// Confirm trend location: Check for consecutive candles in the same direction
   int consecutive = 0;
   for(int i = 2; i <= TrendCandles + 1; i++)
     {
      if((haClose[i] > haClose[i + 1] && isBullish) || (haClose[i] < haClose[i + 1] && !isBullish))
         consecutive++;
      else
         break;
     }
   if(consecutive < ConsecutiveCandles)
      return false;

// Check for a strong reversal candlestick
   double body = MathAbs(haClose[1] - haOpen[1]);
   double shadow = (direction > 0) ? MathAbs(haLow[1] - haOpen[1]) : MathAbs(haHigh[1] - haOpen[1]);

// Avoid division by zero and confirm shadow-to-body ratio
   if(body == 0.0 || (shadow / body) < ShadowToBodyRatio)
      return false;

// Confirm the reversal with the next candlestick (opposite direction)
   return ((haClose[0] - haOpen[0]) * direction < 0);
  }

//+------------------------------------------------------------------+
//| Get RSI Value                                                    |
//+------------------------------------------------------------------+
bool GetRSIValue(double &rsiValue)
  {
   double rsiBuffer[];
   if(CopyBuffer(rsiHandle, 0, 0, 1, rsiBuffer) > 0)
     {
      rsiValue = rsiBuffer[0];
      return true;
     }
   return false;
  }

//+------------------------------------------------------------------+
//| Draw Arrow                                                       |
//+------------------------------------------------------------------+
void DrawArrow(string name, datetime time, double price, int code, color clr)
  {
   name += "_" + IntegerToString(time);
   if(ObjectFind(0, name) != -1)
      ObjectDelete(0, name);

   if(ObjectCreate(0, name, OBJ_ARROW, 0, time, price))
     {
      ObjectSetInteger(0, name, OBJPROP_ARROWCODE, code);
      ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
      ObjectSetInteger(0, name, OBJPROP_WIDTH, 2);
      Print("Arrow Drawn: ", name, " at ", price);
     }
   else
     {
      Print("Failed to create arrow: ", GetLastError());
     }
  }

//+------------------------------------------------------------------+
//| Expert deinitialization                                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(rsiHandle != INVALID_HANDLE)
      IndicatorRelease(rsiHandle);
  }
//+------------------------------------------------------------------+


Результаты

Я использовал тестирование как на истории, так и на реальном рынке для оценки производительности советника.
  • Тестирование на истории

Я запустил советник на исторических данных, чтобы проверить его базовую жизнеспособность и выявить его сильные и слабые стороны. Этот этап подтверждает, что подход работает в известных рыночных условиях, хотя он не может полностью воспроизвести реальные факторы, такие как проскальзывание или переменные спреды. Давайте посмотрим на GIF-изображение ниже.

Тестирование на истории V100

Рис. 3. Тестирование индекса V100 на истории

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

  • EURUSD

Сигнал Итого True  Точность в %
Покупка  20  17 85%
Продажа   10  8 80%

  • Индекс Crash 900

Сигнал Итого True  Точность в %
Покупка 18 14 77,8%
Продажа  25 15 60%

  • Индекс Step

Сигнал Итого True  Точность в %
Покупка 18 15 83,3%
Продажа  22 14  63,6%

Советник доказал свою высокую эффективность, достигнув минимальной точности 77,8% для сигналов на покупку и минимальной точности 60% для сигналов на продажу по всем протестированным парам.

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

Тестирование в реальных условиях

Рис 4. Тестирование индекса V25 в реальных условиях

Ключевой вывод

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


Заключение

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

Дата Название инструмента  Описание Версия  Обновления  Примечания
01/10/24 Chart Projector Скрипт для наложения эффекта призрака на движение цены за предыдущий день. 1.0 Первоначальная версия Первый инструмент в Lynnchris Tools Chest
18/11/24 Analytical Comment Предоставляет информацию за предыдущий день в табличном формате, а также прогнозирует будущее направление рынка. 1.0 Первоначальная версия Второй инструмент в Lynnchris Tools Chest
27/11/24 Analytics Master Регулярное обновление рыночных показателей каждые два часа  1.01 Вторая версия Третий инструмент в Lynnchris Tools Chest
02/12/24 Analytics Forecaster  Регулярное обновление рыночных показателей каждые два часа с интеграцией с Telegram 1.1 Третья версия Инструмент номер 4
09/12/24 Volatility Navigator Советник анализирует рыночные условия с помощью полос Боллинджера, RSI и ATR. 1.0 Первоначальная версия Инструмент номер 5
19/12/24 Mean Reversion Signal Reaper  Анализирует рынок и генерирует сигналы, используя стратегию возврата к среднему  1.0  Первоначальная версия  Инструмент номер 6 
9/01/25  Signal Pulse  Анализирует несколько таймфреймов 1.0  Первоначальная версия  Инструмент номер 7 
17/01/25  Metrics Board  Панель с кнопками для анализа  1.0  Первоначальная версия Инструмент номер 8 
21/01/25 External Flow Аналитика с помощью внешних библиотек 1.0  Первоначальная версия Инструмент номер 9 
27/01/25 VWAP Взвешенная по объему средняя цена   1.3  Первоначальная версия  Инструмент номер 10 
02/02/25  Heikin Ashi Signal EA Сглаживание тренда и обнаружение сигналов разворота  1.0  Первоначальная версия  Инструмент номер 11 


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

Прикрепленные файлы |
Нейросети в трейдинге: Спайково-семантический подход к пространственно-временной идентификации (Окончание) Нейросети в трейдинге: Спайково-семантический подход к пространственно-временной идентификации (Окончание)
S3CE-Net в нашей интерпретации ловко переводит рынок в язык событий и фиксирует ранние импульсы, которые традиционные индикаторы просто усредняют. STFS гарантирует устойчивость обучения — модель видит данные под разными углами и не переобучается на локальных аномалиях. SSAM-блоки и OpenCL-реализация дают практическую скорость и точность, а разделение режимов обучение/эксплуатация сохраняет ресурсы в продакшене.
От начального до среднего уровня: Struct (V) От начального до среднего уровня: Struct (V)
В данной статье мы рассмотрим, как перегрузить структурный код. Я знаю, что сначала это довольно сложно для понимания, особенно если увидеть это впервые. Очень важно, чтобы вы усвоили эти понятия и хорошо поняли их, прежде чем пытаться вникать в более сложные и проработанные вещи.
Управление рисками (Часть 4): Завершение ключевых методов класса Управление рисками (Часть 4): Завершение ключевых методов класса
Эта статья — четвертая часть нашей серии статей об управлении рисками в MQL5, где мы продолжаем изучать продвинутые методы защиты и оптимизации торговых стратегий. Заложив важные основы в предыдущих статьях, теперь мы сосредоточимся на завершении всех оставшихся методов, которые были отложены в третьей части, включая функции для проверки достижения определенных уровней прибыли или убытков. Кроме того, в статье будут представлены новые ключевые события, обеспечивающие более точное и гибкое управление.
Алгоритм искусственной коронарной циркуляции — Artificial Coronary Circulation System (ACCS) Алгоритм искусственной коронарной циркуляции — Artificial Coronary Circulation System (ACCS)
Метаэвристический алгоритм, имитирующий рост коронарных артерий в сердце человека для задач оптимизации. Использует принципы ангиогенеза (роста новых сосудов), бифуркации (разветвления) и обрезки слабых ветвей для поиска оптимальных решений в многомерном пространстве. Проверка его эффективности на широком спектре задач принесла неожиданные результаты.