//+------------------------------------------------------------------+ //| 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(); if(counted_bars<0) return(-1); if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; if(counted_bars==0) limit-=1+1+Slowing1; 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=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); } //+------------------------------------------------------------------+