//+------------------------------------------------------------------+ //| JMA.mq4 | //| Spiggy | //| | //+------------------------------------------------------------------+ #property copyright "Spiggy" #property link "" #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 White //---- input parameters extern int Periods=14; extern int PriceType = 0; extern int Offset = 0; extern int phase=0; extern int BarCount=300; //---- buffers double ExtMapBuffer1[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer1); //---- return(0); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); //---- // variable definitions bool firstTime=True; int AccountedBars=0; int jj=0; int ii=0; int shift=0; double series=0; double vv=0; double v1=0; double v2=0; double v3=0; double v4=0; double s8=0; double s10=0; double s18=0; double s20=0; int v5=0; int v6=0; double s28=0; double s30=0; int s38=0; int s40=0; int s48=0; int s50=0; int s58=0; int s60=0; double s68=0; double s70=0; double f8=0; double f10=0; double f18=0; double f20=0; double f28=0; double f30=0; double f38=0; double f40=0; double f48=0; double f50=0; double f58=0; double f60=0; double f68=0; double f70=0; double f78=0; double f80=0; double f88=0; double f90=0; double f98=0; double fA0=0; double fA8=0; double fB0=0; double fB8=0; double fC0=0; double fC8=0; double fD0=0; double f0=0; double fD8=0; double fE0=0; double fE8=0; int fF0=0; double fF8=0; int value2=0; double JMA=0; double prevtime=0; double list[127]; double ring1[127]; double ring2[10]; double buffer[61]; ArrayInitialize(list,0); ArrayInitialize(ring1,0); ArrayInitialize(ring2,0); ArrayInitialize(buffer,0); if (firstTime) { AccountedBars = Bars-BarCount; firstTime=False; } if ((CurTime()-prevtime)<30) return(-1); prevtime=CurTime(); //SetLoopCount(0); { s28 = 63; s30 = 64; for ( ii = 1 ; ii <= s28 ; ii++) { list[ii] = -1000000; } for ( ii = s30 ; ii <= 127 ; ii++ ) { list[ii] = 1000000; } f0 = 1; } //{--------------------------------------------------------------------} for ( shift=BarCount ; shift >= 0 ; shift-- ) { switch(PriceType) { case 0: series=Close[shift]; break; case 1: series=Open[shift]; break; case 2: series=High[shift]; break; case 3: series=Low[shift]; break; case 4: series=(High[shift]+Low[shift])/2; break; case 5: series=(High[shift]+Low[shift]+Close[shift])/3; break; case 6: series=(High[shift]+Low[shift]+Close[shift]+Close[shift])/4; break; } if (fF0 < 61) { fF0= fF0 + 1; buffer[fF0] = series; } //{--------------------------------------------------------------------} // { main cycle } if (fF0 > 30) { if (Periods < 1.0000000002) { f80 = 0.0000000001; //{1.0e-10} } else { f80 = (Periods - 1) / 2.0; } if (phase < -100) { f10 = 0.5; } else { if (phase > 100) { f10 = 2.5; } else { f10 = phase / 100 + 1.5; } } v1 = MathLog(MathSqrt(f80)); v2 = v1; if (v1 / MathLog(2.0) + 2.0 < 0.0) { v3 = 0; } else { v3 = v2 / MathLog(2.0) + 2.0; } f98 = v3; if (0.5 <= f98 - 2.0) { f88 = f98 - 2.0; } else { f88 = 0.5; } f78 = MathSqrt(f80) * f98; f90 = f78 / (f78 + 1.0); f80 = f80 * 0.9; f50 = f80 / (f80 + 2.0); if (f0 != 0) { f0 = 0; v5 = 0; for ( ii = 1 ; ii <=29 ; ii++ ) { if (buffer[ii+1] != buffer[ii]) { v5 = 1.0; } } fD8 = v5*30.0; if (fD8 == 0) { f38 = series; } else { f38 = buffer[1]; } f18 = f38; if (fD8 > 29) fD8 = 29; } else fD8 = 0; for ( ii = fD8 ; ii >= 0 ; ii-- ) { //{ another bigcycle...} value2=31-ii; if (ii == 0) { f8 = series; } else { f8 = buffer[value2]; } f28 = f8 - f18; f48 = f8 - f38; if (MathAbs(f28) > MathAbs(f48)) { v2 = MathAbs(f28); } else { v2 = MathAbs(f48); } fA0 = v2; vv = fA0 + 0.0000000001; //{1.0e-10;} if (s48 <= 1) { s48 = 127; } else { s48 = s48 - 1; } if (s50 <= 1) { s50 = 10; } else { s50 = s50 - 1; } if (s70 < 128) s70 = s70 + 1; s8 = s8 + vv - ring2[s50]; ring2[s50] = vv; if (s70 > 10) { s20 = s8 / 10; } else s20 = s8 / s70; if (s70 > 127) { s10 = ring1[s48]; ring1[s48] = s20; s68 = 64; s58 = s68; while (s68 > 1) { if (list[s58] < s10) { s68 = s68 *0.5; s58 = s58 + s68; } else if (list[s58] <= s10) { s68 = 1; } else { s68 = s68 *0.5; s58 = s58 - s68; } } } else { ring1[s48] = s20; if (s28 + s30 > 127) { s30 = s30 - 1; s58 = s30; } else { s28 = s28 + 1; s58 = s28; } if (s28 > 96) { s38 = 96; } else s38 = s28; if (s30 < 32) { s40 = 32; } else s40 = s30; } s68 = 64; s60 = s68; while (s68 > 1) { if (list[s60] >= s20) { if (list[s60 - 1] <= s20) { s68 = 1; } else { s68 = s68 *0.5; s60 = s60 - s68; } } else { s68 = s68 *0.5; s60 = s60 + s68; } if ((s60 == 127) && (s20 > list[127])) s60 = 128; } if (s70 > 127) { if (s58 >= s60) { if ((s38 + 1 > s60) && (s40 - 1 < s60)) { s18 = s18 + s20; } else if ((s40 > s60) && (s40 - 1 < s58)) s18 = s18 + list[s40 - 1]; } else if (s40 >= s60) { if ((s38 + 1 < s60) && (s38 + 1 > s58)) s18 = s18 + list[s38 + 1]; } else if (s38 + 2 > s60) { s18 = s18 + s20; } else if ((s38 + 1 < s60) && (s38 + 1 > s58)) s18 = s18 + list[s38 + 1]; if (s58 > s60) { if ((s40 - 1 < s58) && (s38 + 1 > s58)) { s18 = s18 - list[s58]; } else if ((s38 < s58) && (s38 + 1 > s60)) s18 = s18 - list[s38]; } else { if ((s38 + 1 > s58) && (s40 - 1 < s58)) { s18 = s18 - list[s58]; } else if ((s40 > s58) && (s40 < s60)) s18 = s18 - list[s40]; } } if (s58 <= s60) { if (s58 >= s60) { list[s60] = s20; } else { for ( jj = s58 + 1 ; jj <= s60 - 1 ; jj++ ) { list[jj - 1] = list[jj]; } list[s60 - 1] = s20; } } else { for ( jj = s58 - 1 ; jj >= s60 ; jj-- ) { list[jj + 1] = list[jj]; } list[s60] = s20; } if (s70 <= 127) { s18 = 0; for (jj = s40 ; jj <= s38 ; jj++) { s18 = s18 + list[jj]; } } f60 = s18 / (s38 - s40 + 1); if (fF8 + 1 > 31) { fF8 = 31; } else fF8 = fF8 + 1; if (fF8 <= 30) { if (f28 > 0) { f18 = f8; } else f18 = f8 - f28 * f90; if (f48 < 0) { f38 = f8; } else f38 = f8 - f48 * f90; fB8 = series; //{EasyLanguage does not have "continue" statement} if (fF8 != 30) { continue; } if (fF8 == 30) { fC0 = series; if (MathCeil(f78) >= 1) { v4 = MathCeil(f78); } else v4 = 1; fE8 = MathCeil(v4); if (MathFloor(f78) >= 1) { v2 = MathFloor(f78); } else v2 = 1; fE0 = MathCeil(v2); if (fE8 == fE0) { f68 = 1; } else { v4 = fE8 - fE0; f68 = (f78 - fE0) / v4; } if (fE0 <= 29) { v5 = fE0; } else v5 = 29; if (fE8 <= 29) { v6 = fE8; } else v6 = 29; fA8 = (series - buffer[fF0 - v5]) * (1 - f68) / fE0 + (series - buffer[fF0 - v6]) * f68 / fE8; } } else { if (f98 >= MathPow(fA0/f60, f88)) { v1 = MathPow(fA0/f60, f88); } else v1 = f98; if (v1 < 1) { v2 = 1; } else { if (f98 >= MathPow(fA0/f60, f88)) { v3 = MathPow(fA0/f60, f88); } else v3 = f98; v2 = v3; } f58 = v2; f70 = MathPow(f90, MathSqrt(f58)); if (f28 > 0) { f18 = f8; } else { f18 = f8 - f28 * f70; } if (f48 < 0) { f38 = f8; } else { f38 = f8 - f48 * f70; } } } if (fF8 > 30) { f30 = MathPow(f50, f58); fC0 = (1 - f30) * series + f30 * fC0; fC8 = (series - fC0) * (1 - f50) + f50 * fC8; fD0 = f10 * fC8 + fC0; f20 = -f30 * 2; f40 = f30 * f30; fB0 = f20 + f40 + 1; fA8 = (fD0 - fB8) * fB0 + f40 * fA8; fB8 = fB8 + fA8; } JMA= fB8; } if (fF0 <= 30) { JMA=0; } //Print ("JMA is " + JMA + " shift is " + shift); ExtMapBuffer1[shift-Offset]=JMA; if (shift>0) { AccountedBars=AccountedBars+1; } } //---- return(0); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains close prices for each bar
Series array that contains open prices of each bar
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Indicator Curves created:
Implements a curve of type DRAW_LINE
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features: