/*[[ Name := JMA Separate Window := No First Color := Blue First Draw Type := Line First Symbol := 217 Use Second Data := No Second Color := Red Second Draw Type := Line Second Symbol := 218 ]]*/ Inputs: Len(14),phase(0),barscount(300); Variables: vv(0), v1(0), v2(0), v3(0), v4(0), s8(0), s10(0), s18(0), s20(0), ii(0), v5(0), v6(0), s28(0), s30(0), s38(0), s40(0), s48(0), s50(0), s58(0), s60(0), s68(0), s70(0), f8(0), f10(0), f18(0), f20(0), f28(0), f30(0), f38(0), f40(0), f48(0), f50(0), f58(0), f60(0), f68(0), f70(0), f78(0), f80(0), f88(0), f90(0), f98(0), fA0(0), fA8(0), fB0(0), fB8(0), fC0(0), fC8(0), fD0(0), f0(0), fD8(0), fE0(0), fE8(0), fF0(0), fF8(0), jj(0),value2(0),JMA(0),shift(0),Series(0),prevtime(0); Arrays: list[127](0), ring1[127](0), ring2[10](0), buffer[61](0); if curtime-prevtime<30 then exit; prevtime=curtime; SetLoopCount(0); begin s28 = 63; s30 = 64; for ii = 1 to s28 begin list[ii] = -1000000; end; for ii = s30 to 127 begin list[ii] = 1000000; end; f0 = 1; end; //{--------------------------------------------------------------------} for shift=barscount DownTo 0 Begin series=close[shift]; if (fF0 < 61) then begin fF0= fF0 + 1; buffer[fF0] = series; end; //{--------------------------------------------------------------------} // { main cycle } if (fF0 > 30) then begin if (Len < 1.0000000002) then f80 = 0.0000000001 //{1.0e-10} else f80 = (Len - 1) / 2; if (phase < -100) then f10 = 0.5 else if (phase > 100) then f10 = 2.5 else f10 = phase / 100 + 1.5; v1 = Log(SqRt(f80)); v2 = v1; if (v1 / Log(2.0) + 2 < 0) then v3 = 0 else v3 = v2 / Log(2.0) + 2; f98 = v3; if (0.5 <= f98 - 2) then f88 = f98 - 2 else f88 = 0.5; f78 = SqRt(f80) * f98; f90 = f78 / (f78 + 1); f80 = f80 * 0.9; f50 = f80 / (f80 + 2); if (f0 <> 0) then begin f0 = 0; v5 = 0; for ii = 1 to 29 Begin if (buffer[ii+1] <> buffer[ii]) then v5 = 1; end; fD8 = v5*30; if (fD8 = 0) then f38 = series else f38 = buffer[1]; f18 = f38; if (fD8 > 29) then fD8 = 29; end else fD8 = 0; for ii = fD8 downto 0 begin //{ another bigcycle...} value2=31-ii; if (ii = 0) then f8 = series else f8 = buffer[value2]; f28 = f8 - f18; f48 = f8 - f38; if (Abs(f28) > Abs(f48)) then v2 = Abs(f28) else v2 = Abs(f48); fA0 = v2; vv = fA0 + 0.0000000001; //{1.0e-10;} if (s48 <= 1) then s48 = 127 else s48 = s48 - 1; if (s50 <= 1) then s50 = 10 else s50 = s50 - 1; if (s70 < 128) then s70 = s70 + 1; s8 = s8 + vv - ring2[s50]; ring2[s50] = vv; if (s70 > 10) then s20 = s8 / 10 else s20 = s8 / s70; if (s70 > 127) then begin s10 = ring1[s48]; ring1[s48] = s20; s68 = 64; s58 = s68; while (s68 > 1) begin if (list[s58] < s10) then begin s68 = s68 *0.5; s58 = s58 + s68; end else if (list[s58] <= s10) then begin s68 = 1; end else begin s68 = s68 *0.5; s58 = s58 - s68; end; end; end else begin ring1[s48] = s20; if (s28 + s30 > 127) then begin s30 = s30 - 1; s58 = s30; end else begin s28 = s28 + 1; s58 = s28; end; if (s28 > 96) then s38 = 96 else s38 = s28; if (s30 < 32) then s40 = 32 else s40 = s30; end; s68 = 64; s60 = s68; while (s68 > 1) begin if (list[s60] >= s20) then begin if (list[s60 - 1] <= s20) then begin s68 = 1; end else begin s68 = s68 *0.5; s60 = s60 - s68; end; end else begin s68 = s68 *0.5; s60 = s60 + s68; end; if ((s60 = 127) and (s20 > list[127])) then s60 = 128; end; if (s70 > 127) then begin if (s58 >= s60) then begin if ((s38 + 1 > s60) and (s40 - 1 < s60)) then s18 = s18 + s20 else if ((s40 > s60) and (s40 - 1 < s58)) then s18 = s18 + list[s40 - 1]; end else if (s40 >= s60) then begin if ((s38 + 1 < s60) and (s38 + 1 > s58)) then s18 = s18 + list[s38 + 1]; end else if (s38 + 2 > s60) then s18 = s18 + s20 else if ((s38 + 1 < s60) and (s38 + 1 > s58)) then s18 = s18 + list[s38 + 1]; if (s58 > s60) then begin if ((s40 - 1 < s58) and (s38 + 1 > s58)) then s18 = s18 - list[s58] else if ((s38 < s58) and (s38 + 1 > s60)) then s18 = s18 - list[s38]; end else begin if ((s38 + 1 > s58) and (s40 - 1 < s58)) then s18 = s18 - list[s58] else if ((s40 > s58) and (s40 < s60)) then s18 = s18 - list[s40]; end; end; if (s58 <= s60) then begin if (s58 >= s60) then list[s60] = s20 else begin for jj = s58 + 1 to s60 - 1 Begin list[jj - 1] = list[jj]; end; list[s60 - 1] = s20; end; end else begin for jj = s58 - 1 downto s60 Begin list[jj + 1] = list[jj]; end; list[s60] = s20; end; if (s70 <= 127) then begin s18 = 0; for jj = s40 to s38 Begin s18 = s18 + list[jj]; end; end; f60 = s18 / (s38 - s40 + 1); if (fF8 + 1 > 31) then fF8 = 31 else fF8 = fF8 + 1; if (fF8 <= 30) then begin if (f28 > 0) then f18 = f8 else f18 = f8 - f28 * f90; if (f48 < 0) then f38 = f8 else f38 = f8 - f48 * f90; fB8 = series; //{EasyLanguage does not have "continue" statement} if (fF8 <> 30) then continue; if (fF8=30) then BEGIN fC0 = series; if (Ceil(f78) >= 1) then v4 = Ceil(f78) else v4 = 1; fE8 = Ceil(v4); if (Floor(f78) >= 1) then v2 = Floor(f78) else v2 = 1; fE0 = Ceil(v2); if (fE8 = fE0) then f68 = 1 else begin v4 = fE8 - fE0; f68 = (f78 - fE0) / v4; end; if (fE0 <= 29) then v5 = fE0 else v5 = 29; if (fE8 <= 29) then v6 = fE8 else v6 = 29; fA8 = (series - buffer[fF0 - v5]) * (1 - f68) / fE0 + (series - buffer[fF0 - v6]) * f68 / fE8; END; end else begin if (f98 >= pow(fA0/f60, f88)) then v1 = pow(fA0/f60, f88) else v1 = f98; if (v1 < 1) then v2 = 1 else begin if (f98 >= pow(fA0/f60, f88)) then v3 = pow(fA0/f60, f88) else v3 = f98; v2 = v3; end; f58 = v2; f70 = pow(f90, SqRt(f58)); if (f28 > 0) then f18 = f8 else f18 = f8 - f28 * f70; if (f48 < 0) then f38 = f8 else f38 = f8 - f48 * f70; end; end; if (fF8 > 30) then begin f30 = pow(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; end; JMA= fB8; end; if (fF0 <= 30) then JMA=0; SetIndexValue(shift,JMA); end;