//+------------------------------------------------------------------+ //| Blau_TStoch.mq5 | //| Copyright 2011, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright #property link "http://www.mql5.com" // URL #property description "q-period Stochastic (William Blau)" // description #include // include file (terminal_data_folder\MQL5\Include) //--- indicator settings #property indicator_separate_window // indicator in separate window #property indicator_buffers 6 // number of buffers used #property indicator_plots 1 // indicator plots //--- graphic plot #0 (Main) #property indicator_label1 "TStoch" // graphic plot label #property indicator_type1 DRAW_LINE // draw as a line #property indicator_color1 Blue // line color #property indicator_style1 STYLE_SOLID // line style #property indicator_width1 1 // line width //--- input parameters input int q=5; // q - period for Stochastic input int r=20; // r - 1st EMA, applied to Stochastic input int s=5; // s - 2nd EMA, applied to the 1st smoothing input int u=3; // u - 3rd EMA, applied to the 2nd smoothing input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - applied price //--- dynamic arrays used for calculations double MainBuffer[]; // u-period 3rd EMA (graphic plot #0) double PriceBuffer[]; // price array double LLBuffer[]; // minimal value of the lowest price (q bars) double StochBuffer[]; // q-period stochastic double EMA_StochBuffer[]; // r-period 1st EMA double DEMA_StochBuffer[]; // s-period 2nd EMA //--- global variables int begin1, begin2, begin3, begin4; // starting indexes int rates_total_min; // rates total min //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers // plot buffers // graphic plot #0 SetIndexBuffer(0,MainBuffer,INDICATOR_DATA); // u-period 3rd EMA // buffers for intermediate calculations SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS); // price buffer SetIndexBuffer(2,LLBuffer,INDICATOR_CALCULATIONS); // minimal value of the lowest price (q bars) SetIndexBuffer(3,StochBuffer,INDICATOR_CALCULATIONS); // q-period stochastic SetIndexBuffer(4,EMA_StochBuffer,INDICATOR_CALCULATIONS); // r-period 1st EMA SetIndexBuffer(5,DEMA_StochBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA /* //--- graphic plot #0 (Main) PlotIndexSetString(0,PLOT_LABEL,"TStoch"); // label PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE); // drawing type as a line PlotIndexSetInteger(0,PLOT_LINE_COLOR,Blue); // line color PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // line style PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1); // line width */ //--- precision IndicatorSetInteger(INDICATOR_DIGITS,_Digits); //--- begin1=q-1; // - StochBuffer[], LLBuffer[] begin2=begin1+r-1; // or =(q-1)+(r-1) - EMA_StochBuffer[] begin3=begin2+s-1; // or =(q-1)+(r-1)+(s-1) - DEMA_StochBuffer[] begin4=begin3+u-1; // or =(q-1)+(r-1)+(s-1)+(u-1) - MainBuffer[] // rates_total_min=begin4+1; // rates total min //--- starting index for plot #0 PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4); //--- short indicator name string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u); IndicatorSetString(INDICATOR_SHORTNAME,"Blau_TStoch("+shortname+")"); //--- OnInit done return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate( const int rates_total, // rates total const int prev_calculated, // bars, calculated at previous call const datetime &Time[], // Time const double &Open[], // Open const double &High[], // High const double &Low[], // Low const double &Close[], // Close const long &TickVolume[], // Tick Volume const long &Volume[], // Real Volume const int &Spread[] // Spread ) { int i,k,pos; double min; //--- check rates if(rates_totalLow[k]) min=Low[k]; } LLBuffer[i]=min; // calculation of StochBuffer[] - q-period Stochastic StochBuffer[i]=PriceBuffer[i]-LLBuffer[i]; } //--- EMA smoothing // r-period 1st EMA ExponentialMAOnBufferWB( rates_total, // rates total prev_calculated, // bars, calculated at previous call begin1, // starting index r, // smoothing period StochBuffer, // input array EMA_StochBuffer // output array ); // s-period 2nd EMA ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_StochBuffer,DEMA_StochBuffer); // u-period 3rd EMA (graphic plot #0) ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_StochBuffer,MainBuffer); //--- OnCalculate done. Return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+