English 中文 Español Deutsch 日本語 Português
preview
Торговая техника RSI Deep Three Move

Торговая техника RSI Deep Three Move

MetaTrader 5Торговые системы | 21 ноября 2023, 10:28
1 546 0
Javier Santiago Gaston De Iriarte Cabrera
Javier Santiago Gaston De Iriarte Cabrera

1. Введение

Статья основана на новой серии исследований, демонстрирующих несколько торговых методов, основанных на RSI. Торговая техника – это способ использования индикатора. Исследование основано на языке программирования MQL5.


2. Краткое введение в RSI

RSI (Relative Strength Index, индекс относительной силы) - технический индикатор для измерения силы и импульса ценных бумаг, включая акции, валюты или товары. RSI рассчитывается с использованием математических формул и отображается на графике, отображая уровень силы или слабости ценной бумаги за определенный период.

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

Расчет RSI включает сравнение среднего прироста ценной бумаги за определенный период со средним убытком по ценной бумаге за тот же период. Стандартный RSI отображается на шкале от 0 до 100. Значения выше 70 считаются перекупленными, а значения ниже 30 - перепроданными. RSI является популярным индикатором среди трейдеров, поскольку он может подавать сигналы раннего предупреждения о потенциальных трендах. Например, если RSI ценной бумаги постоянно растет и достигает уровня выше 70, это может указывать на то, что ценная бумага перекуплена и подлежит коррекции. С другой стороны, если RSI постоянно падает и достигает уровня ниже 30, это может указывать на то, что ценная бумага перепродана и ей предстоит отскок.

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


3. Что такое RSI (более детальное описание)

3.1 Введение

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

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

RSI чаще всего используется на 14-дневном таймфрейме и измеряется по шкале от 0 до 100, с высокими и низкими уровнями, отмеченными цифрами 70 и 30 соответственно. Короткие или более длинные таймфреймы используются для поочередно более коротких или более длительных прогнозов. Высокие и низкие уровни (80 и 20 или 90 и 10) встречаются реже, но указывают на более сильный импульс.

Индекс относительной силы был разработан Дж. Уэллсом Уайлдером и опубликован в 1978 году в книге "Новые концепции технических торговых систем", а также в журнале Commodities (ныне - Modern Trader) в июньском номере 1978 года. RSI стал одним из самых популярных индексов осцилляторов.

Индекс подает сигналы на покупку, когда ценная бумага или валюта перепродана, и на продажу, когда она перекуплена.

RSI с рекомендуемыми параметрами и ежедневной оптимизацией были протестированы и сопоставлены с другими стратегиями в работе Марека и Шедивы (2017). Тестирование было рандомизированным по времени и компаниям (например, Apple, Exxon Mobil, IBM, Microsoft) и показало, что RSI может давать хорошие результаты, однако с увеличением временного периода его обычно обходит простая стратегия "купи и держи".

3.2 Расчет

Для каждого торгового периода рассчитывается изменение вверх U или изменение вниз D. Периоды повышения характеризуются тем, что новое закрытие происходит выше предыдущего:

1

И наоборот, период падения характеризуется тем, что цена закрытия ниже, чем цена закрытия предыдущего периода.

2

Если последнее закрытие равно предыдущему, то U и D равны нулю. Обратите внимание, что U и D — положительные числа.

Средние значения теперь рассчитываются на основе последовательностей таких U и D с использованием сглаженного или модифицированного скользящего среднего за n-период (SMMA или MMA), которое представляет собой экспоненциально сглаженное скользящее среднее с α = 1 / n. Это положительно взвешенные средние положительных членов, которые ведут себя аддитивно по отношению к разбиению.

ервоначально Уайлдер сформулировал расчет скользящего среднего как: newval = (prevval * (n - 1) + newdata) / n, что эквивалентно вышеупомянутому экспоненциальному сглаживанию. Таким образом, новые данные просто делятся на n или умножаются на α, а предыдущие средние значения изменяются на (n – 1)/n, т. е. 1 – α. Некоторые коммерческие решения, такие как AIQ, используют в качестве среднего значения стандартную экспоненциальную скользящую среднюю (EMA) вместо SMMA Уайлдера. Сглаженные скользящие средние следует соответствующим образом инициализировать простой скользящей средней, используя первые n значений ценового ряда.

Отношение этих средних значений представляет собой относительную силу или коэффициент относительной силы:

3

Затем коэффициент относительной силы преобразуется в индекс относительной силы от 0 до 100:

4

Если среднее значение U равно нулю, RS и RSI также равны нулю. Если среднее значение U равно среднему значению D, RS равен 1, а RSI равен 50. Если среднее значение U максимально, так что среднее значение D равно нулю, то значение RS отклоняется в бесконечность, а RSI равен 100.


3.3 Определение

3.3.1 Базовая конфигурация

RSI представлен на графике выше или ниже ценового графика. Индикатор имеет верхнюю линию, обычно на отметке 70, нижнюю линию на отметке 30 и пунктирную среднюю линию на отметке 50. Уайлдер рекомендовал период сглаживания, равный 14 (экспоненциальное сглаживание, т. е. α = 1/14 или N = 14).

image EURUSD 30m

3.3.2. Принципы

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

Уровень RSI является показателем недавней торговой силы акций. Наклон RSI прямо пропорционален скорости изменения тренда. Расстояние, пройденное RSI, пропорционально величине движения.

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


3.3.3. Дивергенция (расхождение)

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

3.3.4. Условия перекупленности и перепроданности

Уайлдер считал, что "неудачные колебания" RSI выше и ниже 50 являются убедительными признаками разворота рынка. Например, предположим, что RSI достигает 76, возвращается к 72, а затем поднимается до 77. Если индекс упадет ниже 72, согласно Уайлдеру это "неудачное колебание" выше 70.

Уайлдер писал, что графики и области поддержки и сопротивления иногда легче увидеть на графике RSI, а не на ценовом графике. Центральная линия индекса относительной силы равна 50, что часто рассматривается как линия поддержки и сопротивления индикатора.

Если индекс относительной силы ниже 50, это обычно означает, что потери акций превышают прибыль. Когда индекс относительной силы превышает 50, это обычно означает, что прибыль превышает потери.

3.3.5. Восходящие и нисходящие тренды

В дополнение к оригинальной интерпретации RSI Уайлдером, Эндрю Кардуэлл разработал несколько новых интерпретаций RSI, которые помогают определить и подтвердить тренд. Во-первых, Кардуэлл заметил, что восходящий тренд обычно торгуется между RSI 40 и 80, тогда как нисходящий тренд обычно торгуется между RSI 60 и 20. Кардуэлл также заметил, что когда ценные бумаги изменяются с восходящего тренда на нисходящий и наоборот, RSI претерпевает "сдвиг диапазона".

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

3.3.6. Развороты

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

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


4. RSI Deep Three Move

Техника Deep Three Move подает сигнал, когда RSI входит в уровень перепроданности или перекупленности и формирует три последовательных движения в одну сторону, а четвертое движение (в ту же сторону) является подтверждением. Условия торговли следующие:

  • Бычий сигнал обнаруживается всякий раз, когда RSI находится ниже предыдущего RSI, который, в свою очередь, также ниже предыдущего RSI, а последний также ниже предыдущего RSI. Поскольку он обычно используется с 8-периодными RSI, RSI три периода назад должен быть ниже 20, а RSI четыре периода назад должен быть выше 20 (во избежание дублирования сигналов).
  • Медвежий сигнал обнаруживается всякий раз, когда RSI находится выше предыдущего RSI, который, в свою очередь, также выше предыдущего RSI, а последний также выше предыдущего RSI. Поскольку он обычно используется с 8-периодными RSI, RSI три периода назад должен быть выше 80, а четыре периода назад должен быть ниже 80 (во избежание дублирования сигналов).

На следующем рисунке показан бычий сигнал, основанный на данной методике:

Technique



5. Код

//+------------------------------------------------------------------+
//|                                          RSI Deep Three Move.mq5 |
//|                              Javier S. Gastón de Iriarte Cabrera |
//|              https://https://www.mql5.com/en/users/jsgaston/news |
//+------------------------------------------------------------------+
#property copyright "Javier S. Gastón de Iriarte Cabrera"
#property link      "https:/https://www.mql5.com/en/users/jsgaston/news"
#property version   "1.01"
#property script_show_inputs
#include <GetIndicatorBuffers.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>


#include <Trade\AccountInfo.mqh>
//---
CPositionInfo  m_position;                                                         // object of CPositionInfo class
CTrade         m_trade;                                                            // object of CTrade class
CSymbolInfo    m_symbol;                                                           // object of CSymbolInfo class
CAccountInfo   m_account;                                                          // object of CAccountInfo class

CTrade  trade;
CTrade  Ctrade;

input string             Expert_Title             ="RSI Deep Three Move Strategy"; // Document name

enum ENUM_LOT_TYPE
  {
   LOT_TYPE_FIX   = 0,                                                             // fix lot
   LOT_TYPE_RISK  = 1,                                                             // risk %
  };
//--- input parameters

input ENUM_LOT_TYPE        inp_lot_type               = LOT_TYPE_FIX;              // type of lot

input double               inp_lot_fix                = 0.01;                      // fix lot
input double               inp_lot_risk               = 0.01;
input bool     InpPrintLog          = false;                                       // Print log
ulong                    Expert_MagicNumber       =11777;            
bool                     Expert_EveryTick         =false;            
input ENUM_TIMEFRAMES my_timeframe=PERIOD_CURRENT;                                 // Timeframe

input ENUM_APPLIED_PRICE   Inp_RSI_applied_price = PRICE_CLOSE;                    // RSI: type of price
input int InpPeriodRSI=8;                                                          // Period of the signal for the RSI inside custom
int    handle_iCustom;


input int ptsl = 5000;                                                             // points for stoploss
input int pttp = 5000;                                                             // points for takeprofit
string Orden;
double sl2;
double tp2;

Это сложный фрагмент кода, написанный на языке MQL5. Это торговая стратегия, которая использует индекс относительной силы (RSI) для определения потенциальных торговых возможностей. Код включает использование различных классов, таких как CPositionInfo, CTrade, CSymbolInfo и CAccountInfo. Он также включает в себя использование различных входных параметров, таких как тип лота, фиксированный лот, процент риска, название советника, магическое число, таймфрейм, период усреднения RSI, тип цены и точки стоп-лосса и тейк-профита. Код также включает использование таких переменных, как handle_iRSI2, handle_iCustom, Orden, sl и tp. Целью кода является определение потенциальных торговых возможностей на основе индикатора RSI.

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   handle_iCustom=iCustom(_Symbol,my_timeframe,"\\Indicators\\Examples\\RSI",InpPeriodRSI);

   if(handle_iCustom==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);
     }
//---
   return(INIT_SUCCEEDED);
  }

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

void OnTick()
  {
   MqlTick tick;
   double last_price = tick.ask;
   SymbolInfoTick(_Symbol,tick);
   int total = PositionsTotal();
//---
// Retrieve the current value
   MqlTradeResult  result;
   MqlRates rates[];
//---
   double array_rsi[];
   ArraySetAsSeries(array_rsi,true);
   int start_pos=0,count=5;
   if(!iGetArray(handle_iCustom,0,start_pos,count,array_rsi))
      return;
   string text="";
   for(int i=0; i<count; i++)
      text=text+IntegerToString(i)+": "+DoubleToString(array_rsi[i],Digits()+1)+"\n";
//---
   Comment(text);
     {
      if(array_rsi[0] < array_rsi[1] && array_rsi[1] < array_rsi[2] && array_rsi[2] < array_rsi[3] && array_rsi[3] < 20.0 && array_rsi[4] > 20.0)
        {
         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(array_rsi[0] > array_rsi[1] && array_rsi[1] > array_rsi[2] && array_rsi[2]  > array_rsi[3] && array_rsi[3] > 80.0 && array_rsi[4] < 80.0)
        {
         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" && array_rsi2[0]<20.0)
        {
         trade.PositionClose(_Symbol,5);
         Print("cerró sell");
         return;
        }
      if(Orden=="Buy" && array_rsi2[0]>80.0)
        {
         trade.PositionClose(_Symbol,5);
         Print("cerró buy");
         return;
        }
     }
  }
Этот фрагмент кода представляет собой функцию Expert Tick на языке MQL5. Он используется для открытия и закрытия позиций на рынке. Сначала он извлекает текущее значение символа и сохраняет его в тиковой переменной MqlTick. Затем он извлекает общее количество позиций и сохраняет его в переменной total. Затем он извлекает значения RSI из функции iCustom и сохраняет их в array_rsi и переменной. Затем он проверяет, находятся ли значения RSI ниже 20 для ордера на продажу и выше 80 для ордера на покупку, и если да, то открывает позицию с соответствующими параметрами. Наконец, он проверяет, превысили ли значения RSI порог 20 или 80, и если да, то закрывает позицию.
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      //if(InpPrintLog)
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- 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__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
  }

Этот код используется для копирования значений из индикаторного буфера в массив. Функция принимает пять параметров: дескриптор индикатора, индикаторный буфер, начальную позицию в буфере, количество копируемых значений и массив для хранения значений. Затем он проверяет, является ли массив динамическим, и если да, то сбрасывает код ошибки и копирует значения из буфера в массив. Если копирование не удается, печатается сообщение об ошибке и возвращается false. В противном случае - true.

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);
  }

Этот код используется для расчета размера лота для сделки. Первая функция, get_lot(), принимает цену сделки в качестве аргумента и проверяет тип лота (фиксированный или основанный на риске). Если тип лота фиксирован, вызывается функция normalize_lot() для нормализации размера лота. Если тип лота основан на риске, функция OrderCalcMargin() используется для расчета маржи, необходимой для сделки, а функция AccountInfoDouble() используется для получения баланса счета. Затем размер лота рассчитывается путем деления баланса счета на маржу и умножения его на процент риска. Затем вызывается функция normalize_lot() для нормализации размера лота. Функция normalize_lot() принимает размер лота в качестве аргумента и рассчитывает размер шага и минимальный размер лота для символа. Затем размер лота округляется до ближайшего шага и при необходимости применяется минимальный размер лота.


6. Результаты

EURUSD, 30-минутные периоды и 900 пунктов для SL (не забываем использовать 8 периодов для RSI) на 2023 год с первого января до конца июня.

График

Данные



7. Заключение

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

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

Ниже представлены прибыльные результаты по всем символам моего брокера на центовом счете с периодом 30 минут до конца июня 2023 года.

Оптимизация

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

Прикрепленные файлы |
Популяционные алгоритмы оптимизации: Алгоритм интеллектуальных капель воды (Intelligent Water Drops, IWD) Популяционные алгоритмы оптимизации: Алгоритм интеллектуальных капель воды (Intelligent Water Drops, IWD)
В статье рассматривается интересный алгоритм - интеллектуальные капли воды, IWD, подсмотренный у неживой природы, симулирующий процесс формирования русла реки. Идеи этого алгоритма позволили значительно улучшить прошлого лидера рейтинга - SDS, а нового лидера (модифицированный SDSm), как обычно, найдёте в архиве к статье.
Разработка системы репликации - Моделирование рынка (Часть 20): ФОРЕКС (I) Разработка системы репликации - Моделирование рынка (Часть 20): ФОРЕКС (I)
Первоначальная цель данной статьи заключается не в охвате всех возможностей ФОРЕКС, а скорее в адаптации системы таким образом, чтобы вы могли совершить хотя бы одну репликацию рынка. Моделирование оставим для другого момента. Однако, если у нас нет тиков, а есть только бары, приложив немного усилий, мы можем смоделировать возможные сделки, которые могли произойти на рынке ФОРЕКС. Так будет до тех пор, пока мы не рассмотрим, как адаптировать тестер. Попытка работать с данными ФОРЕКС внутри системы без их модификации приводит к ошибкам диапазона.
Кросс-валидация и основы причинно-следственного вывода в моделях CatBoost, экспорт в ONNX формат Кросс-валидация и основы причинно-следственного вывода в моделях CatBoost, экспорт в ONNX формат
В данной статье предложен авторский способ создания ботов с использованием машинного обучения.
Разработка системы репликации - Моделирование рынка (Часть 19): Необходимые корректировки Разработка системы репликации - Моделирование рынка (Часть 19): Необходимые корректировки
Здесь мы подготовим почву для того, чтобы при необходимости добавления новых функций в код это происходило плавно и легко. Текущий код пока не может охватывать или обрабатывать некоторые моменты, которые будут необходимы для значимого прогресса. Нам нужно, чтобы всё было построено так, чтобы усилия по реализации некоторых вещей были минимальными. Если сделаем всё правильно, мы сможем получить действительно универсальную систему, способную очень легко адаптироваться к любой ситуации, которую необходимо охватить.