#
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
Home
Forex Forum
+ Add Script
Metastock
Expert Advisors
Explorations
Indicators
Trading Systems
Metatrader
MQL Experts
MQL Indicators
MQ4 Experts
MQ4 Indicators
MQ4 Scripts
Tradestation
Functions
Indicators
PaintBars
ShowMe
Trading Systems
Amibroker
Commentaries
Explorations
Functions
Indicators
Trading Systems
Contact us
Newsletter
Group: Metatrader MQL Indicators
Title: JMA 1
Description:
Lag-free moving avg
/*[[ Name := JMA Separate Window := No First Color := White 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: firstTime(True),AccountedBars(0), 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 firstTime then { AccountedBars = Bars-barscount; firstTime=False; }; 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); If shift>0 then AccountedBars=AccountedBars+1; end;
Author/Source:
?
Forex Directory
|
Forex Trading Systems
|
Privacy
|
Disclaimer
|
Contact