Смотри, как бесплатно скачать роботов
Ищи нас в Facebook!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Индикаторы

Kill Gap! Безгэповые индикаторы и источник безгэповых котировок. - индикатор для MetaTrader 4

Просмотров:
6480
Рейтинг:
(4)
Опубликован:
2010.05.08 21:45
Обновлен:
2014.04.21 14:54
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Вы никогда не ловили себя на желании взять ножницы, вырезать приключившийся после праздников или выходных гэп и склеить котировки? )))
Индикаторы, попав на такой гэп (а это м.б. сотня пп. и более), впадают в прострацию (аж стрелки гнутся) на длину своего расчета (для индикаторов с КИХ). Для индикаторов с БИХ все м.б. гораздо хуже. Короче, пока "стрелки не распрямятся", и индикаторы не станут адекватными, они будут в лучшем случае бесполезными, а то и могут навредить.

Вот что получилось с "ножницами и клеем". На график подцеплены Envelops, RSI и ATR в двух вариантах - c гэпом (красный) и без (синий).

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

Как идентифицировать такой «праздничный» гэп? Очевидно, что он должен отвечать двум условиям:
1. Время между смежными барами должно быть не меньше, скажем, восьми часов. Если этого не учитывать, то в реал-тайме гэп может быть ошибочно идентифицирован внутри дня – нередки ситуации, когда котировки поступают с гэпами, которые потом, задним числом фильтруются (заполняются) ДЦ..
2. Наличие разрыва между Open бара и Close предыдущего.

Для того, чтобы строить безгэповые индикаторы, нужно иметь источник фильтрованных котировок с вырезанным гэпом для всех типов цены. Это вспомогательный индикатор KillGap, на 0-м буфере которого - «склеенные» котировки по запрошенному типу цены, а на 1-м – накопительная разность гэпов – смещение, обеспечивающая неразрывность. Собственно, безгэповое Close равно оригинальному Close плюс это смещение, High без гэпа = High + смещение и т.д.

iCustom(
   string symbol,       // символьное имя инструмента (NULL- текущий)
   int timeframe,       // тайм-фрейм (0- текущий)
   "KillGap",           // имя этого индикатора
   //
   int GapPoints,       // порог идентификации гэпа в пп.; <0 - без азполнения 1-го буфера - смещения
   int GapHours,        // порог по времени между смежными барами 
                           // >0 - в часах 
                           // <0 - в минутах
   int applied_price,   // тип цены:
                           // 0 - PRICE_CLOSE - цена закрытия 
                           // 1 - PRICE_OPEN - цена открытия
                           // 2 - PRICE_HIGH - макс.цена
                           // 3 - PRICE_LOW - мин.цена
                           // 4 - PRICE_MEDIAN - средняя цена,(high+low)/2
                           // 5 - PRICE_TYPICAL - типичная цена,(high+low+close)/3
                           // 6 - PRICE_WEIGHTED - взвешенная цена закрытия,(high+low+close+close)/4
                           // 7 - объем
   //
   int mode,            // mode - номер буфера индикатора:
                           // 0- буфер безгэповых котировок
                           // 1- буфер смещения - накопительная разница гэпов
   int shift            // сдвиг
  );

Если кинуть его на график, то процесс "склейки" виден наглядно. (безгэповая цена закрытия):


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

Так же можно подготовить безгэповые ценовые массивы заранее в своем цикле пересчета (фрагмент ф-ии start() из Стохастика – там нужно сразу три типа цены и в дальнешем используются функции работы с массивами – ArrayMaximum(…) ):

void start() {
   // граница пересчета
   int limit=Bars-IndicatorCounted()-1;  
   if(limit>1) limit=Bars-1; 
   // заполнение безгэповых ценовых массивов
   for(int i=limit; i>=0; i--) { 
      double base=iCustom(NULL,0,"KillGap",GapPoints,GapHours,0, 1,i); // получить гэповое смещение
      CloseG[i]=Close[i]+base; // позиционируемая цена
      HighG[i] =High[i] +base; // цена поиска максимумов
      LowG[i]  =Low[i]  +base; // цена поиска минимумов
     }
Для правильного отображения индикаторов, рисующихся в окне инструмента (цен), их посчитанные по безгэповым котировкам значения нужно сдвинуть на величину гэпа в обратную сторону (код ф-ии start() индикатора iMA.Gap):
void start() {
   // граница пересчета
   int limit=Bars-IndicatorCounted()-1;  
   if(limit>1) limit=Bars-1; 
   // заполнение буферов безгэповыми котировками и смещением
   for(int i=limit; i>=0; i--) {
      price[i]=iCustom(NULL,0,"KillGap",GapPoints,GapHours,Price, 0,i); // котировки
      base[i] =iCustom(NULL,0,"KillGap",GapPoints,GapHours,Price, 1,i); // смещение
     }
   // расчет индикатора по массиву price[]
   for(i=limit; i>=0; i--) Ind[i]=iMAOnArray(price,Bars,MAperiod,Shift,Method,i)-base[i];
  }

Можно также внедрить код индикатора KillGap в переделываемый индикатор в виде функции, но по быстродействию (проверял) выигрыша не заметил.

В прикрепленном архиве содержатся:
KillGap – индикатор-источник безгэповых котировок и смещения
безгэповые индикаторы:
iATR.Gap – средний торговый диапазон
iBands Gap – полосы Боллинджера
iCCI.Gap – индекс товарного канала
iEnvelops.Gap - конверт
iMa.Gap – скользящая средняя
iMomentum.Gap – моментум
iRSI.Gap – индекс относительной силы
iStdDev.Gap – стандартная девиация
iSAR.Gap – параболик
iStoch.Gap – стохастик
iStoch.GapNR – стохастик с шумодавом

Все индикаторы имеют те же поля, что и их стандартные прототипы, кроме добавленного поля GapPoints – порога идентификации гэпа в пунктах. Временной гэп во всех случаях жестко установлен в 8 часов. Если есть интерес пофильтровать гэпы внутри дня, можете сделать в коде индикаторов глобальную переменную int GapHours внешней, т.е. extern int GapHours. Но в этом мало смысла – гэпы внутри дня обычно затем фильтруются ДЦ.


Nevalyashka_BreakdownLevel Nevalyashka_BreakdownLevel

Продолжение темы "неваляшка". Торговля на пробое цены временного промежутка.

MA-Hector MA-Hector

Индикатор выдает сигнал "BUY" или "SELL" по всем timeframe соответствующей валютной пары

Trall 007 Trall 007

Многоступенчатый трал

Инвестор Инвестор

Конфигурация для автоматической торговли и анализа