English 中文 Español Deutsch 日本語 Português
preview
Может ли Heiken Ashi давать хорошие сигналы в сочетании со скользящими средними?

Может ли Heiken Ashi давать хорошие сигналы в сочетании со скользящими средними?

MetaTrader 5Торговые системы | 3 октября 2023, 11:23
1 145 0
Javier Santiago Gaston De Iriarte Cabrera
Javier Santiago Gaston De Iriarte Cabrera

Введение

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

portada



Свечи Heiken Ashi

Свечи — это простой и быстрый способ интерпретировать данные OHLC (открытие, максимум, минимум, закрытие) и обнаружить закономерности. Бычья (обычно зеленая) свеча возникает, когда рынок закрывается выше цены открытия. Медвежья (обычно красная) свеча возникает, когда рынок закрывается ниже цены открытия.


candle ohlc


торговые паттерны


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

свечи


Свечи Heiken Ashi стремятся очистить картину и показать более четкий тренд за счет сглаживания данных OHLC. Вот как рассчитать свечи Heiken Ashi:

(open + high + low + close)  ÷  4


Heikin-Ashi High=Максимальное значение (High-0, Open-0 и Close-0) 

Heikin-Ashi Low=Минимальное значение (Low-0, Open-0 и Close-0)


Heikin Ashi — японский торговый индикатор. В буквальном переводе с японского — "средний темп". Графики Хейкин-Аши напоминают графики свечей, но имеют более плавный вид, поскольку отслеживают диапазон ценовых движений, а не отслеживают каждое движение цены, как в случае обычных свечей. Heikin Ashi был создан в 1700-х годах Мунехисой Хоммой, который также создал свечной график. Эти графики используются трейдерами и инвесторами, чтобы помочь определить и предсказать движения цен.

Как и стандартные свечи, свеча Heikin Ashi имеет тело и тень, однако цель ее применения заключается в другом. Последняя цена свечи Хейкин-Аши рассчитывается по средней цене текущего бара или таймфрейма (например, на дневном таймфрейме каждый бар будет представлять движение цены в этот конкретный день). Формула последней цены бара Heikin Ashi выглядит так: (open + high + low + close)  ÷  4. Открытие Heikin Ashi происходит в середине предыдущей свечи по формуле: (открытие предыдущего бара + закрытие предыдущего бара)  ÷ 2. Самая высокая и самая низкая ценовые точки представлены тенями, как и свечи.

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


heiken ashi (1) candles(2)


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


Скользящие средние

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

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

Фильтр скользящей средней иногда называют коробчатым фильтром (boxcar filter), особенно если за ним следует прореживание.

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

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


ma


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

ma form


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



План

покупка


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

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

Торговые условия:

  • Покупайте всякий раз, когда график Heikin-Ashi является бычьим, а рынок пересекает скользящую среднюю за 100 периодов.
  • Продавайте всякий раз, когда график Heikin Ashi является медвежьим, а рынок пересекает скользящую среднюю за 100 периодов.

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



Результаты

Это результаты для EURUSD M30 с 1 января 2022 года по 5 июля 2023 года. Лучшие результаты могут быть получены при оптимизации на других таймфреймах. Для использования на всех символах необходимо провести оптимизацию и тестирование.

График

Отчет тестера стратегий



Код

int OnInit()
  {
//---
   handle_iCustomMA=iCustom(_Symbol,my_timeframe,"\\folder/s where you have the indicator\\sma",MAPeriod,MAShift);
   handle_iCustomHeiken=iCustom(_Symbol,my_timeframe_Heiken,"\\folder/s where you have the indicator\\Heiken_Ashi_copy");
//---
   if(handle_iCustomMA==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iCustom indicator for the symbol %s/%s, error code %d",
                  _Symbol,
                  EnumToString(my_timeframe),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }
   if(handle_iCustomHeiken==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iCustom indicator for the symbol %s/%s, error code %d",
                  _Symbol,
                  EnumToString(my_timeframe_Heiken),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }
   return(INIT_SUCCEEDED);
  }

Этот код используется для инициализации двух пользовательских индикаторов на языке MQL5. Первый индикатор — это простая скользящая средняя (SMA) с параметрами MAPeriod и MAShift. Второй индикатор — копия Heiken Ashi. Код создает хэндлы для каждого индикатора и проверяет наличие ошибок. Если обнаружена ошибка, отображается код ошибки и возвращается значение INIT_FAILED. Если ошибок не обнаружено, код возвращает INIT_SUCCEEDED.

void OnTick()
  {
   double heikenAshiOpen[], heikenAshiHigh[], heikenAshiLow[], heikenAshiClose[];
   CopyBuffer(handle_iCustomHeiken,0,0,2,heikenAshiOpen);
   CopyBuffer(handle_iCustomHeiken,1,0,2,heikenAshiHigh);
   CopyBuffer(handle_iCustomHeiken,2,0,2,heikenAshiLow);
   CopyBuffer(handle_iCustomHeiken,3,0,2,heikenAshiClose);
   Comment("heikenAshiOpen ",DoubleToString(heikenAshiOpen[0],_Digits),
           "\n heikenAshiHigh ",DoubleToString(heikenAshiHigh[0],_Digits),
           "\n heikenAshiLow ",DoubleToString(heikenAshiLow[0],_Digits),
           "\n heikenAshiClose ",DoubleToString(heikenAshiClose[0],_Digits));
//---
   MqlTick tick;
   double last_price = tick.ask;
   SymbolInfoTick(_Symbol,tick);
   int total = PositionsTotal();
//---
// Retrieve the current value
   MqlTradeResult  result;
   MqlRates rates[];
//---
   double array_ma[];
   ArraySetAsSeries(array_ma,true);
   int start_pos2=0,count2=5;
   if(!iGetArray2(handle_iCustomMA,0,start_pos2,count2,array_ma))
      return;
//------------------------------------------------------------------------------
     {
      if(DoubleToString(heikenAshiClose[0],_Digits) < DoubleToString(heikenAshiOpen[0],_Digits) && (DoubleToString(heikenAshiClose[1],_Digits) > DoubleToString(heikenAshiOpen[1],_Digits)))
        {
         Print("Open Order Buy");
         Alert(" Buying");
         Orden="Buy";
         sl=NormalizeDouble(tick.ask - ptsl*_Point,_Digits);
         tp=NormalizeDouble(tick.bid + pttp*_Point,_Digits);
         trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,get_lot(tick.bid),tick.bid,sl,tp,"Buy");
         return;
        }
     }
     {
      if(DoubleToString(heikenAshiClose[0],_Digits) > DoubleToString(heikenAshiOpen[0],_Digits) && (DoubleToString(heikenAshiClose[1],_Digits) < DoubleToString(heikenAshiOpen[1],_Digits)))
        {
         Print("Open Order Sell");
         Alert(" Selling");
         Orden="Sell";
         sl=NormalizeDouble(tick.bid + ptsl*_Point,_Digits);
         tp=NormalizeDouble(tick.ask - pttp*_Point,_Digits);
         trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,get_lot(tick.ask),tick.ask,sl,tp,"Sell");
         return;
        }
     }
   if(total>0)
     {
      if(Orden=="Sell" &&(DoubleToString(heikenAshiClose[0],_Digits) < DoubleToString(heikenAshiOpen[0],_Digits) ))
        {
         trade.PositionClose(_Symbol,5);
         Print("cerró sell");
         return;
        }
      if(Orden=="Buy" &&(DoubleToString(heikenAshiClose[0],_Digits) > DoubleToString(heikenAshiOpen[0],_Digits) ))
        {
         trade.PositionClose(_Symbol,5);
         Print("cerró buy");
         return;
        }
     }
  }

Этот фрагмент кода представляет собой скрипт на MQL5, который используется для открытия и закрытия позиций на рынке Форекс. Он начинается с объявления четырех двойных массивов (heikenAshiOpen, heikenAshiHigh, heikenAshiLow и heikenAshiClose) и копирования значений из пользовательского индикатора iCustomHeiken. Затем он извлекает текущие тиковые данные из символа и объявляет массивы MqlTradeResult и MqlRates. Далее он объявляет массив для скользящей средней (array_ma) и устанавливает массив как серию. Затем он извлекает значения из пользовательского индикатора iCustomMA и сохраняет их в массиве array_ma. Наконец он проверяет, находится ли текущее закрытие Heiken Ashi ниже открытия, а предыдущее закрытие Heiken Ashi выше открытия, и если да, то он открывает ордер на покупку с указанными стоп-лоссом и тейк-профитом. Он также проверяет, находится ли текущее закрытие Heiken Ashi выше открытия, а предыдущее закрытие Heiken Ashi ниже открытия, и если да, то он открывает ордер на продажу с указанными стоп-лоссом и тейк-профитом. Если есть открытые позиции, он проверяет, находится ли закрытие Heiken Ashi ниже, чем открытие для ордера на продажу, и выше, чем открытие для ордера на покупку, и если да, то закрывает позицию.

Второе целое число CopyBuffer — это значение, с которого следует начать подсчет, а второе — значение количества отсчетов. Я использовал два вместо одного, чтобы принять во внимание 1-n (в данном случае, непосредственно предшествующую свечу Heiken Ashi). Это было необходимо для стратегии, чтобы увидеть изменение цвета в условии if (открывать или не открывать ордер).

Два if-условия открытия/закрытия ордеров — это то, что вам следует изменить в коде. Вы можете, например, использовать больше свечей одного цвета перед открытием ордера или перейти ко второй свече другого цвета для закрытия ордеров.

Еще одним хорошим решением для закрытия ордеров было бы использование еще одной SMA с другим периодом и использования перекрестных сигналов для закрытия ордеров. Как в примере с изображением:

heiken ashi 2 ma


//+------------------------------------------------------------------+
double get_lot(double price)
  {
   if(inp_lot_type==LOT_TYPE_FIX)
      return(normalize_lot(inp_lot_fix));
   double one_lot_margin;
   if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,one_lot_margin))
      return(inp_lot_fix);
   return(normalize_lot((AccountInfoDouble(ACCOUNT_BALANCE)*(inp_lot_risk/100))/ one_lot_margin));
  }
double normalize_lot(double lt)
  {
   double lot_step = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   lt = MathFloor(lt / lot_step) * lot_step;
   double lot_minimum = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   lt = MathMax(lt, lot_minimum);
   return(lt);
  }
bool iGetArray2(const int handle2,const int buffer2,const int start_pos2,
                const int count2,double &arr_buffer2[])
  {
   bool result2=true;
   if(!ArrayIsDynamic(arr_buffer2))
     {
      //if(InpPrintLog)
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      return(false);
     }
   ArrayFree(arr_buffer2);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied2=CopyBuffer(handle2,buffer2,start_pos2,count2,arr_buffer2);
   if(copied2!=count2)
     {
      //--- if the copying fails, tell the error code
      //if(InpPrintLog)
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                  __FILE__,__FUNCTION__,count2,copied2,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result2);
  }

Этот код представляет собой функцию MQL5, которая рассчитывает размер лота для сделки. Функция принимает переменную double, называемую ценой, и использует ее для расчета размера лота. 

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

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

Затем применяется функция iGetArray2 для копирования значений из индикаторного буфера и проверки на наличие ошибок. Если обнаружена ошибка, функция возвращает false.



Заключение

Мы увидели, как можно использовать Heiken Ashi с другим индикатором.

Очевидно, здесь можно провести большую оптимизацию, чтобы регулировать частоту сигналов и улучшать их качество:

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

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

Надеюсь, статья вам понравилась.

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

Прикрепленные файлы |
sma.mq5 (1.78 KB)
Разработка системы репликации - Моделирование рынка (Часть 16): Новая система классов Разработка системы репликации - Моделирование рынка (Часть 16): Новая система классов
Нам нужно лучше организовать свою работу. Код растёт, и если этого не сделать сейчас, потом это станет невозможным. Давайте разделять и властвовать. То, что MQL5 позволяет нам использовать классы, поможет нам в этой задаче, но для этого нам нужно иметь некоторые знания о некоторых моментах, связанных с классами. Наверное, новичков больше всего смущает наследование. В этой статье мы рассмотрим практичным и простым способом, как использовать данные механизмы.
Сделайте торговые графики лучше с интерактивным графическим интерфейсом на основе MQL5 (Часть II): Перемещаемый интерфейс (II) Сделайте торговые графики лучше с интерактивным графическим интерфейсом на основе MQL5 (Часть II): Перемещаемый интерфейс (II)
Раскройте потенциал динамического представления данных в своих торговых стратегиях и утилитах с помощью нашего подробного руководства по созданию перемещаемых графических интерфейсов в MQL5. Погрузитесь в фундаментальные принципы объектно-ориентированного программирования и узнайте, как легко и эффективно разрабатывать и использовать один или несколько перемещаемых графических интерфейсов на одном графике.
Создавать графические панели в MQL5 стало проще Создавать графические панели в MQL5 стало проще
В этой статье мы предоставим простое и понятное руководство для всех, кто хочет создать один из самых ценных и полезных инструментов в трейдинге — графическую панель, упрощающую выполнение торговых задач. Графические панели позволяют сэкономить время и больше сосредоточиться на самой торговле.
Разработка системы репликации - Моделирование рынка (Часть 15): Появление СИМУЛЯТОРА (V) - СЛУЧАЙНОЕ БЛУЖДАНИЕ Разработка системы репликации - Моделирование рынка (Часть 15): Появление СИМУЛЯТОРА (V) - СЛУЧАЙНОЕ БЛУЖДАНИЕ
В этой статье мы завершим разработку симулятора для нашей системы. Основной целью здесь будет настройка алгоритма, рассмотренного в предыдущей статье. Этот алгоритм направлен на создание движения СЛУЧАЙНОГО БЛУЖДАНИЯ. Поэтому, для понимания сегодняшнего материала, необходимо понять содержание предыдущих статей. Если вы не следили за развитием симулятора, советую посмотреть эту последовательность с самого начала. В противном случае вы можете запутаться в том, что будет здесь объяснено.