#property copyright "Copyright © 2008, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #property indicator_chart_window #property indicator_buffers 4 #property indicator_color1 Yellow #property indicator_color2 Yellow #property indicator_color3 White #property indicator_color4 White #import "FXI.dll" string gGrab(string a0, string a1); #import "fxi_upd.dll" string returnReg(string a0, string a1); void runUpdater(); #import int gi_76 = 4; double gda_80[100000]; double gda_84[100000]; double gda_88[100000]; double gda_92[100000]; double gda_96[100000]; double gda_100[100000]; double gda_104[100000]; double gda_108[5]; double gd_112 = 0.0; double gda_120[100000]; double gda_124[100000]; int gi_128 = 0; int gi_132 = 0; int gi_136 = 0; int g_bars_140 = 0; double g_ibuf_144[]; int g_file_148; bool gi_unused_152 = FALSE; extern string Copyright = "Copyright Sharptrade Partners, LLC - 2009"; extern string First = " SquishSquash Predictor"; extern string Last = "http://www.triadformula.com"; double g_ibuf_180[]; double gd_184 = 1.01; int gi_192 = 2; double gd_196 = 100.0; double gd_204 = 1.0; double gd_212 = 100.0; double gd_220 = 1.0; int gi_228 = 2; int gi_232 = 2; double g_pips_236 = 100.0; int gi_unused_244 = 0; double g_ibuf_248[]; double g_ibuf_252[]; double g_ibuf_256[]; double g_ibuf_260[]; int g_time_264 = -1; bool gi_268; bool gi_272; double gd_276; double gd_284; int gi_292 = -1; double gda_296[50]; double gda_300[50]; double gd_304; double gd_unused_312; double gd_320; double gd_328; double gd_unused_336; string g_str_concat_344; double gda_unused_352[]; double gda_unused_356[]; bool gi_360 = TRUE; int g_bars_364 = -1; double g_ibuf_368[]; int LP(string as_0, string as_8) { gi_128 = IndicatorCounted(); if (Bars > g_bars_140 + 1) { gi_132 = FALSE; for (int li_16 = Bars - 1; li_16 > Bars - gi_76; li_16--) gda_104[li_16] = (High[li_16] + Low[li_16]) / 2.0; } g_bars_140 = Bars; if (gi_128 < 0) return (-1); if (gi_128 > 0) gi_128--; gi_136 = Bars - gi_128; Laguerre(StrToDouble(as_0), StrToDouble(as_8)); graph(); return (0); } void Laguerre(double ad_0, double ad_8) { for (int li_16 = Bars - 2; li_16 >= 0; li_16--) { if (li_16 > 0) gda_84[li_16] = (High[li_16] + Low[li_16]) / 2.0; else if (li_16 == 0) gda_84[li_16] = (ad_0 + ad_8) / 2.0; gda_80[li_16] = MathAbs(gda_84[li_16] - (gda_104[li_16 + 1])); gda_120[li_16] = gda_80[li_16]; gda_124[li_16] = gda_80[li_16]; if (li_16 < Bars - 2 - gi_76) { for (int l_count_20 = 0; l_count_20 < gi_76; l_count_20++) { if (gda_80[li_16 + l_count_20] > gda_120[li_16]) gda_120[li_16] = gda_80[li_16 + l_count_20]; if (gda_80[li_16 + l_count_20] < gda_124[li_16]) gda_124[li_16] = gda_80[li_16 + l_count_20]; } } if (gda_120[li_16] - gda_124[li_16] != 0.0 && li_16 < Bars - 7 - gi_76) { gda_108[0] = (gda_80[li_16] - gda_124[li_16]) / (gda_120[li_16] - gda_124[li_16]); if (gda_120[li_16 + 1] - (gda_124[li_16 + 1]) == 0.0) gda_108[1] = gda_108[0]; else gda_108[1] = (gda_80[li_16 + 1] - (gda_124[li_16 + 1])) / (gda_120[li_16 + 1] - (gda_124[li_16 + 1])); if (gda_120[li_16 + 2] - (gda_124[li_16 + 2]) == 0.0) gda_108[2] = gda_108[1]; else gda_108[2] = (gda_80[li_16 + 2] - (gda_124[li_16 + 2])) / (gda_120[li_16 + 2] - (gda_124[li_16 + 2])); if (gda_120[li_16 + 3] - (gda_124[li_16 + 3]) == 0.0) gda_108[3] = gda_108[2]; else gda_108[3] = (gda_80[li_16 + 3] - (gda_124[li_16 + 3])) / (gda_120[li_16 + 3] - (gda_124[li_16 + 3])); if (gda_120[li_16 + 4] - (gda_124[li_16 + 4]) == 0.0) gda_108[4] = gda_108[3]; else gda_108[4] = (gda_80[li_16 + 4] - (gda_124[li_16 + 4])) / (gda_120[li_16 + 4] - (gda_124[li_16 + 4])); ArraySort(gda_108, 5); gd_112 = gda_108[2]; } if (li_16 < Bars - 7 - gi_76) { if (li_16 == Bars - 8 - gi_76) gda_88[li_16] = gd_112 * gda_84[li_16] + (1 - gd_112) * (gda_88[li_16 + 1]); else { if (li_16 == Bars - 9 - gi_76) { gda_88[li_16] = gd_112 * gda_84[li_16] + (1 - gd_112) * (gda_88[li_16 + 1]); gda_92[li_16] = (-(1 - gd_112)) * gda_88[li_16] + (gda_88[li_16 + 1]) + (1 - gd_112) * (gda_92[li_16 + 1]); } else { if (li_16 == Bars - 10 - gi_76) { gda_88[li_16] = gd_112 * gda_84[li_16] + (1 - gd_112) * (gda_88[li_16 + 1]); gda_92[li_16] = (-(1 - gd_112)) * gda_88[li_16] + (gda_88[li_16 + 1]) + (1 - gd_112) * (gda_92[li_16 + 1]); gda_96[li_16] = (-(1 - gd_112)) * gda_92[li_16] + (gda_92[li_16 + 1]) + (1 - gd_112) * (gda_96[li_16 + 1]); } else { if (li_16 == Bars - 11 - gi_76) { gda_88[li_16] = gd_112 * gda_84[li_16] + (1 - gd_112) * (gda_88[li_16 + 1]); gda_92[li_16] = (-(1 - gd_112)) * gda_88[li_16] + (gda_88[li_16 + 1]) + (1 - gd_112) * (gda_92[li_16 + 1]); gda_96[li_16] = (-(1 - gd_112)) * gda_92[li_16] + (gda_92[li_16 + 1]) + (1 - gd_112) * (gda_96[li_16 + 1]); gda_100[li_16] = (-(1 - gd_112)) * gda_96[li_16] + (gda_96[li_16 + 1]) + (1 - gd_112) * (gda_100[li_16 + 1]); } else { if (li_16 <= Bars - 12 - gi_76) { gda_88[li_16] = gd_112 * gda_84[li_16] + (1 - gd_112) * (gda_88[li_16 + 1]); gda_92[li_16] = (-(1 - gd_112)) * gda_88[li_16] + (gda_88[li_16 + 1]) + (1 - gd_112) * (gda_92[li_16 + 1]); gda_96[li_16] = (-(1 - gd_112)) * gda_92[li_16] + (gda_92[li_16 + 1]) + (1 - gd_112) * (gda_96[li_16 + 1]); gda_100[li_16] = (-(1 - gd_112)) * gda_96[li_16] + (gda_96[li_16 + 1]) + (1 - gd_112) * (gda_100[li_16 + 1]); gda_104[li_16] = (gda_88[li_16] + 2.0 * gda_92[li_16] + 2.0 * gda_96[li_16] + gda_100[li_16]) / 6.0; } } } } } } } } void graph() { if (gi_132 == FALSE) { for (int li_0 = gi_136 - 3 * gi_76; li_0 >= 0; li_0--) g_ibuf_144[li_0] = gda_104[li_0]; gi_132 = TRUE; return; } for (li_0 = gi_136; li_0 >= 0; li_0--) g_ibuf_144[li_0] = gda_104[li_0]; } int loginStart() { int l_str2int_0; bool li_4; int li_8; g_file_148 = FileOpen("fxi_t.bin", FILE_CSV|FILE_READ); if (g_file_148 < 1) li_4 = FALSE; else { l_str2int_0 = StrToInteger(FileReadString(g_file_148)); FileClose(g_file_148); 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_148 = FileOpen("fxi_t.bin", FILE_WRITE, 8); if (g_file_148 < 1) { Print("Cannot open password cache!"); return (0); } FileWrite(g_file_148, TimeLocal()); FileClose(g_file_148); checkVersions(); break; case 1: Alert("Invalid key provided!! Please re-install the software with the correct key."); gi_unused_152 = TRUE; break; case 4: Alert("Your account has been disabled! Please contact support@fximpact.com"); gi_unused_152 = TRUE; break; case 5: Alert("Server error!! Please make sure you are connected to the Internet and try again."); gi_unused_152 = TRUE; break; case 6: Alert("No key found in your registry (bad install)! Please re-install the product."); gi_unused_152 = 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 (Copyright == "oahs9f8hp9w8") { SetIndexStyle(0, DRAW_LINE, EMPTY, 2); SetIndexBuffer(0, g_ibuf_144); return (0); } IndicatorBuffers(5); SetIndexBuffer(0, g_ibuf_248); SetIndexLabel(0, "High Predict"); SetIndexStyle(0, DRAW_NONE); SetIndexEmptyValue(0, 0.0); SetIndexArrow(0, 167); SetIndexBuffer(1, g_ibuf_252); SetIndexLabel(1, "Low Predict"); SetIndexStyle(1, DRAW_NONE); SetIndexArrow(1, 167); SetIndexEmptyValue(1, 0.0); SetIndexBuffer(2, g_ibuf_256); SetIndexLabel(2, "High Good SO"); SetIndexStyle(2, DRAW_ARROW); SetIndexArrow(2, 167); SetIndexEmptyValue(2, 0.0); SetIndexBuffer(3, g_ibuf_260); SetIndexLabel(3, "Low Good SO"); SetIndexStyle(3, DRAW_ARROW); SetIndexArrow(3, 167); SetIndexEmptyValue(3, 0.0); SetIndexBuffer(4, g_ibuf_368); IndicatorShortName("FXI_SquishSquashPredictor"); loginStart(); return (0); } int deinit() { Comment(""); return (0); } int start() { string ls_12; string ls_20; if (Copyright == "verCheckInfo") { g_ibuf_180[0] = gd_184; return (0); } if (Copyright == "oahs9f8hp9w8") { LP(First, Last); return (0); } string ls_unused_0 = 0; int l_ind_counted_8 = IndicatorCounted(); if (!gi_360 && Bars - g_bars_364 > 1) { Print("More than 1 bar fed to indicator..reloading!"); gi_360 = TRUE; g_time_264 = -1; ArrayInitialize(g_ibuf_248, EMPTY_VALUE); ArrayInitialize(g_ibuf_252, EMPTY_VALUE); ArrayInitialize(g_ibuf_368, EMPTY_VALUE); gi_292 = -1; } momentum(0); if (g_time_264 < Time[0]) { g_time_264 = Time[0]; gi_268 = FALSE; gi_272 = FALSE; SquishSquash(1, 0, Open[0]); gd_276 = Open[0]; gd_284 = Open[0]; gi_292 = -1; gi_unused_244 = 0; while (gi_292 == -1) { if (!gi_268) { SquishSquash(1, 0, gd_276); if (gd_304 <= gd_276) { gi_268 = TRUE; gd_unused_312 = gd_320; } else gd_276 += 1.0 * Point; } if (!gi_272) { SquishSquash(2, 0, gd_284); if (gd_328 >= gd_284) { gi_272 = TRUE; gd_unused_336 = gd_284; } else gd_284 -= 1.0 * Point; } if (gi_268 && gi_272) gi_292 = 1; } g_ibuf_248[0] = gd_276; g_ibuf_252[0] = gd_284; } SquishSquash(3, 0, gd_284); if (Oscillator(g_ibuf_248[0], g_ibuf_252[0]) <= 0.341) { if (iCustom(Symbol(), 0, "FXI_SquishSquashPredictor", "oahs9f8hp9w8", DoubleToStr(g_ibuf_248[0], Digits), DoubleToStr(Open[0], Digits), 0, 0) <= g_ibuf_248[0] && iCustom(Symbol(), 0, "FXI_SquishSquashPredictor", "oahs9f8hp9w8", DoubleToStr(g_ibuf_248[0], Digits), DoubleToStr(Open[0], Digits), 0, 0) >= g_ibuf_252[0]) g_ibuf_256[0] = g_ibuf_248[0]; else g_ibuf_256[0] = 0; } else g_ibuf_256[0] = 0; if (g_ibuf_256[0] != 0.0) if (Oscillator(g_ibuf_248[0], Open[0]) > 0.341) g_ibuf_256[0] = 0; if (Oscillator(g_ibuf_248[0], g_ibuf_252[0]) >= -0.341) { if (iCustom(Symbol(), 0, "FXI_SquishSquashPredictor", "oahs9f8hp9w8", DoubleToStr(Open[0], Digits), DoubleToStr(g_ibuf_252[0], Digits), 0, 0) <= g_ibuf_248[0] && iCustom(Symbol(), 0, "FXI_SquishSquashPredictor", "oahs9f8hp9w8", DoubleToStr(Open[0], Digits), DoubleToStr(g_ibuf_252[0], Digits), 0, 0) >= g_ibuf_252[0]) g_ibuf_260[0] = g_ibuf_252[0]; else g_ibuf_260[0] = 0; } else g_ibuf_260[0] = 0; if (g_ibuf_260[0] != 0.0) if (Oscillator(Open[0], g_ibuf_252[0]) < -0.341) g_ibuf_260[0] = 0; if (g_ibuf_256[0] != 0.0) { ls_12 = "Price will go above SquishSquash High at " + DoubleToStr(g_ibuf_256[0], Digits) + "\n"; ls_12 = StringConcatenate(ls_12, " -- Take Profit on SquishSquash High Trade at " + DoubleToStr(g_ibuf_252[0], Digits) + "\n"); } else ls_12 = "Price will go above SquishSquash High at N/A\n"; if (g_ibuf_260[0] == 0.0) ls_20 = "Price will go below SquishSquash Low at N/A"; else { ls_20 = "Price will go below SquishSquash Low at " + DoubleToStr(g_ibuf_260[0], Digits) + "\n"; ls_20 = StringConcatenate(ls_20, " -- Take Profit on SquishSquash Low Trade at " + DoubleToStr(g_ibuf_248[0], Digits) + "\n"); } g_str_concat_344 = StringConcatenate(ls_12, ls_20); Comment(g_str_concat_344); g_bars_364 = Bars; gi_360 = FALSE; return (0); } int SquishSquash(int ai_0, int ai_4, double ad_8) { int l_index_36; double ld_44; double ld_52; double ld_20 = 0; double ld_28 = 0; bool li_40 = TRUE; ArrayInitialize(gda_296, -1); ArrayInitialize(gda_300, -1); if (ai_0 == 1) { ld_44 = ad_8; ld_52 = Open[ai_4] - 1.0 * Point; } else { if (ai_0 == 2) { ld_44 = Open[ai_4] + 1.0 * Point; ld_52 = ad_8; } else { if (ai_0 == 3) { ld_44 = High[ai_4]; ld_52 = Low[ai_4]; } } } while (li_40) { for (int li_16 = ai_4; li_16 < ai_4 + gd_196; li_16++) { if (li_16 == ai_4) ld_20 += gd_204 * ((ld_44 - Open[li_16]) / 2.0); else ld_20 += gd_204 * ((High[li_16] - Open[li_16]) / 2.0); } ld_28 = ld_20 / gd_196; ld_20 = 0; slideArray(1, ld_28, gi_228); for (li_16 = ai_4; li_16 < ai_4 + gd_212; li_16++) { if (li_16 == ai_4) ld_20 += gd_220 * ((Open[li_16] - ld_52) / 2.0); else ld_20 += gd_220 * ((Open[li_16] - Low[li_16]) / 2.0); } ld_28 = ld_20 / gd_212; ld_20 = 0; slideArray(2, ld_28, gi_232); if (gda_300[gi_232] == -1.0 || gda_296[gi_228] == -1.0) continue; l_index_36 = 0; for (li_16 = ai_4; li_16 < ai_4 + gi_228; li_16++) { if (li_16 == ai_4) { ld_20 += ld_44 + gda_296[l_index_36]; l_index_36++; } else { ld_20 += High[li_16] + gda_296[l_index_36]; l_index_36++; } } if ((High[ai_4 + 1] + (Low[ai_4 + 1])) / 2.0 < (High[ai_4] + Low[ai_4]) / 2.0 && g_pips_236 * Point < g_ibuf_368[ai_4]) ld_28 = ld_20 / gi_228 + g_ibuf_368[ai_4]; else ld_28 = ld_20 / gi_228; ld_20 = 0; gd_304 = ld_28; l_index_36 = 0; for (li_16 = ai_4; li_16 < ai_4 + gi_232; li_16++) { if (li_16 == ai_4) { ld_20 += ld_52 - gda_300[l_index_36]; l_index_36++; } else { ld_20 += Low[li_16] - gda_300[l_index_36]; l_index_36++; } } if ((High[ai_4 + 1] + (Low[ai_4 + 1])) / 2.0 > (High[ai_4] + Low[ai_4]) / 2.0 && g_pips_236 * Point < g_ibuf_368[ai_4]) ld_28 = ld_20 / gi_232 - g_ibuf_368[ai_4]; else ld_28 = ld_20 / gi_232; ld_20 = 0; gd_328 = ld_28; break; } return (0); } void slideArray(int ai_0, double ad_4, int ai_12) { for (int li_16 = ai_12 - 1; li_16 >= 0; li_16--) { if (ai_0 == 1) gda_296[li_16 + 1] = gda_296[li_16]; else gda_300[li_16 + 1] = gda_300[li_16]; } if (ai_0 == 1) gda_296[0] = ad_4; if (ai_0 == 2) gda_300[0] = ad_4; } void momentum(int ai_0) { for (int l_index_4 = 0; l_index_4 <= ai_0; l_index_4++) g_ibuf_368[l_index_4] = MathAbs((High[l_index_4 + 1] + (Low[l_index_4 + 1])) / 2.0 - (High[l_index_4] + Low[l_index_4]) / 2.0) / 2.0; } double Oscillator(double ad_0, double ad_8) { double ld_ret_32; double ld_16 = 0; double ld_24 = 0; for (int li_40 = gi_192; li_40 >= 0; li_40--) { if (li_40 != 0) { ld_16 = (High[li_40] + Low[li_40]) / 2.0 - (High[li_40 + 1] + (Low[li_40 + 1])) / 2.0 + ld_16; ld_24 = High[li_40] - Low[li_40] + ld_24; } else { ld_24 = ad_0 - ad_8 + ld_24; ld_16 = (ad_0 + ad_8) / 2.0 - (High[1] + Low[1]) / 2.0 + ld_16; } } ld_16 /= gi_192; ld_24 /= gi_192; if (ld_24 > 0.0) ld_ret_32 = ld_16 / ld_24; else ld_ret_32 = 0; return (ld_ret_32); } bool checkVerInfo() { if (Copyright == "verCheckInfo") { IndicatorBuffers(1); SetIndexBuffer(0, g_ibuf_180); SetIndexStyle(0, DRAW_NONE); return (TRUE); } return (FALSE); }