Построение горизонтальных уровней пробития при помощи фракталов

Victor Chebotariov | 25 июля, 2008

Фракталы

Фракталы (Fractals) — это один из пяти индикаторов торговой системы Билла Вильямса, позволяющий обнаруживать дно или вершину. Техническое определение фрактала вверх — это серия из минимум пяти последовательных баров, в которой перед самым высоким максимумом и за ним находятся по два бара с более низкими максимумами. Противоположная конфигурация (серия из пяти баров, в которой перед самым низким минимумом и за ним находятся по два бара с более высокими минимумами) соответствует фракталу вниз. На графике фракталы имеют значения High и Low и отмечены стрелками вверх или вниз.

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


Индикатор уровней фрактала

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

При помощи мастера создания советника мы создадим основное тело нашего индикатора. Для этого нужно в MetaEditor выполнить последовательность команд "Файл -> Создать" или нажать на панели инструментов кнопку . На экране откроется "Мастер Создания Советника".

Создание тела программы завершено, вот так оно должно выглядеть:

//+------------------------------------------------------------------+
//|                                                 FractalsLine.mq4 |
//|                               Copyright © 2006, Виктор Чеботарёв |
//|                                      http://www.chebotariov.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Виктор Чеботарёв"
#property link      "http://www.chebotariov.com/"
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtMapBuffer2);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

Теперь осталось добавить небольшой кусочек кода и наш индикатор готов.

Нам нужно:

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

int i=Bars-counted_bars-1;
 
while(i>=0)
  {
   // Здесь вычисляем значение индикатора для каждого бара (i)
   i--;
  }

2. Нам нужно получить значения верхнего и нижнего фракталов:

double upfrac_val=iFractals(NULL,0,MODE_UPPER,i+1);
double lofrac_val=iFractals(NULL,0,MODE_LOWER,i+1);

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

if(upfrac_val>0)
  {
   GlobalVariableSet(Symbol()+Period()+"upfrac",upfrac_val);
  }
else if(lofrac_val>0)
  {
   GlobalVariableSet(Symbol()+Period()+"lofrac",lofrac_val);
  }

4. Осталось прочитать данные из глобальных переменных и передать нашим индексам:

ExtMapBuffer1[i] = GlobalVariableGet(Symbol()+Period()+"upfrac");
ExtMapBuffer2[i] = GlobalVariableGet(Symbol()+Period()+"lofrac");

В готовом виде код нашего индикатора стал таким:

//+------------------------------------------------------------------+
//|                                                 FractalsLine.mq4 |
//|                               Copyright © 2006, Виктор Чеботарёв |
//|                                      http://www.chebotariov.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Виктор Чеботарёв"
#property link      "http://www.chebotariov.com/"
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtMapBuffer2);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
//----
   int i=Bars-counted_bars-1;
 
   while(i>=0)
     {
      double upfrac_val=iFractals(NULL,0,MODE_UPPER,i+1);
      double lofrac_val=iFractals(NULL,0,MODE_LOWER,i+1);
      if(upfrac_val>0)
        {
         GlobalVariableSet(Symbol()+Period()+"upfrac",upfrac_val);
        }
      else if(lofrac_val>0)
        {
         GlobalVariableSet(Symbol()+Period()+"lofrac",lofrac_val);
        }
      ExtMapBuffer1[i] = GlobalVariableGet(Symbol()+Period()+"upfrac");
      ExtMapBuffer2[i] = GlobalVariableGet(Symbol()+Period()+"lofrac");
      i--;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+

Осталось откомпилировать, выполнив команду меню "Файл -> Компилировать" или нажав на кнопку на панели инструментов.

Новоиспеченный индикатор можно прикреплять на график.


Практическое применение

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

Например, мы вошли в рынок (см. график, метка 1) со стопом выше синей линии (метка 2), при пробое красной линии (м. 3) перемещаем StopLoss (м. 4), при новом пробое (м. 5) перемещаем StopLoss аналогично (м. 6). При пробое синей линии (м. 7) - ликвидация позиции.

Для того чтобы использовать FractalsLine в качестве трейлинг-стопа необходимо добавить в эксперт два небольших кусочка кода:

Получение данных из индикатора FractalsLine :

double FLU = iCustom(NULL,0,"FractalsLine",0,0); // Синия фрактальная линия
double FLL = iCustom(NULL,0,"FractalsLine",1,0); // Красная фрактальная линия

Трейлинг-стоп на основе индикатора FractalsLine:

if(Close[0]>FLU) //Трейлинг-стоп для длинных позиций
  {
   if(OrderStopLoss()<FLL-3*Point || OrderStopLoss()==0)
     {
      OrderModify(OrderTicket(),OrderOpenPrice(),FLL-3*Point,OrderTakeProfit(),0,Green);
      return(0);
     }
  }
if(Close[0]<FLL) //Трейлинг-стоп для коротких позиций
  {
   if(OrderStopLoss()>FLL+(Ask-Bid+3)*Point || OrderStopLoss()==0)
     {
      OrderModify(OrderTicket(),OrderOpenPrice(),FLL+(Ask-Bid+3)*Point,OrderTakeProfit(),0,Red);
      return(0);
     }
  }

Внедрение трейлинг-стопа на основе индикатора FractalsLine в советник MACD Sample дало положительный результат. Это видно при сравнительных тестах.


Тестирование стандартного MACD Sample

Символ EURUSD (Euro vs US Dollar)
Период 1 Час (H1) 2008.01.02 12:00 - 2008.06.30 23:00 (2008.01.01 - 2008.07.01)
Модель Все тики (наиболее точный метод на основе всех наименьших доступных таймфреймов)
Параметры TakeProfit=50; Lots=0.1; TrailingStop=30; MACDOpenLevel=3; MACDCloseLevel=2; MATrendPeriod=26;
Баров в истории 4059 Смоделировано тиков 1224016 Качество моделирования 90.00%
Ошибки рассогласования графиков 1
Начальный депозит 10000.00
Чистая прибыль 182.00 Общая прибыль 1339.00 Общий убыток -1157.00
Прибыльность 1.16 Матожидание выигрыша 3.79
Абсолютная просадка 697.00 Максимальная просадка 827.00 (8.16%) Относительная просадка 8.16% (827.00)
Всего сделок 48 Короткие позиции (% выигравших) 28 (82.14%) Длинные позиции (% выигравших) 20 (85.00%)
Прибыльные сделки (% от всех) 40 (83.33%) Убыточные сделки (% от всех) 8 (16.67%)
Самая большая прибыльная сделка 50.00 убыточная сделка -492.00
Средняя прибыльная сделка 33.48 убыточная сделка -144.63
Максимальное количество непрерывных выигрышей (прибыль) 14 (546.00) непрерывных проигрышей (убыток) 3 (-350.00)
Максимальная непрерывная прибыль (число выигрышей) 546.00 (14) непрерывный убыток (число проигрышей) -492.00 (1)
Средний непрерывный выигрыш 7 непрерывный проигрыш 1


Тестирование MACD Sample с применение трейлинг-стопа на основе индикатора FractalsLine

Символ EURUSD (Euro vs US Dollar)
Период 1 Час (H1) 2008.01.02 12:00 - 2008.06.30 23:00 (2008.01.01 - 2008.07.01)
Модель Все тики (наиболее точный метод на основе всех наименьших доступных таймфреймов)
Баров в истории 4059 Смоделировано тиков 1224016 Качество моделирования 90.00%
Ошибки рассогласования графиков 1
Начальный депозит 10000.00
Чистая прибыль 334.00 Общая прибыль 1211.00 Общий убыток -877.00
Прибыльность 1.38 Матожидание выигрыша 5.14
Абсолютная просадка 211.00 Максимальная просадка 277.00 (2.75%) Относительная просадка 2.75% (277.00)
Всего сделок 65 Короткие позиции (% выигравших) 41 (41.46%) Длинные позиции (% выигравших) 24 (62.50%)
Прибыльные сделки (% от всех) 32 (49.23%) Убыточные сделки (% от всех) 33 (50.77%)
Самая большая прибыльная сделка 50.00 убыточная сделка -102.00
Средняя прибыльная сделка 37.84 убыточная сделка -26.58
Максимальное количество непрерывных выигрышей (прибыль) 3 (150.00) непрерывных проигрышей (убыток) 4 (-168.00)
Максимальная непрерывная прибыль (число выигрышей) 150.00 (3) непрерывный убыток (число проигрышей) -168.00 (4)
Средний непрерывный выигрыш 2 непрерывный проигрыш 2


Заключение

Из приведенных тестов видно, что с применением FractalsLine выросла не только прибыльность, но и уменьшилась просадка.