Торговая система ДиНаполи

Roman Vashchilin | 27 апреля, 2017

Содержание

  1. Введение
  2. Уровни ДиНаполи: основа
  3. Главные принципы и термины
  4. Расширения Фибоначчи/ДиНаполи
  5. Техника торговли по уровням ДиНаполи
  6. Стратегии "Сапер А" и "Сапер Б"
  7. Индикатор уровней ДиНаполи
  8. Заключение
  9. Литература

1. Введение

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

Предлагаю рассмотреть его систему подробно. Я постарался максимально доходчиво изложить базовые понятия и принципы торговли по этой методике, которые невозможно описать без тесного знакомства с уровнями Фибоначчи. Что же это за уровни? Как их понимать и применять на практике? А главное, как они работают в трейдинге?

2. Уровни ДиНаполи: основа



Отображение основы уровней ДиНаполи


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

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



Пример неправильного размещения уровней Фибоначчи



Пример правильного размещения уровней Фибоначчи


Уровни ДиНаполи по своей природе являются уровнями поддержки и сопротивления, но более глубоко интерпретируемыми, чем в классическом случае. Строятся они на основе уровней Фибоначчи. В основе их лежит так называемый рыночный размах (см. ниже), или, говоря проще, тренд. Для построения уровней ДиНаполи нам потребуются только три уровня Фибоначчи: 61,8%, 50% и 38,2%. Именно они и будут выступать на нашем графике в роли уровней сопротивления и поддержки. На график линии Фибоначчи будут наноситься снизу вверх в случае восходящего тренда и сверху вниз — если тренд нисходящий.

В идеале линии выстроятся от 0% до 100% по направлению текущего тренда. Все уровни Фибоначчи, которые имеют значение больше чем 100%, используются для установки точек закрытия позиции.



Рыночный размах


Уровни ДиНаполи можно применять двумя способами — в виде расширения и в виде коррекции. 

Коррекция применяется для поиска целевых точек входа в торговые позиции, сетка расширения строится для поиска точек выхода из рынка.


3. Главные принципы и термины

  • Узел Фибоначчи — точка на ценовом графике, на которой заканчивается движение коррекции. Джо ДиНаполи советовал работать только с узлами, находящимися в диапазоне от 38,2% до 61,8%. Все что ниже 38,2% — слишком незначительно, а  больше 61,8% — слишком сильное (т.е. тренд, возможно, не восстановится).
  • Рыночный размах (расстояние между экстремумами) — расстояние от начала до конца ценового движения, на котором проводят уровни Фибоначчи. Если цена после окончания коррекции меняет свою точку максимума или минимума, следует также переместить крайнюю точку наших уровней. В этом случае размах увеличится.
  • Скопление — место на графике, в котором наблюдается скопление нескольких узлов Фибоначчи, т.е. множество коррекционных уровней близко друг к другу.
  • Фокусная точка (экстремум) — крайняя точка рыночного размаха, уровень, с которого начинается коррекция цены. При смене экстремума на графике появляется еще одна фокусная точка, поэтому их может быть много на графике в зоне одного размаха.  
  • Целевой уровень — точка на графике цены, в котором вы планируете разместить тейк-профит.
  • Целевая точка — любая точка на графике, на которой вы планируете какое-либо действие (вход в рынок, выход из него и.т.д.).
  • Реакциязаконченная коррекция в трендовом движении. В радиусе одного размаха может быть сформировано несколько реакций.


Расширения, коррекция и фокусная точка


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



Реакции на графике


Советы от ДиНаполи

  • Сигналы которые будут поступать от этих уровней, приносят плоды лишь в случае, когда коррекционные уровни, а также скопления/поддержки находятся в зоне уровней 38,2%-61,8%. На остальные сигналы не стоит обращать внимания.
  • Уровнями для фиксации прибыли будут обычные расширения Фибоначчи, которые растягиваются до последней коррекции, чтобы на уровнях 161,8% и 261,8% поместить стоп-лосс.
  • Количество размахов на графике всегда равно количеству фокусных чисел.
  • Фокусные числа всегда находятся правее реакций, с которыми они связаны. Т.е. коррекции цены, которые образовались на размахе уровней, должны находится левее фокусного числа.
  • Чем выше таймфрейм, тем меньше число реакций. Когда вы работаете на разных временных интервалах, вы можете заметить, что на мелких таймфреймах движение цены очень быстрое, а на старших таймфреймах эти мелкие движения даже не отображаются.Это правило также используется и в обратном порядке: когда появляется место, на котором цена находит сильное сопротивление/поддержку, вы сможете найти необходимые вам реакции и размахи, которые не отображаются на старших таймфреймах, опустившись на меньшие временные интервалы.


4. Расширения Фибоначчи/ДиНаполи

Сетка расширений уровней ДиНаполи понадобится нам для того, чтобы определить места для закрытия своих позиций. Основой их построения будет служить сетка расширений Фибоначчи. На сей раз будем использовать уровни в 100%, 161,8% и 261,8%, которые будут являться для нас целевой точкой для размещения тейк-профита.



Расширения уровней Фибоначчи (ДиНаполи)


Сетка расширений Фибоначчи будет строиться на графике так:

  • Для нисходящего тренда — начиная от ценового минимума и до пика коррекции цены, которую образовала линия отбития цены, начиная с 38,2% и выше.
  • Для восходящего тренда — начиная от ценового максимума и до минимума коррекции цены, которая пересекает уровень 38,2% и выше.



Наглядный пример как размещать на графике "Сетку расширений Фибоначчи"


В своей книге "Торговля с использованием уровней ДиНаполи" автор уделяет много внимания таким понятиям как "Множественные фокусные числа" и "Рыночные размахи". Данные модели характерны в работе для инструментов с частыми "флетами", когда нет ярко намеченного тренда. В работе на графике и их построении такие фигуры сложнее, чем простые "размахи". Основную сложность представляет отсеивание ненужных нам уровней, которые являются неактуальными.

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

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


5. Техника торговли по уровням ДиНаполи

Перейдем непосредственно к системе торговли по уровням ДиНаполи. Вкратце, если взять лишь основную идеологию из его книги, можно построить несколько тактик торговли с уровнями "агрессивная" и "спокойная".

  • Агрессивная включает в себя 2 способа входа в рынок: это стратегии "Кусты" и "Бонсай". Принцип торговли по ним схож, разница лишь в том, где расставлять стоп-лоссы.
  • Спокойная описывает также 2 способа: "Сапер А" и "Сапер Б".

При использовании агрессивного метода торговли расчет идет на то, что цена будет отбиваться от уровня 38,2% и уже образовавшегося размаха. Разница между стратегиями "Кусты" и "Бонсай" состоит лишь в том, после какого фибо-уровня будет устанавливаться стоп-лосс.

Начнем со способа торговли "Кусты".  По правилам этого метода, позиции нужно открывать в тот момент, когда цена на построенной сетке коррекций пересекает уровень 38,2% в направлении нынешнего тренда, а стоп-лосс помещается дальше уровня 50%. По методике "Бонсай" входим в рынок так же, как по методике "Кусты", но стоп-лосс выставляем, не доходя до уровня Фибоначчи 50%.

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



Стратегия "Кусты"


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


6. Стратегии "Сапер А" и "Сапер Б"

Наиболее спокойные и наименее рисковые стратегии — "Сапер А" и "Сапер Б".  Вход в рынок по ним также подразумевается после окончания коррекции, но сама работа будет вестись со страховкой.

  • Сапер А. Сначала мы ждем, когда закончится первая коррекция (пока не открываем позиции), затем ждем формирования второй коррекции. Только после этого открываем позиции. Стоп-лосс помещаем так же, как мы ставили его в прошлой стратегии, т.е. за следующий уровень Фибоначчи.
  • Сапер Б. Открываем позиции не после второй сформировавшейся коррекции, а только после третьей, четвертой и т.д. Иными словами, входим в рынок только после серьезного подтверждения тренда, что дает нам сильную страховку от ложных сигналов.
Что мы имеем в результате данной стратегии? Получаем мы нечастые входы в рынок. Тренд не всегда бывает таким продолжительным, чтобы давать 3 и более подряд движений коррекции, да еще и соответствующих правилам данной торговой системы (о том, что конец отката должен быть на уровнях 38,2% — 61,8%). С другой стороны, таким образом мы отфильтровываем ложные сигналы, в которых коррекция цены не становится продолжением тренда.


Стратегия "Сапер А"


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

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

7. Индикатор уровней ДиНаполи

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

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

Индикатор для автоматического отображения уровней ДиНаполи также включает в себя индикатор "Zigzag" со звуковым уведомлением о развороте зигзага. Индикатор красной линией отмечает на графике линию для размещения стоп-лосса, синим цветом — линию для начала работы, остальные горизонтальные линии — целевые для достижения ценой. Кроме того, индикатор показывает вертикальные линии разметки времени (их можно отключить в настройках индикатора).


Входные параметры индикатора



Отображение индикатора "DiNapoli Levels" на ценовом графике терминала


Параметры:

  • Minimum points in a ray (по умолчанию = 400) — изменение ширины вертикальных временных уровней;
  • Show the vertical lines (по умолчанию = true) — отображать/не отображать временные вертикальные уровни;
  • Number of history bars (по умолчанию = 5000) — количество охватываемых баров в истории встроенным индикатором "Zigzag";
  • Play sound (по умолчанию = true) — включить звуковое уведомление о изменении направления индикатором "Zigzag";
  • Sound file (по умолчанию = "expert.wav") — выбор файл для звукового уведомления;
  • Start Line color (по умолчанию = Blue) — цвет стартовой горизонтальной линии;
  • Stop Line color (по умолчанию = Red) — цвет горизонтальной линии для установки стоп-лосса;
  • Target1 Line color (по умолчанию = Green) — цвет горизонтальной линии для цели №1;
  • Target2 Line color (по умолчанию = DarkOrange) — цвет горизонтальной линии для цели №2;
  • Target3 Line color (по умолчанию = DarkOrchid) — цвет горизонтальной линии для цели №3;
  • Target4 Line color (по умолчанию = DarkSlateBlue) — цвет горизонтальной линии для цели №4;
  • Time Target1 color (по умолчанию = DarkSlateGray) — цвет вертикальной временной линии №1;
  • Time Target2 color (по умолчанию = SaddleBrown) — цвет вертикальной временной линии №2;
  • Time Target3 color (по умолчанию = DarkSlateGray) — цвет вертикальной временной линии №3;
  • Time Target4 color (по умолчанию = DarkSlateGray) — цвет вертикальной временной линии №4;

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

Начальные параметры кода выглядят так:

//------------------------------------------------------------------------------------
//                                                                 DiNapoli Levels.mq5
//                                                   The modified indicator FastZZ.mq5
//                                       Added DiNapoli Target Levels and Time Targets
//                                                         victorg, www.mql5.com, 2013
//------------------------------------------------------------------------------------
#property copyright   "Copyright 2012, Yurich"
#property link        "https://login.mql5.com/ru/users/Yurich"
#property version     "3.00"
#property description "FastZZ plus DiNapoli Target Levels."
#property description "The modified indicator 'FastZZ.mq5'."
#property description "victorg, www.mql5.com, 2013."
//------------------------------------------------------------------------------------
#property indicator_chart_window // Выводить индикатор в окне графика
#property indicator_buffers 3    // Количество буферов для расчета индикатора
#property indicator_plots   1    // Количество окон индикатора
#property indicator_label1  "DiNapoli Levels" // задает метку для графической серии
#property indicator_type1   DRAW_COLOR_ZIGZAG // Стиль рисования индикатора. N - номер графической серии
#property indicator_color1  clrTeal,clrOlive  // Цвет для вывода линии N, где N - номер графической серии
#property indicator_style1  STYLE_SOLID       // Стиль линии в графической серии
#property indicator_width1  1    // Толщина линии в графической серии
//------------------------------------------------------------------------------------
input int    iDepth=400;              // Минимум точек в луче
input bool   VLine=true;              // Показывать вертикальные линии
input int    iNumBars=5000;           // Количество баров в истории
input bool   Sound=true;              // Включить звуковые уведомления
input string SoundFile="expert.wav";  // Звуковой файл
input color  cStar=clrBlue;           // Цвет стартовой линии
input color  cStop=clrRed;            // Цвет линии стопа
input color  cTar1=clrGreen;          // Цвет линии цели №1
input color  cTar2=clrDarkOrange;     // Цвет линии цели №2
input color  cTar3=clrDarkOrchid;     // Цвет линии цели №3
input color  cTar4=clrDarkSlateBlue;  // Цвет линии цели №4
input color  cTarT1=clrDarkSlateGray; // Цвет временной линии №1
input color  cTarT2=clrDarkSlateGray; // Цвет временной линии №2
input color  cTarT3=clrSaddleBrown;   // Цвет временной линии №3
input color  cTarT4=clrDarkSlateGray; // Цвет временной линии №4
input color  cTarT5=clrDarkSlateGray; // Цвет временной линии №5

Введем переменные в индикатор.

//Основные переменные
double   DiNapoliH[],DiNapoliL[],ColorBuffer[],Depth,A,B,C,Price[6];
int      Last,Direction,Refresh,NumBars;
datetime AT,BT,CT,Time[5];
color    Color[11];
string   Name[11]={"Start Line","Stop Line","Target1 Line","Target2 Line",
                   "Target3 Line","Target4 Line","Time Target1","Time Target2",
                   "Time Target3","Time Target4","Time Target5"};

После написания главных параметров и введения переменных можем приступать к написанию основной части индикатора.

Основная часть:

// Начинаем инициализацию индикатора
void OnInit()
  {
  int i;
  string sn,sn2;
  
// Выставим условия для точек в луче
  if(iDepth<=0)Depth=500; 
  else Depth=iDepth;   
  
// Выставим условия для баров в истории     
  if(iNumBars<10)NumBars=10;
  else NumBars=iNumBars;
  
// Настроим отображение индикаторных буферов  
  SetIndexBuffer(0,DiNapoliH,INDICATOR_DATA); 
  SetIndexBuffer(1,DiNapoliL,INDICATOR_DATA);
  SetIndexBuffer(2,ColorBuffer,INDICATOR_COLOR_INDEX);
  
//Выставим точность отображения значений индикатора
  IndicatorSetInteger(INDICATOR_DIGITS,Digits()); 
  
// Настраиваем отрисовку линий  
  PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0); 
  PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0); 
  
// Настроим короткое имя индикатора  
  sn="DiNapoli"; sn2=""; 
  for(i=1;i<100;i++)
    {
// Настроим поиск диаграммы   
    if(ChartWindowFind(0,sn)<0){break;}
    sn2="_"+(string)i; sn+=sn2;
    }
    
// Установим отображение символа    
  IndicatorSetString(INDICATOR_SHORTNAME,sn);
  for(i=0;i<11;i++) Name[i]+=sn2;
  
// Инициализируем буферы пустыми значениями   
  ArrayInitialize(DiNapoliH,0); ArrayInitialize(DiNapoliL,0);

Переходим к оформлению индикатора:

// Настраиваем цветовые линии индикатора
  Color[0]=cStar; Color[1]=cStop; Color[2]=cTar1; Color[3]=cTar2;
  Color[4]=cTar3; Color[5]=cTar4; Color[6]=cTarT1; Color[7]=cTarT2;
  Color[8]=cTarT3; Color[9]=cTarT4; Color[10]=cTarT5;
  Depth=Depth*_Point;
  Direction=1; Last=0; Refresh=1;
  for(i=0;i<6;i++)
    {
    if(ObjectFind(0,sn)!=0)
      {
      
// Настроим горизонтальные и вертикальные линии     
      ObjectCreate(0,Name[i],OBJ_HLINE,0,0,0);
      ObjectSetInteger(0,Name[i],OBJPROP_COLOR,Color[i]);
      ObjectSetInteger(0,Name[i],OBJPROP_WIDTH,1);
      ObjectSetInteger(0,Name[i],OBJPROP_STYLE,STYLE_DOT);
//    ObjectSetString(0,Name[i],OBJPROP_TEXT,Name[i]);// описание объекта
      }
    }
  if(VLine==true)
    {
    for(i=6;i<11;i++)
      {
      if(ObjectFind(0,sn)!=0)
        {
        ObjectCreate(0,Name[i],OBJ_VLINE,0,0,0);
        ObjectSetInteger(0,Name[i],OBJPROP_COLOR,Color[i]);
        ObjectSetInteger(0,Name[i],OBJPROP_WIDTH,1);
        ObjectSetInteger(0,Name[i],OBJPROP_STYLE,STYLE_DOT);
//      ObjectSetString(0,Name[i],OBJPROP_TEXT,Name[i]);// описание объекта
        }
      }
    }
  }
  
// Добавим функцию при снятии индикатора с графика удаляются графические объекты от индикатора
void OnDeinit(const int reason)
  {
  int i;
   
  for(i=0;i<11;i++) ObjectDelete(0,Name[i]);
  ChartRedraw();
  return;
  }

Теперь рассчитаем буферы индикатора:

// Функция итерации индикатора
int OnCalculate(const int total,        // Размер входных таймсерий
                const int calculated,   // Обработано баров вызове
                const datetime &time[], // Массив со значениями времени
                const double &open[],   // Массив с ценами открытия
                const double &high[],   // Массив для копирования максимальных цен 
                const double &low[],    // Массив минимальных цен
                const double &close[],  // Массив цен закрытия
                const long &tick[],     // Параметр содержащий историю тикового объема
                const long &real[],     // Реальный объем
                const int &spread[])    // Массив содержащий историю спредов                

  {
  int i,start;
  bool set;
  double a;

// Задаем проверку баров
  if(calculated<=0)
    {
    start=total-NumBars; if(start<0)start=0;
    
// Инициализируем буферы пустыми значениями  
    Last=start; ArrayInitialize(ColorBuffer,0);
    ArrayInitialize(DiNapoliH,0); ArrayInitialize(DiNapoliL,0);
    }
    
// Обсчет нового бара    
  else start=calculated-1;
  for(i=start;i<total-1;i++)
    {
    set=false; DiNapoliL[i]=0; DiNapoliH[i]=0;
    if(Direction>0)
      {
      if(high[i]>DiNapoliH[Last])
        {
        DiNapoliH[Last]=0; DiNapoliH[i]=high[i];
        if(low[i]<high[Last]-Depth)
          {
          if(open[i]<close[i])
            {
            DiNapoliH[Last]=high[Last];
            A=C; B=high[Last]; C=low[i];
            AT=CT; BT=time[Last]; CT=time[i];
            Refresh=1;
            }
          else
            {
            Direction=-1;
            A=B; B=C; C=high[i];
            AT=BT; BT=CT; CT=time[i];
            Refresh=1;
            }
          DiNapoliL[i]=low[i];
          }
          
// Устанавливаем цвета линий      
        ColorBuffer[Last]=0; Last=i; ColorBuffer[Last]=1;
        set=true;
        }
      if(low[i]<DiNapoliH[Last]-Depth&&(!set||open[i]>close[i]))
        {
        DiNapoliL[i]=low[i];
        if(high[i]>DiNapoliL[i]+Depth&&open[i]<close[i])
          {
          DiNapoliH[i]=high[i];
          A=C; B=high[Last]; C=low[i];
          AT=CT; BT=time[Last]; CT=time[i];
          Refresh=1;
          }
        else
          {
          if(Direction>0)
            {
            A=B; B=C; C=high[Last];
            AT=BT; BT=CT; CT=time[Last];
            Refresh=1;
            }
          Direction=-1;
          }
          
// Устанавливаем цвета линий
        ColorBuffer[Last]=0; Last=i; ColorBuffer[Last]=1;
        }
      }
    else
      {
      if(low[i]<DiNapoliL[Last])
        {
        DiNapoliL[Last]=0; DiNapoliL[i]=low[i];
        if(high[i]>low[Last]+Depth)
          {
          if(open[i]>close[i])
            {
            DiNapoliL[Last]=low[Last];
            A=C; B=low[Last]; C=high[i];
            AT=CT; BT=time[Last]; CT=time[i];
            Refresh=1;
            }
          else
            {
            Direction=1;
            A=B; B=C; C=low[i];
            AT=BT; BT=CT; CT=time[i];
            Refresh=1;
            }
          DiNapoliH[i]=high[i];
          }
          
// Устанавливаем цвета линий           
        ColorBuffer[Last]=0; Last=i; ColorBuffer[Last]=1;
        set=true;
        }
      if(high[i]>DiNapoliL[Last]+Depth&&(!set||open[i]<close[i]))
        {
        DiNapoliH[i]=high[i];
        if(low[i]<DiNapoliH[i]-Depth&&open[i]>close[i])
          {
          DiNapoliL[i]=low[i];
          A=C; B=low[Last]; C=high[i];
          AT=CT; BT=time[Last]; CT=time[i];
          Refresh=1;
          }
        else
          {
          if(Direction<0)
            {
            A=B; B=C; C=low[Last];
            AT=BT; BT=CT; CT=time[Last];
            Refresh=1;
            }
          Direction=1;
          }
// Устанавливаем цвета линий            
        ColorBuffer[Last]=0; Last=i; ColorBuffer[Last]=1;
        }
      }
    DiNapoliH[total-1]=0; DiNapoliL[total-1]=0;
    }
//------------
  if(Refresh==1)
    {

Конечный цикл расчёта индикатора:    

// Проверка количества баров на достаточность для расчёта
    Refresh=0; a=B-A;
    Price[0]=NormalizeDouble(a*0.318+C,_Digits);           // Начало;
    Price[1]=C;                                            // Стоп
    Price[2]=NormalizeDouble(a*0.618+C,_Digits);           // Цель№1
    Price[3]=a+C;                                          // Цель№2;
    Price[4]=NormalizeDouble(a*1.618+C,_Digits);           // Цель№3;
    Price[5]=NormalizeDouble(a*2.618+C,_Digits);           // Цель№4;
    for(i=0;i<6;i++) ObjectMove(0,Name[i],0,time[total-1],Price[i]);
    if(VLine==true)
      {
 
// Возвращаем значение округленное до ближайшего целого числа указанного значения      
      a=(double)(BT-AT);
      Time[0]=(datetime)MathRound(a*0.318)+CT;             // Временная цель№1
      Time[1]=(datetime)MathRound(a*0.618)+CT;             // Временная цель№2
      Time[2]=(datetime)MathRound(a)+CT;                   // Временная цель№3
      Time[3]=(datetime)MathRound(a*1.618)+CT;             // Временная цель№4
      Time[4]=(datetime)MathRound(a*2.618)+CT;             // Временная цель№5
      for(i=6;i<11;i++) ObjectMove(0,Name[i],0,Time[i-6],open[total-1]);
      }
    ChartRedraw();
    
// Если направление поменялось то включим воспроизведение звука
    if(Sound==true&&calculated>0)PlaySound(SoundFile);
    }
  return(total);
  }
//------------------------------------------------------------------------------------

Сам индикатор прикреплен в конце статьи.


8. Заключение

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

Программы, используемые в статье:

 # Имя
Тип
 Описание
1 DiNapoli  Levels.mq5                 Индикатор  Индикатор для автоматического расчета и построения уровней ДиНаполи

9. Литература

  1. Джо ДиНаполи Д44 Торговля с использованием уровней ДиНаполи. — М.: ИК Аналитика, 2001