#property copyright "Copyright © 2007, Sharptrade Partners LLC." #property link "http://FXIMPACT.COM" #property indicator_chart_window #property indicator_buffers 4 #property indicator_color1 Green #property indicator_color2 Red #property indicator_color3 Black #property indicator_color4 Black #import "FXI.dll" string gGrab(string a0, string a1); #import "fxi_upd.dll" string returnReg(string a0, string a1); void runUpdater(); #import int g_file_76; bool gi_80 = FALSE; extern string Copyright = "Copyright Sharptrade Partners, LLC - 2009"; extern string First = " Price Action Channel Histogram"; extern string Last = "www.foreximpact.com"; extern bool ShowAlerts = FALSE; double g_ibuf_112[]; double gd_116 = 1.01; int gi_124 = 4; double g_ibuf_128[]; double g_ibuf_132[]; int g_highest_136 = 0; int g_lowest_140 = 0; double gd_144 = 0.0; double gd_152 = 0.0; int gi_unused_160 = 0; int gi_unused_164 = 0; int gi_168 = 0; int gi_172 = 0; double g_ibuf_176[]; double g_ibuf_180[]; double g_ibuf_184[]; int gi_188 = -1; int gi_192 = -1; int gi_196 = -1; int g_time_200 = -1; bool gi_unused_204 = TRUE; double gda_208[100000]; double gda_212[100000]; double gda_216[100000]; double gda_220[100000]; double gda_224[100000]; double gda_228[100000]; double gda_232[100000]; double gda_236[5]; double gd_240 = 0.0; double gda_248[100000]; double gda_252[100000]; int gi_unused_256 = 0; int gi_260 = 0; int gi_264 = 0; int g_bars_268 = 0; int gi_272 = 4; double gd_276; bool gi_284 = TRUE; int g_bars_288 = -1; double gd_292; int gi_unused_300 = -1; int g_time_304 = 0; bool gi_308 = FALSE; int loginStart() { int l_str2int_0; bool li_4; int li_8; g_file_76 = FileOpen("fxi_t.bin", FILE_CSV|FILE_READ); if (g_file_76 < 1) li_4 = FALSE; else { l_str2int_0 = StrToInteger(FileReadString(g_file_76)); FileClose(g_file_76); li_4 = TRUE; } if (TimeLocal() - l_str2int_0 >= 604800 || li_4 == FALSE) { li_8 = doLogin(); switch (li_8) { case 0: Alert("Logged in"); g_file_76 = FileOpen("fxi_t.bin", FILE_WRITE, 8); if (g_file_76 < 1) { Print("Cannot open password cache!"); return (0); } FileWrite(g_file_76, TimeLocal()); FileClose(g_file_76); checkVersions(); break; case 1: Alert("Invalid key provided!! Please re-install the software with the correct key."); gi_80 = TRUE; break; case 4: Alert("Your account has been disabled! Please contact support@fximpact.com"); gi_80 = TRUE; break; case 5: Alert("Server error!! Please make sure you are connected to the Internet and try again."); gi_80 = TRUE; break; case 6: Alert("No key found in your registry (bad install)! Please re-install the product."); gi_80 = TRUE; } } return (0); } int doLogin() { string ls_0 = returnReg("Software\\FXI\\Triad", "fname"); string ls_8 = returnReg("Software\\FXI\\Triad", "lname"); string ls_16 = returnReg("Software\\FXI\\Triad", "email"); string ls_24 = returnReg("Software\\FXI\\Triad", "key"); if (ls_24 == "") return (6); string ls_32 = "fname=" + ls_0; ls_32 = ls_32 + "&lname=" + ls_8; ls_32 = ls_32 + "&email=" + ls_16; ls_32 = ls_32 + "&key=" + ls_24; string ls_40 = gGrab("http://www.foreximpact.com/triad/t_login.php", ls_32); if (StringSubstr(ls_40, 0, 1) == "0") return (0); if (StringSubstr(ls_40, 0, 1) == "1") return (1); if (StringSubstr(ls_40, 0, 1) == "4") return (4); return (5); } void checkVersions() { string lsa_28[50]; int li_36; int li_40; string ls_48; string ls_56; string ls_64; string ls_0 = "http://www.foreximpact.com/triad/versions.txt"; string ls_8 = gGrab(ls_0, ""); int l_str2dbl_24 = -1; int l_file_32 = FileOpen("fxi_versions.txt", FILE_CSV|FILE_WRITE, ","); if (l_file_32 < 1) Print("Can NOT load the versions.txt file! Not updating indicators..."); FileWrite(l_file_32, ls_8); FileClose(l_file_32); l_file_32 = FileOpen("fxi_versions.txt", FILE_CSV|FILE_READ, ","); if (l_file_32 < 1) Print("Can NOT load the versions.txt file! Not updating indicators..."); string ls_16 = FileReadString(l_file_32); l_str2dbl_24 = StrToDouble(ls_16); int l_index_44 = 0; if (l_str2dbl_24 > 0) { for (int l_count_72 = 0; l_count_72 < l_str2dbl_24; l_count_72++) { ls_16 = FileReadString(l_file_32); li_40 = StringFind(ls_16, ".", 0); ls_48 = StringSubstr(ls_16, 0, li_40); li_36 = StringFind(ls_16, " ", 0); ls_56 = StringSubstr(ls_16, li_36 + 1, StringLen(ls_16) - (li_36 + 1)); if (!checkIndyVersion(ls_48, ls_56)) { ls_64 = StringSubstr(ls_16, 0, li_36); lsa_28[l_index_44] = ls_64; l_index_44++; } } FileClose(l_file_32); Print("Number of indicators to update -- ", l_index_44); if (l_index_44 > 0) { l_file_32 = FileOpen("fxi_update.txt", FILE_CSV|FILE_WRITE, ","); if (l_file_32 < 1) Print("Can not open fxi_update.txt for writing! Exiting..."); else { FileWrite(l_file_32, l_index_44); for (int l_index_76 = 0; l_index_76 < l_index_44; l_index_76++) { Print("Updating Indicator -- ", lsa_28[l_index_76]); FileWrite(l_file_32, lsa_28[l_index_76]); } FileClose(l_file_32); runUpdater(); } } } else FileClose(l_file_32); } bool checkIndyVersion(string as_0, string as_8) { Print("Checking indy " + as_0 + " with version " + as_8); double l_str2dbl_16 = StrToDouble(as_8); double l_icustom_24 = iCustom(Symbol(), 0, as_0, "verCheckInfo", 0, 0); Print("Returned version : ", l_icustom_24); if (l_icustom_24 > 0.0 && l_icustom_24 < l_str2dbl_16) return (FALSE); if (l_icustom_24 == 0.0) return (FALSE); return (TRUE); } int init() { if (checkVerInfo()) return (0); if (!IsDllsAllowed()) { Alert("Must allow DLLs! Go to Tools > Options > Expert Advisors > Allow DLL Imports"); gi_80 = TRUE; return (-1); } IndicatorBuffers(5); gd_292 = (MarketInfo(Symbol(), MODE_SPREAD) + 1.0) * Point; SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID, 2); SetIndexArrow(0, 233); SetIndexBuffer(0, g_ibuf_180); SetIndexLabel(0, "Long Arrow"); SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID, 2); SetIndexArrow(1, 234); SetIndexBuffer(1, g_ibuf_184); SetIndexLabel(1, "Short Arrow"); SetIndexStyle(2, DRAW_NONE); SetIndexBuffer(2, g_ibuf_128); SetIndexLabel(2, "Upper Line"); SetIndexStyle(3, DRAW_NONE); SetIndexBuffer(3, g_ibuf_132); SetIndexLabel(3, "Lower Line"); SetIndexStyle(4, DRAW_NONE); SetIndexBuffer(4, g_ibuf_176); if (Period() == PERIOD_W1) gi_124 = 4; else { if (Period() == PERIOD_D1) gi_124 = 4; else { if (Period() == PERIOD_H4) gi_124 = 8; else gi_124 = 8; } } loginStart(); return (0); } int deinit() { for (int l_count_0 = 0; l_count_0 <= gi_168; l_count_0++) ObjectDelete("FXI_AdvancedPivot Long Line #" + l_count_0); for (l_count_0 = 0; l_count_0 <= gi_172; l_count_0++) ObjectDelete("FXI_AdvancedPivot Short Line #" + l_count_0); return (0); } int start() { if (Copyright == "verCheckInfo") { g_ibuf_112[0] = gd_116; return (0); } if (gi_80) return (0); int l_ind_counted_0 = IndicatorCounted(); if (!gi_284 && MathAbs(Bars - g_bars_288) > 1.0) { gi_196 = -1; for (int l_index_4 = 0; l_index_4 <= gi_168; l_index_4++) ObjectDelete("FXI_AdvancedPivot Long Line #" + l_index_4); for (l_index_4 = 0; l_index_4 <= gi_172; l_index_4++) ObjectDelete("FXI_AdvancedPivot Short Line #" + l_index_4); l_ind_counted_0 = 0; ArrayInitialize(g_ibuf_180, EMPTY_VALUE); ArrayInitialize(g_ibuf_184, EMPTY_VALUE); ArrayInitialize(g_ibuf_128, EMPTY_VALUE); ArrayInitialize(g_ibuf_132, EMPTY_VALUE); } LineaPlanus(); ArrowPlacement(); int li_8 = Bars - l_ind_counted_0; if (li_8 > 0) li_8--; if (li_8 < 0) return (-1); for (l_index_4 = li_8; l_index_4 >= 0; l_index_4--) { if (gi_308 && l_index_4 != 0) continue; if (l_index_4 == 0) { if (gi_196 != -1) { if (g_time_200 == Time[l_index_4]) drawArrows(gi_196, l_index_4); else gi_196 = -1; } } if (l_index_4 == 0) { if (g_time_304 < Time[0]) { g_time_304 = Time[0]; checkLP(l_index_4); } } else checkLP(l_index_4); doPatterns(l_index_4); drawLines(l_index_4); } gi_284 = FALSE; g_bars_288 = Bars; return (0); } void doPatterns(int ai_0) { int l_datetime_4 = 0; int l_datetime_8 = 0; if (gi_196 == -1 || gi_196 == 2) { g_highest_136 = iHighest(NULL, 0, MODE_HIGH, gi_124 * 2 + 1, ai_0 + 1); if (g_highest_136 == ai_0 + gi_124 + 1) { gd_144 = High[g_highest_136]; gi_unused_160 = g_highest_136; gi_168++; gi_188 = TRUE; l_datetime_4 = Time[g_highest_136]; l_datetime_8 = Time[ai_0]; if (l_datetime_4 > l_datetime_8) l_datetime_8 = Time[0]; for (int li_12 = ai_0; li_12 <= g_highest_136; li_12++) g_ibuf_128[li_12] = gd_144 + gd_292; ObjectCreate("FXI_AdvancedPivot Long Line #" + gi_168, OBJ_TREND, 0, l_datetime_4, gd_144 + gd_292, l_datetime_8, gd_144 + gd_292); ObjectSet("FXI_AdvancedPivot Long Line #" + gi_168, OBJPROP_RAY, FALSE); ObjectSet("FXI_AdvancedPivot Long Line #" + gi_168, OBJPROP_COLOR, LightGreen); ObjectSet("FXI_AdvancedPivot Long Line #" + gi_168, OBJPROP_WIDTH, 2); ObjectSetText("FXI_AdvancedPivot Long Line #" + gi_168, "FXI_AdvancedPivot"); } } if (gi_196 == -1 || gi_196 == 1) { g_lowest_140 = iLowest(NULL, 0, MODE_LOW, gi_124 * 2 + 1, ai_0 + 1); if (g_lowest_140 == ai_0 + gi_124 + 1) { gd_152 = Low[g_lowest_140]; gi_unused_164 = g_lowest_140; gi_172++; gi_192 = TRUE; l_datetime_4 = Time[g_lowest_140]; l_datetime_8 = Time[ai_0]; if (l_datetime_4 < l_datetime_8) l_datetime_8 = Time[0]; for (li_12 = ai_0; li_12 <= g_lowest_140; li_12++) g_ibuf_132[li_12] = gd_152 - 1.0 * Point; ObjectCreate("FXI_AdvancedPivot Short Line #" + gi_172, OBJ_TREND, 0, l_datetime_4, gd_152 - 1.0 * Point, l_datetime_8, gd_152 - 1.0 * Point); ObjectSet("FXI_AdvancedPivot Short Line #" + gi_172, OBJPROP_RAY, FALSE); ObjectSet("FXI_AdvancedPivot Short Line #" + gi_172, OBJPROP_COLOR, LightSalmon); ObjectSet("FXI_AdvancedPivot Short Line #" + gi_172, OBJPROP_WIDTH, 2); ObjectSetText("FXI_AdvancedPivot Short Line #" + gi_172, "FXI_AdvancedPivot"); } } } void drawLines(int ai_0) { if (gi_188 == TRUE) { g_ibuf_128[ai_0] = gd_144 + gd_292; if (High[ai_0] > gd_144 + gd_292) { gi_188 = FALSE; ObjectSet("FXI_AdvancedPivot Long Line #" + gi_168, OBJPROP_COLOR, Green); if (ai_0 == 0) { doAlerts(1, ai_0); gi_196 = 1; g_time_200 = Time[ai_0]; } } ObjectSet("FXI_AdvancedPivot Long Line #" + gi_168, OBJPROP_TIME2, Time[ai_0]); } if (gi_192 == TRUE) { g_ibuf_132[ai_0] = gd_152 - 1.0 * Point; if (Low[ai_0] < gd_152 - 1.0 * Point) { gi_192 = FALSE; ObjectSet("FXI_AdvancedPivot Short Line #" + gi_172, OBJPROP_COLOR, Red); if (ai_0 == 0) { doAlerts(2, ai_0); gi_196 = 2; g_time_200 = Time[ai_0]; } } ObjectSet("FXI_AdvancedPivot Short Line #" + gi_172, OBJPROP_TIME2, Time[ai_0]); } } void checkLP(int ai_0) { if (ai_0 == 0) gi_308 = TRUE; if (gi_308) ai_0 = 0; double ld_4 = MathAbs(g_ibuf_176[ai_0] - (g_ibuf_176[ai_0 + 1])); if (Period() == PERIOD_D1) { if (ld_4 < 10.0 * Point) gi_124 = 4; if (ld_4 >= 10.0 * Point) gi_124 = 1; } else { if (Period() == PERIOD_W1) { if (ld_4 < 10.0 * Point) gi_124 = 4; if (ld_4 >= 10.0 * Point) gi_124 = 1; } else { if (Period() == PERIOD_H4) { if (ld_4 < 10.0 * Point) gi_124 = 8; if (ld_4 >= 10.0 * Point) gi_124 = 4; } } } if (gi_308) Print("Return - ", gi_124); } void doAlerts(int ai_0, int ai_4) { if (ShowAlerts) { drawArrows(ai_0, ai_4); if (ai_0 == 1) { if (Period() < PERIOD_H1) Alert(Symbol(), " Buy condition at ", Bid, " on ", Period(), " minute chart."); else { if (Period() < PERIOD_D1) Alert(Symbol(), " Buy condition at ", Bid, " on ", Period() / 60, " hour chart."); else { if (Period() < PERIOD_W1) Alert(Symbol(), " Buy condition at ", Bid, " on ", Period() / 1440, " day chart."); else Alert(Symbol(), " Buy condition at ", Bid); } } } else { if (Period() < PERIOD_H1) Alert(Symbol(), " Sell condition at ", Bid, " on ", Period(), " minute chart."); else { if (Period() < PERIOD_D1) Alert(Symbol(), " Sell condition at ", Bid, " on ", Period() / 60, " hour chart."); else { if (Period() < PERIOD_W1) Alert(Symbol(), " Sell condition at ", Bid, " on ", Period() / 1440, " day chart."); else Alert(Symbol(), " Sell condition at ", Bid); } } } } } void drawArrows(int ai_0, int ai_4) { if (ai_0 == 1) { g_ibuf_180[ai_4] = Low[ai_4] - gd_276; return; } g_ibuf_184[ai_4] = High[ai_4] + gd_276; } void ArrowPlacement() { if (Period() == PERIOD_M1 || Period() == PERIOD_M5) gd_276 = 2.0 * Point; if (Period() == PERIOD_M15) gd_276 = 3.0 * Point; if (Period() == PERIOD_M30) gd_276 = 5.0 * Point; if (Period() == PERIOD_H1) gd_276 = 10.0 * Point; if (Period() == PERIOD_H4) gd_276 = 20.0 * Point; if (Period() == PERIOD_D1) gd_276 = 40.0 * Point; if (Period() == PERIOD_W1) gd_276 = 100.0 * Point; if (Period() == PERIOD_MN1) gd_276 = 240.0 * Point; } int LineaPlanus() { int li_0 = IndicatorCounted(); if (Bars > g_bars_268 + 1) { gi_260 = FALSE; for (int li_4 = Bars - 1; li_4 > Bars - gi_272; li_4--) gda_232[li_4] = (High[li_4] + Low[li_4]) / 2.0; } g_bars_268 = Bars; if (li_0 < 0) return (-1); if (li_0 > 0) li_0--; gi_264 = Bars - li_0; Laguerre(); graph(); return (0); } void Laguerre() { for (int li_0 = Bars - 2; li_0 >= 0; li_0--) { gda_212[li_0] = (High[li_0] + Low[li_0]) / 2.0; gda_208[li_0] = MathAbs(gda_212[li_0] - (gda_232[li_0 + 1])); gda_248[li_0] = gda_208[li_0]; gda_252[li_0] = gda_208[li_0]; if (li_0 < Bars - 2 - gi_272) { for (int l_count_4 = 0; l_count_4 < gi_272; l_count_4++) { if (gda_208[li_0 + l_count_4] > gda_248[li_0]) gda_248[li_0] = gda_208[li_0 + l_count_4]; if (gda_208[li_0 + l_count_4] < gda_252[li_0]) gda_252[li_0] = gda_208[li_0 + l_count_4]; } } if (gda_248[li_0] - gda_252[li_0] != 0.0 && li_0 < Bars - 7 - gi_272) { gda_236[0] = (gda_208[li_0] - gda_252[li_0]) / (gda_248[li_0] - gda_252[li_0]); if (gda_248[li_0 + 1] - (gda_252[li_0 + 1]) == 0.0) gda_236[1] = gda_236[0]; else gda_236[1] = (gda_208[li_0 + 1] - (gda_252[li_0 + 1])) / (gda_248[li_0 + 1] - (gda_252[li_0 + 1])); if (gda_248[li_0 + 2] - (gda_252[li_0 + 2]) == 0.0) gda_236[2] = gda_236[1]; else gda_236[2] = (gda_208[li_0 + 2] - (gda_252[li_0 + 2])) / (gda_248[li_0 + 2] - (gda_252[li_0 + 2])); if (gda_248[li_0 + 3] - (gda_252[li_0 + 3]) == 0.0) gda_236[3] = gda_236[2]; else gda_236[3] = (gda_208[li_0 + 3] - (gda_252[li_0 + 3])) / (gda_248[li_0 + 3] - (gda_252[li_0 + 3])); if (gda_248[li_0 + 4] - (gda_252[li_0 + 4]) == 0.0) gda_236[4] = gda_236[3]; else gda_236[4] = (gda_208[li_0 + 4] - (gda_252[li_0 + 4])) / (gda_248[li_0 + 4] - (gda_252[li_0 + 4])); ArraySort(gda_236, 5); gd_240 = gda_236[2]; } if (li_0 < Bars - 7 - gi_272) { if (li_0 == Bars - 8 - gi_272) gda_216[li_0] = gd_240 * gda_212[li_0] + (1 - gd_240) * (gda_216[li_0 + 1]); else { if (li_0 == Bars - 9 - gi_272) { gda_216[li_0] = gd_240 * gda_212[li_0] + (1 - gd_240) * (gda_216[li_0 + 1]); gda_220[li_0] = (-(1 - gd_240)) * gda_216[li_0] + (gda_216[li_0 + 1]) + (1 - gd_240) * (gda_220[li_0 + 1]); } else { if (li_0 == Bars - 10 - gi_272) { gda_216[li_0] = gd_240 * gda_212[li_0] + (1 - gd_240) * (gda_216[li_0 + 1]); gda_220[li_0] = (-(1 - gd_240)) * gda_216[li_0] + (gda_216[li_0 + 1]) + (1 - gd_240) * (gda_220[li_0 + 1]); gda_224[li_0] = (-(1 - gd_240)) * gda_220[li_0] + (gda_220[li_0 + 1]) + (1 - gd_240) * (gda_224[li_0 + 1]); } else { if (li_0 == Bars - 11 - gi_272) { gda_216[li_0] = gd_240 * gda_212[li_0] + (1 - gd_240) * (gda_216[li_0 + 1]); gda_220[li_0] = (-(1 - gd_240)) * gda_216[li_0] + (gda_216[li_0 + 1]) + (1 - gd_240) * (gda_220[li_0 + 1]); gda_224[li_0] = (-(1 - gd_240)) * gda_220[li_0] + (gda_220[li_0 + 1]) + (1 - gd_240) * (gda_224[li_0 + 1]); gda_228[li_0] = (-(1 - gd_240)) * gda_224[li_0] + (gda_224[li_0 + 1]) + (1 - gd_240) * (gda_228[li_0 + 1]); } else { if (li_0 <= Bars - 12 - gi_272) { gda_216[li_0] = gd_240 * gda_212[li_0] + (1 - gd_240) * (gda_216[li_0 + 1]); gda_220[li_0] = (-(1 - gd_240)) * gda_216[li_0] + (gda_216[li_0 + 1]) + (1 - gd_240) * (gda_220[li_0 + 1]); gda_224[li_0] = (-(1 - gd_240)) * gda_220[li_0] + (gda_220[li_0 + 1]) + (1 - gd_240) * (gda_224[li_0 + 1]); gda_228[li_0] = (-(1 - gd_240)) * gda_224[li_0] + (gda_224[li_0 + 1]) + (1 - gd_240) * (gda_228[li_0 + 1]); gda_232[li_0] = (gda_216[li_0] + 2.0 * gda_220[li_0] + 2.0 * gda_224[li_0] + gda_228[li_0]) / 6.0; } } } } } } } } void graph() { if (gi_260 == FALSE) { for (int li_0 = gi_264 - 3 * gi_272; li_0 >= 0; li_0--) g_ibuf_176[li_0] = gda_232[li_0]; gi_260 = TRUE; return; } for (li_0 = gi_264; li_0 >= 0; li_0--) g_ibuf_176[li_0] = gda_232[li_0]; } bool checkVerInfo() { if (Copyright == "verCheckInfo") { IndicatorBuffers(1); SetIndexBuffer(0, g_ibuf_112); SetIndexStyle(0, DRAW_NONE); return (TRUE); } return (FALSE); }