Скачать MetaTrader 5

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

25 июля 2008, 09:31
Victor Chebotariov
10
2 030

Фракталы

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

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


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

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

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

  • В первом шаге работы мастера необходимо выбрать "Пользовательский индикатор".
  • Во втором шаге необходимо указать имя, автора, ссылку и параметры, так как для индикатора мы будем использовать индикатор Fractals, то настраиваемых параметров у нас не будет, поэтому указываем только имя, автора и ссылку.
  • В третьем шаге мастер предлагает нам определить параметры отображения пользовательского индикатора. Поскольку наш индикатор должен отображаться на главном графике, то галочку напротив "Индикатор в отдельном окне" мы не ставим. Дальше нам предлагают определить индексы. Нам потребуется два индекса, один для уровня верхнего фрактала, второй для уровня нижнего фрактала. Оба индекса будут иметь тип Line, для первого индекса мы выберем синий цвет (Blue), для второго - красный (Red) и нажмем кнопку "Готово".

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

//+------------------------------------------------------------------+
//|                                                 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 выросла не только прибыльность, но и уменьшилась просадка.

Прикрепленные файлы |
FractalsLine.mq4 (2.28 KB)
StrategyTester.zip (33.25 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (10)
MQL4 Comments
MQL4 Comments | 9 авг 2008 в 14:23

Похоже, что канал строится по несостоявшимся фракталам, да еще и без учета спреда. А это приведет к неверной установке стопа!

Следовательно, будет вышибать с рынка почем за зря!

MQL4 Comments
MQL4 Comments | 11 авг 2008 в 13:37
Чё-то я прикола не понял... а зачем велосипед изобретать? https://www.mql5.com/ru/code/7108
Prival
Prival | 2 сен 2008 в 00:07

Индикатор FractalsLine.mq4

Тут есть скрытая неточность работы. Может проявиться только во время появления гэпа.

Посмотрите внимательно на скрин. При создании АТС необходимо эту возможность учитывать, что бы не было мучительно больно

MQL4 Comments
MQL4 Comments | 14 сен 2010 в 22:06
может быть и не во время гепа. например, если на подьеме есть два нижних, а верхний не образовался, будет обратное пересечение (как на картинке).
Laburyaka
Laburyaka | 23 сен 2014 в 18:17

очень здорово, а то я ручками рисовал уровни. хотел бы узнать: не могли бы Вы слегка подправить индикатор? хотелось бы, чтобы индикатор рисовал только! уровни последних двух противоположных фракталов + price + alert.

спасибо! 

Переход на новые рельсы: пользовательские индикаторы в MQL5 Переход на новые рельсы: пользовательские индикаторы в MQL5

Я не буду перечислять все новые возможности и особенности нового терминала и языка. Их действительно много, и некоторые новинки вполне достойны освещения в отдельной статье. Вы не увидите здесь кода, написанного по принципам объектно-ориентированного программирования — это слишком серьезная тема для того, чтобы просто быть упомянутой в контексте как дополнительная вкусность для кодописателей. В этой статье остановимся подробней на индикаторах, их строении, отображении, видах, а также особенностях их написания по сравнению с MQL4.

Вот мы и получили долгожданные MetaTrader 5 и MQL5 Вот мы и получили долгожданные MetaTrader 5 и MQL5

Это очень краткий обзор MetaTrader 5. Я не могу описать все новшества системы за столь короткий период времени - тестирование стартовало 09-09-2009. Это символическая дата, и я уверен, что это будет счастливым числом. Всего несколько дней у меня на руках бета-версия терминала MetaTrader 5 и MQL5. Я не успел опробовать все, что в нем есть нового, но то, что есть, уже впечатляет.

Как построить и протестировать стратегию бинарных опционов в Тестере Стратегий MetaTrader 4 Как построить и протестировать стратегию бинарных опционов в Тестере Стратегий MetaTrader 4

Руководство по построению стратегии бинарных опционов и ее тестированию в Тестере Стратегий MetaTrader 4 с использованием утилиты Binary-Options-Strategy-Tester из Маркета на MQL5.com.

Портфельная торговля в MetaTrader 4 Портфельная торговля в MetaTrader 4

В статье обсуждаются принципы портфельной торговли и особенности применения к валютному рынку. Рассматриваются несколько простых математических моделей для формирования портфеля. Приводятся примеры практической реализации портфельной торговли в MetaTrader 4: портфельный индикатор и советник для полуавтоматической торговли. Описываются элементы торговых стратегий, их достоинства и "подводные камни".