//------------------------------------------------------------------ #property copyright "© mladen, 2016, MetaQuotes Software Corp." #property link "www.forex-tsd.com, www.mql5.com" #property description "This T3 uses two methods for calculating T3" #property description " " #property description " 1 - The original Tim Tillson way" #property description " 2 - And the modified Bob Fulks / Alex Matulich way" #property description " " #property description "Modified version is a bit 'faster' in response to price changes" //------------------------------------------------------------------ #property indicator_chart_window #property indicator_buffers 6 #property indicator_plots 3 #property indicator_label1 "t3 zone" #property indicator_type1 DRAW_FILLING #property indicator_color1 clrGainsboro #property indicator_label2 "t3 middle" #property indicator_type2 DRAW_LINE #property indicator_style2 STYLE_DOT #property indicator_color2 clrGray #property indicator_label3 "t3" #property indicator_type3 DRAW_COLOR_LINE #property indicator_color3 clrDarkGray,clrLimeGreen,clrOrangeRed #property indicator_width3 3 // // // // // 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_tbiased2, // Trend biased (extreme) 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 pr_hatbiased2 // Heiken ashi trend biased (extreme) price }; enum chgColor { chg_onSlope, // change color on slope change chg_onLevel, // Change color on outer levels cross chg_onMiddle // Change color on middle level cross }; input ENUM_TIMEFRAMES TimeFrame = PERIOD_CURRENT; // Time frame input double T3Period = 25; // T3 period input double T3Hot = 0.7; // T3 hot input bool T3Original = false; // T3 original (Tim Tillson) way? input enPrices T3Price = pr_close; // Average price input chgColor ColorOn = chg_onLevel; // Color change on : input int FlPeriod = 25; // Period for finding floating levels input double FlUp = 90; // Upper level % input double FlDown = 10; // Lower level % input bool AlertsOn = false; // Turn alerts on? input bool AlertsOnCurrent = true; // Alert on current bar? input bool AlertsMessage = true; // Display messageas on alerts? input bool AlertsSound = false; // Play sound on alerts? input bool AlertsEmail = false; // Send email on alerts? input bool AlertsNotify = false; // Send push notification on alerts? input bool Interpolate = true; // Interpolate when in multi time frame mode? double t3[],t3c[],mid[],fup[],fdn[],count[]; ENUM_TIMEFRAMES timeFrame; //------------------------------------------------------------------ // //------------------------------------------------------------------ // // // // // int OnInit() { SetIndexBuffer(0,fup,INDICATOR_DATA); SetIndexBuffer(1,fdn,INDICATOR_DATA); SetIndexBuffer(2,mid,INDICATOR_DATA); SetIndexBuffer(3,t3 ,INDICATOR_DATA); SetIndexBuffer(4,t3c,INDICATOR_COLOR_INDEX); SetIndexBuffer(5,count,INDICATOR_CALCULATIONS); timeFrame = MathMax(_Period,TimeFrame); IndicatorSetString(INDICATOR_SHORTNAME,timeFrameToString(timeFrame)+" T3 floating levels ("+(string)T3Period+")"); 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[]) { if (Bars(_Symbol,_Period)0 && !IsStopped(); limit--) if (count[limit]==_processed) break; for (i=MathMin(limit,MathMax(prev_calculated-1,0)); i 0 && time[i-n] >= currTime[0]; n++) continue; for(k=1; (i-k)>=0 && k=0; k++) { lo = MathMin(lo,t3[i-k]); hi = MathMax(hi,t3[i-k]); } double rn = hi-lo; fup[i] = lo+rn*FlUp /100.0; fdn[i] = lo+rn*FlDown/100.0; mid[i] = (fup[i]+fdn[i])/2; switch (ColorOn) { case chg_onLevel : t3c[i] = (t3[i]>fup[i]) ? 1 : (t3[i]mid[i]) ? 1 : (t3[i]0) ? (t3[i]>t3[i-1]) ? 1 : (t3[i]0) ? workT3[r-1][k+buffer] : price; if (r>0 && period>1) { 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]); } //------------------------------------------------------------------ // //------------------------------------------------------------------ // // // // // // #define priceInstances 1 double workHa[][priceInstances*4]; double getPrice(int tprice, const double& open[], const double& close[], const double& high[], const double& low[], int i,int _bars, int instanceNo=0) { if (tprice>=pr_haclose) { 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); case pr_hatbiased2: if (haClose>haOpen) return(haHigh); if (haCloseopen[i]) return((high[i]+close[i])/2.0); else return((low[i]+close[i])/2.0); case pr_tbiased2: if (close[i]>open[i]) return(high[i]); if (close[i]=0) start = foundAt; else break; } string indicatorName = StringSubstr(progPath,start+1); indicatorName = StringSubstr(indicatorName,0,StringLen(indicatorName)-4); return(indicatorName); } // // // // // int _tfsPer[]={PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M20,PERIOD_M30,PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8,PERIOD_H12,PERIOD_D1,PERIOD_W1,PERIOD_MN1}; string _tfsStr[]={"1 minute","2 minutes","3 minutes","4 minutes","5 minutes","6 minutes","10 minutes","12 minutes","15 minutes","20 minutes","30 minutes","1 hour","2 hours","3 hours","4 hours","6 hours","8 hours","12 hours","daily","weekly","monthly"}; string timeFrameToString(int period) { if (period==PERIOD_CURRENT) period = _Period; int i; for(i=ArraySize(_tfsPer)-1;i>=0;i--) if(period==_tfsPer[i]) break; return(_tfsStr[i]); }