//+------------------------------------------------------------------+ //| Copyright © 2010, Ivan Kornilov| //| StochasticExpansion_v1.1.mq4| //+------------------------------------------------------------------+ #property copyright "Copyright © 2010, Ivan Kornilov. All rights reserved." #property link "excelf@gmail.com" #property indicator_separate_window #property indicator_buffers 2 #property indicator_color1 SteelBlue #property indicator_color2 OrangeRed #property indicator_level1 5 #property indicator_level2 -5 #property indicator_level3 10 #property indicator_level4 10 #property indicator_level5 0 extern int KPeriod1 = 13; extern int Slowing1 = 6; extern int NoiseFilter = 6; double blue[]; double red[]; double HighesBuffer1[]; double LowesBuffer1[]; double KLineBuffer1[]; double KLineBuffer2[]; int init() { IndicatorBuffers(6); SetIndexBuffer(0, blue); SetIndexBuffer(1, red); //SetIndexStyle(0, DRAW_HISTOGRAM);SetIndexStyle(1, DRAW_HISTOGRAM); SetIndexBuffer(2, HighesBuffer1); SetIndexBuffer(3, LowesBuffer1); SetIndexBuffer(4, KLineBuffer1); SetIndexBuffer(5, KLineBuffer2); IndicatorShortName("StochasticExpansion_v1.1("+KPeriod1+","+Slowing1+")"); return(0); } int limit; int start(){ int counted_bars=IndicatorCounted(); limit = Bars - counted_bars; if(counted_bars > 0) { limit = Bars - counted_bars - 1; } minimumsCounting(LowesBuffer1, KPeriod1); maximumsCounting(HighesBuffer1, KPeriod1); KLine(KLineBuffer1, KLineBuffer2, HighesBuffer1, LowesBuffer1, Slowing1); for(int i = limit; i >= 0; i--) { double value = iMAOnArray(KLineBuffer1, Bars, NoiseFilter, 0, 0, i); if( value < KLineBuffer1[i] ) { blue[i] = KLineBuffer1[i]; red[i] = EMPTY_VALUE; blue[i+1] = KLineBuffer1[i+1]; } else { blue[i] = EMPTY_VALUE; red[i] = KLineBuffer1[i]; red[i+1] = KLineBuffer1[i+1]; } } } void minimumsCounting(double &LowesBuffer[], int KPeriod) { for(int i = limit; i>=0; i--) { LowesBuffer[i] = Low[iLowest(NULL,0,MODE_LOW, KPeriod, i)]; } } void maximumsCounting(double &HighesBuffer[], int KPeriod) { for(int i = limit; i>=0; i--) { HighesBuffer[i] = High[iHighest(NULL,0,MODE_HIGH, KPeriod, i)]; } } void KLine(double &KLineBuffer1[], double &KLineBuffer2[], double HighesBuffer[], double LowesBuffer[], int Slowing) { for(int i = limit; i>=0; i--) { double sumlow=0; double sumhigh=0; for(int k = i + Slowing - 1; k >= i; k--) { sumlow += Close[k] - LowesBuffer[k]; sumhigh += HighesBuffer[k] - Close[k]; } if(sumhigh == 0.0) { KLineBuffer1[i] = 0; } else { KLineBuffer1[i] = sumlow / sumhigh; } if(sumlow == 0.0) { KLineBuffer2[i] = 0; } else { KLineBuffer2[i] = -sumhigh / sumlow; } KLineBuffer1[i] = KLineBuffer1[i] + KLineBuffer2[i]; } return(0); }