Tag Archives: дивергенция

MQL4: работа с барами, поиск дивергенции по RSI

Здравствуйте, уважаемые коллеги программисты MQL4!

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

MQL4 - Работа с барами, поиск Дивергенции по RSI

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

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

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

Наиболее распространённым графическим представлением баров являются так называемые «японские свечи». Именно их мы будем использовать для иллюстраций и называть барами.

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

Массив баров на графике на всю глубину исторических данных называется таймсерией. Нумерация в этом массиве ведётся справа налево, то есть индекс 0 (ноль) в массиве-таймсерии означает данные текущего бара, который соответствует незавершенному промежутку времени на данном таймфрейме. Размер массива-таймсерии можно получить, вызвав функцию iBars, или обратившись к предопределённой переменной Bars.

Доступ к данным конкретного бара осуществляется с помощью функций:

iOpen – цена открытия бара;

iClose – цена закрытия бара;

iHigh – максимальная цена бара;

iLow – минимальная цена бара;

iTime – время открытия бара;

iVolume – тиковый объём или сколько раз цена меняла значение за время формирования бара.

Примеры работы с таймсериями

Сначала рассмотрим простой пример работы с таймсерией. Найдём на всей доступной истории свечу с наибольшим объёмом и одновременно посчитаем средний размер тел свечей:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ShowBarsParameters()
  {
   Comment("");
   long VolumeMax=0;  // максимальный объём
   int VolumeMaxIndex=0;// индекс бара с максимальным объёмом

   double BodySum=0;  // суммарная величина тел свечей

   for(int i=Bars-1; i>=0; i--)
     {
      if(VolumeMax<iVolume(NULL,0,i))
        {
         VolumeMax=iVolume(NULL,0,i);
         VolumeMaxIndex=i;
        }
      BodySum+=MathAbs(iOpen(NULL,0,i)-iClose(NULL,0,i));
     }
   Comment("На графике всего: ", Bars," баров","
",
           "Максимальное значение объема ",VolumeMax," получено ",
           iTime(NULL,0,VolumeMaxIndex)," на баре №",VolumeMaxIndex,"
",
           "Средняя величина тел свечей в пунктах: ", int(BodySum/_Point)/Bars);
  } 

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

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ShowBarsParametersExt(string symbol, int timeframe)
  {
   Comment("");
   long VolumeMax=0;  // максимальный объём
   int VolumeMaxIndex=0;// индекс бара с максимальным объёмом

   double BodySum=0;  // суммарная величина тел свечей

   for(int i=iBars(symbol,timeframe)-1; i>=0; i--)
     {
      if(VolumeMax<iVolume(symbol,timeframe,i))
        {
         VolumeMax=iVolume(symbol,timeframe,i);
         VolumeMaxIndex=i;
        }
      BodySum+=MathAbs(iOpen(symbol,timeframe,i)-iClose(symbol,timeframe,i));
     }
   Comment("На графике ",symbol,"(",timeframe,") всего: ", iBars(symbol,timeframe)," баров","
",
           "Максимальное значение объема ",VolumeMax," получено ",
            iTime(symbol,timeframe,VolumeMaxIndex)," на баре №",VolumeMaxIndex,"
",
           "Средняя величина тел свечей в пунктах: ", int(BodySum/_Point)/Bars);
  }

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

ShowBarsParameters("EURJPY",PERIOD_H1);

Разметка фракталов Билла Вильямса

Давайте научимся определять простейшие свечные формации. Так как мы собираемся искать дивергенции осциллятора RSI с ценой, нам надо решить задачу с определением локальных экстремумов на графике. По этим опорным точкам можно будет провести трендовую линию, которая покажет направление движения цены. Самым простым способом определения таких точек является разметка фракталов Билла Вильямса. Фракталы представляют собой формации из пяти свечей. Если High центральной свечи расположен выше максимальных цен двух свечей слева и двух свечей справа – имеет место «фрактал вверх»:

Если же Low центрального бара ниже минимумов двух баров слева и двух баров справа, то перед нами «фрактал вниз»:

В терминале есть встроенный индикатор фракталов:

Мы напишем скрипт, который будет делать разметку фракталов на исторических данных, подобно тому, как это делает встроенный индикатор Fractals.

С помощью кнопки в главной панели MetaEditor создадим скрипт «Фракталы.mq4»:

Скрипт более удобен для демонстрации, так как изначально состоит из одной главной функции OnStart(), которая запускается, как только скрипт был добавлен к графику валютной пары. После однократного выполнения OnStart() скрипт выгружается из памяти. Весь рабочий код мы поместим в функции, которые потом можно будет без труда перенести в ваши советники и индикаторы.
//+------------------------------------------------------------------+
//|                                                     Фракталы.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
  }

Для отображения фракталов будем использовать графические объекты «стрелка» (OBJ_ARROW). Нам понадобится функция, которая будет создавать такие объекты на графике цены. Воспользуемся готовой функцией ArrowCreate из справочника MQL, идущего в комплекте с терминалом:

//+------------------------------------------------------------------+ 
//| Создает стрелку                                                  | 
//+------------------------------------------------------------------+ 
bool ArrowCreate(const long              chart_ID=0,           // ID графика 
                 const string            name="Arrow",         // имя стрелки 
                 const int               sub_window=0,         // номер подокна 
                 datetime                time=0,               // время точки привязки 
                 double                  price=0,              // цена точки привязки 
                 const uchar             arrow_code=252,       // код стрелки 
                 const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // положение точки привязки 
                 const color             clr=clrRed,           // цвет стрелки 
                 const ENUM_LINE_STYLE   style=STYLE_SOLID,    // стиль окаймляющей линии 
                 const int               width=3,              // размер стрелки 
                 const bool              back=false,           // на заднем плане 
                 const bool              selection=false,      // выделить для перемещений 
                 const bool              hidden=true,          // скрыт в списке объектов 
                 const long              z_order=0)            // приоритет на нажатие мышью 

Создадим функцию, которая получает индекс бара и определяет, сформирован ли на нём фрактал:

//+------------------------------------------------------------------+
//| Проверяет, сформирован ли на баре с индексом index               |
//| фрактал                                                          |
//|                                                                  |
//| is_up - эта переменная принимает значение true, если сформирован  |
//| фрактал вверх                                                 |
//| is_down - эта переменная принимает значение true, если сформирован|
//| фрактал вниз                                                  |
//| Если фрактал не сформирован, то обеим переменным                 |
//| присваивается значение false                                     |
//+------------------------------------------------------------------+
void GetFractalType(int index, bool &is_up, bool &is_down)
  {
// сбрасываем значения переменных
   is_up=is_down=false;

// проверяем, выше ли High (максимум) центральной свечи двух предыдущих и двух последующих
   is_up=(iHigh(_Symbol,_Period,index+1)<iHigh(_Symbol,_Period,index) &&
          iHigh(_Symbol,_Period,index+2)<iHigh(_Symbol,_Period,index) &&
          iHigh(_Symbol,_Period,index-1)<iHigh(_Symbol,_Period,index) &&
          iHigh(_Symbol,_Period,index-2)<iHigh(_Symbol,_Period,index));

// проверяем, ниже ли Low (минимум) центральной свечи двух предыдущих и двух последующих
   is_down=(iLow(_Symbol,_Period,index+1)>iLow(_Symbol,_Period,index) &&
            iLow(_Symbol,_Period,index+2)>iLow(_Symbol,_Period,index) &&
            iLow(_Symbol,_Period,index-1)>iLow(_Symbol,_Period,index) &&
            iLow(_Symbol,_Period,index-2)>iLow(_Symbol,_Period,index));
  }

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

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

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ShowFractals()
  {
   // пропускаем по два бара в конце и в начале таймсерии
   for(int i=Bars-2; i>1; i--)
     {
      string Name;// имя объекта
      bool IsUp, IsDown;
      // получаем тип фрактала, если он сформирован на данном баре
      GetFractalType(i,IsUp,IsDown);

      // сформирован фрактал вверх
      if(IsUp)
        {
         Name="FRCTL_UP_"+_Symbol+"_"+IntegerToString(iTime(_Symbol,_Period,i));
         // рисуем над High свечи синюю точку
         ArrowCreate(0,Name,0,iTime(_Symbol,_Period,i),iHigh(_Symbol,_Period,i),
         159,ANCHOR_BOTTOM,clrBlue,STYLE_SOLID,2,true,false);
        }
      // сформирован фрактал вниз
      if(IsDown)
        {
         Name="FRCTL_DOWN_"+_Symbol+"_"+IntegerToString(iTime(_Symbol,_Period,i));
         // рисуем под Low свечи красную точку
         ArrowCreate(0,Name,0,iTime(_Symbol,_Period,i),iLow(_Symbol,_Period,i),
         159,ANCHOR_BOTTOM,clrRed,STYLE_SOLID,2,true,false);
        }
     }
  }

Также нам понадобится функция, которая будет удалять графические объекты, которые могли остаться на графике от предыдущего запуска нашего скрипта. Эта функция будет искать графические объекты, имя которых начинается с определённого набора символов (так называемый префикс), и удалять только их. Ранее мы позаботились, чтобы создаваемые объекты имели такой префикс: «FRCTL». Удалять объекты мы будем перед вызовом функции ShowFractals.

//+------------------------------------------------------------------+ 
//| Удаляет графические объекты с префиксом prfx                     | 
//+------------------------------------------------------------------+
void DeleteObjects(string prfx)
  {
   for(int i=ObjectsTotal()-1; i>=0; i--)
     {
      string nm=ObjectName(0,i);
      if(StringSubstr(nm,0,StringLen(prfx))==prfx)
         ObjectDelete(0,nm);
     }
  }

В итоге функция OnStart() будет выглядеть следующим образом:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   DeleteObjects("FRCTL");
   ShowFractals();
  }

Результат работы нашего скрипта:

Автоматический поиск дивергенции на примере осциллятора RSI

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

Различают медвежью и бычью дивергенции.

Медвежья дивергенция – это ситуация, когда цена формирует всё более высокие максимумы при восходящем тренде, а каждая новая вершина индикатора RSI оказывается ниже предыдущей:

Медвежья дивергенция служит сигналом высокой вероятности смены тренда на нисходящий (медвежий).

Бычья дивергенция – это ситуация, когда цена формирует всё более низкие минимумы при нисходящем тренде, а каждая новая впадина индикатора RSI оказывается выше предыдущей:

Бычья дивергенция служит сигналом высокой вероятности смены тренда на восходящий (бычий).

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

Скрытая медвежья дивергенция:

Скрытая бычья дивергенция:

Напишем скрипт, который будет искать на исторических данных оба вида дивергенций: обычную дивергенцию будем отмечать сплошной линией, а скрытую – пунктирной.

С помощью кнопки «Создать» в главной панели MetaEditor создадим скрипт «Дивергенция.mq4».

В этом скрипте нам понадобятся входные параметры, поэтому добавим директиву script_show_inputs:

#property script_show_inputs

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

Наш скрипт будет использовать следующие параметры:

input int  RSIPeriod             = 9;     // Период RSI
input bool ShowFracrals          = false; // Показывать фракталы
input bool ShowHiddenDivergence  = false; // Показывать "скрытую" дивергенцию 

Определим строковую константу-префикс для имён графических объектов. Она понадобится нам при поиске объектов для их удаления:

#define PREFIX    "OBJ_DIV_"

Опишем структуру для хранения данных о фрактале и объявим два массива таких структур для фракталов вверх и для фракталов вниз:

struct fractal
  {
   datetime          time;      // время открытия бара, на котором был сформирован фрактал
   double            peak;      // максимум или минимум бара в зависимости от типа фрактала
   double            indicator; // значение индикатора RSI на баре
  } FractalsUp[],FractalsDown[];

Добавим в код функцию DeleteObjects, которую мы написали ранее, и вызовем её в обработчике OnStart(). Тем самым мы удалим с графика объекты, которые могли остаться после предыдущего запуска скрипта.  Установим нулевой размер у массивов фракталов и определим направление индексации в массивах, как в таймсериях (справа налево).

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   // удалим объекты, возможно оставшиеся от предыдущего запуска скрипта
   DeleteObjects(PREFIX);

   // установим нулевой размер у массивов фракталов
   ArrayResize(FractalsUp,0);
   ArrayResize(FractalsDown,0);

   // определим направление индексации в массивах фракталов как в таймсериях(справо налево)
   ArraySetAsSeries(FractalsUp,true);
   ArraySetAsSeries(FractalsDown,true);
  }

//+------------------------------------------------------------------+
//| Удаляет графические объекты с префиксом prfx                     |
//+------------------------------------------------------------------+
void DeleteObjects(string prfx)
  {
   for(int i=ObjectsTotal()-1; i>=0; i--)
     {
      string nm=ObjectName(0,i);
      if(StringSubstr(nm,0,StringLen(prfx))==prfx)
         ObjectDelete(0,nm);
     }
  }

Напишем функцию, которая заполняет массивы FractalsUp[] и FractalsDown[] найденными на истории фракталами. При этом, если параметр ShowFracrals = true, то найденные фракталы будут отображаться на графике цветными точками. Функцию отрисовки графических объектов возьмём из комплектного руководства MQL, а функцию GetFractalType, определяющую тип фракталов – из написанного нами ранее скрипта «Фракталы.mq4».

//+------------------------------------------------------------------+
//| Находит на истории все фракталы и заполняет соответствующие      |
//| массивы фракталов.                                               |
//| В зависимости от параметра ShowFracrals отображает найденные     |
//| фракталы на графике                                              |  
//+------------------------------------------------------------------+  
void ShowFractalsAndFillArrays()
{
// пропускаем по два бара в конце и в начале таймсерии
   int to=Bars-2;
   for(int i=2; i<to; i++)
     {
      string Name;// имя объекта
      bool IsUp, IsDown;
      double rsi;

      // получаем тип фрактала, если он сформирован на данном баре
      GetFractalType(i,IsUp,IsDown);

      // сформирован фрактал вверх
      if(IsUp)
        {
         rsi=iRSI(_Symbol,_Period,RSIPeriod,PRICE_CLOSE,i);
         // также есть максимум на RSI
         if(iRSI(_Symbol,_Period,RSIPeriod,PRICE_CLOSE,i+1)<rsi &&
            iRSI(_Symbol,_Period,RSIPeriod,PRICE_CLOSE,i-1)<rsi)
           {
            // добавляем данные о фрактале в массив
            int ind=AddFractalToArray(FractalsUp,iTime(_Symbol,_Period,i),
            iHigh(_Symbol,_Period,i),rsi);
 
           // рисуем над High свечи синюю точку
            if(ShowFracrals)
            {
              Name=PREFIX+_Symbol+"_FRCTL_UP_"+IntegerToString(FractalsUp[ind].time);
              ArrowCreate(0,Name,0,FractalsUp[ind].time,FractalsUp[ind].peak,159,
              ANCHOR_BOTTOM,clrBlue,STYLE_SOLID,2,true,false);
            }   
           }
        }
      // сформирован фрактал вниз
      if(IsDown)
        {
         rsi=iRSI(_Symbol,_Period,RSIPeriod,PRICE_CLOSE,i);
         // также есть минимум на RSI
         if(iRSI(_Symbol,_Period,RSIPeriod,PRICE_CLOSE,i+1)>rsi && 
            iRSI(_Symbol,_Period,RSIPeriod,PRICE_CLOSE,i-1)>rsi)
           {
            // добавляем данные о фрактале в массив
            int ind=AddFractalToArray(FractalsDown,iTime(_Symbol,_Period,i),
            iLow(_Symbol,_Period,i),rsi);
            
            // рисуем под Low свечи красную точку
            if(ShowFracrals)
            {
             Name=PREFIX+_Symbol+"_FRCTL_DOWN_"+IntegerToString(FractalsDown[ind].time);
             ArrowCreate(0,Name,0,FractalsDown[ind].time,FractalsDown[ind].peak,159,
             ANCHOR_TOP,clrRed,STYLE_SOLID,2,true,false);
            }   
           }
        }
     }
}

После того, как оба массива фракталов заполнены, нам потребуется функция, которая найдёт и разметит линиями возможные дивергенции цены и осциллятора RSI:

//+------------------------------------------------------------------+
//| Ищет и размечает трендовыми линиями дивергенции на               |
//| графике цены и осцилляторе RSI                                   |
//+------------------------------------------------------------------+
void ShowDivergence()
  {
   int size;
   string Name=PREFIX+_Symbol+"TLINE_";
// ----------- рисуем линии медвежьей дивергенции по локальным максимумам
   size=ArraySize(FractalsUp);
   for(int i=0; i<size-1; i++)
     {
      int Style=EMPTY;
      // медвежья дивергенция – цена вверх, RSI вниз
      if(FractalsUp[i].peak>FractalsUp[i+1].peak &&
         FractalsUp[i].indicator<FractalsUp[i+1].indicator)
         Style=STYLE_SOLID;
      else
         // скрытая медвежья дивергенция (конвергенция) – цена вниз, RSI вверх
         if(ShowHiddenDivergence && FractalsUp[i].peak<FractalsUp[i+1].peak &&
            FractalsUp[i].indicator>FractalsUp[i+1].indicator)
            Style=STYLE_DOT;
      if(Style>EMPTY)
        {
         TrendCreate(0,Name+"BEAR_BAR_"+IntegerToString(FractalsUp[i].time),0,
         FractalsUp[i+1].time,FractalsUp[i+1].peak,FractalsUp[i].time,FractalsUp[i].peak,
         clrMaroon,ENUM_LINE_STYLE(Style));
         TrendCreate(0,Name+"BEAR_RSI_"+IntegerToString(FractalsUp[i].time),1,
         FractalsUp[i+1].time,FractalsUp[i+1].indicator,FractalsUp[i].time,
         FractalsUp[i].indicator,clrMaroon,ENUM_LINE_STYLE(Style));
        }
     }
// ----------- рисуем линии бычьей дивергенции по локальным минимумам
   size=ArraySize(FractalsDown);
   for(int i=0; i<size-1; i++)
     {
      int Style=EMPTY;
      // бычья дивергенция – цена вниз, RSI вверх
      if(FractalsDown[i].peak<FractalsDown[i+1].peak &&    
         FractalsDown[i].indicator>FractalsDown[i+1].indicator)
         Style=STYLE_SOLID;
      else
         // скрытая бычья дивергенция (конвергенция) – цена вверх, RSI вниз
         if(ShowHiddenDivergence && FractalsDown[i].peak>FractalsDown[i+1].peak && 
            FractalsDown[i].indicator<FractalsDown[i+1].indicator)
            Style=STYLE_DOT;
      if(Style>EMPTY)
        {
          TrendCreate(0,Name+"BULL_BAR_"+IntegerToString(FractalsDown[i].time),0,
          FractalsDown[i+1].time,FractalsDown[i+1].peak,FractalsDown[i].time,
          FractalsDown[i].peak, clrGreen,ENUM_LINE_STYLE(Style));
          TrendCreate(0,Name+"BULL_RSI_"+IntegerToString(FractalsDown[i].time),1,
          FractalsDown[i+1].time,FractalsDown[i+1].indicator,FractalsDown[i].time,
          FractalsDown[i].indicator,clrGreen,ENUM_LINE_STYLE(Style));
        }
     }
  }

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

Добавим вызов функций в обработчик OnStart():

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   // удалим объекты, возможно оставшиеся от предыдущего запуска скрипта
   DeleteObjects(PREFIX);

   // установим нулевой размер у массивов фракталов
   ArrayResize(FractalsUp,0);
   ArrayResize(FractalsDown,0);

   // определим направление индексации в массивах фракталов как в таймсериях(справо налево)
   ArraySetAsSeries(FractalsUp,true);
   ArraySetAsSeries(FractalsDown,true);
   
   ShowFractalsAndFillArrays();
   ShowDivergence();
  }

Наш скрипт готов. Запустим его на часовом графике EURUSD, предварительно прикрепив к графику индикатор RSI с таким же периодом, как в скрипте:

Скрипт можно запускать и без индикатора RSI. В таком случае линии дивергенции будут построены только на графике цены.

Включим отображение фракталов (цветные точки) и скрытой дивергенции (пунктирные линии):

Заключение

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

Тема на форуме

С уважением, Юрий Лосев aka lsv107
Tlap.com

Уроки по MQL4 , , , ,

Торгуем скрытую дивергенцию с Hidden Divergence Panel

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

Несмотря на достаточно высокую надежность сигнала дивергенции, получившего название «золотого», он не пользуется популярностью у трейдеров, играя роль дополнительного фильтра. Причина – контртрендовый тип стратегии. Увидев коррекцию с возможным разворотом, трейдер закрывает позицию по тренду.

Но есть и другая дивергенция – скрытая, дающая сигнал о продолжении тренда. Ее не так-то легко заметить без специальных индикаторов. Одним из таких является Hidden Divergence Panel. Готовы познать силу скрытой дивергенции?

Hidden Divergence Panel - индикатор Скрытой Дивергенции для MT4

Платформа: MetaTrader 4

Валютные пары: любые

Таймфрейм: любой

Время торговли: круглосуточно

Рекомендуемые брокеры: Alpari, InstaForex, Roboforex

Как найти скрытую дивергенцию на рынке Форекс?

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

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

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

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

  • Если последовательному снижению максимумов классического тренда соответствуют растущие максимумы осциллятора, – это сигнал скрытой дивергенции на продолжение падения.

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

Важное значение имеют параметры настроек и визуальная тренировка для мгновенного и безошибочного определения сигнала о расхождении. Hidden Divergence Panel снимает необходимость высматривать скрытую дивергенцию, определяя ее «на автомате» по целой группе валютных пар и инструментов. Сигналы DashBoard и наносимая индикатором разметка представляют собой полноценную, готовую к применению торговую систему.

Установка и настройки индикатора Hidden Divergence Panel

Hidden Divergence Panel – это файл формата ex4, который устанавливается в торговую платформу через опцию «Каталог данных» в меню терминала Metatrader 4.

Отрываем папку MQL и размещаем файл ex4 в директорию «Indicators». Если что-то не получилось, посмотрите эту статью нашего сайта с универсальной инструкцией по установке любого индикатора.

Загруженный индикатор после перезапуска программы можно найти по пути меню МТ4 «Индикаторы – Пользовательские – Hidden Divergence Panel», или открыв панель «Навигатор», из нее индикатор можно перетащить на любой график мышкой. Он сразу будет готов к работе, настроенный на поиск скрытой дивергенции на основных таймфреймах и валютных парах.

Желающим изменить настройки по умолчанию можно поработать со вкладкой «Входные параметры» в настройках индикатора. Она содержит разделы:

Настройки Dashboard

  • Symbols – прописывайте в этой строке все символы валютных пар точно так, как они отображены в терминале, особенно это касается счетов типа ECN, STP и т.д., где валютные пары снабжены различными префиксами;
  •  Is (M1…WN) Timeframe Enabled – «true» включает таймфреймы, на которых ведется поиск дивергенции, «false» отключает какой-либо временной промежуток;
  • Sort By и Sort Type – принципы сортировки, по умолчанию включен отбор по валютным парам и возрастанию таймфрейма.

Настройки ареала поиска дивергенции и цветовой гаммы ее сигналов

Минимальный порог поиска дивергенции настраивается по опциям DivirgenceWitnMinimumBars, максимальный – DivirgenceWitnMaximumBars, глубина истории – MaxBars.

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

При изменении настроек по умолчанию стоит обратить внимание на:

  • Настройки индикатора MACD – они обозначены тремя строчками стандартных опций для периода двух скользящих EMA и одной SMA;
  • Настройки фильтра тренда – он должен быть включен значением «true» и системой из двух скользящих средних EMA с периодом 50 и 200 по умолчанию.

Остальные пункты – это общие цветовые и текстовые настройки индикатора, а также алерты – различные способы оповещения трейдера о появлении сигналов.

Как работает индикатор Hidden Divergence Panel

Основные плюсы Hidden Divergence Panel – мультивалютность и поиск скрытой дивергенции по всем доступным таймфреймам. Неважно, на графике какого инструмента установлен индикатор, в подвале всегда будет отображаться DashBoard со списком выбранных инструментов и временных промежутков.

Трейдер может совместить в одной стратегии несколько видов торговых систем (краткосрочную, среднесрочную, долгосрочную) или получить подтверждение дивергенции внутри дня, заметив сигнал на «трех экранах».

Таблица DashBoard содержит всю необходимую информацию:

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

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

Примеры торговли по сигналам Hidden Divergence Panel

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

Трейдер может настроить Hidden Divergence Panel в одном окне. Функция таблицы Chart в один клик откроет график выбранной валютной пары на нужном таймфрейме с уже отмеченным сигналом дивергенции, стрелкой входа, уровнями SL и TP.

Задача трейдера сводится к простому «ручному» копированию сигналов – входу по цене открытия свечи со стрелкой, установкой уровней мани менеджмента по цифровым и графическим отметкам индикатора.

В качестве примера возьмем покупку по паре EURUSD

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

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

Стоп-лосс и тейк-профит не имеют фиксированного размера, выставляются в зависимости от силы тренда, не избавляя трейдера от убытков, даже если котировки перед этим побывали в плюсовой зоне.

В качестве примера рассмотрим продажу по паре AUDUSD

Как видно ниже, вход в шорт был идеально выполнен на откате. Трейдер вошел в рынок с относительно коротким стопом и хорошим тейком.

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

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

Заключение

Индикатор Hidden Divergence Panel – идеально сбалансированная торговая система, если ее использовать «на полную мощность». Трейдер не должен пренебрегать возможностью мультивалютных сделок, снижающих риск убытка, но не злоупотребляя при этом количеством таймфреймов.

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

Ранее на нашем сайте был выложен индикатор «прямой» дивергенции – Divergence Panel, который может дать идеи для хеджирования сделок или увеличения профита на откатах по тренду.

Тема на форуме

С уважением, Иван Петров
Tlap.com

Индикаторы Форекс , , , ,

Stochastic RSI — плод запретной любви классических индикаторов

форекс индикатор Stochastic Rsi  скачать

Добрый день, дамы и господа! Многие из вас используют в своей торговле такой индикатор, как RSI. Но известных трейдеров Стэнли Кролла и Тушарда Чанда, авторов книги «Новый технический трейдер» и нескольких других книг, напрягал тот факт, что RSI очень часто находится между уровнями 20 и 80 в течение длительного времени, не пересекая их, и поэтому они изобрели индикатор Stochastic RSI, который по их задумке должен быть лишен этого недостатка. Может быть уважаемые трейдеры перестарались, а может так и было задумано, но получившийся индикатор находится в зонах перекупленности/перепроданности очень часто. Что же на самом деле получилось у этих двух успешных людей? Сегодня мы постараемся в этом разобраться.

Смотреть видео

Индикаторы Форекс , ,

Crazy Nippel System — агрессивный скальпинг для больших заработков

Форекс стратегия Crazy Nippel System скачать видеоДоброго времени суток. Рынок форекс, как известно, позволяет заработать много денег. Но сможете ли вы их унести? Валютный трейдинг — не место для нытиков. Сегодня мы разберем мощную стратегию с нашего форума под названием Crazy Nippel System. Если вы не в силах контролировать свои эмоции, если вы первую неделю на Forex и максимум на что способны — это плакаться о потерянных ста долларах в уютном вконтактике, то эта торговая система не для вас.

Читать дальше

Стратегии Форекс , , , ,

Все, что вы боялись спросить о дивергенции на форекс

Что такое дивергенция на форекс

Здравствуйте, товарищи трейдеры! Меня часто спрашивают: работает ли технический анализ? Какой форекс индикатор лучший?

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

Узнать больше

Новичкам, Обучение , , ,