English 中文 Español Deutsch 日本語 Português
Построение горизонтальных уровней пробития при помощи фракталов

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

MetaTrader 4Примеры | 25 июля 2008, 09:31
5 051 10
Victor Chebotariov
Victor Chebotariov

Фракталы

Фракталы (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)
[Удален] | 9 авг. 2008 в 14:23

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

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

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

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

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

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

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

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

спасибо! 

Как писать быстрые неперерисовывающиеся зигзаги Как писать быстрые неперерисовывающиеся зигзаги
Предлагается достаточно универсальный подход к написанию индикаторов типа "зигзаг". Метод охватывает значительную часть уже существующих "зигзагов" и позволяет относительно просто создавать новые.
Групповые файловые операции Групповые файловые операции
Иногда требуется проделать одинаковые операции для некоторой группы файлов. Если у вас есть список файлов, входящих в эту группу, то это не проблема. Но если этот список нужно получить самостоятельно, то возникает вопрос: "Каким образом?" В статье предлагается сделать это с помощью функций FindFirstFile() и FindNextFile(), входящих в библиотеку kernel32.dll.
Материалы Automated Trading Championship: Регистрация Материалы Automated Trading Championship: Регистрация
В данной статье собраны полезные материалы, которые помогут вам узнать больше о процедуре регистрации на Automated Trading Championship.
Эксперты на основе популярных торговых систем и алхимия оптимизации торгового робота (Часть 7) Эксперты на основе популярных торговых систем и алхимия оптимизации торгового робота (Часть 7)
В этой статье автор приводит пример эксперта, который бы удовлетворял требованиям Automated Trading Championship 2008