#property copyright "Copyright © 2008, Nick Bilak" #property link "http://www.mql4.info/" #property show_inputs #import "GlobalVariable.dll" int GV_SetNamedInt(string a0, int a1); double GV_SetNamedDouble(string a0, double a1); #import extern string system = "slave1sys"; extern string pairs = "AUDCAD,AUDCHF,AUDJPY,AUDNZD,AUDUSD,CADCHF,CADJPY,CHFJPY,EURAUD,EURCAD,EURCHF,EURDKK,EURGBP,EURJPY,EURNOK,EURNZD,EURSEK,EURUSD,GBPAUD,GBPCAD,GBPCHF,GBPNZD,GBPUSD,GBPJPY,NZDCAD,NZDCHF,NZDJPY,NZDUSD,SGDJPY,USDCAD,USDCHF,USDHKD,USDJPY,USDSGD"; extern bool ReverseTrades = FALSE; extern int history = 10; extern int CycleMilliseconds = 200; double gda_104[][11]; int g_datetime_112; string gsa_120[]; int init() { int li_0; int li_4; int li_8; string ls_12; while (true) { li_4 = StringFind(pairs, ",", li_0); if (li_4 <= 0) break; ls_12 = StringSubstr(pairs, li_0, li_4 - li_0); li_0 = li_4 + 1; li_8++; ArrayResize(gsa_120, li_8); gsa_120[li_8 - 1] = ls_12; } ls_12 = StringSubstr(pairs, li_0); li_8++; ArrayResize(gsa_120, li_8); gsa_120[li_8 - 1] = ls_12; Print(ArraySize(gsa_120), " SymbolNames:"); ls_12 = ""; for (li_0 = 0; li_0 < ArraySize(gsa_120); li_0++) ls_12 = ls_12 + gsa_120[li_0] + ", "; Print(ls_12); return (0); } int deinit() { int li_12; int li_0 = ArraySize(gda_104) / 11; int li_16 = GV_SetNamedInt(system + "lines", 0); for (int l_count_4 = 0; l_count_4 < li_0; l_count_4++) { for (int l_count_8 = 0; l_count_8 < 11; l_count_8++) { li_12++; GV_SetNamedDouble(system + "_mt_" + li_12, 0); } } return (1); } int start() { int li_0; while (IsStopped() == FALSE) { Sleep(CycleMilliseconds); Comment("local time is : " + TimeToStr(TimeLocal(), TIME_SECONDS)); if (!IsConnected()) { Print("not yet connected"); continue; } li_0 = FindTrades(); FindLastClosedTrades(history); if (TimeLocal() - g_datetime_112 > 300) { Print("subacc " + system + " total trades:", CountNZ(gda_104, 11)); g_datetime_112 = TimeLocal(); } if (ArraySize(gda_104) == 0) continue; li_0 = 0; li_0 = SaveArrayToGV(gda_104, system); if (li_0 <= 0) Print("Error saving trades!"); } return (0); } int FindTrades() { int l_ord_total_4 = OrdersTotal(); ArrayResize(gda_104, 0); for (int l_pos_0 = l_ord_total_4 - 1; l_pos_0 >= 0; l_pos_0--) if (OrderSelect(l_pos_0, SELECT_BY_POS, MODE_TRADES)) AddTrade(OrderTicket(), 0, MODE_TRADES); return (1); } int FindLastClosedTrades(int ai_0) { int l_hist_total_8 = OrdersHistoryTotal(); for (int l_pos_4 = l_hist_total_8 - 1; l_pos_4 >= l_hist_total_8 - ai_0; l_pos_4--) if (OrderSelect(l_pos_4, SELECT_BY_POS, MODE_HISTORY)) AddTrade(OrderTicket(), 1, MODE_HISTORY); return (1); } int AddTrade(int a_ticket_0, int ai_4, int ai_8) { string ls_12; int li_20; int l_str2int_24; double ld_48; double ld_56; double ld_64; double ld_72; double ld_80; double ld_88; int li_28 = ArraySize(gda_104) / 11 + 1; int li_36 = -1; int l_cmd_44 = -1; if (OrderSelect(a_ticket_0, SELECT_BY_TICKET, ai_8)) { ls_12 = OrderComment(); l_str2int_24 = 0; if (StringFind(ls_12, "to #", 0) >= 0) { li_20 = StringFind(ls_12, "#", 0); l_str2int_24 = StrToInteger(StringSubstr(ls_12, li_20 + 1, StringLen(ls_12) - li_20 - 1)); } if (StringFind(ls_12, "from #", 0) >= 0) { li_20 = StringFind(ls_12, "#", 0); l_str2int_24 = StrToInteger(StringSubstr(ls_12, li_20 + 1, StringLen(ls_12) - li_20 - 1)); } l_cmd_44 = OrderType(); ld_48 = OrderStopLoss(); ld_56 = OrderTakeProfit(); ld_72 = MarketInfo(OrderSymbol(), MODE_SPREAD) * MarketInfo(OrderSymbol(), MODE_POINT); ld_80 = OrderOpenPrice(); ld_88 = OrderClosePrice(); if (ReverseTrades) { if (l_cmd_44 == OP_BUY) { l_cmd_44 = 1; if (ld_48 > 0.0) ld_64 = ld_48 + ld_72; else ld_64 = 0; if (ld_56 > 0.0) ld_48 = ld_56 + ld_72; else ld_48 = 0; ld_56 = ld_64; ld_80 -= ld_72; } else { if (l_cmd_44 == OP_SELL) { l_cmd_44 = 0; if (ld_48 > 0.0) ld_64 = ld_48 - ld_72; else ld_64 = 0; if (ld_56 > 0.0) ld_48 = ld_56 - ld_72; else ld_48 = 0; ld_56 = ld_64; ld_80 += ld_72; } else { if (l_cmd_44 == OP_BUYSTOP) { l_cmd_44 = 3; if (ld_48 > 0.0) ld_64 = ld_48 + ld_72; else ld_64 = 0; if (ld_56 > 0.0) ld_48 = ld_56 + ld_72; else ld_48 = 0; ld_56 = ld_64; ld_80 -= ld_72; } else { if (l_cmd_44 == OP_SELLSTOP) { l_cmd_44 = 2; if (ld_48 > 0.0) ld_64 = ld_48 - ld_72; else ld_64 = 0; if (ld_56 > 0.0) ld_48 = ld_56 - ld_72; else ld_48 = 0; ld_56 = ld_64; ld_80 += ld_72; } else { if (l_cmd_44 == OP_BUYLIMIT) { l_cmd_44 = 5; if (ld_48 > 0.0) ld_64 = ld_48 + ld_72; else ld_64 = 0; if (ld_56 > 0.0) ld_48 = ld_56 + ld_72; else ld_48 = 0; ld_56 = ld_64; ld_80 -= ld_72; } else { if (l_cmd_44 == OP_SELLLIMIT) { l_cmd_44 = 4; if (ld_48 > 0.0) ld_64 = ld_48 - ld_72; else ld_64 = 0; if (ld_56 > 0.0) ld_48 = ld_56 - ld_72; else ld_48 = 0; ld_56 = ld_64; ld_80 += ld_72; } } } } } } } for (int l_index_32 = 0; l_index_32 < ArraySize(gsa_120); l_index_32++) { if (gsa_120[l_index_32] == OrderSymbol()) { li_36 = l_index_32; break; } } if (li_36 < 0) return; ArrayResize(gda_104, li_28); gda_104[li_28 - 1][0] = a_ticket_0; gda_104[li_28 - 1][1] = l_cmd_44; gda_104[li_28 - 1][2] = ld_80; gda_104[li_28 - 1][3] = ld_48; gda_104[li_28 - 1][4] = ld_56; gda_104[li_28 - 1][5] = OrderOpenTime(); gda_104[li_28 - 1][6] = li_36; gda_104[li_28 - 1][7] = OrderLots(); gda_104[li_28 - 1][8] = ai_4; gda_104[li_28 - 1][9] = ld_88; gda_104[li_28 - 1][10] = l_str2int_24; } return (0); } int SaveArrayToGV(double ada_0[][11], string as_4) { int li_32; int li_12 = ArraySize(ada_0) / 11; if (li_12 <= 0) return (1); int li_16 = GV_SetNamedInt(as_4 + "lines", li_12); for (int l_index_24 = 0; l_index_24 < li_12; l_index_24++) { for (int l_count_28 = 0; l_count_28 < 11; l_count_28++) { li_32++; GV_SetNamedDouble(as_4 + "_mt_" + li_32, ada_0[l_index_24][l_count_28]); GlobalVariableSet(as_4 + "_mt_" + li_32, ada_0[l_index_24][l_count_28]); } } return (1); } int CountNZ(double ada_0[][11], int ai_4) { int li_ret_20; int li_16 = ArraySize(ada_0) / ai_4; for (int l_index_8 = 0; l_index_8 < li_16; l_index_8++) if (ada_0[l_index_8][0] > 0.0) li_ret_20++; return (li_ret_20); }