#property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 White #property indicator_color2 White bool gi_76 = TRUE; int gi_80 = 0; bool AlertsOn = FALSE; bool Comments = FALSE; bool TrendLine = TRUE; int TrendLineStyle = 0; int TrendLineWidth = 3; color UpperTrendLineColour = Red; color LowerTrendLineColour = SkyBlue; bool ProjectionLines = FALSE; int ProjectionLinesStyle = 2; int ProjectionLinesWidth = 3; color UpperProjectionLineColour = Blue; color LowerProjectionLineColour = Red; bool HorizontLine = FALSE; bool gi_144 = FALSE; int gi_148 = 0; int gi_152 = 1; bool gi_156 = FALSE; double gd_160 = -1.0; bool gi_168 = FALSE; double gd_172 = -1.0; bool gi_180 = FALSE; double gda_184[]; double gda_188[]; int init() { SetIndexStyle(0, DRAW_ARROW); SetIndexArrow(0, 217); SetIndexBuffer(0, gda_184); SetIndexEmptyValue(0, 0.0); SetIndexStyle(1, DRAW_ARROW); SetIndexArrow(1, 218); SetIndexBuffer(1, gda_188); SetIndexEmptyValue(1, 0.0); for (int li_0 = 1; li_0 <= 10; li_0++) { ObjectDelete("HHL_" + li_0); ObjectDelete("HL_" + li_0); ObjectDelete("HLL_" + li_0); ObjectDelete("LL_" + li_0); ObjectDelete("HC1_" + li_0); ObjectDelete("HC2_" + li_0); ObjectDelete("HC3_" + li_0); ObjectDelete("LC1_" + li_0); ObjectDelete("LC2_" + li_0); ObjectDelete("LC3_" + li_0); } Comment(""); return (0); } int deinit() { for (int li_0 = 1; li_0 <= 10; li_0++) { ObjectDelete("HHL_" + li_0); ObjectDelete("HL_" + li_0); ObjectDelete("HLL_" + li_0); ObjectDelete("LL_" + li_0); ObjectDelete("HC1_" + li_0); ObjectDelete("HC2_" + li_0); ObjectDelete("HC3_" + li_0); ObjectDelete("LC1_" + li_0); ObjectDelete("LC2_" + li_0); ObjectDelete("LC3_" + li_0); } Comment(""); return (0); } int SetTDPoint(int ai_0) { if (gi_156 == FALSE) { for (int li_4 = ai_0; li_4 > 1; li_4--) { if (High[li_4 + 2] < High[li_4] && High[li_4 + 1] < High[li_4] && High[li_4 - 1] < High[li_4] && High[li_4 - 2] < High[li_4]) gda_184[li_4] = High[li_4]; if (Low[li_4 + 2] > Low[li_4] && Low[li_4 + 1] > Low[li_4] && Low[li_4 - 1] > Low[li_4] && Low[li_4 - 2] > Low[li_4]) gda_188[li_4] = Low[li_4]; } gda_184[0] = 0; gda_188[0] = 0; gda_184[1] = 0; gda_188[1] = 0; } else { for (li_4 = ai_0; li_4 > 3; li_4--) { if (High[li_4 + 1] <= High[li_4] && High[li_4 - 1] < High[li_4] && High[li_4 + 2] <= High[li_4] && High[li_4 - 2] < High[li_4]) gda_184[li_4] = High[li_4]; else gda_184[li_4] = 0; if (Low[li_4 + 1] >= Low[li_4] && Low[li_4 - 1] > Low[li_4] && Low[li_4 + 2] >= Low[li_4] && Low[li_4 - 2] > Low[li_4]) gda_188[li_4] = Low[li_4]; else gda_188[li_4] = 0; } gda_184[0] = 0; gda_188[0] = 0; gda_184[1] = 0; gda_188[1] = 0; gda_184[2] = 0; gda_188[2] = 0; } return (0); } int GetHighTD(int ai_0) { int li_4 = 0; for (int li_8 = 0; li_8 < ai_0; li_8++) { li_4++; while (gda_184[li_4] == 0.0) { li_4++; if (li_4 > Bars - 2) return (-1); } } return (li_4); } int GetNextHighTD(int ai_0) { int li_4 = ai_0 + 1; while (gda_184[li_4] <= High[ai_0]) { li_4++; if (li_4 > Bars - 2) return (-1); } return (li_4); } int GetLowTD(int ai_0) { int li_4 = 0; for (int li_8 = 0; li_8 < ai_0; li_8++) { li_4++; while (gda_188[li_4] == 0.0) { li_4++; if (li_4 > Bars - 2) return (-1); } } return (li_4); } int GetNextLowTD(int ai_0) { int li_4 = ai_0 + 1; while (gda_188[li_4] >= Low[ai_0] || gda_188[li_4] == 0.0) { li_4++; if (li_4 > Bars - 2) return (-1); } return (li_4); } int TrendLineHighTD(int ai_0, int ai_4, int ai_8, int ai_12) { ObjectSet("HL_" + ai_8, OBJPROP_TIME1, Time[ai_4]); ObjectSet("HL_" + ai_8, OBJPROP_TIME2, Time[ai_0]); ObjectSet("HL_" + ai_8, OBJPROP_PRICE1, High[ai_4]); ObjectSet("HL_" + ai_8, OBJPROP_PRICE2, High[ai_0]); ObjectSet("HL_" + ai_8, OBJPROP_COLOR, UpperTrendLineColour); if (ai_8 == 1) ObjectSet("HL_" + ai_8, OBJPROP_WIDTH, TrendLineWidth); else ObjectSet("HL_" + ai_8, OBJPROP_WIDTH, 2); return (0); } int TrendLineLowTD(int ai_0, int ai_4, int ai_8, int ai_12) { ObjectSet("LL_" + ai_8, OBJPROP_TIME1, Time[ai_4]); ObjectSet("LL_" + ai_8, OBJPROP_TIME2, Time[ai_0]); ObjectSet("LL_" + ai_8, OBJPROP_PRICE1, Low[ai_4]); ObjectSet("LL_" + ai_8, OBJPROP_PRICE2, Low[ai_0]); ObjectSet("LL_" + ai_8, OBJPROP_COLOR, LowerTrendLineColour); if (ai_8 == 1) ObjectSet("LL_" + ai_8, OBJPROP_WIDTH, TrendLineWidth); else ObjectSet("LL_" + ai_8, OBJPROP_WIDTH, 2); return (0); } int HorizontLineHighTD(int ai_0, int ai_4, int ai_8, double ad_12, color ai_20) { ObjectSet("HHL_" + ai_8, OBJPROP_PRICE1, High[ai_4] - (High[ai_4] - High[ai_0]) / (ai_4 - ai_0) * ai_4); ObjectSet("HHL_" + ai_8, OBJPROP_STYLE, ad_12); ObjectSet("HHL_" + ai_8, OBJPROP_COLOR, ai_20); ObjectSet("HHL_" + ai_8, OBJPROP_BACK, TRUE); return (0); } int HorizontLineLowTD(int ai_0, int ai_4, int ai_8, double ad_12, color ai_20) { ObjectSet("HLL_" + ai_8, OBJPROP_PRICE1, Low[ai_4] + (Low[ai_0] - Low[ai_4]) / (ai_4 - ai_0) * ai_4); ObjectSet("HLL_" + ai_8, OBJPROP_STYLE, ad_12); ObjectSet("HLL_" + ai_8, OBJPROP_COLOR, ai_20); ObjectSet("HLL_" + ai_8, OBJPROP_BACK, TRUE); return (0); } string TakeProfitHighTD(int ai_0, int ai_4, int ai_8, color ai_12) { int li_16; double ld_20; double ld_28; double ld_36; double ld_44; int li_52 = 0; string ls_56 = ""; double ld_64 = (High[ai_4] - High[ai_0]) / (ai_4 - ai_0); while (NormalizeDouble(Point, li_52) == 0.0) li_52++; double ld_72 = 0; for (int li_80 = ai_0; li_80 > 0; li_80--) { if (Close[li_80] > High[ai_4] - ld_64 * (ai_4 - li_80)) { ld_72 = High[ai_4] - ld_64 * (ai_4 - li_80); break; } } if (ld_72 > 0.0) { ls_56 = ls_56 + "UTD_Line (" + DoubleToStr(High[ai_4] - ld_64 * ai_4, li_52) + ") broken at " + DoubleToStr(ld_72, li_52) + ", uptargets:\n"; li_16 = iLowest(NULL, 0, MODE_LOW, ai_4 - li_80, li_80); ld_20 = High[ai_4] - ld_64 * (ai_4 - li_16) - Low[li_16]; ld_28 = High[ai_4] - ld_64 * (ai_4 - li_16) - Close[li_16]; li_16 = iLowest(NULL, 0, MODE_CLOSE, ai_4 - li_80, li_80); ld_36 = High[ai_4] - ld_64 * (ai_4 - li_16) - Close[li_16]; ld_44 = TrendLineStyle; } else { ld_72 = High[ai_4] - ld_64 * ai_4; ls_56 = ls_56 + "UTD_Line (" + DoubleToStr(ld_72, li_52) + "), Possible break-up. \n"; li_16 = iLowest(NULL, 0, MODE_LOW, ai_4, 0); ld_20 = High[ai_4] - ld_64 * (ai_4 - li_16) - Low[li_16]; ld_28 = High[ai_4] - ld_64 * (ai_4 - li_16) - Close[li_16]; li_16 = iLowest(NULL, 0, MODE_CLOSE, ai_4, 0); ld_36 = High[ai_4] - ld_64 * (ai_4 - li_16) - Close[li_16]; ld_44 = TrendLineStyle; } ObjectSet("HL_" + ai_8, OBJPROP_STYLE, ld_44); ls_56 = ls_56 + "TP1=" + DoubleToStr(ld_20 + ld_72, li_52) + " (" + DoubleToStr(ld_20 / Point, 0) + "pts.)\n"; ObjectSet("HC1_" + ai_8, OBJPROP_TIME1, Time[ai_0]); ObjectSet("HC1_" + ai_8, OBJPROP_TIME2, Time[0]); ObjectSet("HC1_" + ai_8, OBJPROP_PRICE1, ld_20 + ld_72); ObjectSet("HC1_" + ai_8, OBJPROP_PRICE2, ld_20 + ld_72); ObjectSet("HC1_" + ai_8, OBJPROP_COLOR, ai_12); ObjectSet("HC1_" + ai_8, OBJPROP_STYLE, ld_44); if (ai_8 == 1) { ObjectSet("HC1_" + ai_8, OBJPROP_WIDTH, ProjectionLinesWidth); ObjectSet("HC1_" + ai_8, OBJPROP_STYLE, ProjectionLinesStyle); } else ObjectSet("HC1_" + ai_8, OBJPROP_WIDTH, 2); return (ls_56); } string TakeProfitLowTD(int ai_0, int ai_4, int ai_8, color ai_12) { int li_16; double ld_20; double ld_28; double ld_36; double ld_44; int li_52 = 0; string ls_56 = ""; double ld_64 = (Low[ai_0] - Low[ai_4]) / (ai_4 - ai_0); while (NormalizeDouble(Point, li_52) == 0.0) li_52++; double ld_72 = 0; for (int li_80 = ai_0; li_80 > 0; li_80--) { if (Close[li_80] < Low[ai_4] + ld_64 * (ai_4 - li_80)) { ld_72 = Low[ai_4] + ld_64 * (ai_4 - li_80); break; } } if (ld_72 > 0.0) { ls_56 = ls_56 + "LTD_Line (" + DoubleToStr(Low[ai_4] + ld_64 * ai_4, li_52) + ") broken at " + DoubleToStr(ld_72, li_52) + ", downtargets:\n"; li_16 = iHighest(NULL, 0, MODE_HIGH, ai_4 - li_80, li_80); ld_20 = High[li_16] - (Low[ai_4] + ld_64 * (ai_4 - li_16)); ld_28 = Close[li_16] - (Low[ai_4] + ld_64 * (ai_4 - li_16)); li_80 = iHighest(NULL, 0, MODE_CLOSE, ai_4 - li_80, li_80); ld_36 = Close[li_16] - (Low[ai_4] + ld_64 * (ai_4 - li_16)); ld_44 = TrendLineStyle; } else { ld_72 = Low[ai_4] + ld_64 * ai_4; ls_56 = ls_56 + "LTD_Line (" + DoubleToStr(ld_72, li_52) + "), Possible downbreak.\n"; li_16 = iHighest(NULL, 0, MODE_HIGH, ai_4, 0); ld_20 = High[li_16] - (Low[ai_4] + ld_64 * (ai_4 - li_16)); ld_28 = Close[li_16] - (Low[ai_4] + ld_64 * (ai_4 - li_16)); li_16 = iHighest(NULL, 0, MODE_CLOSE, ai_4, 0); ld_36 = Close[li_16] - (Low[ai_4] + ld_64 * (ai_4 - li_16)); ld_44 = TrendLineStyle; } ObjectSet("LL_" + ai_8, OBJPROP_STYLE, ld_44); ls_56 = ls_56 + "TP1=" + DoubleToStr(ld_72 - ld_20, li_52) + " (" + DoubleToStr(ld_20 / Point, 0) + "pts.)\n"; ObjectSet("LC1_" + ai_8, OBJPROP_TIME1, Time[ai_0]); ObjectSet("LC1_" + ai_8, OBJPROP_TIME2, Time[0]); ObjectSet("LC1_" + ai_8, OBJPROP_PRICE1, ld_72 - ld_20); ObjectSet("LC1_" + ai_8, OBJPROP_PRICE2, ld_72 - ld_20); ObjectSet("LC1_" + ai_8, OBJPROP_COLOR, ai_12); ObjectSet("LC1_" + ai_8, OBJPROP_STYLE, ld_44); if (ai_8 == 1) { ObjectSet("LC1_" + ai_8, OBJPROP_WIDTH, ProjectionLinesWidth); ObjectSet("LC1_" + ai_8, OBJPROP_STYLE, ProjectionLinesStyle); } else ObjectSet("LC1_" + ai_8, OBJPROP_WIDTH, 2); return (ls_56); } string TDMain(int ai_0) { int li_4; double ld_8; double lda_16[20]; string ls_20 = "--- step " + ai_0 + " --------------------\n"; while (NormalizeDouble(Point, li_4) == 0.0) li_4++; lda_16[0] = UpperProjectionLineColour; lda_16[2] = 16711935; lda_16[4] = 1993170; lda_16[6] = 2139610; lda_16[8] = 13458026; lda_16[1] = LowerProjectionLineColour; lda_16[3] = 2237106; lda_16[5] = 32768; lda_16[7] = 13850042; lda_16[9] = 15570276; lda_16[10] = 255; lda_16[12] = 16711935; lda_16[14] = 1993170; lda_16[16] = 2139610; lda_16[18] = 13458026; lda_16[11] = 16711680; lda_16[13] = 2237106; lda_16[15] = 32768; lda_16[17] = 13850042; lda_16[19] = 15570276; ai_0 += gi_148; int li_28 = GetHighTD(ai_0); int li_32 = GetNextHighTD(li_28); int li_36 = GetLowTD(ai_0); int li_40 = GetNextLowTD(li_36); gd_160 = High[li_32] - (High[li_32] - High[li_28]) / (li_32 - li_28) * li_32; gd_172 = Low[li_40] + (Low[li_36] - Low[li_40]) / (li_40 - li_36) * li_40; if (li_28 < 0) ls_20 = ls_20 + "UTD no TD up-point \n"; else { if (li_32 < 0) ls_20 = ls_20 + "UTD no TD point-upper then last one (" + DoubleToStr(High[li_28], li_4) + ")\n"; else { ls_20 = ls_20 + "UTD " + DoubleToStr(High[li_32], li_4) + " " + DoubleToStr(High[li_28], li_4) + "\n"; } } if (li_36 < 0) ls_20 = ls_20 + "LTD no TD down-point \n"; else { if (li_40 < 0) ls_20 = ls_20 + "LTD no TD point-lower then last one (" + DoubleToStr(Low[li_36], li_4) + ")\n"; else { ls_20 = ls_20 + "LTD " + DoubleToStr(Low[li_40], li_4) + " " + DoubleToStr(Low[li_36], li_4) + "\n"; } } if (ai_0 == 1) ld_8 = 0; else ld_8 = 2; if (li_28 > 0 && li_32 > 0) { if (TrendLine == TRUE) { ObjectCreate("HL_" + ai_0, OBJ_TREND, 0, 0, 0, 0, 0); TrendLineHighTD(li_28, li_32, ai_0, lda_16[ai_0 * 2 - 2]); } else ObjectDelete("HL_" + ai_0); if (HorizontLine == TRUE && ai_0 == 1) { ObjectCreate("HHL_" + ai_0, OBJ_HLINE, 0, 0, 0, 0, 0); ObjectSet("HHL_" + ai_0, OBJPROP_BACK, TRUE); HorizontLineHighTD(li_28, li_32, ai_0, ld_8, lda_16[ai_0 * 2 - 2]); } else ObjectDelete("HHL_" + ai_0); if (ProjectionLines == TRUE) { ObjectCreate("HC1_" + ai_0, OBJ_TREND, 0, 0, 0, 0, 0); ObjectCreate("HC2_" + ai_0, OBJ_TREND, 0, 0, 0, 0, 0); ObjectCreate("HC3_" + ai_0, OBJ_TREND, 0, 0, 0, 0, 0); ls_20 = ls_20 + TakeProfitHighTD(li_28, li_32, ai_0, lda_16[ai_0 * 2 - 2]); } else { ObjectDelete("HC1_" + ai_0); ObjectDelete("HC2_" + ai_0); ObjectDelete("HC3_" + ai_0); } } if (li_36 > 0 && li_40 > 0) { if (TrendLine == TRUE) { ObjectCreate("LL_" + ai_0, OBJ_TREND, 0, 0, 0, 0, 0); TrendLineLowTD(li_36, li_40, ai_0, lda_16[ai_0 * 2 - 1]); } else ObjectDelete("LL_" + ai_0); if (HorizontLine == TRUE && ai_0 == 1) { ObjectCreate("HLL_" + ai_0, OBJ_HLINE, 0, 0, 0, 0, 0); ObjectSet("HLL_" + ai_0, OBJPROP_BACK, TRUE); HorizontLineLowTD(li_36, li_40, ai_0, ld_8, lda_16[ai_0 * 2 - 1]); } else ObjectDelete("HLL_" + ai_0); if (ProjectionLines == TRUE) { ObjectCreate("LC1_" + ai_0, OBJ_TREND, 0, 0, 0, 0, 0); ObjectCreate("LC2_" + ai_0, OBJ_TREND, 0, 0, 0, 0, 0); ObjectCreate("LC3_" + ai_0, OBJ_TREND, 0, 0, 0, 0, 0); ls_20 = ls_20 + TakeProfitLowTD(li_36, li_40, ai_0, lda_16[ai_0 * 2 - 1]); } else { ObjectDelete("LC1_" + ai_0); ObjectDelete("LC2_" + ai_0); ObjectDelete("LC3_" + ai_0); } } if (AlertsOn) { if (Close[0] > gd_160 && gi_168 == FALSE) { Alert("UTL Break>", gd_160, " on ", Symbol(), " ", Period(), " @ ", Bid); gi_168 = TRUE; } if (Close[0] < gd_172 && gi_180 == FALSE) { Alert("LTL Break<", gd_172, " on ", Symbol(), " ", Period(), " @ ", Bid); gi_180 = TRUE; } } return (ls_20); } int start() { string ls_0 = ""; SetTDPoint(Bars - 1); if (gi_144 == TRUE) { SetIndexArrow(0, 217); SetIndexArrow(1, 218); } else { SetIndexArrow(0, 160); SetIndexArrow(1, 160); } if (gi_152 > 10) { Comment("ShowingSteps readings 0 - 10"); return (0); } for (int li_8 = 1; li_8 <= gi_152; li_8++) ls_0 = ls_0 + TDMain(li_8); ls_0 = ls_0 + "------------------------------------\nShowingSteps=" + gi_152 + "\nBackSteps=" + gi_148; if (gi_156 == TRUE) { ls_0 = ls_0 + "\nFractals"; } else { ls_0 = ls_0 + "\nTD point"; } if (Comments == TRUE) Comment(ls_0); else Comment(""); return (0); }