//+------------------------------------------------------------------+ //| StochasticDiNapoli.mq4 | //| Copyright © 2010, LenIFCHIK | //|Индикатор написан в соответствии с описанием, приведённым в книге | //|Джо ДиНаполи "Торговля с использованием уровней ДиНаполи". | //|Исходный код содержит уровни перекупленности и перепроданности, | //|но с целью применения индикатора для техники ДиНаполи, данные | //|уровни отключены (отмечены как комментарии знаком "//"). Включение| //|осуществляется путём удаления из начала соответствующих строк | //|символа "//". | //+------------------------------------------------------------------+ #property copyright "Copyright © 2010, LenIFCHIK" #property indicator_separate_window //в отдельном окне #property indicator_minimum 0 //закрёплённый минимум #property indicator_maximum 100 //закреплённый максимум #property indicator_buffers 2 //число буферов индикатора #property indicator_color1 RoyalBlue //цвет линии %K #property indicator_color2 FireBrick //цвет линии %D //---- входные параметры extern int FastK=8; //период линии %K extern int SlowK=3; //период "медленной" %K extern int SlowD=3; //преиод "медленной" %D extern string Levels_display_mode="0 - off, 1 - on"; extern int Levels_ON_OFF=0; //режим отображения уровней перекупленности/перепроданности extern int OBLevel=80; //уровень перекуплнности (по умолчанию не отображается) extern int OSLevel=20; //уровень перепроданности (по умолчанию не отображается) //---- буферы индикатора double StoBuffer[]; //буфер стохастической линии double SigBuffer[]; //буфер сигнальной линии //+------------------------------------------------------------------+ //| Инициализация. Функция Init | //+------------------------------------------------------------------+ int init() { string short_name; //---- отрисовка индикатора SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1); //отрисовка стохастической линии SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,1); //отрисовка сигнальной линии //---- разметка буферов SetIndexBuffer(0,StoBuffer); SetIndexBuffer(1,SigBuffer); //---- имя окна данных и окна индикатора short_name="Stochastic DiNapoli("+FastK+","+SlowK+","+SlowD+")"; IndicatorShortName(short_name); SetIndexLabel(0,"Stoch"); SetIndexLabel(1,"Signal"); //---- начало отрисовки SetIndexDrawBegin(0,FastK); SetIndexDrawBegin(1,FastK); //---- определение уровней switch(Levels_ON_OFF) //режим отображения уровней перекупленности/перепроданности { case 0 : //ОТОБРАЖАЮТСЯ SetLevelValue(1,EMPTY_VALUE); //уровень перекупленности SetLevelValue(2,EMPTY_VALUE); //уровень перепроданности break; case 1 : //ОТОБРАЖАЮТСЯ SetLevelValue(1,OBLevel); //уровень перекупленности SetLevelValue(2,OSLevel); //уровень перепроданности //---- стиль отображения уровней SetLevelStyle(STYLE_DOT,1,Silver); break; default : Levels_ON_OFF=0; //по умолчанию НЕ ОТОБРАЖАЮТСЯ } //---- конец инициализации return(0); } //+------------------------------------------------------------------+ //| Stochastic по DiNapoli | //+------------------------------------------------------------------+ int start() { int i,counted_bars=IndicatorCounted(); double high,low; //---- if(Bars<=FastK) return(0); //---- if(counted_bars<1) for(i=1;i<=FastK;i++) {StoBuffer[Bars-i]=0.0;SigBuffer[Bars-i]=0.0;} //---- i=Bars-FastK-1; if(counted_bars>=FastK) i=Bars-counted_bars-1; while(i>=0) { low=Low[Lowest(NULL,0,MODE_LOW,FastK,i)]; //минимум high=High[Highest(NULL,0,MODE_HIGH,FastK,i)]; //максимум double Fast=(Close[i]-low)/(high-low)*100; //расчёт первичной быстрой линии %К StoBuffer[i]=StoBuffer[i+1]+(Fast-StoBuffer[i+1])/SlowK; //расчёт стохастической линии SigBuffer[i]=SigBuffer[i+1]+(StoBuffer[i]-SigBuffer[i+1])/SlowD; //расчёт сигнальной линии i--; } return(0); } //+------------------------------------------------------------------+