#property copyright “Copyright 2020 © Gold Line FX Indicator”
#property link “www.GDlineFX.com”
#property indicator_separate_window
#property indicator_minimum 0.0
#property indicator_maximum 1.0
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Red
extern string TimeFrame = “240”;
extern int SmoothPeriod = 5;
extern int SmoothPhase = 0;
extern bool alertsOn = True;
extern bool alertsOnCurrent = True;
extern bool alertsMessage = True;
extern bool alertsSound = True;
extern bool alertsEmail = FALSE;
double g_ibuf_112[];
double g_ibuf_116[];
double g_ibuf_120[];
int g_timeframe_124;
bool gi_128 = FALSE;
bool gi_132 = FALSE;
string gs_136;
string gs_nothing_144 = “nothing”;
datetime g_time_152;
string gsa_156[] = {“M1”, “M5”, “M15”, “M30”, “H1”, “H4”, “D1”, “W1”, “MN”};
int gia_160[] = {1, 5, 15, 30, 60, 240, 1440, 10080, 43200};
double gda_164[][30];
int init() {
IndicatorBuffers(3);
SetIndexBuffer(0, g_ibuf_112);
SetIndexStyle(0, DRAW_HISTOGRAM);
SetIndexBuffer(1, g_ibuf_116);
SetIndexStyle(1, DRAW_HISTOGRAM);
SetIndexBuffer(2, g_ibuf_120);
if (TimeFrame == “calculate”) {
gi_128 = TRUE;
return (0);
}
if (TimeFrame == “getBarsCount”) {
gi_132 = TRUE;
return (0);
}
g_timeframe_124 = f0_5(TimeFrame);
gs_136 = WindowExpertName();
IndicatorShortName(f0_1(g_timeframe_124) + “-GoldFX-Filter”);
return (0);
}
int start() {
double ld_0;
double ld_8;
double ld_16;
int shift_24;
int li_28 = IndicatorCounted();
if (li_28 < 0) return (-1);
if (li_28 > 0) li_28–;
int li_32 = MathMin(Bars – li_28, Bars – 1);
if (gi_132) {
g_ibuf_112[0] = li_32 + 1;
return (0);
}
if (gi_128 || g_timeframe_124 == Period()) {
for (int li_36 = li_32; li_36 >= 0; li_36–) {
ld_0 = f0_3(High[li_36 + 1], SmoothPeriod, SmoothPhase, li_36 + 1, 0);
ld_8 = f0_3(Low[li_36 + 1], SmoothPeriod, SmoothPhase, li_36 + 1, 10);
ld_16 = f0_3(Close[li_36], SmoothPeriod, SmoothPhase, li_36, 20);
g_ibuf_116[li_36] = EMPTY_VALUE;
g_ibuf_112[li_36] = EMPTY_VALUE;
g_ibuf_120[li_36] = g_ibuf_120[li_36 + 1];
if (ld_16 > ld_0) g_ibuf_120[li_36] = -1;
if (ld_16 < ld_8) g_ibuf_120[li_36] = 1;
if (g_ibuf_120[li_36] == 1.0) g_ibuf_116[li_36] = 1;
if (g_ibuf_120[li_36] == -1.0) g_ibuf_112[li_36] = 1;
}
f0_2();
return (0);
}
li_32 = MathMax(li_32, MathMin(Bars, iCustom(NULL, g_timeframe_124, gs_136, “getBarsCount”, 0, 0) * g_timeframe_124 / Period()));
for (li_36 = li_32; li_36 >= 0; li_36–) {
shift_24 = iBarShift(NULL, g_timeframe_124, Time[li_36]);
g_ibuf_116[li_36] = EMPTY_VALUE;
g_ibuf_112[li_36] = EMPTY_VALUE;
g_ibuf_120[li_36] = iCustom(NULL, g_timeframe_124, gs_136, “calculate”, SmoothPeriod, SmoothPhase, 2, shift_24);
if (g_ibuf_120[li_36] == 1.0) g_ibuf_116[li_36] = 1;
if (g_ibuf_120[li_36] == -1.0) g_ibuf_112[li_36] = 1;
}
f0_2();
return (0);
}
void f0_2() {
int li_0;
if ((!gi_128) && alertsOn) {
if (alertsOnCurrent) li_0 = 0;
else li_0 = 1;
li_0 = iBarShift(NULL, 0, iTime(NULL, g_timeframe_124, li_0));
if (g_ibuf_120[li_0] != g_ibuf_120[li_0 + 1]) {
if (g_ibuf_120[li_0] == 1.0) {
f0_6(li_0, “up”);
return;
}
f0_6(li_0, “down”);
}
}
}
void f0_6(int ai_0, string as_4) {
string str_concat_12;
if (gs_nothing_144 != as_4 || g_time_152 != Time[ai_0]) {
gs_nothing_144 = as_4;
g_time_152 = Time[ai_0];
str_concat_12 = StringConcatenate(Symbol(), ” at “, TimeToStr(TimeLocal(), TIME_SECONDS), ” GoldFX-Filter direction changed to”, as_4);
if (alertsMessage) Alert(str_concat_12);
if (alertsEmail) SendMail(StringConcatenate(Symbol(), “GoldFX-Filter”), str_concat_12);
if (alertsSound) PlaySound(“alert2.wav”);
}
}
int f0_5(string as_0) {
as_0 = f0_0(as_0);
for (int li_8 = ArraySize(gia_160) – 1; li_8 >= 0; li_8–)
if (as_0 == gsa_156[li_8] || as_0 == “” + gia_160[li_8]) return (MathMax(gia_160[li_8], Period()));
return (Period());
}
string f0_1(int ai_0) {
for (int li_4 = ArraySize(gia_160) – 1; li_4 >= 0; li_4–)
if (ai_0 == gia_160[li_4]) return (gsa_156[li_4]);
return (“”);
}
string f0_0(string as_0) {
int li_8;
string ls_ret_12 = as_0;
for (int li_20 = StringLen(as_0) – 1; li_20 >= 0; li_20–) {
li_8 = StringGetChar(ls_ret_12, li_20);
if ((li_8 > ‘`’ && li_8 < ‘{‘) || (li_8 > ‘Я’ && li_8 < 256)) ls_ret_12 = StringSetChar(ls_ret_12, li_20, li_8 – 32);
else
if (li_8 > -33 && li_8 < 0) ls_ret_12 = StringSetChar(ls_ret_12, li_20, li_8 + 224);
}
return (ls_ret_12);
}
double f0_3(double ad_0, double ad_8, double ad_16, int ai_24, int ai_28 = 0) {
double ld_32;
double ld_40;
if (ArrayRange(gda_164, 0) != Bars) ArrayResize(gda_164, Bars);
int li_48 = Bars – ai_24 – 1;
if (li_48 == 0) {
for (int count_52 = 0; count_52 < 7; count_52++) gda_164[0][count_52 + ai_28] = ad_0;
while (count_52 < 10) {
gda_164[0][count_52 + ai_28] = 0;
count_52++;
}
return (ad_0);
}
double ld_56 = MathMax(MathLog(MathSqrt((ad_8 – 1.0) / 2.0)) / MathLog(2.0) + 2.0, 0);
double ld_64 = MathMax(ld_56 – 2.0, 0.5);
double ld_72 = ad_0 – (gda_164[li_48 – 1][ai_28 + 5]);
double ld_80 = ad_0 – (gda_164[li_48 – 1][ai_28 + 6]);
gda_164[li_48][ai_28 + 7] = 0;
if (MathAbs(ld_72) > MathAbs(ld_80)) gda_164[li_48][ai_28 + 7] = MathAbs(ld_72);
if (MathAbs(ld_72) < MathAbs(ld_80)) gda_164[li_48][ai_28 + 7] = MathAbs(ld_80);
gda_164[li_48][ai_28 + 8] = gda_164[li_48 – 1][ai_28 + 8] + (gda_164[li_48][ai_28 + 7] – (gda_164[li_48 – 10][ai_28 + 7])) / 10.0;
double ld_88 = MathMin(MathMax(4.0 * ad_8, 30), 150);
if (li_48 < ld_88) {
ld_32 = gda_164[li_48][ai_28 + 8];
for (count_52 = 1; count_52 < ld_88 && li_48 – count_52 >= 0; count_52++) ld_32 += gda_164[li_48 – count_52][ai_28 + 8];
ld_32 /= count_52;
} else ld_32 = ((gda_164[li_48 – 1][ai_28 + 9]) * ld_88 – (gda_164[li_48 – f0_4(ld_88)][ai_28 + 8]) + (gda_164[li_48][ai_28 + 8])) / ld_88;
gda_164[li_48][ai_28 + 9] = ld_32;
if (gda_164[li_48][ai_28 + 9] > 0.0) ld_40 = (gda_164[li_48][ai_28 + 7]) / (gda_164[li_48][ai_28 + 9]);
else ld_40 = 0;
if (ld_40 > MathPow(ld_56, 1.0 / ld_64)) ld_40 = MathPow(ld_56, 1.0 / ld_64);
if (ld_40 < 1.0) ld_40 = 1.0;
double ld_96 = MathPow(ld_40, ld_64);
double ld_104 = MathSqrt((ad_8 – 1.0) / 2.0) * ld_56;
double ld_112 = MathPow(ld_104 / (ld_104 + 1.0), MathSqrt(ld_96));
if (ld_72 > 0.0) gda_164[li_48][ai_28 + 5] = ad_0;
else gda_164[li_48][ai_28 + 5] = ad_0 – ld_112 * ld_72;
if (ld_80 < 0.0) gda_164[li_48][ai_28 + 6] = ad_0;
else gda_164[li_48][ai_28 + 6] = ad_0 – ld_112 * ld_80;
double ld_120 = MathMax(MathMin(ad_16, 100), -100) / 100.0 + 1.5;
double ld_128 = (ad_8 – 1.0) / 2.0 / ((ad_8 – 1.0) / 2.0 + 2.0);
double ld_136 = MathPow(ld_128, ld_96);
gda_164[li_48][ai_28 + 0] = ad_0 + ld_136 * (gda_164[li_48 – 1][ai_28 + 0] – ad_0);
gda_164[li_48][ai_28 + 1] = (ad_0 – (gda_164[li_48][ai_28 + 0])) * (1 – ld_128) + ld_128 * (gda_164[li_48 – 1][ai_28 + 1]);
gda_164[li_48][ai_28 + 2] = gda_164[li_48][ai_28 + 0] + ld_120 * (gda_164[li_48][ai_28 + 1]);
gda_164[li_48][ai_28 + 3] = (gda_164[li_48][ai_28 + 2] – (gda_164[li_48 – 1][ai_28 + 4])) * MathPow(1 – ld_136, 2) + MathPow(ld_136, 2) * (gda_164[li_48 – 1][ai_28 +
3]);
gda_164[li_48][ai_28 + 4] = gda_164[li_48 – 1][ai_28 + 4] + (gda_164[li_48][ai_28 + 3]);
return (gda_164[li_48][ai_28 + 4]);
}
int f0_4(double ad_0) {
return (ad_0);
}