//------------------------------------------------------------------ #property copyright "mladen" #property link "mladenfx@gmail.com" #property version "1.00" //------------------------------------------------------------------ #property indicator_chart_window #property indicator_buffers 13 #property indicator_plots 2 #property indicator_minimum -1 #property indicator_maximum 101 #property indicator_label1 "Double smoothed stochastic" #property indicator_type1 DRAW_COLOR_BARS #property indicator_color1 clrDeepSkyBlue,clrBurlyWood,clrNONE #property indicator_width1 2 #property indicator_label2 "Double smoothed stochastic" #property indicator_type2 DRAW_COLOR_LINE #property indicator_color2 clrLimeGreen,clrSandyBrown,clrSilver #property indicator_style2 STYLE_SOLID #property indicator_width2 2 // // // // // enum enPrices { pr_close, // Close pr_open, // Open pr_high, // High pr_low, // Low pr_median, // Median pr_typical, // Typical pr_weighted, // Weighted pr_average, // Average (high+low+open+close)/4 pr_medianb, // Average median body (open+close)/2 pr_tbiased, // Trend biased price pr_haclose, // Heiken ashi close pr_haopen , // Heiken ashi open pr_hahigh, // Heiken ashi high pr_halow, // Heiken ashi low pr_hamedian, // Heiken ashi median pr_hatypical, // Heiken ashi typical pr_haweighted, // Heiken ashi weighted pr_haaverage, // Heiken ashi average pr_hamedianb, // Heiken ashi median body pr_hatbiased // Heiken ashi trend biased price }; enum enStyles { st_automatic, // automatically adjust style st_bars, // view as bars st_candles, // view as candles st_line // view as line }; input int StochasticPeriod = 55; // Stochastic period input int EMAPeriod = 15; // Smoothing period input int EMAPeriod2 = 7; // Smoothing period input enPrices PriceForHigh = pr_high; // Price to use for high input enPrices PriceForLow = pr_low; // Price to use for low input enPrices PriceForClose = pr_close; // Price to use for close input enStyles Style = st_automatic; // Style input double UpLevel = 80.0; // Overbought level input double DnLevel = 20.0; // Oversold level input color ColorUp = clrDeepSkyBlue; // Up color input color ColorDown = clrSandyBrown; // Down color // // // // // double StochasticBuffer[]; double calcBuffer[]; double calcBuffer1[]; double barh[]; double barl[]; double baro[]; double barc[]; double colorBuffer[]; double line[]; double cololBuffer[]; double prh[],prl[],prc[]; //------------------------------------------------------------------ // //------------------------------------------------------------------ // // // // int OnInit() { SetIndexBuffer(0,baro ,INDICATOR_DATA); SetIndexBuffer(1,barh ,INDICATOR_DATA); SetIndexBuffer(2,barl ,INDICATOR_DATA); SetIndexBuffer(3,barc ,INDICATOR_DATA); SetIndexBuffer(4,colorBuffer ,INDICATOR_COLOR_INDEX); SetIndexBuffer(5,line ,INDICATOR_DATA); SetIndexBuffer(6,cololBuffer ,INDICATOR_COLOR_INDEX); SetIndexBuffer(7,StochasticBuffer,INDICATOR_CALCULATIONS); SetIndexBuffer(8,calcBuffer ,INDICATOR_CALCULATIONS); SetIndexBuffer(9,calcBuffer1 ,INDICATOR_CALCULATIONS); SetIndexBuffer(10,prh ,INDICATOR_CALCULATIONS); SetIndexBuffer(11,prl ,INDICATOR_CALCULATIONS); SetIndexBuffer(12,prc ,INDICATOR_CALCULATIONS); IndicatorSetInteger(INDICATOR_LEVELS,2); IndicatorSetDouble(INDICATOR_LEVELVALUE,0,UpLevel); IndicatorSetDouble(INDICATOR_LEVELVALUE,1,DnLevel); IndicatorSetInteger(INDICATOR_LEVELCOLOR,DimGray); IndicatorSetString(INDICATOR_SHORTNAME,"Double smoothe stochastic ("+(string)StochasticPeriod+","+(string)EMAPeriod+")"); return(0); } //------------------------------------------------------------------ // //------------------------------------------------------------------ // // // // 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& tick_volume[], const long& volume[], const int& spread[]) { // // // // // static bool styleSetUp = false; static int styleInUse = -1; static int styleToUse; int style = (int)ChartGetInteger(0,CHART_MODE,0); // // // // // if (!styleSetUp || (Style==st_automatic && styleInUse!=style)) { if (Style==st_automatic) switch(style) { case CHART_BARS: styleToUse = DRAW_COLOR_BARS; break; case CHART_CANDLES: styleToUse = DRAW_COLOR_CANDLES; break; case CHART_LINE: styleToUse = DRAW_COLOR_LINE; break; } else switch(Style) { case st_bars: styleToUse = DRAW_COLOR_BARS; break; case st_candles: styleToUse = DRAW_COLOR_CANDLES; break; case st_line: styleToUse = DRAW_COLOR_LINE; break; } styleInUse = style; // // // // // if (styleToUse==DRAW_COLOR_LINE) { PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrNONE); PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrNONE); PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrNONE); PlotIndexSetInteger(1,PLOT_LINE_COLOR,0,ColorUp); PlotIndexSetInteger(1,PLOT_LINE_COLOR,1,ColorDown); } else { PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,ColorUp); PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,ColorDown); PlotIndexSetInteger(1,PLOT_LINE_COLOR,0,clrNONE); PlotIndexSetInteger(1,PLOT_LINE_COLOR,1,clrNONE); PlotIndexSetInteger(1,PLOT_LINE_COLOR,2,clrNONE); PlotIndexSetInteger(0,PLOT_DRAW_TYPE,styleToUse); } } // // // // // double alpha = 2.0/(1.0+EMAPeriod); double alpha1 = 2.0/(1.0+EMAPeriod2); // // // // // for (int i=(int)MathMax(prev_calculated-1,1); i=0; k++) max = MathMax(max,prh[i-k]); double min = prl[i]; for(int k=1; k=0; k++) min = MathMin(min,prl[i-k]); double sto = 0; if (max!=min) sto = (prc[i]-min)/(max-min)*100.00; calcBuffer[i] = calcBuffer[i-1]+alpha*(sto-calcBuffer[i-1]); // // // // // max = calcBuffer[i]; for(int k=1; k=0; k++) max = MathMax(max,calcBuffer[i-k]); min = calcBuffer[i]; for(int k=1; k=0; k++) min = MathMin(min,calcBuffer[i-k]); if (max!=min) sto = (calcBuffer[i]-min)/(max-min)*100.00; else sto = 0; calcBuffer1[i] = calcBuffer1[i-1]+alpha*(sto-calcBuffer1[i-1]); StochasticBuffer[i] = StochasticBuffer[i-1]+alpha1*(calcBuffer1[i]-StochasticBuffer[i-1]); baro[i] = open[i]; barc[i] = close[i]; barh[i] = high[i]; barl[i] = low[i]; line[i] = close[i]; if (i>0) { colorBuffer[i] = 2; cololBuffer[i] = 2; if (StochasticBuffer[i]>UpLevel) { cololBuffer[i]= 0; colorBuffer[i]= 0; } if (StochasticBuffer[i]=pr_haclose) { int bars = Bars(NULL,0); if (ArrayRange(workHa,0)!= bars) ArrayResize(workHa,bars); instanceNo *= 4; // // // // // double haOpen; if (i>0) haOpen = (workHa[i-1][instanceNo+2] + workHa[i-1][instanceNo+3])/2.0; else haOpen = (open[i]+close[i])/2; double haClose = (open[i] + high[i] + low[i] + close[i]) / 4.0; double haHigh = MathMax(high[i], MathMax(haOpen,haClose)); double haLow = MathMin(low[i] , MathMin(haOpen,haClose)); if(haOpen haOpen) return((haHigh+haClose)/2.0); else return((haLow+haClose)/2.0); } } // // // // // switch (price) { case pr_close: return(close[i]); case pr_open: return(open[i]); case pr_high: return(high[i]); case pr_low: return(low[i]); case pr_median: return((high[i]+low[i])/2.0); case pr_medianb: return((open[i]+close[i])/2.0); case pr_typical: return((high[i]+low[i]+close[i])/3.0); case pr_weighted: return((high[i]+low[i]+close[i]+close[i])/4.0); case pr_average: return((high[i]+low[i]+close[i]+open[i])/4.0); case pr_tbiased: if (close[i]>open[i]) return((high[i]+close[i])/2.0); else return((low[i]+close[i])/2.0); } return(0); }