//+------------------------------------------------------------------+ //| ProjectName | //| Copyright 2012, CompanyName | //| http://www.companyname.net | //+------------------------------------------------------------------+ /* вызов из кодов 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 // сдвиг ); ============== iCustom(NULL,0,"KillGap",GapPoints,GapHours,Price, 0,i); // котировки iCustom(NULL,0,"KillGap",GapPoints,GapHours,Price, 1,i); // смещение */ #property indicator_chart_window #property indicator_buffers 2 // входные параметры extern int GapPoints=33; // порог идентификации гэпа в пп. double gp; // порог идентификации гэпа в ценах bool kg=0; // 1- убивать гэп bool ZeroBase=1; // 0 - без смещения; буфер base[] заполняется нулями extern int GapHours=24; // порог по времени смежных баров в часах (>0) или минутах (<0) int gt; // порог по времени в секундах extern int Price=0; // тип цены // инд.буферы double price[],// буфер безгэповых котировок base[]; // буфер смещения //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void init() { if(GapPoints<0) {kg=1; GapPoints=-GapPoints; ZeroBase=0;} // 0 - без смещения if(GapPoints>0) {kg=1; gp=GapPoints*Point;} // порог идентификации гэпа в ценах if(GapHours>0) gt=GapHours*3600; else gt=-GapHours*60; // порог по времени в секундах SetIndexBuffer(0,price); // буфер безгэповых котировок SetIndexLabel(0,"Price "+GapPoints+"p."); SetIndexBuffer(1,base); // буфер смещения SetIndexLabel(1,"Base "+GapHours+"h."); IndicatorDigits(5); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void start() { // граница пересчета static datetime gtime; // время гэпа // int limit=Bars-IndicatorCounted()-1; // if(limit>1) {limit=Bars-1; gtime=0;} int counted_bars=IndicatorCounted(); if(counted_bars<0) return(-1); if(counted_bars>0) counted_bars--; int limit=Bars-counted_bars; if(counted_bars==0) limit-=1+1; // заполнение массива безгэповыми котировками for(int i=limit; i>=0; i--) { if(kg*(gtime!=Time[i])) { static double base_i; // смещение, корректирующее гэп double gap=Close[i+1]-Open[i]; // величина гэпа в ценах if((MathAbs(gap)>=gp)*(Time[i]-Time[i+1]>gt)) { base_i+=gap; // вычисление смещения gtime=Time[i]; // время гэпа } } if(i==limit && i>1) base_i=0; // инициализация base[i]=ZeroBase*base_i; // смещение // выбор цены switch(Price) { case 0: double p=Close[i]; break; case 1: p=Open[i]; break; case 2: p=High[i]; break; case 20: p=(2*High[i]+Low[i]+Close[i])/4; break; // Weighted High case 3: p=Low[i]; break; case 30: p=(High[i]+2*Low[i]+Close[i])/4; break; // Weighted Low case 4: p=(High[i]+Low[i])/2; break; // Middle case 5: p=(High[i]+Low[i]+Close[i])/3; break; // Typical case 6: p=(High[i]+Low[i]+2*Close[i])/4; break; // Weighted case 7: p=Volume[i]-base_i; break; default: p=Close[i]; } price[i]=p+base_i; // котировки } } //+------------------------------------------------------------------+