//------------------------------------------------------------------ #property copyright "© mladen, 2018" #property link "mladenfx@gmail.com" #property description "TEMA - Jurik volty adaptive" //------------------------------------------------------------------ #property indicator_chart_window #property indicator_buffers 2 #property indicator_plots 1 #property indicator_label1 "TEMA - Jurik volty adaptive" #property indicator_type1 DRAW_COLOR_LINE #property indicator_color1 clrDarkGray,clrDeepPink,clrLimeGreen #property indicator_width1 2 //--- input parameters input double inpPeriod = 27; // Period input ENUM_APPLIED_PRICE inpPrice = PRICE_CLOSE; // Price //--- indicator buffers double val[],valc[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,val,INDICATOR_DATA); SetIndexBuffer(1,valc,INDICATOR_COLOR_INDEX); //--- indicator short name assignment IndicatorSetString(INDICATOR_SHORTNAME,"TEMA Jurik volty adative("+(string)inpPeriod+")"); //--- return (INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator de-initialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ 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) ?(val[i]>val[i-1]) ? 2 :(val[i]0) ? price - wrk[r-1][bsmax] : 0; double del2 = (r>0) ? price - wrk[r-1][bsmin] : 0; wrk[r][voltya]=0; if(MathAbs(del1) > MathAbs(del2)) wrk[r][voltya] = MathAbs(del1); if(MathAbs(del1) < MathAbs(del2)) wrk[r][voltya] = MathAbs(del2); wrk[r][vsum]=(r>9) ? wrk[r-1][vsum]+0.1*(wrk[r][voltya]-wrk[r-10][voltya]) : wrk[r][voltya]; double avg=wrk[r][vsum]; int k=1; for(; k=0; k++) avg+=wrk[r-k][vsum]; avg/=k; wrk[r][avolty]=avg; double dVolty=(wrk[r][avolty]>0) ? wrk[r][voltya]/wrk[r][avolty]: 0; if(dVolty > MathPow(len1,1.0/pow1)) dVolty = MathPow(len1,1.0/pow1); if(dVolty < 1) dVolty = 1.0; // //--- // double pow2 = MathPow(dVolty, pow1); double len2 = MathSqrt(0.5*(length-1))*len1; double Kv = MathPow(len2/(len2+1), MathSqrt(pow2)); if(del1 > 0) wrk[r][bsmax] = price; else wrk[r][bsmax] = price - Kv*del1; if(del2 < 0) wrk[r][bsmin] = price; else wrk[r][bsmin] = price - Kv*del2; // //--- // double _temp=(wrk[r][vsum]!=0) ? wrk[r][avolty]/wrk[r][vsum]: 1; return(_temp); } // //--- // double workTema[][3]; #define _tema1 0 #define _tema2 1 #define _tema3 2 double iTema(double price, double period, int r, int bars, int instanceNo=0) { if (ArrayRange(workTema,0)!= bars) ArrayResize(workTema,bars); instanceNo*=3; // //--- // workTema[r][_tema1+instanceNo] = price; workTema[r][_tema2+instanceNo] = price; workTema[r][_tema3+instanceNo] = price; if (r>0 && period>1) { double alpha = 2.0 / (1.0+period); workTema[r][_tema1+instanceNo] = workTema[r-1][_tema1+instanceNo]+alpha*(price -workTema[r-1][_tema1+instanceNo]); workTema[r][_tema2+instanceNo] = workTema[r-1][_tema2+instanceNo]+alpha*(workTema[r][_tema1+instanceNo]-workTema[r-1][_tema2+instanceNo]); workTema[r][_tema3+instanceNo] = workTema[r-1][_tema3+instanceNo]+alpha*(workTema[r][_tema2+instanceNo]-workTema[r-1][_tema3+instanceNo]); } return(workTema[r][_tema3+instanceNo]+3.0*(workTema[r][_tema1+instanceNo]-workTema[r][_tema2+instanceNo])); } // //--- // double getPrice(ENUM_APPLIED_PRICE tprice,const double &open[],const double &close[],const double &high[],const double &low[],int i,int _bars) { if(i>=0) switch(tprice) { case PRICE_CLOSE: return(close[i]); case PRICE_OPEN: return(open[i]); case PRICE_HIGH: return(high[i]); case PRICE_LOW: return(low[i]); case PRICE_MEDIAN: return((high[i]+low[i])/2.0); case PRICE_TYPICAL: return((high[i]+low[i]+close[i])/3.0); case PRICE_WEIGHTED: return((high[i]+low[i]+close[i]+close[i])/4.0); } return(0); } //+------------------------------------------------------------------+