Stochastic |
Stochastic |
Stochastic |
Stochastic |
Stochastic |
Stochastic |
Stochastic |
Stochastic |
Stochastic Oscillator developed by Dr. George Lane in the late 1950s. The main idea behind Stochastic Oscilator according to its developer, lies in the fact that rising price tends to close near its previous highs, and falling price tends to close near its previous lows. Dr. George Lane used this oscillator to identify bull and bear set-ups to anticipate a future reversal and is also useful for identifying overbought and oversold levels. Stochastic Oscillator doesn't follow price, it doesn't follow volume or anything like, that it follows the speed or the momentum of price. Stochastic Oscillator is a momentum indicator that shows the location of the close relative to the high-low range over a set number of periods. The Stochastic Oscillator sensitivity to market movements can be reduced by adjusting the time period or by taking a moving average of the result. Stochastic Oscillator attempts to predict turning points by comparing the closing price of a security to its price range. In technical analysis of securities trading, the stochastic oscillator is a momentum indicator that uses support and resistance levels. Stochastic is a momentum oscillator, which consists of two lines: %K - fast line, and %D - slow line. Stochastic is plotted on the scale between 1 and 100. If the Stochastic Oscillator hovers near 100 it signals accumulation. Stochastic lurking near zero indicates distribution. There are also trigger levels that are added to the Stochastic chart at 20 and 80 levels, for some trading strategy is considered the threshold level triggers 50th. Those lines suggest when the market is oversold or overbought once Stochastic lines pass over them. Stochastic Oscillator shows very nicely inputs, outputs and trends. It is recommended to use a trend indicator such as Moving Average Convergence Divergence - MACD, Moving average - MA, VininI Trend WPR MA and the like.
Mathematical Formula:
%K = 100[(C - L14)/(H14 - L14)]
C = the most recent closing price
L14 = the low of the 14 previous trading sessions
H14 = the highest price traded during the same 14-day period.
%D = 3-period moving average of %K
Mathematical Formula:
%K = 100[(C - L14)/(H14 - L14)]
C = the most recent closing price
L14 = the low of the 14 previous trading sessions
H14 = the highest price traded during the same 14-day period.
%D = 3-period moving average of %K
Stochastic - Stoch. MQ4 Code Base (Copy Code)
//+------------------------------------------------------------------+ //| Stochastic.mq4 | //| Copyright © 2004, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2004, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" #property indicator_separate_window #property indicator_minimum 0 #property indicator_maximum 100 #property indicator_buffers 2 #property indicator_color1 LightSeaGreen #property indicator_color2 Red //---- input parameters extern int KPeriod=5; extern int DPeriod=3; extern int Slowing=3; //---- buffers double MainBuffer[]; double SignalBuffer[]; double HighesBuffer[]; double LowesBuffer[]; //---- int draw_begin1=0; int draw_begin2=0; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { string short_name; //---- 2 additional buffers are used for counting. IndicatorBuffers(4); SetIndexBuffer(2, HighesBuffer); SetIndexBuffer(3, LowesBuffer); //---- indicator lines SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0, MainBuffer); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(1, SignalBuffer); //---- name for DataWindow and indicator subwindow label short_name="Sto("+KPeriod+","+DPeriod+","+Slowing+")"; IndicatorShortName(short_name); SetIndexLabel(0,short_name); SetIndexLabel(1,"Signal"); //---- draw_begin1=KPeriod+Slowing; draw_begin2=draw_begin1+DPeriod; SetIndexDrawBegin(0,draw_begin1); SetIndexDrawBegin(1,draw_begin2); //---- return(0); } //+------------------------------------------------------------------+ //| Stochastic oscillator | //+------------------------------------------------------------------+ int start() { int i,k; int counted_bars=IndicatorCounted(); double price; //---- if(Bars<=draw_begin2) return(0); //---- initial zero if(counted_bars<1) { for(i=1;i<=draw_begin1;i++) MainBuffer[Bars-i]=0; for(i=1;i<=draw_begin2;i++) SignalBuffer[Bars-i]=0; } //---- minimums counting i=Bars-KPeriod; if(counted_bars>KPeriod) i=Bars-counted_bars-1; while(i>=0) { double min=1000000; k=i+KPeriod-1; while(k>=i) { price=Low[k]; if(min>price) min=price; k--; } LowesBuffer[i]=min; i--; } //---- maximums counting i=Bars-KPeriod; if(counted_bars>KPeriod) i=Bars-counted_bars-1; while(i>=0) { double max=-1000000; k=i+KPeriod-1; while(k>=i) { price=High[k]; if(max<price) max=price; k--; } HighesBuffer[i]=max; i--; } //---- %K line i=Bars-draw_begin1; if(counted_bars>draw_begin1) i=Bars-counted_bars-1; while(i>=0) { double sumlow=0.0; double sumhigh=0.0; for(k=(i+Slowing-1);k>=i;k--) { sumlow+=Close[k]-LowesBuffer[k]; sumhigh+=HighesBuffer[k]-LowesBuffer[k]; } if(sumhigh==0.0) MainBuffer[i]=100.0; else MainBuffer[i]=sumlow/sumhigh*100; i--; } //---- last counted bar will be recounted if(counted_bars>0) counted_bars--; int limit=Bars-counted_bars; //---- signal line is simple movimg average for(i=0; i<limit; i++) SignalBuffer[i]=iMAOnArray(MainBuffer,Bars,DPeriod,0,MODE_SMA,i); //---- return(0); } //+------------------------------------------------------------------+
Stochastic - Stoch. MQ5 Code Base (Copy Code)
//+------------------------------------------------------------------+ //| Stochastic.mq5 | //| Copyright 2009, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "2009, MetaQuotes Software Corp." #property link "http://www.mql5.com" //--- indicator settings #property indicator_separate_window #property indicator_buffers 4 #property indicator_plots 2 #property indicator_type1 DRAW_LINE #property indicator_type2 DRAW_LINE #property indicator_color1 LightSeaGreen #property indicator_color2 Red #property indicator_style2 STYLE_DOT //--- input parameters input int InpKPeriod=5; // K period input int InpDPeriod=3; // D period input int InpSlowing=3; // Slowing //--- indicator buffers double ExtMainBuffer[]; double ExtSignalBuffer[]; double ExtHighesBuffer[]; double ExtLowesBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,ExtMainBuffer,INDICATOR_DATA); SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA); SetIndexBuffer(2,ExtHighesBuffer,INDICATOR_CALCULATIONS); SetIndexBuffer(3,ExtLowesBuffer,INDICATOR_CALCULATIONS); //--- set accuracy IndicatorSetInteger(INDICATOR_DIGITS,2); //--- set levels IndicatorSetInteger(INDICATOR_LEVELS,2); IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20); IndicatorSetDouble(INDICATOR_LEVELVALUE,1,80); //--- set maximum and minimum for subwindow IndicatorSetDouble(INDICATOR_MINIMUM,0); IndicatorSetDouble(INDICATOR_MAXIMUM,100); //--- name for DataWindow and indicator subwindow label IndicatorSetString(INDICATOR_SHORTNAME,"Stoch("+(string)InpKPeriod+","+(string)InpDPeriod+","+(string)InpSlowing+")"); PlotIndexSetString(0,PLOT_LABEL,"Main"); PlotIndexSetString(1,PLOT_LABEL,"Signal"); //--- sets first bar from what index will be drawn PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2); PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpKPeriod+InpDPeriod); //--- initialization done } //+------------------------------------------------------------------+ //| Stochastic Oscillator | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total,const int prev_calculated, const datetime &Time[], const double &Open[], const double &High[], const double &Low[], const double &Close[], const long &TickVolume[], const long &Volume[], const int &Spread[]) { int i,k,start; //--- check for bars count if(rates_total<=InpKPeriod+InpDPeriod+InpSlowing) return(0); //--- start=InpKPeriod-1; if(start+1<prev_calculated) start=prev_calculated-2; else { for(i=0;i<start;i++) { ExtLowesBuffer[i]=0.0; ExtHighesBuffer[i]=0.0; } } //--- calculate HighesBuffer[] and ExtHighesBuffer[] for(i=start;i<rates_total;i++) { double dmin=1000000.0; double dmax=-1000000.0; for(k=i-InpKPeriod+1;k<=i;k++) { if(dmin>Low[k]) dmin=Low[k]; if(dmax<High[k]) dmax=High[k]; } ExtLowesBuffer[i]=dmin; ExtHighesBuffer[i]=dmax; } //--- %K start=InpKPeriod-1+InpSlowing-1; if(start+1<prev_calculated) start=prev_calculated-2; else { for(i=0;i<start;i++) ExtMainBuffer[i]=0.0; } //--- main cycle for(i=start;i<rates_total;i++) { double sumlow=0.0; double sumhigh=0.0; for(k=(i-InpSlowing+1);k<=i;k++) { sumlow +=(Close[k]-ExtLowesBuffer[k]); sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]); } if(sumhigh==0.0) ExtMainBuffer[i]=100.0; else ExtMainBuffer[i]=sumlow/sumhigh*100; } //--- signal start=InpDPeriod-1; if(start+1<prev_calculated) start=prev_calculated-2; else { for(i=0;i<start;i++) ExtSignalBuffer[i]=0.0; } for(i=start;i<rates_total;i++) { double sum=0.0; for(k=0;k<InpDPeriod;k++) sum+=ExtMainBuffer[i-k]; ExtSignalBuffer[i]=sum/InpDPeriod; } //--- OnCalculate done. Return new prev_calculated. return(rates_total); } //+------------------------------------------------------------------+