![Построение горизонтальных уровней пробития при помощи фракталов](https://c.mql5.com/i/articles/overlay.png)
Построение горизонтальных уровней пробития при помощи фракталов
Фракталы
Фракталы (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 |
![](https://c.mql5.com/2/14/strategytester.gif)
Заключение
Из приведенных тестов видно, что с применением FractalsLine выросла не только прибыльность, но и уменьшилась просадка.
![Как писать быстрые неперерисовывающиеся зигзаги](https://c.mql5.com/2/16/687_36.jpg)
![Групповые файловые операции](https://c.mql5.com/2/16/677_43.gif)
![Материалы Automated Trading Championship: Регистрация](https://c.mql5.com/2/16/698_8.gif)
![Эксперты на основе популярных торговых систем и алхимия оптимизации торгового робота (Часть 7)](https://c.mql5.com/2/16/676_7.gif)
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Похоже, что канал строится по несостоявшимся фракталам, да еще и без учета спреда. А это приведет к неверной установке стопа!
Следовательно, будет вышибать с рынка почем за зря!
Индикатор FractalsLine.mq4
Тут есть скрытая неточность работы. Может проявиться только во время появления гэпа.
Посмотрите внимательно на скрин. При создании АТС необходимо эту возможность учитывать, что бы не было мучительно больно
очень здорово, а то я ручками рисовал уровни. хотел бы узнать: не могли бы Вы слегка подправить индикатор? хотелось бы, чтобы индикатор рисовал только! уровни последних двух противоположных фракталов + price + alert.
спасибо!