by WWMMACAU » Sun Aug 29, 2010 3:05 pm
Please create this MT4 indicator to .
- Code: Select all
/*
Thanks
Generated by EX4-TO-MQ4 decompiler V4.0.224.1 []
Website: http://purebeam.biz
E-mail : purebeam@gmail.com
*/
#property link "http://www.forexter.land.ru/indicators.htm"
#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 White
#property indicator_color2 Lime
#property indicator_color3 Blue
#property indicator_color4 Blue
#property indicator_color5 C'0x2D,0x8C,0x5A'
#property indicator_color6 C'0x8C,0x2D,0x5A'
#property indicator_color7 C'0x2D,0x8C,0x5A'
#property indicator_color8 C'0x8C,0x2D,0x5A'
#property indicator_width7 5
#property indicator_width8 5
extern int SR = 3;
extern int SRZZ = 36;
extern int MainRZZ = 12;
extern int FP = 12;
extern int SMF = 3;
extern bool DrawZZ = TRUE;
extern string exaprice = "Price modes";
extern string exprice = "0=close,1=open,2=high,3=low";
extern string exprice2 = "4=(h+l)/2,5=(h+l+c)/3,6=(H+L+2*C)/4";
extern int PriceConst = 0;
extern bool alertsOn = TRUE;
extern bool alertsOnCurrent = TRUE;
extern bool alertsMessage = TRUE;
extern bool alertsSound = FALSE;
extern bool alertsEmail = FALSE;
double g_ibuf_148[];
double g_ibuf_152[];
double gda_156[];
double gda_160[];
double g_ibuf_164[];
double g_ibuf_168[];
double g_ibuf_172[];
double g_ibuf_176[];
int gia_180[6] = {0, 0, 0, 0, 0, 0};
int gia_184[5] = {0, 0, 0, 0, 0};
int gi_188;
int gi_192;
int gi_196;
int gi_200;
int gi_204;
bool gi_208 = TRUE;
int g_bars_212 = 0;
string gs_nothing_216 = "nothing";
datetime g_time_224;
void MainCalculation(int ai_0) {
if (Bars - ai_0 > SR + 1) SACalc(ai_0);
else gda_156[ai_0] = 0;
if (Bars - ai_0 > FP + SR + 2) {
SMCalc(ai_0);
return;
}
gda_160[ai_0] = 0;
}
void SACalc(int ai_0) {
int li_4;
int l_count_8;
int li_12;
int li_16;
double ld_24;
switch (PriceConst) {
case 0:
gda_156[ai_0] = iMA(NULL, 0, SR + 1, 0, MODE_LWMA, PRICE_CLOSE, ai_0);
break;
case 1:
gda_156[ai_0] = iMA(NULL, 0, SR + 1, 0, MODE_LWMA, PRICE_OPEN, ai_0);
break;
case 4:
gda_156[ai_0] = iMA(NULL, 0, SR + 1, 0, MODE_LWMA, PRICE_MEDIAN, ai_0);
break;
case 5:
gda_156[ai_0] = iMA(NULL, 0, SR + 1, 0, MODE_LWMA, PRICE_TYPICAL, ai_0);
break;
case 6:
gda_156[ai_0] = iMA(NULL, 0, SR + 1, 0, MODE_LWMA, PRICE_WEIGHTED, ai_0);
break;
default:
gda_156[ai_0] = iMA(NULL, 0, SR + 1, 0, MODE_LWMA, PRICE_OPEN, ai_0);
}
for (int li_20 = ai_0 + SR + 2; li_20 > ai_0; li_20--) {
ld_24 = 0.0;
li_4 = 0;
l_count_8 = 0;
li_12 = li_20 + SR;
li_16 = li_20 - SR;
if (li_16 < ai_0) li_16 = ai_0;
while (li_12 >= li_20) {
l_count_8++;
ld_24 += l_count_8 * SnakePrice(li_12);
li_4 += l_count_8;
li_12--;
}
while (li_12 >= li_16) {
l_count_8--;
ld_24 += l_count_8 * SnakePrice(li_12);
li_4 += l_count_8;
li_12--;
}
gda_156[li_20] = ld_24 / li_4;
}
}
double SnakePrice(int ai_0) {
switch (PriceConst) {
case 0:
return (Close[ai_0]);
case 1:
return (Open[ai_0]);
case 4:
return ((High[ai_0] + Low[ai_0]) / 2.0);
case 5:
return ((Close[ai_0] + High[ai_0] + Low[ai_0]) / 3.0);
case 6:
return ((2.0 * Close[ai_0] + High[ai_0] + Low[ai_0]) / 4.0);
}
return (Open[ai_0]);
}
void SMCalc(int ai_0) {
double ld_4;
double ld_12;
for (int li_20 = ai_0 + SR + 2; li_20 >= ai_0; li_20--) {
ld_4 = gda_156[ArrayMaximum(gda_156, FP, li_20)];
ld_12 = gda_156[ArrayMinimum(gda_156, FP, li_20)];
gda_160[li_20] = ((SMF + 2) * 2 * gda_156[li_20] - (ld_4 + ld_12)) / 2.0 / (SMF + 1);
}
}
void LZZCalc(int ai_0) {
int li_8;
int li_12;
int li_16;
int l_index_20;
int li_4 = ai_0 - 1;
int li_24 = 0;
int li_28 = 0;
while (li_4 < gi_188 && li_16 == 0) {
li_4++;
g_ibuf_152[li_4] = 0;
li_8 = li_4 - MainRZZ;
if (li_8 < ai_0) li_8 = ai_0;
li_12 = li_4 + MainRZZ;
if (li_4 == ArrayMinimum(gda_160, li_12 - li_8 + 1, li_8)) {
li_16 = -1;
li_24 = li_4;
}
if (li_4 == ArrayMaximum(gda_160, li_12 - li_8 + 1, li_8)) {
li_16 = 1;
li_28 = li_4;
}
}
if (li_16 != 0) {
l_index_20 = 0;
if (li_4 > ai_0) {
if (gda_160[li_4] > gda_160[ai_0]) {
if (li_16 == 1) {
if (li_4 >= ai_0 + MainRZZ && l_index_20 < 5) {
l_index_20++;
gia_180[l_index_20] = li_4;
}
li_28 = li_4;
g_ibuf_152[li_4] = gda_160[li_4];
}
} else {
if (li_16 == -1) {
if (li_4 >= ai_0 + MainRZZ && l_index_20 < 5) {
l_index_20++;
gia_180[l_index_20] = li_4;
}
li_24 = li_4;
g_ibuf_152[li_4] = gda_160[li_4];
}
}
}
while (li_4 < gi_204 || l_index_20 < 5) {
g_ibuf_152[li_4] = 0;
li_8 = li_4 - MainRZZ;
if (li_8 < ai_0) li_8 = ai_0;
li_12 = li_4 + MainRZZ;
if (li_4 == ArrayMinimum(gda_160, li_12 - li_8 + 1, li_8)) {
if (li_16 == -1 && gda_160[li_4] < gda_160[li_24]) {
if (li_4 >= ai_0 + MainRZZ && l_index_20 < 5) gia_180[l_index_20] = li_4;
g_ibuf_152[li_24] = 0;
g_ibuf_152[li_4] = gda_160[li_4];
li_24 = li_4;
}
if (li_16 == 1) {
if (li_4 >= ai_0 + MainRZZ && l_index_20 < 5) {
l_index_20++;
gia_180[l_index_20] = li_4;
}
g_ibuf_152[li_4] = gda_160[li_4];
li_16 = -1;
li_24 = li_4;
}
}
if (li_4 == ArrayMaximum(gda_160, li_12 - li_8 + 1, li_8)) {
if (li_16 == 1 && gda_160[li_4] > gda_160[li_28]) {
if (li_4 >= ai_0 + MainRZZ && l_index_20 < 5) gia_180[l_index_20] = li_4;
g_ibuf_152[li_28] = 0;
g_ibuf_152[li_4] = gda_160[li_4];
li_28 = li_4;
}
if (li_16 == -1) {
if (li_4 >= ai_0 + MainRZZ && l_index_20 < 5) {
l_index_20++;
gia_180[l_index_20] = li_4;
}
g_ibuf_152[li_4] = gda_160[li_4];
li_16 = 1;
li_28 = li_4;
}
}
li_4++;
if (li_4 > gi_188) return;
}
gi_196 = Bars - gia_180[5];
g_ibuf_152[ai_0] = gda_160[ai_0];
return;
}
}
void SZZCalc(int ai_0) {
int li_8;
int li_12;
int li_16;
int l_index_20;
int li_4 = ai_0 - 1;
int li_24 = 0;
int li_28 = 0;
while (li_4 <= gi_204 && li_16 == 0) {
li_4++;
g_ibuf_176[li_4] = 0;
g_ibuf_172[li_4] = 0;
g_ibuf_168[li_4] = 0;
g_ibuf_164[li_4] = 0;
g_ibuf_148[li_4] = 0;
li_8 = li_4 - SRZZ;
if (li_8 < ai_0) li_8 = ai_0;
li_12 = li_4 + SRZZ;
if (li_4 == ArrayMinimum(gda_160, li_12 - li_8 + 1, li_8)) {
li_16 = -1;
li_24 = li_4;
}
if (li_4 == ArrayMaximum(gda_160, li_12 - li_8 + 1, li_8)) {
li_16 = 1;
li_28 = li_4;
}
}
if (li_16 != 0) {
l_index_20 = 0;
if (li_4 > ai_0) {
if (gda_160[li_4] > gda_160[ai_0]) {
if (li_16 == 1) {
if (li_4 >= ai_0 + SRZZ && l_index_20 < 4) {
l_index_20++;
gia_184[l_index_20] = li_4;
}
li_28 = li_4;
g_ibuf_168[li_4 - 1] = Open[li_4 - 1];
}
} else {
if (li_16 == -1) {
if (li_4 >= ai_0 + SRZZ && l_index_20 < 4) {
l_index_20++;
gia_184[l_index_20] = li_4;
}
li_24 = li_4;
g_ibuf_164[li_4 - 1] = Open[li_4 - 1];
}
}
}
while (li_4 <= gi_204 || l_index_20 < 4) {
g_ibuf_176[li_4] = 0;
g_ibuf_172[li_4] = 0;
g_ibuf_168[li_4] = 0;
g_ibuf_164[li_4] = 0;
g_ibuf_148[li_4] = 0;
li_8 = li_4 - SRZZ;
if (li_8 < ai_0) li_8 = ai_0;
li_12 = li_4 + SRZZ;
if (li_4 == ArrayMinimum(gda_160, li_12 - li_8 + 1, li_8)) {
if (li_16 == -1 && gda_160[li_4] < gda_160[li_24]) {
if (li_4 >= ai_0 + SRZZ && l_index_20 < 4) gia_184[l_index_20] = li_4;
g_ibuf_164[li_24 - 1] = 0;
g_ibuf_164[li_4 - 1] = Open[li_4 - 1];
li_24 = li_4;
}
if (li_16 == 1) {
if (li_4 >= ai_0 + SRZZ && l_index_20 < 4) {
l_index_20++;
gia_184[l_index_20] = li_4;
}
g_ibuf_164[li_4 - 1] = Open[li_4 - 1];
li_16 = -1;
li_24 = li_4;
}
}
if (li_4 == ArrayMaximum(gda_160, li_12 - li_8 + 1, li_8)) {
if (li_16 == 1 && gda_160[li_4] > gda_160[li_28]) {
if (li_4 >= ai_0 + SRZZ && l_index_20 < 4) gia_184[l_index_20] = li_4;
g_ibuf_168[li_28 - 1] = 0;
g_ibuf_168[li_4 - 1] = Open[li_4 - 1];
li_28 = li_4;
}
if (li_16 == -1) {
if (li_4 >= ai_0 + SRZZ && l_index_20 < 4) {
l_index_20++;
gia_184[l_index_20] = li_4;
}
g_ibuf_168[li_4 - 1] = Open[li_4 - 1];
li_16 = 1;
li_28 = li_4;
}
}
li_4++;
if (li_4 > gi_204) return;
}
gi_192 = Bars - gia_184[4];
return;
}
}
void ArrCalc() {
int li_8;
int li_16 = 0;
for (int li_0 = gi_204; g_ibuf_152[li_0] == 0.0; li_0--) {
}
int li_4 = li_0;
double ld_20 = g_ibuf_152[li_0];
for (li_0--; g_ibuf_152[li_0] == 0.0; li_0--) {
}
if (g_ibuf_152[li_0] > ld_20) li_16 = 1;
if (g_ibuf_152[li_0] > 0.0 && g_ibuf_152[li_0] < ld_20) li_16 = -1;
ld_20 = g_ibuf_152[li_4];
for (li_0 = li_4 - 1; li_0 > 0; li_0--) {
if (g_ibuf_152[li_0] > ld_20) {
li_16 = -1;
ld_20 = g_ibuf_152[li_0];
}
if (g_ibuf_152[li_0] > 0.0 && g_ibuf_152[li_0] < ld_20) {
li_16 = 1;
ld_20 = g_ibuf_152[li_0];
}
if (li_16 > 0 && g_ibuf_168[li_0] > 0.0) {
g_ibuf_148[li_0] = Open[li_0];
g_ibuf_168[li_0] = 0;
}
if (li_16 < 0 && g_ibuf_164[li_0] > 0.0) {
g_ibuf_148[li_0] = Open[li_0];
g_ibuf_164[li_0] = 0;
}
if (li_16 > 0 && g_ibuf_164[li_0] > 0.0) {
if (li_0 > 1) {
li_4 = li_0 - 1;
li_8 = li_4 - SRZZ + 1;
if (li_8 < 0) li_8 = 0;
for (int li_12 = li_4; li_12 >= li_8 && g_ibuf_168[li_12] == 0.0; li_12--) {
g_ibuf_172[li_12] = g_ibuf_164[li_0];
g_ibuf_176[li_12] = 0;
}
}
if (li_0 == 1) g_ibuf_172[0] = g_ibuf_164[li_0];
}
if (li_16 < 0 && g_ibuf_168[li_0] > 0.0) {
if (li_0 > 1) {
li_4 = li_0 - 1;
li_8 = li_4 - SRZZ + 1;
if (li_8 < 0) li_8 = 0;
for (li_12 = li_4; li_12 >= li_8 && g_ibuf_164[li_12] == 0.0; li_12--) {
g_ibuf_176[li_12] = g_ibuf_168[li_0];
g_ibuf_172[li_12] = 0;
}
}
if (li_0 == 1) g_ibuf_176[0] = g_ibuf_168[li_0];
}
}
}
int init() {
IndicatorBuffers(8);
SetIndexBuffer(0, g_ibuf_148);
SetIndexStyle(0, DRAW_ARROW, EMPTY, 2);
SetIndexArrow(0, 110);
SetIndexEmptyValue(0, 0.0);
SetIndexBuffer(1, g_ibuf_152);
if (DrawZZ) {
SetIndexStyle(1, DRAW_SECTION, EMPTY, 4);
SetIndexEmptyValue(1, 0.0);
} else SetIndexStyle(1, DRAW_NONE);
SetIndexBuffer(2, gda_156);
SetIndexStyle(2, DRAW_NONE);
SetIndexBuffer(3, gda_160);
SetIndexStyle(3, DRAW_NONE);
SetIndexBuffer(4, g_ibuf_164);
SetIndexStyle(4, DRAW_ARROW, EMPTY);
SetIndexArrow(4, 159);
SetIndexEmptyValue(4, 0.0);
SetIndexLabel(4, "trend UP");
SetIndexBuffer(5, g_ibuf_168);
SetIndexStyle(5, DRAW_ARROW, EMPTY);
SetIndexArrow(5, 159);
SetIndexEmptyValue(5, 0.0);
SetIndexLabel(5, "trend DOWN");
SetIndexBuffer(6, g_ibuf_172);
SetIndexStyle(6, DRAW_ARROW, EMPTY);
SetIndexArrow(6, 159);
SetIndexEmptyValue(6, 0.0);
SetIndexBuffer(7, g_ibuf_176);
SetIndexStyle(7, DRAW_ARROW, EMPTY);
SetIndexArrow(7, 159);
SetIndexEmptyValue(7, 0.0);
return (0);
}
void deinit() {
}
int start() {
int li_20;
int li_0 = IndicatorCounted();
if (li_0 < 0) return (-1);
if (li_0 > 0) li_0--;
if (gi_208 == TRUE) {
if (SR < 2) SR = 2;
if (Bars <= (MainRZZ + FP + SR + 2) * 2) return (-1);
if (SRZZ <= SR) SRZZ = SR + 1;
gi_188 = Bars - (MainRZZ + FP + SR + 2);
gi_204 = gi_188;
gi_200 = gi_204;
g_bars_212 = Bars;
gi_208 = FALSE;
}
int li_4 = Bars - li_0;
for (int li_8 = li_4; li_8 >= 0; li_8--) MainCalculation(li_8);
if (g_bars_212 != Bars) {
gi_200 = Bars - gi_192;
gi_204 = Bars - gi_196;
g_bars_212 = Bars;
}
SZZCalc(0);
LZZCalc(0);
ArrCalc();
if (alertsOn) {
if (alertsOnCurrent) li_20 = 0;
else li_20 = 1;
if (g_ibuf_164[li_20] > 0.0) doAlert(" Trend changed to UP M"+Period());
if (g_ibuf_168[li_20] > 0.0) doAlert(" Trend changed to DOWN M"+Period());
}
return (0);
}
void doAlert(string as_0) {
string l_str_concat_8;
if (gs_nothing_216 != as_0 || g_time_224 != Time[0]) {
gs_nothing_216 = as_0;
g_time_224 = Time[0];
l_str_concat_8 = StringConcatenate(Symbol(), " at ", TimeToStr(TimeLocal(), TIME_SECONDS), " WAVE ", as_0);
if (alertsMessage) Alert(l_str_concat_8);
if (alertsEmail) SendMail(StringConcatenate(Symbol(), " WAVE"), l_str_concat_8);
if (alertsSound) PlaySound("alert2.wav");
}
}
LUA format.