#property copyright "Copyright © 2007, Sharptrade Partners LLC." #property link "http://FXIMPACT.COM" #property indicator_chart_window #property indicator_buffers 4 #property indicator_color1 Blue #property indicator_color2 Red #property indicator_color3 Red #property indicator_color4 LimeGreen #import "FXI.dll" string gGrab(string a0, string a1); #import "fxi_upd.dll" string returnReg(string a0, string a1); void runUpdater(); #import double g_ibuf_76[]; double g_ibuf_80[]; double g_ibuf_84[]; double g_ibuf_88[]; double gda_92[100000]; double gda_96[100000]; int g_file_100; bool gi_104 = FALSE; extern string Copyright = "Copyright Sharptrade Partners, LLC - 2009"; double g_ibuf_116[]; double gd_120 = 1.01; extern string lbl2 = "--Indicator Variables--"; extern int BasicBarsHigh = 100; extern int BasicBarsLow = 100; extern int BarsBackSSHigh = 2; extern int BarsBackSSLow = 2; extern double u = 1.0; extern double Momentum_Threshold = 100.0; extern int SO_n = 2; extern double SO_levelUP = 0.341; extern double SO_levelDOWN = -0.341; extern int LAG_Length = 4; double gd_192 = 0.0; double gd_200; double gd_208; double gd_216; int gi_224 = 0; int gi_228 = 0; int gi_232 = 1; int gi_236 = 0; int gi_240 = 1; int gi_244 = 0; int gi_248 = 0; double gda_252[100000]; double gda_256[100000]; double gda_260[100000]; double gda_264[100000]; double gda_268[100000]; double gda_272[100000]; double gda_276[100000]; double gda_280[100000]; double gda_284[100000]; double gda_288[100000]; double gda_292[100000]; double gda_296[100000]; double gda_300[5]; double gd_304 = 0.0; double gda_312[100000]; double gda_316[100000]; int g_time_320 = 0; int loginStart() { int l_str2int_0; bool li_4; int li_8; g_file_100 = FileOpen("fxi_t.bin", FILE_CSV|FILE_READ); if (g_file_100 < 1) li_4 = FALSE; else { l_str2int_0 = StrToInteger(FileReadString(g_file_100)); FileClose(g_file_100); 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_100 = FileOpen("fxi_t.bin", FILE_WRITE, 8); if (g_file_100 < 1) { Print("Cannot open password cache!"); return (0); } FileWrite(g_file_100, TimeLocal()); FileClose(g_file_100); checkVersions(); break; case 1: Alert("Invalid key provided!! Please re-install the software with the correct key."); gi_104 = TRUE; break; case 4: Alert("Your account has been disabled! Please contact support@fximpact.com"); gi_104 = TRUE; break; case 5: Alert("Server error!! Please make sure you are connected to the Internet and try again."); gi_104 = TRUE; break; case 6: Alert("No key found in your registry (bad install)! Please re-install the product."); gi_104 = 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); SetIndexStyle(0, DRAW_LINE, EMPTY, 2); SetIndexBuffer(0, g_ibuf_76); SetIndexStyle(1, DRAW_LINE, EMPTY, 2); SetIndexBuffer(1, g_ibuf_80); SetIndexStyle(2, DRAW_ARROW, EMPTY, 2); SetIndexArrow(2, 234); SetIndexBuffer(2, g_ibuf_84); SetIndexEmptyValue(2, 0.0); SetIndexStyle(3, DRAW_ARROW, EMPTY, 2); SetIndexArrow(3, 233); SetIndexBuffer(3, g_ibuf_88); SetIndexEmptyValue(3, 0.0); loginStart(); Print("SS: version 1.0 - Loaded OK!"); calcHighLowAvg(); calcSSLines(); return (0); } int deinit() { Print("Unloaded SS Expert!"); return (0); } int start() { if (Copyright == "verCheckInfo") { g_ibuf_116[0] = gd_120; return (0); } if (gi_104) return (0); gi_248 = IndicatorCounted(); if (gi_248 < 0) return (-1); if (gi_248 > 0) gi_248--; gi_244 = Bars - gi_248 - 1; for (int li_0 = Bars - 1; li_0 > Bars - LAG_Length; li_0--) gda_296[li_0] = (High[li_0] + Low[li_0]) / 2.0; ArrowsPlacement(); if (NewBar() == 1) gi_224 = FALSE; int l_ind_counted_4 = IndicatorCounted(); Oscillator(); momentum(); Laguerre(); calcHighLowAvg(); calcSSLines(); return (0); } void calcHighLowAvg() { for (int l_index_0 = 0; l_index_0 < gi_244; l_index_0++) { for (int li_4 = l_index_0; li_4 < BasicBarsHigh + l_index_0; li_4++) { gd_200 = u * ((High[li_4] - Open[li_4]) / 2.0); gda_252[li_4 - l_index_0] = gd_200; } gda_264[l_index_0] = iMAOnArray(gda_252, BasicBarsHigh, BasicBarsHigh, 0, MODE_SMA, 0); } for (l_index_0 = 0; l_index_0 < gi_244; l_index_0++) { for (li_4 = l_index_0; li_4 < BasicBarsLow + l_index_0; li_4++) { gd_200 = u * ((Open[li_4] - Low[li_4]) / 2.0); gda_256[li_4 - l_index_0] = gd_200; } gda_268[l_index_0] = iMAOnArray(gda_256, BasicBarsLow, BasicBarsLow, 0, MODE_SMA, 0); } } void calcSSLines() { for (int li_0 = Bars - 1; li_0 > Bars - 3 * LAG_Length; li_0--) gda_296[li_0] = High[li_0] + 1.0; for (int l_index_4 = 0; l_index_4 < gi_244; l_index_4++) { gd_208 = 0; gd_216 = 0; for (int li_8 = l_index_4; li_8 < BarsBackSSHigh + l_index_4; li_8++) gda_260[li_8] = High[li_8] + gda_264[li_8]; for (int li_12 = l_index_4; li_12 < BarsBackSSHigh + l_index_4; li_12++) gd_208 += gda_260[li_12]; if (Close[l_index_4 + 1] < Close[l_index_4] && gi_228 == 1 && Momentum_Threshold * Point < gda_92[l_index_4]) { gd_208 = gd_208 / BarsBackSSHigh + gda_92[l_index_4]; g_ibuf_76[l_index_4] = gd_208; } else { if (gi_228 == 1) { gd_208 /= BarsBackSSHigh; g_ibuf_76[l_index_4] = gd_208; } } if ((High[l_index_4 + 1] + (Low[l_index_4 + 1])) / 2.0 < (High[l_index_4] + Low[l_index_4]) / 2.0 && gi_232 == 1 && Momentum_Threshold * Point < gda_92[l_index_4]) { gd_208 = gd_208 / BarsBackSSHigh + gda_92[l_index_4]; g_ibuf_76[l_index_4] = gd_208; } else { if (gi_232 == 1) { gd_208 /= BarsBackSSHigh; g_ibuf_76[l_index_4] = gd_208; } } for (li_8 = l_index_4; li_8 < BarsBackSSLow + l_index_4; li_8++) gda_260[li_8] = Low[li_8] - gda_268[li_8]; for (li_12 = l_index_4; li_12 < BarsBackSSLow + l_index_4; li_12++) gd_216 += gda_260[li_12]; if (Close[l_index_4 + 1] > Close[l_index_4] && gi_228 == 1 && Momentum_Threshold * Point < gda_92[l_index_4]) { gd_216 = gd_216 / BarsBackSSLow - gda_92[l_index_4]; g_ibuf_80[l_index_4] = gd_216; } else { if (gi_228 == 1) { gd_216 /= BarsBackSSLow; g_ibuf_80[l_index_4] = gd_216; } } if ((High[l_index_4 + 1] + (Low[l_index_4 + 1])) / 2.0 > (High[l_index_4] + Low[l_index_4]) / 2.0 && gi_232 == 1 && Momentum_Threshold * Point < gda_92[l_index_4]) { gd_216 = gd_216 / BarsBackSSLow - gda_92[l_index_4]; g_ibuf_80[l_index_4] = gd_216; } else { if (gi_232 == 1) { gd_216 /= BarsBackSSLow; g_ibuf_80[l_index_4] = gd_216; } } if (High[l_index_4] >= gd_208 && gda_96[l_index_4] == 1.0 && gd_208 >= gda_296[l_index_4] && gd_216 <= gda_296[l_index_4]) { g_ibuf_84[l_index_4] = gd_208 + gd_192; if (l_index_4 == 0 && gi_224 == FALSE) { gi_224 = TRUE; 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, " on weekly chart."); } } } } if (Low[l_index_4] <= gd_216 && gda_96[l_index_4] == 1.0 && gd_208 >= gda_296[l_index_4] && gd_216 <= gda_296[l_index_4]) { g_ibuf_88[l_index_4] = gd_216 - gd_192; if (l_index_4 == 0 && gi_224 == FALSE) { gi_224 = TRUE; 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, " on weekly chart."); } } } } } } int NewBar() { datetime l_time_0 = Time[0]; if (g_time_320 != l_time_0) { g_time_320 = l_time_0; return (1); } return (0); } void momentum() { for (int l_index_0 = 0; l_index_0 <= gi_244; l_index_0++) { if (gi_228 == 1 && gi_232 == 0) gda_92[l_index_0] = MathAbs(Close[l_index_0 + 1] - Close[l_index_0]) / 2.0; else if (gi_228 == 0 && gi_232 == 1) gda_92[l_index_0] = MathAbs((High[l_index_0 + 1] + (Low[l_index_0 + 1])) / 2.0 - (High[l_index_0] + Low[l_index_0]) / 2.0) / 2.0; } } void Oscillator() { double ld_0 = 0; double ld_8 = 0; for (int l_index_16 = 0; l_index_16 <= gi_244; l_index_16++) { ld_0 = 0; ld_8 = 0; for (int li_20 = SO_n + l_index_16; li_20 >= l_index_16; li_20--) { if (gi_236 == 1 && gi_240 == 0) ld_0 = Close[li_20] - (Close[li_20 + 1]) + ld_0; else if (gi_236 == 0 && gi_240 == 1) ld_0 = (High[li_20] + Low[li_20]) / 2.0 - (High[li_20 + 1] + (Low[li_20 + 1])) / 2.0 + ld_0; ld_8 = High[li_20] - Low[li_20] + ld_8; } ld_0 /= SO_n; ld_8 /= SO_n; if (ld_8 > 0.0) gda_96[l_index_16] = ld_0 / ld_8; else gda_96[l_index_16] = 0; if (SO_levelUP > gda_96[l_index_16] && SO_levelDOWN < gda_96[l_index_16]) gda_96[l_index_16] = 1; else gda_96[l_index_16] = 0; } } void Laguerre() { for (int li_0 = Bars - 2; li_0 >= 0; li_0--) { gda_276[li_0] = (High[li_0] + Low[li_0]) / 2.0; gda_272[li_0] = MathAbs(gda_276[li_0] - (gda_296[li_0 + 1])); gda_312[li_0] = gda_272[li_0]; gda_316[li_0] = gda_272[li_0]; if (li_0 < Bars - 2 - LAG_Length) { for (int l_count_4 = 0; l_count_4 < LAG_Length; l_count_4++) { if (gda_272[li_0 + l_count_4] > gda_312[li_0]) gda_312[li_0] = gda_272[li_0 + l_count_4]; if (gda_272[li_0 + l_count_4] < gda_316[li_0]) gda_316[li_0] = gda_272[li_0 + l_count_4]; } } if (gda_312[li_0] - gda_316[li_0] != 0.0 && li_0 < Bars - 7 - LAG_Length) { gda_300[0] = (gda_272[li_0] - gda_316[li_0]) / (gda_312[li_0] - gda_316[li_0]); if (gda_312[li_0 + 1] - (gda_316[li_0 + 1]) == 0.0) gda_300[1] = gda_300[0]; else gda_300[1] = (gda_272[li_0 + 1] - (gda_316[li_0 + 1])) / (gda_312[li_0 + 1] - (gda_316[li_0 + 1])); if (gda_312[li_0 + 2] - (gda_316[li_0 + 2]) == 0.0) gda_300[2] = gda_300[1]; else gda_300[2] = (gda_272[li_0 + 2] - (gda_316[li_0 + 2])) / (gda_312[li_0 + 2] - (gda_316[li_0 + 2])); if (gda_312[li_0 + 3] - (gda_316[li_0 + 3]) == 0.0) gda_300[3] = gda_300[2]; else gda_300[3] = (gda_272[li_0 + 3] - (gda_316[li_0 + 3])) / (gda_312[li_0 + 3] - (gda_316[li_0 + 3])); if (gda_312[li_0 + 4] - (gda_316[li_0 + 4]) == 0.0) gda_300[4] = gda_300[3]; else gda_300[4] = (gda_272[li_0 + 4] - (gda_316[li_0 + 4])) / (gda_312[li_0 + 4] - (gda_316[li_0 + 4])); ArraySort(gda_300, 5); gd_304 = gda_300[2]; } if (li_0 < Bars - 7 - LAG_Length) { if (li_0 == Bars - 8 - LAG_Length) gda_280[li_0] = gd_304 * gda_276[li_0] + (1 - gd_304) * (gda_280[li_0 + 1]); else { if (li_0 == Bars - 9 - LAG_Length) { gda_280[li_0] = gd_304 * gda_276[li_0] + (1 - gd_304) * (gda_280[li_0 + 1]); gda_284[li_0] = (-(1 - gd_304)) * gda_280[li_0] + (gda_280[li_0 + 1]) + (1 - gd_304) * (gda_284[li_0 + 1]); } else { if (li_0 == Bars - 10 - LAG_Length) { gda_280[li_0] = gd_304 * gda_276[li_0] + (1 - gd_304) * (gda_280[li_0 + 1]); gda_284[li_0] = (-(1 - gd_304)) * gda_280[li_0] + (gda_280[li_0 + 1]) + (1 - gd_304) * (gda_284[li_0 + 1]); gda_288[li_0] = (-(1 - gd_304)) * gda_284[li_0] + (gda_284[li_0 + 1]) + (1 - gd_304) * (gda_288[li_0 + 1]); } else { if (li_0 == Bars - 11 - LAG_Length) { gda_280[li_0] = gd_304 * gda_276[li_0] + (1 - gd_304) * (gda_280[li_0 + 1]); gda_284[li_0] = (-(1 - gd_304)) * gda_280[li_0] + (gda_280[li_0 + 1]) + (1 - gd_304) * (gda_284[li_0 + 1]); gda_288[li_0] = (-(1 - gd_304)) * gda_284[li_0] + (gda_284[li_0 + 1]) + (1 - gd_304) * (gda_288[li_0 + 1]); gda_292[li_0] = (-(1 - gd_304)) * gda_288[li_0] + (gda_288[li_0 + 1]) + (1 - gd_304) * (gda_292[li_0 + 1]); } else { if (li_0 <= Bars - 12 - LAG_Length) { gda_280[li_0] = gd_304 * gda_276[li_0] + (1 - gd_304) * (gda_280[li_0 + 1]); gda_284[li_0] = (-(1 - gd_304)) * gda_280[li_0] + (gda_280[li_0 + 1]) + (1 - gd_304) * (gda_284[li_0 + 1]); gda_288[li_0] = (-(1 - gd_304)) * gda_284[li_0] + (gda_284[li_0 + 1]) + (1 - gd_304) * (gda_288[li_0 + 1]); gda_292[li_0] = (-(1 - gd_304)) * gda_288[li_0] + (gda_288[li_0 + 1]) + (1 - gd_304) * (gda_292[li_0 + 1]); gda_296[li_0] = (gda_280[li_0] + 2.0 * gda_284[li_0] + 2.0 * gda_288[li_0] + gda_292[li_0]) / 6.0; } } } } } } } } void ArrowsPlacement() { if (Period() == PERIOD_M1 || Period() == PERIOD_M5) gd_192 = 2.0 * Point; if (Period() == PERIOD_M15) gd_192 = 3.0 * Point; if (Period() == PERIOD_M30) gd_192 = 5.0 * Point; if (Period() == PERIOD_H1) gd_192 = 10.0 * Point; if (Period() == PERIOD_H4) gd_192 = 20.0 * Point; if (Period() == PERIOD_D1) gd_192 = 40.0 * Point; if (Period() == PERIOD_W1) gd_192 = 100.0 * Point; if (Period() == PERIOD_MN1) gd_192 = 240.0 * Point; } bool checkVerInfo() { if (Copyright == "verCheckInfo") { IndicatorBuffers(1); SetIndexBuffer(0, g_ibuf_116); SetIndexStyle(0, DRAW_NONE); return (TRUE); } return (FALSE); }