//+------------------------------------------------------------------+ //| JMA.mq4 | //| Weld, Jurik Research | //| http://weld.torguem.net | //+------------------------------------------------------------------+ #property copyright "Weld" #property link "http://weld.torguem.net" #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Aqua //---- input parameters extern int Length = 14; extern int Phase = 0; //---- buffers double JMABuffer []; double fC0Buffer []; double fA8Buffer []; double fC8Buffer []; double list[128], ring1[128], ring2[11], buffer[62]; bool initial; int s28, s30, s48, s68, s50, s70, fF0, s58, s60, s40, s38, v5, v6, fD8, fE8, fE0; double vv, v1, v2, v3, v4, s8, s10, s18, s20, f8, f10, f18, f20, f28, f30, f38, f40, f48, f50, f58, f60, f68, f70, f78, f80, f88, f90, f98, fA0, fB0, fB8, fC0, fD0, fF8, JMA, series; //+------------------------------------------------------------------+ //| JMA initialization function | //+------------------------------------------------------------------+ int init() { int i; //---- 2 additional buffers are used for counting. IndicatorBuffers(4); //---- drawing settings SetIndexStyle (0, DRAW_LINE, STYLE_SOLID, 2); SetIndexDrawBegin(0, 30); //---- 2 indicator buffers mapping SetIndexBuffer (0, JMABuffer); SetIndexBuffer (1, fC0Buffer); SetIndexBuffer (2, fA8Buffer); SetIndexBuffer (3, fC8Buffer); //---- name for DataWindow and indicator subwindow label IndicatorShortName ("JMA(" + Length + "," + Phase + ")"); SetIndexLabel (0, "JMA"); //---- initial part s28 = 63; s30 = 64; for (i = 0; i <= s28; i++) list [i] = -1000000; for (i = s30; i <= 127; i++) list [i] = 1000000; initial = true; if (Length < 1.0000000002) f80 = 0.0000000001; else f80 = (Length - 1) / 2.0; if (Phase < -100) f10 = 0.5; else if (Phase > 100) f10 = 2.5; else f10 = Phase / 100.0 + 1.5; v1 = MathLog (MathSqrt (f80)); v2 = v1; if (v1 / MathLog(2.0) + 2.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); return; } //+------------------------------------------------------------------+ //| JMA iteration function | //+------------------------------------------------------------------+ int start() { int ii, jj, shift, limit; int counted_bars = IndicatorCounted(); //---- check for possible errors if (counted_bars < 0) return (-1); limit = Bars - counted_bars - 1; //---- for (shift = limit; shift >= 0; shift--) { series = Close [shift]; if (fF0 < 61) { fF0++; buffer [fF0] = series; } if (fF0 > 30) { if (initial) { initial = false; v5 = 0; for (ii = 1; ii <= 29; ii++) { if (buffer [ii+1] != buffer[ii]) v5 = 1; } fD8 = v5 * 30; if (fD8 == 0) f38 = series; else f38 = buffer[1]; f18 = f38; if (fD8 > 29) fD8 = 29; } else fD8 = 0; //---- big cycle for (ii = fD8; ii >= 0; ii--) { if (ii == 0) f8 = series; else f8 = buffer [31 - ii]; 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--; if (s50 <= 1) s50 = 10; else s50--; if (s70 < 128) s70++; s8 += (vv - ring2 [s50]); ring2 [s50] = vv; if (s70 > 10) s20 = s8 / 10.0; 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 / 2.0; s58 += s68; } else if (list [s58] <= s10) { s68 = 1; } else { s68 = s68 / 2.0; s58 -= s68; } } } else { ring1 [s48] = s20; if ((s28 + s30) > 127) { s30--; s58 = s30; } else { s28++; 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 / 2.0; s60 -= s68; } } else { s68 = s68 / 2.0; s60 += s68; } if ((s60 == 127) && (s20 > list[127])) s60 = 128; } if (s70 > 127) { if (s58 >= s60) { if (((s38 + 1) > s60) && ((s40 - 1) < s60)) s18 += s20; else if ((s40 > s60) && ((s40 - 1) < s58)) s18 += list [s40 - 1]; } else if (s40 >= s60) { if (((s38 + 1) < s60) && ((s38 + 1) > s58)) s18 += list[s38 + 1]; } else if ((s38 + 2) > s60) s18 += s20; else if (((s38 + 1) < s60) && ((s38 + 1) > s58)) s18 += list[s38 + 1]; if (s58 > s60) { if (((s40 - 1) < s58) && ((s38 + 1) > s58)) s18 -= list [s58]; else if ((s38 < s58) && ((s38 + 1) > s60)) s18 -= list [s38]; } else { if (((s38 + 1) > s58) && ((s40 - 1) < s58)) s18 -= list [s58]; else if ((s40 > s58) && (s40 < s60)) 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 += list[jj]; } } f60 = s18 / (s38 - s40 + 1); //---- if ((fF8 + 1) > 31) fF8 = 31; else fF8++; 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; if (fF8 == 30) { fC0Buffer [shift] = series; if (MathCeil(f78) >= 1) v4 = MathCeil(f78); else v4 = 1; fE8 = IntPortion (v4); if (MathFloor(f78) >= 1) v2 = MathFloor(f78); else v2 = 1; fE0 = IntPortion (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; fA8Buffer [shift] = (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; } } // ---- end of big cycle if (fF8 > 30) { fB8 = JMABuffer [shift + 1]; f30 = MathPow (f50, f58); fC0 = (1 - f30) * series + f30 * fC0Buffer [shift + 1]; fC8Buffer [shift] = (series - fC0) * (1 - f50) + f50 * fC8Buffer [shift + 1]; fD0 = f10 * fC8Buffer [shift] + fC0; f20 = f30 * (-2.0); f40 = f30 * f30; fB0 = f20 + f40 + 1; fA8Buffer [shift] = (fD0 - fB8) * fB0 + f40 * fA8Buffer [shift + 1]; fB8 += fA8Buffer [shift]; fC0Buffer [shift] = fC0; } JMA = fB8; } if (fF0 <= 30) JMA = 0; JMABuffer [shift] = JMA; //---- End of main cycle "for" } return; } //+------------------------------------------------------------------+ int IntPortion (double param) { if (param > 0) return (MathFloor (param)); if (param < 0) return (MathCeil (param)); return (0.0); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features: