Скачать MetaTrader 5

Смотри, как бесплатно скачать роботов

Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят

Понравился скрипт?
Оцени его работу в терминале MetaTrader 5

2010.05.08 21:45
Индикаторы

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

Просмотров:
4115
Рейтинг:
голосов: 2

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

Вот что получилось с "ножницами и клеем". На график подцеплены 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

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

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

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