//------------------------------------------------------------------ #property copyright "www.forex-tsd.com" #property link "www.forex-tsd.com" //------------------------------------------------------------------ #property indicator_separate_window #property indicator_buffers 6 #property indicator_plots 2 #property indicator_label1 "Rapid RSi of adaptive T3" #property indicator_type1 DRAW_COLOR_HISTOGRAM2 #property indicator_color1 clrLimeGreen,clrOrange #property indicator_style1 STYLE_SOLID #property indicator_width1 2 #property indicator_label2 "Rapid RSi of adaptive T3" #property indicator_type2 DRAW_COLOR_LINE #property indicator_color2 clrLimeGreen,clrOrange #property indicator_style2 STYLE_SOLID #property indicator_width2 2 #property indicator_minimum -1 #property indicator_maximum 101 // // // // // // // // // // 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 }; input int RsiPeriod = 25; // Rsi period input double T3Period = 15; // T3 Calculation period input double T3Hot = 0.7; // T3 hot value input bool T3Original = true; // T3 original Tillson calculation? input enPrices Price = pr_close; // Price to use input int AdaptivePeriod = 25; // Period for adapting input color ColorFrom = clrOrchid; // Color down input color ColorTo = clrLime; // Color Up input int ColorSteps = 20; // Color steps for drawing input bool ShowLine = true; // Show colored line // // // // // // double rsi[]; double rsiha[]; double rsihb[]; double t3[]; double colorBuffeh[]; double colorBuffer[]; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ // // // // // int cSteps; int OnInit() { SetIndexBuffer(0,rsiha,INDICATOR_DATA); SetIndexBuffer(1,rsihb,INDICATOR_DATA); SetIndexBuffer(2,colorBuffeh,INDICATOR_COLOR_INDEX); SetIndexBuffer(3,rsi,INDICATOR_DATA); SetIndexBuffer(4,colorBuffer,INDICATOR_COLOR_INDEX); SetIndexBuffer(5,t3,INDICATOR_CALCULATIONS); cSteps = (ColorSteps>1) ? ColorSteps : 2; PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,cSteps+1); PlotIndexSetInteger(1,PLOT_COLOR_INDEXES,cSteps+1); for (int i=0;i=0; k++) { diff = t3[i-k]- t3[i-k-1]; if(diff>0) up += diff; else down -= diff; } if(up + down == 0) rsi[i] = 50; else rsi[i] = 100 * up / (up + down); rsiha[i] = rsi[i]; rsihb[i] = 50; colorBuffer[i] = MathFloor(rsi[i]*cSteps/100.0); colorBuffeh[i] = MathFloor(rsi[i]*cSteps/100.0); } return(rates_total); } //------------------------------------------------------------------ // //------------------------------------------------------------------ // // // // // double workDev[]; double iDeviation(double price, double dMA, int period, int totalBars, int i) { if (ArrayRange(workDev,0)!= totalBars) ArrayResize(workDev,totalBars); workDev[i] = price; double dSum = 0; for(int k=0; (i-k)>=0 && k=period) workSma[r][instanceNo+1] = workSma[r-1][instanceNo+1]+(workSma[r][instanceNo]-workSma[r-period][instanceNo])/period; else { workSma[r][instanceNo+1] = 0; for(k=0; k=0; k++) workSma[r][instanceNo+1] += workSma[r-k][instanceNo]; workSma[r][instanceNo+1] /= k; } return(workSma[r][instanceNo+1]); } //------------------------------------------------------------------ // //------------------------------------------------------------------ // // // // // double workT3[][6]; double workT3Coeffs[][6]; #define _period 0 #define _c1 1 #define _c2 2 #define _c3 3 #define _c4 4 #define _alpha 5 // // // // // double iT3(double price, double period, double hot, bool original, int r, int bars, int instanceNo=0) { if (ArrayRange(workT3,0) != bars) ArrayResize(workT3,bars); if (ArrayRange(workT3Coeffs,0) < (instanceNo+1)) ArrayResize(workT3Coeffs,instanceNo+1); if (workT3Coeffs[instanceNo][_period] != period) { workT3Coeffs[instanceNo][_period] = period; double a = hot; workT3Coeffs[instanceNo][_c1] = -a*a*a; workT3Coeffs[instanceNo][_c2] = 3*a*a+3*a*a*a; workT3Coeffs[instanceNo][_c3] = -6*a*a-3*a-3*a*a*a; workT3Coeffs[instanceNo][_c4] = 1+3*a+a*a*a+3*a*a; if (original) workT3Coeffs[instanceNo][_alpha] = 2.0/(1.0 + period); else workT3Coeffs[instanceNo][_alpha] = 2.0/(2.0 + (period-1.0)/2.0); } // // // // // int buffer = instanceNo*6; if (r == 0) { workT3[r][0+buffer] = price; workT3[r][1+buffer] = price; workT3[r][2+buffer] = price; workT3[r][3+buffer] = price; workT3[r][4+buffer] = price; workT3[r][5+buffer] = price; } else { workT3[r][0+buffer] = workT3[r-1][0+buffer]+workT3Coeffs[instanceNo][_alpha]*(price -workT3[r-1][0+buffer]); workT3[r][1+buffer] = workT3[r-1][1+buffer]+workT3Coeffs[instanceNo][_alpha]*(workT3[r][0+buffer]-workT3[r-1][1+buffer]); workT3[r][2+buffer] = workT3[r-1][2+buffer]+workT3Coeffs[instanceNo][_alpha]*(workT3[r][1+buffer]-workT3[r-1][2+buffer]); workT3[r][3+buffer] = workT3[r-1][3+buffer]+workT3Coeffs[instanceNo][_alpha]*(workT3[r][2+buffer]-workT3[r-1][3+buffer]); workT3[r][4+buffer] = workT3[r-1][4+buffer]+workT3Coeffs[instanceNo][_alpha]*(workT3[r][3+buffer]-workT3[r-1][4+buffer]); workT3[r][5+buffer] = workT3[r-1][5+buffer]+workT3Coeffs[instanceNo][_alpha]*(workT3[r][4+buffer]-workT3[r-1][5+buffer]); } // // // // // return(workT3Coeffs[instanceNo][_c1]*workT3[r][5+buffer] + workT3Coeffs[instanceNo][_c2]*workT3[r][4+buffer] + workT3Coeffs[instanceNo][_c3]*workT3[r][3+buffer] + workT3Coeffs[instanceNo][_c4]*workT3[r][2+buffer]); } //------------------------------------------------------------------ // //------------------------------------------------------------------ // // // // // // double workHa[][4]; double getPrice(int price, const double& open[], const double& close[], const double& high[], const double& low[], int i, int bars, int instanceNo=0) { if (price>=pr_haclose) { if (ArrayRange(workHa,0)!= bars) ArrayResize(workHa,bars); // // // // // 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); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ // // // // // color getColor(int stepNo, int totalSteps, color from, color to) { double stes = (double)totalSteps-1.0; double step = (from-to)/(stes); return((color)round(from-step*stepNo)); } color gradientColor(int step, int totalSteps, color from, color to) { color newBlue = getColor(step,totalSteps,(from & 0XFF0000)>>16,(to & 0XFF0000)>>16)<<16; color newGreen = getColor(step,totalSteps,(from & 0X00FF00)>> 8,(to & 0X00FF00)>> 8) <<8; color newRed = getColor(step,totalSteps,(from & 0X0000FF) ,(to & 0X0000FF) ) ; return(newBlue+newGreen+newRed); }