English 中文 Español Deutsch 日本語 Português
preview
Возможности Мастера MQL5, которые вам нужно знать (Часть 39): Индекс относительной силы

Возможности Мастера MQL5, которые вам нужно знать (Часть 39): Индекс относительной силы

MetaTrader 5Торговые системы |
688 1
Stephen Njuki
Stephen Njuki

Введение

В предыдущей статье мы начали рассматривать полосы Боллинджера в пользовательском классе сигналов для советников, собранных в Мастере. Мы рассмотрели 6 из 8 предполагаемых возможных настроек, которые могут быть полезны трейдеру в рамках класса пользовательских сигналов при оценке длинных и коротких позиций. Поскольку статья получилась слишком длинной, последние две настройки, а также комбинированное тестирование всех возможных настроек, или паттернов, было оставлено на потом. Давайте продолжим и рассмотрим паттерн 6.


Полосы расширяются после нисходящего или восходящего тренда

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

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

//+------------------------------------------------------------------+
//| Check for Pattern 6.                                             |
//+------------------------------------------------------------------+
bool CSignalBollingerBands::IsPattern_6(ENUM_POSITION_TYPE T)
{  m_bands.Refresh(-1);
   m_close.Refresh(-1);
   m_high.Refresh(-1);
   m_low.Refresh(-1);
   if(Gap(StartIndex()) > Gap(StartIndex() + 1) && Gap(StartIndex() + 1) > Gap(StartIndex() + 2))
   {  if(T == POSITION_TYPE_BUY && m_close.GetData(StartIndex() + 2) < m_close.GetData(StartIndex() + 3) && m_close.GetData(StartIndex() + 3) < m_close.GetData(StartIndex() + 4))
      {  return(true);
      }
      else if(T == POSITION_TYPE_SELL && m_close.GetData(StartIndex() + 2) > m_close.GetData(StartIndex() + 3) && m_close.GetData(StartIndex() + 3) > m_close.GetData(StartIndex() + 4))
      {  return(true);
      }
   }
   return(false);
}

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

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

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

r_6_ol

c_6_ol


Изменение ориентации и угла наклона полос

Последний паттерн для полос Боллинджера связан с наклоном верхних и нижних полос. Когда нижняя полоса растет быстрее верхней на величину, кратную или превышающую входной параметр отклонения полосы Боллинджера, мы интерпретируем это как бычий сигнал. Это связано с тем, что подобная конфигурация предвещает прорыв вверх через верхнюю полосу. Подтверждение в виде фактического прорыва цены может дополнить этот сигнал. Это позволит уточнить точку входа. Медвежья ситуация зеркальна: если максимумы снижаются быстрее минимумов, нижние полосы выступают в качестве поддержки, которая вот-вот будет пробита. Опять же, закрытие цены ниже нижних полос служит подтверждающим сигналом. Реализуем это в MQL5 следующим образом:

//+------------------------------------------------------------------+
//| Check for Pattern 7.                                             |
//+------------------------------------------------------------------+
bool CSignalBollingerBands::IsPattern_7(ENUM_POSITION_TYPE T)
{  m_bands.Refresh(-1);
   m_close.Refresh(-1);
   m_high.Refresh(-1);
   m_low.Refresh(-1);
   if
   (
      T == POSITION_TYPE_BUY &&
      Lower(StartIndex()) > Lower(StartIndex() + 1) &&
      Lower(StartIndex() + 1) > Lower(StartIndex() + 2) &&
      Upper(StartIndex()) >= Upper(StartIndex() + 1) &&
      Upper(StartIndex() + 1) >= Upper(StartIndex() + 2) &&
      Lower(StartIndex()) - Lower(StartIndex() + 2) >= m_deviation * (Upper(StartIndex()) - Upper(StartIndex() + 2))
   )
   {  return(true);
   }
   else if
   (
      T == POSITION_TYPE_SELL &&
      Upper(StartIndex()) < Upper(StartIndex() + 1) &&
      Upper(StartIndex() + 1) < Upper(StartIndex() + 2) &&
      Lower(StartIndex()) <= Lower(StartIndex() + 1) &&
      Lower(StartIndex() + 1) <= Lower(StartIndex() + 2) &&
      Upper(StartIndex() + 2) - Upper(StartIndex()) >= m_deviation * (Lower(StartIndex() + 2) - Lower(StartIndex()))
   )
   {  return(true);
   }
   return(false);
}

Как упоминалось выше, этот сигнал может быть дополнен ценовым прорывом. Исходный код приложен в конце статьи. Тестирование готового советника с картой входных параметров (input map) 80 для восьмого паттерна дает следующие результаты:

r_7_ol

c_7_ol

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

r_all_ol

c_all_ol

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

//+------------------------------------------------------------------+
//| "Voting" that price will grow.                                   |
//+------------------------------------------------------------------+
int CSignalRSI::LongCondition(void)
{  int result  = 0, results = 0;
//--- if the model 0 is used and "Price Crossing the Upper Band or the Lower Band"
   if(((m_patterns_used & 0x01) != 0) && IsPattern_0(POSITION_TYPE_BUY))
   {  result += m_pattern_0;
      results++;
   }
//--- if the model 1 is used and "Price Bouncing Off Lower Band or Upper Band "
   if(((m_patterns_used & 0x02) != 0) && IsPattern_1(POSITION_TYPE_BUY))
   {  result += m_pattern_1;
      results++;
   }
//--- if the model 2 is used and "Price Squeeze Followed by a Breakout Above Upper Band or Below Lower Band "
   if(((m_patterns_used & 0x04) != 0) && IsPattern_2(POSITION_TYPE_BUY))
   {  result += m_pattern_2;
      results++;
   }
//--- if the model 3 is used and "Price Double Bottoms Near Lower Band or Double Top Near Upper Band "
   if(((m_patterns_used & 0x08) != 0) && IsPattern_3(POSITION_TYPE_BUY))
   {  result += m_pattern_3;
      results++;
   }
//--- if the model 4 is used and "Price Bounces Off the Middle Band from Above & Bounce Off from Below "
   if(((m_patterns_used & 0x10) != 0) && IsPattern_4(POSITION_TYPE_BUY))
   {  result += m_pattern_4;
      results++;
   }
//--- if the model 5 is used and "Volume Divergence at Lower Band or Upper Band  "
   if(((m_patterns_used & 0x20) != 0) && IsPattern_5(POSITION_TYPE_BUY))
   {  result += m_pattern_5;
      results++;
   }
//--- if the model 6 is used and "Bands Widening After Downtrend or After Uptrend "
   if(((m_patterns_used & 0x40) != 0) && IsPattern_6(POSITION_TYPE_BUY))
   {  result += m_pattern_6;
      results++;
   }
//--- if the model 7 is used and "Bands Orientation and Angle Changes "
   if(((m_patterns_used & 0x80) != 0) && IsPattern_7(POSITION_TYPE_BUY))
   {  result += m_pattern_7;
      results++;
   }
//--- return the result
   if(results > 0)
   {  return(int(round(result / results)));
   }
   return(0);
}

В обоих условиях мы используем побитовые операции, чтобы проверить, позволяет ли карта входных параметров для используемых паттернов использовать заданный шаблон. Как мы видели на примере полос Боллинджера, 8 моделей имеют свои отдельные индексы 1, 2, 4, 8, 10, 20, 40 и 80. Поскольку карта входных параметров для используемых паттернов представляет собой целое число в диапазоне от 0 до 255, мы просто проверяем, выбран ли каждый из этих паттернов на основе входного значения. Например, входное значение карты входных параметров 107 подразумевает, что выбраны только паттерны 0, 1, 3, 5 и 6. В нашем последнем прогоне для полос Боллинджера мы в первую очередь оптимизировали эту карту, помимо других пороговых значений. Теперь продолжим нашу статью и рассмотрим индекс относительной силы (RSI). 


Индекс относительной силы

RSI - очень популярный осциллятор, на который полагаются многие трейдеры при размещении и закрытии сделок. Как описано в предисловии к статье и в приведенной ссылке, это индекс, отслеживающий скорость изменения цены, чтобы предвидеть любые ожидаемые развороты заданного ценового тренда. Технически пара EURUSD колеблется в диапазоне от 0,95 до 1,60 с июня 2002 года по настоящее время, и можно утверждать, что в течение следующих 22 лет она все еще сможет оставаться в этом диапазоне. Очевидно, что это огромные изменения. Но они несравнимы с фондовыми индексами, которые почти все выросли по сравнению со своими уровнями 2002 года. Таким образом, умение предвидеть перекупленность или перепроданность валютной пары остается жизненно важным навыком для многих трейдеров. Формула индекса имеет вид:

где:

  • RS - относительная сила (Relative Strength), определяемая как отношение средней прибыли к среднему убытку за определенный период:

Период, за который вычисляются эти средние прибыли/убытки, является входным параметром индикатора RSI. Реализация в MQL5 представлена в библиотечном коде. Продолжая тему прошлой статьи, давайте рассмотрим восемь паттернов RSI. Мы рассмотрим каждый из этих паттернов в режиме, аналогичном тому, который мы использовали в предыдущей статье, где результаты тестирования каждого отдельного паттерна представлены вместе с его описанием. Мы проводим тестирование на дневном таймфрейме валютной пары USDJPY на 2023 год.


Уровни перекупленности/перепроданности (традиционный подход)

Наш паттерн 0 для RSI — это традиционные прорывы ниже или выше уровней осциллятора 30 и 70 соответственно. Это основной способ применения индикатора, доказавший свою эффективность. Таким образом, прорывы ниже уровня 30 указывают на перепроданность ценной бумаги и часто сигнализируют о бычьем входе, тогда как прорывы выше 70 сигнализируют о перекупленности. Реализуем это в нашем пользовательском классе сигналов следующим образом:

//+------------------------------------------------------------------+
//| Check for Pattern 0.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_0(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   if(T == POSITION_TYPE_BUY && Base(StartIndex()) <= 30.0)
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex()) >= 70.0)
   {  return(true);
   }
   return(false);
}

Тестовые прогоны советника, собранного в Мастере (подробности можно найти здесь и здесь), показывают следующие результаты:

r_0

c_0

Такое традиционное использование RSI, как и большинства осцилляторов, не лишено недостатков, поскольку на трендовых рынках осциллятор может оставаться выше уровня 70 в течение длительного периода (при бычьем сценарии) или ниже 30 в медвежьих сценариях. Это часто подразумевает, что осциллятор можно комбинировать с другими индикаторами, такими как скользящие средние, или даже с другими осцилляторами, такими как MACD, чтобы правильно определять текущие сигналы. Кроме того, изменение уровней осциллятора с 70/30 на, скажем, 80/20 может быть целесообразна при работе с высоковолатильными активами, чтобы предотвратить преждевременное открытие позиций.

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


Неудачные колебания RSI (развороты)

Следующий паттерн, хотя поначалу и очень похож на паттерн 0, отличается тем, что ищет точку опоры в осцилляторе после тестирования его ключевых уровней. Бычий сигнал — это тест уровня 30 с последующим прорывом выше него, в то время как медвежий вход сигнализируется ростом выше 70 с последующим закрытием ниже него. Реализуем это в MQL5 следующим образом:

//+------------------------------------------------------------------+
//| Check for Pattern 1.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_1(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   if(T == POSITION_TYPE_BUY && Base(StartIndex() + 1) < 30.0 && Base(StartIndex()) > 30.0)
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex() + 1) > 70.0 && Base(StartIndex()) < 70.0)
   {  return(true);
   }
   return(false);
}

Тестовые прогоны по паттерну 1 дали нам следующие результаты:

r_1

c_1

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


Дивергенция RSI (бычья/медвежья дивергенция)

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

//+------------------------------------------------------------------+
//| Check for Pattern 2.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_2(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   m_close.Refresh(-1);
   if(T == POSITION_TYPE_BUY && 
   Close(StartIndex()) < Close(StartIndex() + 1) && 
   Close(StartIndex() + 1) < Close(StartIndex() + 2) && 
   Base(StartIndex()) > Base(StartIndex() + 1) && 
   Base(StartIndex() + 1) > Base(StartIndex() + 2)
   )
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && 
   Close(StartIndex()) > Close(StartIndex() + 1) && 
   Close(StartIndex() + 1) > Close(StartIndex() + 2) && 
   Base(StartIndex()) < Base(StartIndex() + 1) && 
   Base(StartIndex() + 1) < Base(StartIndex() + 2)
   )
   {  return(true);
   }
   return(false);
}

Тестовые прогоны собранного в Мастере советника, который использует исключительно паттерн 2 и требует карты входных параметров, равной 4, дают нам следующие результаты:

r_2

c_2

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

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


RSI пересекает среднюю линию (уровень 50) вверх/вниз

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

Пересечения средней линии могут служить как индикатором продолжения, так и индикатором разворота тренда. Продолжение тренда подтверждается для бычьего сигнала, если RSI пересекает уровень 50 снизу вверх, а для медвежьего сигнала — если он пересекает уровень в противоположном направлении. Развороты также подтверждаются для медвежьего тренда, когда RSI пробивает уровень 50 снизу вверх, прежде чем опуститься ниже него, а для бычьего тренда — при формировании противоположной U-образной фигуры над этой средней линией. Реализуем наш паттерн 3 следующим образом:

//+------------------------------------------------------------------+
//| Check for Pattern 3.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_3(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   m_close.Refresh(-1);
   m_high.Refresh(-1);
   m_low.Refresh(-1);
   if(T == POSITION_TYPE_BUY && Base(StartIndex() + 1) < 50.0 && Base(StartIndex()) > 50.0)
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex() + 1) > 50.0 && Base(StartIndex()) < 50.0)
   {  return(true);
   }
   return(false);
}

Тестовые прогоны только с этим паттерном, где нашему входному параметру для используемых паттернов присвоено значение 8, дают нам следующие результаты:

r_3

c_3

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


Прорыв линии тренда RSI

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

//+------------------------------------------------------------------+
//| Check for Pattern 4.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_4(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   if(T == POSITION_TYPE_BUY && 
   Base(StartIndex()) > Base(StartIndex() + 1) && 
   Base(StartIndex() + 1) < Base(StartIndex() + 2) && 
   Base(StartIndex() + 2) > Base(StartIndex() + 3) && 
   Base(StartIndex() + 3) < Base(StartIndex() + 4) && 
   Base(StartIndex() + 4) > Base(StartIndex() + 2) && 
   Base(StartIndex()) >= 2.0*Base(StartIndex() + 2)-Base(StartIndex() + 4)
   )
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && 
   Base(StartIndex()) < Base(StartIndex() + 1) && 
   Base(StartIndex() + 1) > Base(StartIndex() + 2) && 
   Base(StartIndex() + 2) < Base(StartIndex() + 3) && 
   Base(StartIndex() + 3) > Base(StartIndex() + 4) && 
   Base(StartIndex() + 4) < Base(StartIndex() + 2) && 
   Base(StartIndex()) <= 2.0*Base(StartIndex() + 2)-Base(StartIndex() + 4)
   )
   {  return(true);
   }
   return(false);
}

Обратите внимание, что мы не обязательно ищем последние истинные пики или впадины RSI, а скорее проверяем, есть ли в последних 5 показаниях RSI последовательность пиков (для бычьего сигнала) или впадин (для медвежьего сигнала). Если эта проверка только в пределах последних 5 значений RSI положительна, то мы просто проверяем прорыв линии тренда. Опять же, мы не вникаем в геометрию фактической линии, соединяющей эти пики и впадины, а просто смотрим на изменение RSI между этими двумя экстремальными точками. Если роста в том же темпе, что и текущее значение RSI, не наблюдается, мы интерпретируем это как пробитие линии тренда, поскольку если бы линия пика или впадины сохранилась, то текущее значение было бы так же далеко от последнего впадины или пика, как и его предшественник в последовательности. Тестирование только с паттерном 4, где входные данные для используемых паттернов равны 10, дает нам следующие результаты:

r_4

c_4

Прорыв линии тренда RSI, используемый в этой статье, как указано в общем источнике, учитывает или проверяет этот паттерн только в последних 5 показаниях RSI. Более комплексный подход, направленный на поиск фрактальных или пиковых/впадинных точек RSI, может дать более интересные результаты.


Зоны перекупленности/перепроданности RSI с подтверждением скользящей средней

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

//+------------------------------------------------------------------+
//| Check for Pattern 5.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_5(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   m_close.Refresh(-1);
   m_ma.Refresh(-1);
   if(T == POSITION_TYPE_BUY && Base(StartIndex()) < 30.0 && Close(StartIndex()) > m_ma.Main(StartIndex()))
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex()) > 70.0 && Close(StartIndex()) < m_ma.Main(StartIndex()))
   {  return(true);
   }
   return(false);
}

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

r_5

c_5


Паттерны RSI "Двойное дно/двойная вершина"

Этот паттерн также несколько похожа на паттерн 1 в том, что он требует тестирования ключевых уровней осциллятора RSI 70 и 30. Однако в отличие от паттерна 1, для которого требуется только один пик или спад, для паттерна 6 требуются два последовательных спада ниже линии 30, за каждым из которых следует восстановление от этого уровня, для бычьего сигнала. Аналогично, двойной скачок выше уровня 70, за которым следует закрытие ниже этого уровня, воспринимается как медвежий сигнал. В коде это выглядит так:

//+------------------------------------------------------------------+
//| Check for Pattern 6.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_6(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   if(T == POSITION_TYPE_BUY && Base(StartIndex()) < 30.0 && 
   Base(StartIndex()) > Base(StartIndex() + 1) && 
   Base(StartIndex() + 1) < Base(StartIndex() + 2) && 
   Base(StartIndex() + 2) > Base(StartIndex() + 3) && 
   Base(StartIndex() + 3) < Base(StartIndex() + 4)
   )
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex()) > 70.0 && 
   Base(StartIndex()) < Base(StartIndex() + 1) && 
   Base(StartIndex() + 1) > Base(StartIndex() + 2) && 
   Base(StartIndex() + 2) < Base(StartIndex() + 3) && 
   Base(StartIndex() + 3) > Base(StartIndex() + 4)
   )
   {  return(true);
   }
   return(false);
}

Тестирование только с паттерном 6, где входные данные для используемых паттернов равны 40, дает нам следующие результаты:

r_6

c_6


RSI с несколькими таймфреймами

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

//+------------------------------------------------------------------+
//| Check for Pattern 7.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_7(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   m_rsi_alt.Refresh(-1);
   if(T == POSITION_TYPE_BUY && Base(StartIndex()) <= 30.0 && Alt(StartIndex()) <= 30.0)
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex()) >= 70.0 && Alt(StartIndex()) >= 70.0)
   {  return(true);
   }
   return(false);
}

Тестирование только этого паттерна с использованием карты входных параметров 80 дает нам следующие результаты:

r_7

c_7

Как и в случае с полосами Боллинджера (см. заключение выше), у нас также есть опция мульти-паттернов для этого класса пользовательских сигналов. Оптимизируем входные паттерны, используемые для отображения целого числа от 0 до 255, чтобы найти идеальную комбинацию паттернов для RSI. В результате нашего оптимизационного прогона была получена карта для используемых шаблонов 189. В двоичном формате это 10111101, что означает, что единственными "неподходящими" паттернами из нашего оптимизационного прогона являются паттерны 1 и 6 (неудачные колебания RSI и двойная вершина/дно). Тестирование проводилось для пары USDJPY, перекрестной проверки не было. Результаты тестирования приведены ниже:

r_all

c_all


Заключение

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

Думаю, читателям было бы интересно изучить дополнительные паттерны, которые мы не рассмотрели в этой статье. Мы использовали только 8 паттернов, что означало, что наши входные данные для используемых паттернов не превышали 2 в восьмой степени минус 1 (255). Если мы прибавим это число паттернов и, скажем, доведем его до 10, то наша карта входных параметров используемых шаблонов будет варьироваться от 0 до 2 в степени 10 минус 1, что дает 1023. Дополнительные паттерны, которые можно рассмотреть, включают стратегию прорыва RSI, при которой, если цена актива поднимается выше ключевого уровня сопротивления на ценовом графике и одновременно пробивает уровень 70 на графике RSI, этот сигнал, в отличие от рассмотренных до сих пор паттернов, интерпретируется как сильный бычий сигнал и начало основного тренда. Аналогично, медвежий сигнал также возникнет, во-первых, если цена упадет ниже ключевого уровня сопротивления на графике, а RSI также упадет ниже 30. Это также противоречит тому, как мы интерпретировали RSI в этой статье. Реализация этого кода зависит от того, знает ли трейдер ключевые уровни поддержки и сопротивления на ценовом графике инструмента, которым он торгует, поэтому эта работа остается на усмотрение читателя.

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

Прикрепленные файлы |
SignalWZ_39.mqh (19.43 KB)
wz_39.mq5 (8.13 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (1)
Arber Coku
Arber Coku | 22 сент. 2024 в 12:06
Здравствуйте,
Спасибо, что поделились этим с нами, это отлично работает для меня на некоторых акциях, как вы описали для значений в статье.

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

Если у вас есть один, вы можете поделиться с нами, пожалуйста?
Пример CNA (сетевого анализа причинно-следственных связей), SMOC (оптимального управления стохастической моделью) и теории игр Нэша с Глубоким обучением Пример CNA (сетевого анализа причинно-следственных связей), SMOC (оптимального управления стохастической моделью) и теории игр Нэша с Глубоким обучением
Мы добавим Глубокое обучение к тем трем примерам, которые были опубликованы в предыдущих статьях, и сравним результаты с предыдущими. Цель состоит в том, чтобы научиться каким образом добавлять Глубокое обучение (DL) в другие советники.
Оптимизация Королевской Битвой — Battle Royale Optimizer (BRO) Оптимизация Королевской Битвой — Battle Royale Optimizer (BRO)
В статье описан инновационный подход в области оптимизации, сочетающий пространственную конкуренцию решений с адаптивным сужением пространства поиска, делая Battle Royale Optimizer перспективным инструментом для финансового анализа.
Как реализовать автоматическую оптимизацию в советниках MQL5 Как реализовать автоматическую оптимизацию в советниках MQL5
Пошаговое руководство по автоматической оптимизации на MQL5 для советников. Мы рассмотрим надежную логику оптимизации, лучшие практики по выбору параметров, а также как реконструировать стратегии с помощью бэк-тестирования. Кроме того, будут рассмотрены методы более высокого уровня, такие как пошаговая форвард-оптимизация, которые улучшат ваш подход к трейдингу.
Введение в MQL5 (часть 9): Использование объектов на графике Введение в MQL5 (часть 9): Использование объектов на графике
В этой статье мы научимся создавать и настраивать объекты графиков в MQL5, используя текущие и исторические данные. Здесь также представлено практическое руководство, с которым вы сможете отображать сделки на графике и использовать другие объекты MQL5 на практике.