/* вызов из кодов iCustom( NULL,0,"AsimmetricStochNR", // на текущем тайм-фрейме и инструменте KperiodShort, // младший (короткий) %K KperiodLong, // старший (длинный) %K Dperiod, // %D сигнальная Slowing, // замедление Dmethod, // тип MA сигнальной: 0-SMA, 1-EMA PriceField, // тип цены: 0-High/Low; 1-Close/Close Sens, // чувствительность в пп. OverSold, // уровень ПП в %% N, // буферы: 0- главная, 1- сигнальная, 2- тренд i // смещение ); */ #property indicator_separate_window // в отд. окне #property indicator_buffers 3 #property indicator_color1 Blue // главная #property indicator_style1 0 #property indicator_color2 Red // сигнальная #property indicator_style2 0 #property indicator_maximum 100 #property indicator_minimum 0 #property indicator_level3 50 // входные параметры extern int KperiodShort=5; // %K extern int KperiodLong=12; // %K extern int Dperiod=1; // %D сигнальная double kd; // коэфф. EMA для сигнальной extern int Slowing=3; // замедление extern int Dmethod=0; // тип MA сигнальной: 0-SMA, 1-EMA extern int PriceField=0; // тип цены: 0-High/Low; 1-Close/Close extern int Sens=7; // чувствительность в пп. double sens; // чувствительность в ценах extern int OverSold=20; // уровень ПП в %% int OverBought; int History=0; // история пересчета: 0 - все бары // массивы инд.буферов double Main[], // главная Signal[], // сигнальная Trend[]; // тренд: 0 - вниз, 1 - вверх int init() { sens=Sens*Point; // чувствительность в ценах if(Dmethod==1) kd=2.0/(1+Dperiod); // коэфф. EMA для сигнальной SetLevelValue(0,OverSold); OverBought=100-OverSold; SetLevelValue(1,OverBought); // буфер главной SetIndexBuffer(0,Main); SetIndexStyle(0,DRAW_LINE); string _str="("+KperiodShort+"/"+KperiodLong+","+Slowing+")"; SetIndexLabel(0,"Main"+_str); SetIndexEmptyValue(0,0.0); // буфер сигнальной SetIndexBuffer(1,Signal); SetIndexStyle(1,DRAW_LINE); _str="("+Dperiod+")"; SetIndexLabel(1,"Signal"+_str); SetIndexEmptyValue(0,0.0); // тренд SetIndexBuffer(2,Trend); SetIndexStyle(2,DRAW_NONE); SetIndexLabel(2,"Trend"); SetIndexEmptyValue(0,0.0); // короткое имя if(Sens!=0) string ShName=Sens+" "; ShName=ShName+"Stoch "; if(PriceField==0) ShName=ShName+"H/L"; else ShName=ShName+"C/C"; ShName=ShName+" ("+KperiodShort+"/"+KperiodLong+","+Dperiod+","+Slowing+")"; IndicatorShortName(ShName); } int reinit() // ф-я дополнительной инициализации { ArrayInitialize(Main,0.0); ArrayInitialize(Signal,0.0); ArrayInitialize(Trend,0.0); return(0); } void start() { int ic=IndicatorCounted(); if(Bars-ic-1>1) ic=reinit(); int limit=Bars-ic-1; // кол-во пересчетов int counted_bars = IndicatorCounted(); if(counted_bars < 0) return(-1); if(counted_bars > 0) counted_bars--; limit = Bars - counted_bars; if(counted_bars==0) limit-=1+1; if(History!=0 && limit>History) limit=History-1; // кол-во пересчетов по истории for(int i=limit; i>=0; i--) { // цикл пересчета по ВСЕМ барам // первоначальные значения static bool Kperiod0,Kperiod1,trend; if(i==limit && limit>1) { Kperiod0=KperiodShort; Kperiod1=KperiodShort; trend=0; } // главная Main[i]=Stoch(Kperiod0, Kperiod1, Slowing, PriceField, sens, i); // сигнальнаяё switch(Dmethod) { case 1: // EMA Signal[i]=kd*Main[i]+(1-kd)*Signal[i+1]; break; case 0: // SMA int sh=i+Dperiod; double ma=Signal[i+1]*Dperiod-Main[sh]; Signal[i]=(ma+Main[i])/Dperiod; } // переключение направления if(Signal[i+1]>OverBought) { // аптренд Kperiod0=KperiodShort; Kperiod1=KperiodLong; trend=1; } if(Signal[i+1]>>>>>>>>>>>>>>>>>>>> // стохастик с шумодавом double Stoch(int Kperiod0, int Kperiod1, int Slowing, int PriceField, double sens, int i) { if(i+MathMax(Kperiod0,Kperiod1)+Slowing>Bars) return(-1); // недостаточно баров - выход // экстремумы цены в цикле замедления/сглаживания double max,min,c; for(int j=i; j0) { // если разница >0 (размах меньше порога), то delta=sens; // размах = порогу, min-=diff/2; // новое значение минимума } // вычисление осциллятора if(delta==0) return(-2); // деление на ноль else return(100*(c-min)/delta); // стохастик }