//+------------------------------------------------------------------+ //| OPTIMA.mq4 | //| | //| | //+------------------------------------------------------------------+ #property copyright "Copyright 2017, Kasander." #property link "" #property version "1.00" #property strict #property indicator_chart_window //--- indicator settings #property indicator_chart_window #property indicator_buffers 7 #property indicator_plots 7 #property indicator_width1 2 #property indicator_width2 2 #property indicator_color1 clrAqua #property indicator_color2 clrRed #property indicator_color3 clrNONE #property indicator_color4 clrNONE #property indicator_color5 clrNONE #property indicator_color6 clrNONE #property indicator_color7 clrNONE //--- indicator buffers double Optimus_1[]; double Optimus_2[]; double Speedi_1[]; double Speedi_2[]; double Optimuss[]; double Up[]; double Dn[]; input string Z=""; // CMA 2 input int PeriodMA=5; // CMA period MA input int PeriodStd=5; // CMA period StDev input int Method=3; // CMA method input int Price=0; // CMA price input string O=""; // Speedi 1 fast input int shift1=2; // Prevoues Candle Shift input int denom1=2; // Denominator / Делитель input int cycles1=1; // Optimus Cycles input string I=""; // Optima 1 Fast input string II=""; // TEMa 1 Fast ---- input ENUM_APPLIED_PRICE t1p=0; // Optima 1 TEMa Fast Price input ENUM_MA_METHOD t1m=3; // Optima 1 TEMa Fast Method input int t1p1=1; // Optima 1 TEMa Fast Period MA input int t1p2=5; // Optima 1 TEMa Fast Period 2 input int t1p3=1; // Optima 1 TEMa Fast Period 3 input double t1k=1; // Optima 1 TEMa Fast Koef input int t1s=1; // Optima 1 TEMa Fast Period Smoothing input string III=""; // TEMa 2 Slow ---- input ENUM_APPLIED_PRICE t2p=0; // Optima 1 TEMa Slow Price input ENUM_MA_METHOD t2m=3; // Optima 1 TEMa Slow Method input int t2p1=2; // Optima 1 TEMa Slow Period MA input int t2p2=3; // Optima 1 TEMa Slow Period 2 input int t2p3=2; // Optima 1 TEMa Slow Period 3 input double t2k=2; // Optima 1 TEMa Slow Koef input int t2s=2; // Optima 1 TEMa Slow Period Smoothing input string IV=""; // Optima 2 Slow input string V=""; // TEMa 3 Fast ---- input ENUM_APPLIED_PRICE t3p=0; // Optima 2 TEMa Fast Price input ENUM_MA_METHOD t3m=3; // Optima 2 TEMa Fast Method input int t3p1=2; // Optima 2 TEMa Fast Period MA input int t3p2=5; // Optima 2 TEMa Fast Period 2 input int t3p3=1; // Optima 2 TEMa Fast Period 3 input double t3k=1; // Optima 2 TEMa Fast Koef input int t3s=2; // Optima 2 TEMa Fast Period Smoothing input string VI=""; // TEMa 4 Slow ---- input ENUM_APPLIED_PRICE t4p=0; // Optima 2 TEMa Slow Price input ENUM_MA_METHOD t4m=3; // Optima 2 TEMa Slow Method input int t4p1=2; // Optima 2 TEMa Slow Period MA input int t4p2=5; // Optima 2 TEMa Slow Period 2 input int t4p3=2; // Optima 2 TEMa Slow Period 3 input double t4k=2; // Optima 2 TEMa Slow Koef input int t4s=2; // Optima 2 TEMa Slow Period Smoothing input string O2=""; // Speedi 2 Slow input int shift2=2; // Prevoues Candle Shift input int denom2=2; // Denominator / Делитель input int cycles2=1; // Optimus Cycles input string VII=""; // Optima 3 Fast input string VIII=""; // TEMa 5 Fast ---- input ENUM_APPLIED_PRICE t5p=0; // Optima 3 TEMa Fast Price input ENUM_MA_METHOD t5m=3; // Optima 3 TEMa Fast Method input int t5p1=3; // Optima 3 TEMa Fast Period MA input int t5p2=5; // Optima 3 TEMa Fast Period 2 input int t5p3=3; // Optima 3 TEMa Fast Period 3 input double t5k=2; // Optima 3 TEMa Fast Koef input int t5s=3; // Optima 3 TEMa Fast Period Smoothing input string IX=""; // TEMa 6 Slow ---- input ENUM_APPLIED_PRICE t6p=0; // Optima 3 TEMa Slow Price input ENUM_MA_METHOD t6m=3; // Optima 3 TEMa Slow Method input int t6p1=3; // Optima 3 TEMa Slow Period MA input int t6p2=5; // Optima 3 TEMa Slow Period 2 input int t6p3=3; // Optima 3 TEMa Slow Period 3 input double t6k=3; // Optima 3 TEMa Slow Koef input int t6s=3; // Optima 3 TEMa Slow Period Smoothing input string X=""; // Optima 4 Slow input string XI=""; // TEMa 7 Fast ---- input ENUM_APPLIED_PRICE t7p=0; // Optima 4 TEMa Fast Price input ENUM_MA_METHOD t7m=3; // Optima 4 TEMa Fast Method input int t7p1=4; // Optima 4 TEMa Fast Period MA input int t7p2=5; // Optima 4 TEMa Fast Period 2 input int t7p3=2; // Optima 4 TEMa Fast Period 3 input double t7k=3; // Optima 4 TEMa Fast Koef input int t7s=2; // Optima 4 TEMa Fast Period Smoothing input string XII=""; // TEMa 8 Slow ---- input ENUM_APPLIED_PRICE t8p=0; // Optima 4 TEMa Slow Price input ENUM_MA_METHOD t8m=3; // Optima 4 TEMa Slow Method input int t8p1=4; // Optima 4 TEMa Slow Period MA input int t8p2=4; // Optima 4 TEMa Slow Period 2 input int t8p3=3; // Optima 4 TEMa Slow Period 3 input double t8k=3; // Optima 4 TEMa Slow Koef input int t8s=2; // Optima 4 TEMa Slow Period Smoothing int i,j,limit1,max1,limit2,max2,cl1,dn1,cl2,dn2; double v1,v2,k,CA[],DIR[],MA_Optimuss[], Fast_1[],Fast_2[],Fast_3[],Fast_4[], Slow_1[],Slow_2[],Slow_3[],Slow_4[], Optima_1[],Optima_2[],Optima_3[],Optima_4[], x1f[],y1f[],z1f[],q1f[],x1s[],y1s[],z1s[],q1s[], x2f[],y2f[],z2f[],q2f[],x2s[],y2s[],z2s[],q2s[], x3f[],y3f[],z3f[],q3f[],x3s[],y3s[],z3s[],q3s[], x4f[],y4f[],z4f[],q4f[],x4s[],y4s[],z4s[],q4s[]; //--- //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping IndicatorBuffers(54); SetIndexBuffer(0,Up); SetIndexBuffer(1,Dn); SetIndexBuffer(2,Optimuss); SetIndexBuffer(3,Speedi_1); SetIndexBuffer(4,Speedi_2); SetIndexBuffer(5,Optimus_1); SetIndexBuffer(6,Optimus_2); SetIndexBuffer(7,Fast_1); SetIndexBuffer(8,Slow_1); SetIndexBuffer(9,Optima_1); SetIndexBuffer(10,Fast_2); SetIndexBuffer(11,Slow_2); SetIndexBuffer(12,Optima_2); SetIndexBuffer(13,Fast_3); SetIndexBuffer(14,Slow_3); SetIndexBuffer(15,Optima_3); SetIndexBuffer(16,Fast_4); SetIndexBuffer(17,Slow_4); SetIndexBuffer(18,Optima_4); SetIndexBuffer(19,x1f); SetIndexBuffer(20,y1f); SetIndexBuffer(21,z1f); SetIndexBuffer(22,q1f); SetIndexBuffer(23,x1s); SetIndexBuffer(24,y1s); SetIndexBuffer(25,z1s); SetIndexBuffer(26,q1s); SetIndexBuffer(27,x2f); SetIndexBuffer(28,y2f); SetIndexBuffer(29,z2f); SetIndexBuffer(30,q2f); SetIndexBuffer(31,x2s); SetIndexBuffer(32,y2s); SetIndexBuffer(33,z2s); SetIndexBuffer(34,q2s); SetIndexBuffer(35,x3f); SetIndexBuffer(36,y3f); SetIndexBuffer(37,z3f); SetIndexBuffer(38,q3f); SetIndexBuffer(39,x3s); SetIndexBuffer(40,y3s); SetIndexBuffer(41,z3s); SetIndexBuffer(42,q3s); SetIndexBuffer(43,x4f); SetIndexBuffer(44,y4f); SetIndexBuffer(45,z4f); SetIndexBuffer(46,q4f); SetIndexBuffer(47,x4s); SetIndexBuffer(48,y4s); SetIndexBuffer(49,z4s); SetIndexBuffer(50,q4s); SetIndexBuffer(51,CA); SetIndexBuffer(52,DIR); SetIndexBuffer(53,MA_Optimuss); //--- sets first bar from what index will be drawn for(i=0; i<7; i++) {SetIndexStyle(i,DRAW_LINE); SetIndexEmptyValue(i,0.0);} for(i=7; i<54; i++) SetIndexStyle(i,DRAW_NONE); //--- max1=fmax(fmax(t1p1+t1p2+t1p3+t1s,t2p1+t2p2+t2p3+t2s), fmax(t3p1+t3p2+t3p3+t3s,t4p1+t4p2+t4p3+t4s)); max2=fmax(fmax(t5p1+t5p2+t5p3+t5s,t6p1+t6p2+t6p3+t6s), fmax(t7p1+t7p2+t7p3+t7s,t8p1+t8p2+t8p3+t8s)); //--- cl1=cycles1; if(cl1<1) cl1=1; cl2=cycles2; if(cl2<1) cl2=1; dn1=denom1; if(dn1<1) dn1=1; dn2=denom2; if(dn2<1) dn2=1; //--- set accuracy IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| 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[]) { //--- limit1=rates_total-prev_calculated-max1; limit2=rates_total-prev_calculated-max2; //--- for(j=0; j0) limit1=max1*(cl1-j+1); if(j<1) {for(i=limit1; i>=0; i--) {x1f[i]=iMA(NULL,0,t1p1,0,t1m,t1p,i); x1s[i]=iMA(NULL,0,t2p1,0,t2m,t2p,i); x2f[i]=iMA(NULL,0,t3p1,0,t3m,t3p,i); x2s[i]=iMA(NULL,0,t4p1,0,t4m,t4p,i);}} else {for(i=limit1; i>=0; i--) {x1f[i]=Fast_1[i]; x1s[i]=Slow_1[i]; x2f[i]=Fast_2[i]; x2s[i]=Slow_2[i];}} for(i=limit1; i>=0; i--) {if(i<=limit1-t1p2) y1f[i]=iMAOnArray(x1f,0,t1p2,0,t1m,i); if(i<=limit1-t2p2) y1s[i]=iMAOnArray(x1s,0,t2p2,0,t2m,i); if(i<=limit1-t3p2) y2f[i]=iMAOnArray(x2f,0,t3p2,0,t3m,i); if(i<=limit1-t4p2) y2s[i]=iMAOnArray(x2s,0,t4p2,0,t4m,i);} for(i=limit1; i>=0; i--) {if(i<=limit1-t1p3) z1f[i]=iMAOnArray(y1f,0,t1p3,0,t1m,i); if(i<=limit1-t2p3) z1s[i]=iMAOnArray(y1s,0,t2p3,0,t2m,i); if(i<=limit1-t3p3) z2f[i]=iMAOnArray(y2f,0,t3p3,0,t3m,i); if(i<=limit1-t4p3) z2s[i]=iMAOnArray(y2s,0,t4p3,0,t4m,i);} for(i=limit1; i>=0; i--) {q1f[i]=x1f[i]*t1k-y1f[i]*t1k+z1f[i]; q1s[i]=x1s[i]*t2k-y1s[i]*t2k+z1s[i]; q2f[i]=x2f[i]*t3k-y2f[i]*t3k+z2f[i]; q2s[i]=x2s[i]*t4k-y2s[i]*t4k+z2s[i];} for(i=limit1; i>=0; i--) {if(i<=limit1-t1s) Fast_1[i]=iMAOnArray(q1f,0,t1s,0,t1m,i); if(i<=limit1-t2s) Slow_1[i]=iMAOnArray(q1s,0,t2s,0,t2m,i); if(i<=limit1-t3s) Fast_2[i]=iMAOnArray(q2f,0,t3s,0,t3m,i); if(i<=limit1-t4s) Slow_2[i]=iMAOnArray(q2s,0,t4s,0,t4m,i);}} //--- for(j=0; j0) limit2=max2*(cl2-j+1); if(j<1) {for(i=limit2; i>=0; i--) {x3f[i]=iMA(NULL,0,t5p1,0,t5m,t5p,i); x3s[i]=iMA(NULL,0,t6p1,0,t6m,t6p,i); x4f[i]=iMA(NULL,0,t7p1,0,t7m,t7p,i); x4s[i]=iMA(NULL,0,t8p1,0,t8m,t8p,i);}} else {for(i=limit2; i>=0; i--) {x3f[i]=Fast_3[i]; x3s[i]=Slow_3[i]; x4f[i]=Fast_4[i]; x4s[i]=Slow_4[i];}} for(i=limit2; i>=0; i--) {if(i<=limit2-t5p2) y3f[i]=iMAOnArray(x3f,0,t5p2,0,t5m,i); if(i<=limit2-t6p2) y3s[i]=iMAOnArray(x3s,0,t6p2,0,t6m,i); if(i<=limit2-t7p2) y4f[i]=iMAOnArray(x4f,0,t7p2,0,t7m,i); if(i<=limit2-t8p2) y4s[i]=iMAOnArray(x4s,0,t8p2,0,t8m,i);} for(i=limit2; i>=0; i--) {if(i<=limit2-t5p3) z3f[i]=iMAOnArray(y3f,0,t5p3,0,t5m,i); if(i<=limit2-t6p3) z3s[i]=iMAOnArray(y3s,0,t6p3,0,t6m,i); if(i<=limit2-t7p3) z4f[i]=iMAOnArray(y4f,0,t7p3,0,t7m,i); if(i<=limit2-t8p3) z4s[i]=iMAOnArray(y4s,0,t8p3,0,t8m,i);} for(i=limit2; i>=0; i--) {q3f[i]=x3f[i]*t5k-y3f[i]*t5k+z3f[i]; q3s[i]=x3s[i]*t6k-y3s[i]*t6k+z3s[i]; q4f[i]=x4f[i]*t7k-y4f[i]*t7k+z4f[i]; q4s[i]=x4s[i]*t8k-y4s[i]*t8k+z4s[i];} for(i=limit2; i>=0; i--) {if(i<=limit2-t5s) Fast_3[i]=iMAOnArray(q3f,0,t5s,0,t5m,i); if(i<=limit2-t6s) Slow_3[i]=iMAOnArray(q3s,0,t6s,0,t6m,i); if(i<=limit2-t7s) Fast_4[i]=iMAOnArray(q4f,0,t7s,0,t7m,i); if(i<=limit2-t8s) Slow_4[i]=iMAOnArray(q4s,0,t8s,0,t8m,i);}} //--- if(prev_calculated==0) {for(i=limit1; i>=0; i--) {Optima_1[i]=Fast_1[i]; Optima_2[i]=Fast_2[i];}} if(limit1>1) limit1-=2; //---- Optima 1 ---- for(i=limit1; i>=0; i--) {if(Optima_1[i+1]>Optima_1[i+2]) {if(Optima_1[i+1]Fast_1[i]) {Optima_1[i]=Slow_1[i]; continue;} if(Optima_1[i+1]>Slow_1[i]&&Optima_1[i+1]Slow_1[i]&&Optima_1[i+1]>Fast_1[i]) {Optima_1[i]=fmax(Slow_1[i],Fast_1[i]); continue;} if(Optima_1[i+1]>Slow_1[i]&&Optima_1[i+1]Fast_1[i]) {Optima_1[i]=Fast_1[i]; continue;} Optima_1[i]=fmin(Slow_1[i],Fast_1[i]);}} //---- Optima 2 ---- for(i=limit1; i>=0; i--) {if(Optima_2[i+1]>Optima_2[i+2]) {if(Optima_2[i+1]Fast_2[i]) {Optima_2[i]=Slow_2[i]; continue;} if(Optima_2[i+1]>Slow_2[i]&&Optima_2[i+1]Slow_2[i]&&Optima_2[i+1]>Fast_2[i]) {Optima_2[i]=fmax(Slow_2[i],Fast_2[i]); continue;} if(Optima_2[i+1]>Slow_2[i]&&Optima_2[i+1]Fast_2[i]) {Optima_2[i]=Fast_2[i]; continue;} Optima_2[i]=fmin(Slow_2[i],Fast_2[i]);}} //---- Optimus 1 ---- if(prev_calculated==0) {for(i=limit1; i>=0; i--) Optimus_1[i]=Optima_1[i];} for(i=limit1; i>=0; i--) {if(Optimus_1[i+1]>Optimus_1[i+2]) {if(Optimus_1[i+1]Optima_1[i]) {Optimus_1[i]=Optima_2[i]; continue;} if(Optimus_1[i+1]>Optima_2[i]&&Optimus_1[i+1]Optima_2[i]&&Optimus_1[i+1]>Optima_1[i]) {Optimus_1[i]=fmax(Optima_2[i],Optima_1[i]); continue;} if(Optimus_1[i+1]>Optima_2[i]&&Optimus_1[i+1]Optima_1[i]) {Optimus_1[i]=Optima_1[i]; continue;} Optimus_1[i]=fmin(Optima_2[i],Optima_1[i]);}} //---- Speedi 1 ---- for(i=limit1-2; i>=0; i--) Speedi_1[i]=Optimus_1[i]+(Optimus_1[i]-Optimus_1[i+shift1])/dn1; //--- if(prev_calculated==0) {for(i=limit2; i>=0; i--) {Optima_3[i]=Fast_3[i]; Optima_4[i]=Fast_4[i];}} if(limit2>1) limit2-=2; //---- Optima 3 ---- for(i=limit2; i>=0; i--) {if(Optima_3[i+1]>Optima_3[i+2]) {if(Optima_3[i+1]Fast_3[i]) {Optima_3[i]=Slow_3[i]; continue;} if(Optima_3[i+1]>Slow_3[i]&&Optima_3[i+1]Slow_3[i]&&Optima_3[i+1]>Fast_3[i]) {Optima_3[i]=fmax(Slow_3[i],Fast_3[i]); continue;} if(Optima_3[i+1]>Slow_3[i]&&Optima_3[i+1]Fast_3[i]) {Optima_3[i]=Fast_3[i]; continue;} Optima_3[i]=fmin(Slow_3[i],Fast_3[i]);}} //---- Optima 4 ---- for(i=limit2; i>=0; i--) {if(Optima_4[i+1]>Optima_4[i+2]) {if(Optima_4[i+1]Fast_4[i]) {Optima_4[i]=Slow_4[i]; continue;} if(Optima_4[i+1]>Slow_4[i]&&Optima_4[i+1]Slow_4[i]&&Optima_4[i+1]>Fast_4[i]) {Optima_4[i]=fmax(Slow_4[i],Fast_4[i]); continue;} if(Optima_4[i+1]>Slow_4[i]&&Optima_4[i+1]Fast_4[i]) {Optima_4[i]=Fast_4[i]; continue;} Optima_4[i]=fmin(Slow_4[i],Fast_4[i]);}} //---- Optimus 2 ---- if(prev_calculated==0) {for(i=limit2; i>=0; i--) Optimus_2[i]=Optima_3[i];} for(i=limit2; i>=0; i--) {if(Optimus_2[i+1]>Optimus_2[i+2]) {if(Optimus_2[i+1]Optima_3[i]) {Optimus_2[i]=Optima_4[i]; continue;} if(Optimus_2[i+1]>Optima_4[i]&&Optimus_2[i+1]Optima_4[i]&&Optimus_2[i+1]>Optima_3[i]) {Optimus_2[i]=fmax(Optima_4[i],Optima_3[i]); continue;} if(Optimus_2[i+1]>Optima_4[i]&&Optimus_2[i+1]Optima_3[i]) {Optimus_2[i]=Optima_3[i]; continue;} Optimus_2[i]=fmin(Optima_4[i],Optima_3[i]);}} //---- Speedi 2 ---- for(i=limit2-2; i>=0; i--) Speedi_2[i]=Optimus_2[i]+(Optimus_2[i]-Optimus_2[i+shift2])/dn2; //---- Optimuss ---- limit1=fmin(limit1,limit2); if(prev_calculated==0) {for(i=limit1; i>=0; i--) Optimuss[i]=Speedi_1[i];} for(i=limit1; i>=0; i--) {if(Optimuss[i+1]>Optimuss[i+2]) {if(Optimuss[i+1]Speedi_1[i]) {Optimuss[i]=Speedi_2[i]; continue;} if(Optimuss[i+1]>Speedi_2[i]&&Optimuss[i+1]Speedi_2[i]&&Optimuss[i+1]>Speedi_1[i]) {Optimuss[i]=fmax(Speedi_2[i],Speedi_1[i]); continue;} if(Optimuss[i+1]>Speedi_2[i]&&Optimuss[i+1]Speedi_1[i]) {Optimuss[i]=Speedi_1[i]; continue;} Optimuss[i]=fmin(Speedi_2[i],Speedi_1[i]);}} //---- CMA 2 ---- if(prev_calculated==0) limit1-=fmin(PeriodMA,PeriodStd); for(i=limit1; i>=0; i--) MA_Optimuss[i]=iMAOnArray(Optimuss,0,PeriodMA,0,Method,i); CA[limit1+1]=Optimuss[limit1+1]; if(prev_calculated==0) limit1--; for(i=limit1; i>=0; i--) {v1=sqrt(iStdDev(NULL,0,PeriodStd,0,Method,Price,i)); v2=sqrt(fabs(CA[i+1]-MA_Optimuss[i])); if(v20) DIR[i]=1; if(CA[i+1]-CA[i]>0) DIR[i]=-1; if(DIR[i]>0) {Up[i]=CA[i]; if(DIR[i+1]<0) Up[i+1]=CA[i+1]; Dn[i]=0;} else if(DIR[i]<0) {Dn[i]=CA[i]; if(DIR[i+1]>0) Dn[i+1]=CA[i+1]; Up[i]=0;}} //--- return(rates_total); } //+------------------------------------------------------------------+