#property copyright "Copyright © 2008, Nick Bilak" #property link "http://www.mql4.info/" #property show_inputs #include #import "GlobalVariable.dll" int crash(); int GV_GetNamedInt(string a0, int a1); double GV_GetNamedDouble(string a0, double a1); #import 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 string SlaveNames = "slave1sys,slave2sys"; extern double Lots = 0.1; extern bool ExportLots = TRUE; extern double ExportLotMultiply = 1.0; extern double MaximumRisk = 2.0; extern bool FixedLot = TRUE; extern int Slippage = 3; extern int MaxMarketDiff = 100; extern bool Wait4ValidMarketDiff = TRUE; extern int ExpireMinutes = 10; extern int NumberTries = 5; extern bool StopLimitOrders = TRUE; extern bool PendingSLTP = FALSE; extern bool Wait4TPSL = TRUE; extern bool TPSL_InPoints = TRUE; extern int TP_adjust = 0; extern int SL_adjust = 0; extern bool Own_TPSL = FALSE; extern int OwnTP = 0; extern int OwnSL = 0; extern bool TradeBuySide = TRUE; extern bool TradeSellSide = TRUE; extern int CycleMilliseconds = 200; extern bool closeAllNow = FALSE; int g_count_200; string g_name_204 = "map.dat"; double gda_212[][11]; double gda_216[][11]; int gia_220[][2]; double gda_unused_224[1][2]; string gsa_228[]; string gsa_232[]; string gsa_236[]; string gs_240; int g_datetime_248; int g_datetime_252; int gi_256; int gia_260[]; int init() { int li_0; int li_4; int li_8; string ls_12; if (!IsDemo() && StringFind(AccountName(), "Daniel Hale", 0) < 0 && StringFind(AccountName(), "tradecopy-import", 0) < 0 && StringFind(AccountName(), "Hale Software Concepts Inc.", 0) < 0 && StringFind(AccountName(), "Hale", 0) < 0 && StringFind(AccountName(), "HALE", 0) < 0 && StringFind(AccountName(), "DANIEL HALE", 0) < 0 && StringFind(AccountName(), "", 0) < 0 && StringFind(AccountName(), "", 0) < 0) { Alert("TradeCopy is not licensed for your account number. Please, contact Nick Bilak - beluck@gmail.com to obtain the licensed version!"); crash(); return (-1); } g_datetime_252 = TimeCurrent(); 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_228, li_8); gsa_228[li_8 - 1] = ls_12; } ls_12 = StringSubstr(pairs, li_0); li_8++; ArrayResize(gsa_228, li_8); gsa_228[li_8 - 1] = ls_12; li_8 = 0; li_0 = 0; li_4 = 0; while (true) { li_4 = StringFind(SlaveNames, ",", li_0); if (li_4 <= 0) break; ls_12 = StringSubstr(SlaveNames, li_0, li_4 - li_0); li_0 = li_4 + 1; li_8++; ArrayResize(gsa_232, li_8); gsa_232[li_8 - 1] = ls_12; } ls_12 = StringSubstr(SlaveNames, li_0); li_8++; ArrayResize(gsa_232, li_8); gsa_232[li_8 - 1] = ls_12; Print(ArraySize(gsa_228), " SymbolNames:"); ls_12 = ""; for (li_0 = 0; li_0 < ArraySize(gsa_228); li_0++) ls_12 = ls_12 + gsa_228[li_0] + ", "; Print(ls_12); Print(ArraySize(gsa_232), " systems:"); ls_12 = ""; for (li_0 = 0; li_0 < ArraySize(gsa_232); li_0++) ls_12 = ls_12 + gsa_232[li_0] + ", "; Print(ls_12); return; } int start() { int li_0; string ls_8; if (!IsDemo() && StringFind(AccountName(), "Daniel Hale", 0) < 0 && StringFind(AccountName(), "tradecopy-import", 0) < 0 && StringFind(AccountName(), "Hale Software Concepts Inc.", 0) < 0 && StringFind(AccountName(), "Hale", 0) < 0 && StringFind(AccountName(), "HALE", 0) < 0 && StringFind(AccountName(), "DANIEL HALE", 0) < 0 && StringFind(AccountName(), "", 0) < 0 && StringFind(AccountName(), "", 0) < 0) { Alert("TradeCopy is not licensed for your account number. Please, contact Nick Bilak - beluck@gmail.com to obtain the licensed version!"); crash(); return (-1); } Sleep(5000); while (IsStopped() == FALSE) { Sleep(CycleMilliseconds); gs_240 = "local time is : " + TimeToStr(TimeLocal(), TIME_SECONDS); Comment(gs_240); if (!(IsConnected())) continue; if (!(IsTradeAllowed())) continue; if (closeAllNow) CloseAll(); li_0 = FindTrades(); ls_8 = " "; ls_8 = GetSlaveTrades(); gs_240 = "local time is : " + TimeToStr(TimeLocal(), TIME_SECONDS) + " getting signals from ( " + ls_8 + " ) Slaves"; Comment(gs_240); if (CountNZ(gda_212, 9) == 0 && TimeCurrent() - g_datetime_252 > 120 && OrdersTotal() == 0) FileDelete(g_name_204); li_0 = ReadMap(); li_0 = MakeMap(); if (TimeCurrent() - g_datetime_248 > 180) { Print("MAimp total mytrades:", CountNZ(gda_216, 11)); Print("MAimp total slave trades:", CountNZ(gda_212, 11)); Print("MAimp total map:", CountNZi(gia_220, 2)); g_datetime_248 = TimeCurrent(); } li_0 = CloseOrders(); li_0 = SaveArrayIToFile(gia_220, g_name_204); if (li_0 <= 0) Print("Error saving Map!"); li_0 = FindTrades(); li_0 = ModifyOrderPrices(); Comment(gs_240); } return (0); } int FindTrades() { int l_ord_total_4 = OrdersTotal(); ArrayResize(gda_216, 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()); return (1); } int AddTrade(int a_ticket_0) { string ls_4; int l_str2int_12; int li_16; int li_20 = ArraySize(gda_216) / 11 + 1; int li_28 = -1; if (OrderSelect(a_ticket_0, SELECT_BY_TICKET, MODE_TRADES)) { for (int l_index_24 = 0; l_index_24 < ArraySize(gsa_228); l_index_24++) { if (gsa_228[l_index_24] == OrderSymbol()) { li_28 = l_index_24; break; } } if (li_28 < 0) return (0); ls_4 = OrderComment(); l_str2int_12 = 0; if (StringFind(ls_4, "from #", 0) >= 0) { li_16 = StringFind(ls_4, "#", 0); l_str2int_12 = StrToInteger(StringSubstr(ls_4, li_16 + 1, StringLen(ls_4) - li_16 - 1)); } ArrayResize(gda_216, li_20); gda_216[li_20 - 1][0] = a_ticket_0; gda_216[li_20 - 1][1] = OrderType(); gda_216[li_20 - 1][2] = OrderOpenPrice(); gda_216[li_20 - 1][3] = OrderStopLoss(); gda_216[li_20 - 1][4] = OrderTakeProfit(); gda_216[li_20 - 1][5] = OrderOpenTime(); gda_216[li_20 - 1][6] = li_28; gda_216[li_20 - 1][7] = OrderLots(); gda_216[li_20 - 1][8] = 0; gda_216[li_20 - 1][9] = OrderClosePrice(); gda_216[li_20 - 1][10] = l_str2int_12; } return (0); } string GetSlaveTrades() { int li_0; int l_count_16; double ld_28; string ls_ret_36; ArrayResize(gda_212, 0); ArrayResize(gsa_236, 0); int li_24 = 0; for (int l_index_20 = 0; l_index_20 < ArraySize(gsa_232); l_index_20++) { l_count_16 = 0; li_0 = GV_GetNamedInt(gsa_232[l_index_20] + "lines", -1); if (li_0 > 0) { ls_ret_36 = ls_ret_36 + " " + gsa_232[l_index_20] + " "; for (int l_count_8 = 0; l_count_8 < li_0; l_count_8++) { li_24++; ArrayResize(gda_212, li_24); ArrayResize(gsa_236, li_24); gsa_236[li_24 - 1] = gsa_232[l_index_20]; for (int l_count_12 = 0; l_count_12 < 11; l_count_12++) { l_count_16++; ld_28 = GV_GetNamedDouble(gsa_232[l_index_20] + "_mt_" + l_count_16, -1); if (ld_28 >= 0.0) gda_212[li_24 - 1][l_count_12] = ld_28; else gda_212[li_24 - 1][l_count_12] = 0; } } } } return (ls_ret_36); } int ReadMap() { int li_8; int l_file_0 = FileOpen(g_name_204, FILE_CSV|FILE_READ); if (l_file_0 < 1) return (0); ArrayResize(gia_220, 0); while (!FileIsEnding(l_file_0)) { li_8++; ArrayResize(gia_220, li_8); gia_220[li_8 - 1][0] = FileReadNumber(l_file_0); gia_220[li_8 - 1][1] = FileReadNumber(l_file_0); } ArrayResize(gia_220, li_8 - 1); FileClose(l_file_0); return (1); } int MakeMap() { int li_12; int li_16; int li_20; int li_24; int li_28; bool li_32; for (int l_index_0 = 0; l_index_0 < ArraySize(gda_212) / 11; l_index_0++) { if (gda_212[l_index_0][8] <= 0.9) { if (gda_212[l_index_0][10] <= 0.9) { li_32 = FALSE; li_12 = gda_212[l_index_0][0]; for (int l_index_4 = 0; l_index_4 < ArraySize(gia_220) / 2; l_index_4++) { li_16 = gia_220[l_index_4][0]; if (li_12 == li_16) { li_20 = gia_220[l_index_4][1]; for (int l_index_8 = 0; l_index_8 < ArraySize(gda_216) / 11; l_index_8++) { li_24 = gda_216[l_index_8][0]; if (li_20 == li_24) { li_32 = TRUE; l_index_8 = 99999; l_index_4 = 99999; } } } } if (!li_32 && li_12 > 0) { li_28 = MakeOrder(l_index_0); if (li_28 > 0) AddMap(li_12, li_28); } } } } return (0); } int AddMap(int ai_0, int ai_4) { int li_8; if (ai_4 > 0) { li_8 = ArraySize(gia_220) / 2 + 1; ArrayResize(gia_220, li_8); gia_220[li_8 - 1][0] = ai_0; gia_220[li_8 - 1][1] = ai_4; } return (0); } int MakeOrder(int ai_0) { int l_count_4; int l_ticket_16; double l_price_96; double ld_104; double l_bid_112; double l_ask_120; int li_128; int l_cmd_8 = gda_212[ai_0][1]; int l_magic_12 = gda_212[ai_0][0]; if (IsNoTrade(l_magic_12)) return (0); if (!StopLimitOrders) if (l_cmd_8 != OP_BUY && l_cmd_8 != OP_SELL) return; int li_20 = 1; if (l_cmd_8 == OP_SELL || l_cmd_8 == OP_SELLSTOP || l_cmd_8 == OP_SELLLIMIT) li_20 = -1; if (!TradeBuySide && li_20 > 0) { AddNoTrade(l_magic_12); return (-1); } if (!TradeSellSide && li_20 < 0) { AddNoTrade(l_magic_12); return (-1); } double ld_40 = gda_212[ai_0][3]; double ld_48 = gda_212[ai_0][4]; double l_price_24 = ld_40; double l_price_32 = ld_48; string ls_56 = GetSymbol(gda_212[ai_0][6]); if (StringLen(ls_56) <= 1) { AddNoTrade(l_magic_12); return (-1); } double l_minlot_64 = MarketInfo(ls_56, MODE_MINLOT); if (l_minlot_64 < 1.0) gi_256 = 1; if (l_minlot_64 < 0.1) gi_256 = 2; if (l_minlot_64 < 0.01) gi_256 = 3; double l_minlot_72 = LotsRisk(ls_56); if (ExportLots) l_minlot_72 = NormalizeDouble(ExportLotMultiply * gda_212[ai_0][7], gi_256); double l_point_80 = MarketInfo(ls_56, MODE_POINT); int l_digits_88 = MarketInfo(ls_56, MODE_DIGITS); int l_stoplevel_92 = MarketInfo(ls_56, MODE_STOPLEVEL); if (l_minlot_72 < l_minlot_64) l_minlot_72 = l_minlot_64; for (g_count_200 = 0; l_ticket_16 <= 0 && g_count_200 < NumberTries; g_count_200++) { l_count_4 = 0; while (l_count_4 < 7 && !IsTradeAllowed()) { l_count_4++; Sleep(3000); } RefreshRates(); if (l_cmd_8 != OP_BUY && l_cmd_8 != OP_SELL) l_price_96 = gda_212[ai_0][2]; if (l_cmd_8 == OP_BUY) l_price_96 = MarketInfo(ls_56, MODE_ASK); if (l_cmd_8 == OP_SELL) l_price_96 = MarketInfo(ls_56, MODE_BID); ld_104 = gda_212[ai_0][2]; if (TPSL_InPoints) { if (NormalizeDouble(l_price_24, 1) >= 0.1) l_price_24 = NormalizeDouble(l_price_96 - li_20 * (MathAbs(ld_104 - ld_40) + SL_adjust * l_point_80), l_digits_88); if (NormalizeDouble(l_price_32, 1) >= 0.1) l_price_32 = NormalizeDouble(l_price_96 + li_20 * (MathAbs(ld_48 - ld_104) + TP_adjust * l_point_80), l_digits_88); } if (Own_TPSL) { l_price_24 = 0; l_price_32 = 0; if (OwnSL > 0) l_price_24 = NormalizeDouble(l_price_96 - li_20 * OwnSL * l_point_80, l_digits_88); if (OwnTP > 0) l_price_32 = NormalizeDouble(l_price_96 + li_20 * OwnTP * l_point_80, l_digits_88); } l_bid_112 = MarketInfo(ls_56, MODE_BID); l_ask_120 = MarketInfo(ls_56, MODE_ASK); Print("stoplev=", l_stoplevel_92, ", bid=", l_bid_112, ", ask=", l_ask_120, " , ticket=", l_magic_12, " order : ", ls_56, ", type=", l_cmd_8, ", lots=", l_minlot_72, ", entry=", l_price_96, ", slip=", Slippage, ", sl=", l_price_24, ", tp=", l_price_32, ", cmt=", gsa_236[ai_0], " fr # ", gda_212[ai_0][10]); if (ExpireMinutes > 0 && TimeCurrent() - gda_212[ai_0][5] > 60 * ExpireMinutes) { Print(l_magic_12 + " No trade - ExpireMinutes limitation" + TimeToStr(gda_212[ai_0][5], TIME_DATE|TIME_MINUTES)); Alert(l_magic_12 + " No trade - ExpireMinutes limitation" + TimeToStr(gda_212[ai_0][5], TIME_DATE|TIME_MINUTES)); AddNoTrade(l_magic_12); return (-1); } if (MathAbs(ld_104 - l_price_96) > MaxMarketDiff * l_point_80) { Print(l_magic_12 + " No trade - MaxMarketDiff limitation, order=", ld_104, " local=", l_price_96, " pnt=", l_point_80, " ", MaxMarketDiff * l_point_80); Alert(l_magic_12 + " No trade - MaxMarketDiff limitation, order=" + ld_104 + " local=" + l_price_96 + " pnt=" + l_point_80 + " " + (MaxMarketDiff * l_point_80)); if (!Wait4ValidMarketDiff) AddNoTrade(l_magic_12); AddNoTrade(l_magic_12); return (-1); } if ((l_cmd_8 == OP_BUYLIMIT || l_cmd_8 == OP_SELLSTOP && l_price_96 > l_bid_112 - l_stoplevel_92 * l_point_80) || (l_cmd_8 == OP_BUYSTOP || l_cmd_8 == OP_SELLLIMIT && l_price_96 < l_ask_120 + l_stoplevel_92 * l_point_80)) { gs_240 = gs_240 + "\n" + "ticket - import - wrong entry price (stoplevel)!"; return (0); } if (li_20 > 0 && NormalizeDouble(l_price_24, 1) >= 0.1 && l_price_24 > l_price_96 - l_stoplevel_92 * l_point_80) { gs_240 = gs_240 + "\n" + "ticket - import - wrong SL for buy!"; return (0); } if (li_20 > 0 && NormalizeDouble(l_price_32, 1) >= 0.1 && l_price_32 < l_price_96 + l_stoplevel_92 * l_point_80) { gs_240 = gs_240 + "\n" + "ticket - import - wrong TP for buy!"; return (0); } if (li_20 < 0 && NormalizeDouble(l_price_32, 1) >= 0.1 && l_price_32 > l_price_96 - l_stoplevel_92 * l_point_80) { gs_240 = gs_240 + "\n" + "ticket - import - wrong TP for sell!"; return (0); } if (li_20 < 0 && NormalizeDouble(l_price_24, 1) >= 0.1 && l_price_24 < l_price_96 + l_stoplevel_92 * l_point_80) { gs_240 = gs_240 + "\n" + "ticket - import - wrong SL for sell!"; return (0); } if (l_cmd_8 != OP_BUY && l_cmd_8 != OP_SELL) l_ticket_16 = OrderSend(ls_56, l_cmd_8, l_minlot_72, l_price_96, Slippage, l_price_24, l_price_32, gsa_236[ai_0] + "_" + l_magic_12, l_magic_12, 0, White); else { if (!PendingSLTP) l_ticket_16 = OrderSend(ls_56, l_cmd_8, l_minlot_72, l_price_96, Slippage, l_price_24, l_price_32, gsa_236[ai_0] + "_" + l_magic_12, l_magic_12, 0, White); else { l_ticket_16 = OrderSend(ls_56, l_cmd_8, l_minlot_72, l_price_96, Slippage, 0, 0, gsa_236[ai_0] + "_" + l_magic_12, l_magic_12, 0, White); if (l_ticket_16 > 0) { while (li_128 < 20) { li_128++; if (OrderSelect(l_ticket_16, SELECT_BY_TICKET)) { if (OrderModify(l_ticket_16, OrderOpenPrice(), l_price_24, l_price_32, OrderExpiration(), White)) break; Sleep(1000); } else Sleep(1000); } } } } } if (l_ticket_16 <= 0) Print("Error opening order : ", ErrorDescription(GetLastError())); return (l_ticket_16); } string GetSymbol(int ai_0) { return (gsa_228[ai_0]); } void CloseAll() { int l_cmd_0; int l_count_4; bool li_8; if (closeAllNow) { for (int l_pos_12 = OrdersTotal() - 1; l_pos_12 >= 0; l_pos_12--) { OrderSelect(l_pos_12, SELECT_BY_POS, MODE_TRADES); l_cmd_0 = OrderType(); if (l_cmd_0 == OP_BUY) { li_8 = FALSE; for (g_count_200 = 0; !li_8 && g_count_200 < NumberTries; g_count_200++) { l_count_4 = 0; while (l_count_4 < 6 && !IsTradeAllowed()) { l_count_4++; Sleep(5000); } RefreshRates(); li_8 = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), Slippage, White); Sleep(3000); } if (!li_8) Print("Error closing order BUY : ", MarketInfo(OrderSymbol(), MODE_BID), " ", OrderTicket(), " ", ErrorDescription(GetLastError())); } if (l_cmd_0 == OP_SELL) { li_8 = FALSE; for (g_count_200 = 0; !li_8 && g_count_200 < NumberTries; g_count_200++) { l_count_4 = 0; while (l_count_4 < 6 && !IsTradeAllowed()) { l_count_4++; Sleep(5000); } RefreshRates(); li_8 = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), Slippage, White); Sleep(3000); } if (!li_8) Print("Error closing order SELL: ", MarketInfo(OrderSymbol(), MODE_ASK), " ", OrderTicket(), " ", ErrorDescription(GetLastError())); } if (l_cmd_0 == OP_BUYSTOP || l_cmd_0 == OP_BUYLIMIT || l_cmd_0 == OP_SELLSTOP || l_cmd_0 == OP_SELLLIMIT) { li_8 = FALSE; for (g_count_200 = 0; !li_8 && g_count_200 < NumberTries; g_count_200++) { l_count_4 = 0; while (l_count_4 < 6 && !IsTradeAllowed()) { l_count_4++; Sleep(5000); } RefreshRates(); li_8 = OrderDelete(OrderTicket()); Sleep(3000); } if (!li_8) Print("Error deleting order : ", MarketInfo(OrderSymbol(), MODE_BID), " ", OrderTicket(), " ", ErrorDescription(GetLastError())); } } } } int CloseOrders() { int li_0; int l_ticket_20; int li_28; int li_32; int li_36; int li_40; int li_44; int l_ticket_48; int li_52; int li_56; bool li_60; int li_64; int l_count_68; double l_lots_80; double l_ord_lots_88; bool li_104; bool li_108; bool li_112; double l_point_72 = 0.00001; for (int l_index_8 = 0; l_index_8 < ArraySize(gda_212) / 11; l_index_8++) { li_28 = -1; if (gda_212[l_index_8][8] > 0.8) { li_28 = gda_212[l_index_8][0]; li_32 = gda_212[l_index_8][10]; l_lots_80 = ExportLotMultiply * gda_212[l_index_8][7]; if (!ExportLots) l_lots_80 = Lots; li_0 = gda_212[l_index_8][6]; l_point_72 = MarketInfo(GetSymbol(li_0), MODE_POINT); li_44 = gda_212[l_index_8][1]; if (Wait4TPSL && li_44 == 0 || li_44 == 1 && MathAbs(gda_212[l_index_8][9] - gda_212[l_index_8][3]) < l_point_72 || MathAbs(gda_212[l_index_8][9] - gda_212[l_index_8][4]) < l_point_72) continue; l_ticket_20 = -1; for (int l_index_12 = 0; l_index_12 < ArraySize(gia_220) / 2; l_index_12++) { li_36 = gia_220[l_index_12][0]; if (li_28 == li_36) { l_ticket_20 = gia_220[l_index_12][1]; li_44 = -1; li_104 = FALSE; for (int l_index_4 = 0; l_index_4 < ArraySize(gda_216) / 11; l_index_4++) { li_40 = gda_216[l_index_4][0]; if (l_ticket_20 == li_40) { li_44 = gda_216[l_index_4][1]; li_104 = TRUE; break; } } if (li_104) { li_112 = FALSE; for (g_count_200 = 0; !li_112 && g_count_200 < NumberTries; g_count_200++) { if (!(OrderSelect(l_ticket_20, SELECT_BY_TICKET, MODE_TRADES))) break; l_ord_lots_88 = OrderLots(); l_ticket_48 = l_ticket_20; RefreshRates(); if (equal(l_lots_80, l_ord_lots_88, 3)) { if (li_44 == 0 || li_44 == 1) li_112 = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, White); else li_112 = OrderDelete(OrderTicket()); } else { if (li_44 == 0 || li_44 == 1) li_112 = OrderClose(OrderTicket(), l_lots_80, OrderClosePrice(), Slippage, White); if (li_112) { li_64 = li_28; l_ticket_48 = li_32; li_60 = FALSE; for (l_index_8 = 0; l_index_8 < ArraySize(gia_220) / 2; l_index_8++) { li_52 = gia_220[l_index_8][0]; if (li_64 == li_52) { gia_220[l_index_8][0] = l_ticket_48; li_56 = gia_220[l_index_8][1]; l_count_68 = 0; li_108 = FALSE; while (!li_108 && li_56 != li_60 && l_count_68 < 100) { l_count_68++; Sleep(50); FindTrades(); for (int l_index_16 = 0; l_index_16 < ArraySize(gda_216) / 11; l_index_16++) { if (gda_216[l_index_16][10] >= 0.9) { li_60 = gda_216[l_index_16][10]; if (li_56 == li_60) { gia_220[l_index_8][1] = gda_216[l_index_16][0]; break; } } } } break; } } } } } if (!li_112) Print("Error closing or deleting order : ", MarketInfo(OrderSymbol(), MODE_BID), " ", OrderTicket(), " ", ErrorDescription(GetLastError())); } } } } } return (0); } int ModifyOrderPrices() { int l_digits_12; int li_16; int li_20; int li_24; int li_28; string ls_32; for (int l_index_0 = 0; l_index_0 < ArraySize(gia_220) / 2; l_index_0++) { li_20 = gia_220[l_index_0][0]; li_16 = gia_220[l_index_0][1]; li_24 = -1; for (int l_index_4 = 0; l_index_4 <= ArraySize(gda_216) / 11; l_index_4++) if (gda_216[l_index_4][0] == li_16) li_24 = l_index_4; li_28 = -1; for (int l_index_8 = 0; l_index_8 <= ArraySize(gda_212) / 11; l_index_8++) if (gda_212[l_index_8][0] == li_20) li_28 = l_index_8; if (li_28 < 0 || li_24 < 0) continue; ls_32 = gda_212[li_28][6]; l_digits_12 = MarketInfo(GetSymbol(ls_32), MODE_DIGITS); if (!equal(gda_216[li_24][3], gda_212[li_28][3], l_digits_12)) ModifyOrder(li_24, 2, gda_212[li_28][3]); if (!equal(gda_216[li_24][4], gda_212[li_28][4], l_digits_12)) ModifyOrder(li_24, 3, gda_212[li_28][4]); if (gda_212[li_28][1] != 1.0 && gda_212[li_28][1] != 0.0) if (!equal(gda_216[li_24][2], gda_212[li_28][2], l_digits_12)) ModifyOrder(li_24, 1, gda_212[li_28][2]); } return (0); } int ModifyOrder(int ai_0, int ai_4, double ad_8) { double l_ord_open_price_20; double l_ord_stoploss_28; double l_ord_takeprofit_36; bool l_bool_16 = FALSE; g_count_200 = 0; if (OrderSelect(gda_216[ai_0][0], SELECT_BY_TICKET, MODE_TRADES)) { l_ord_open_price_20 = OrderOpenPrice(); l_ord_stoploss_28 = OrderStopLoss(); l_ord_takeprofit_36 = OrderTakeProfit(); if (ai_4 == 1) l_ord_open_price_20 = ad_8; if (ai_4 == 2) l_ord_stoploss_28 = ad_8; if (ai_4 == 3) l_ord_takeprofit_36 = ad_8; Print("OrderModify " + ai_4 + " :: ", OrderTicket(), ", ", l_ord_open_price_20, ", ", l_ord_stoploss_28, ", ", l_ord_takeprofit_36); while (!l_bool_16 && g_count_200 < NumberTries) { RefreshRates(); l_bool_16 = OrderModify(OrderTicket(), l_ord_open_price_20, l_ord_stoploss_28, l_ord_takeprofit_36, 0, White); Sleep(1000); g_count_200++; } if (!l_bool_16) Print("Error modifying order at : ", MarketInfo(OrderSymbol(), MODE_BID), " ", OrderTicket(), " ", ErrorDescription(GetLastError())); } return (0); } bool equal(double ad_0, double ad_8, int ai_16) { if (MathAbs(NormalizeDouble(ad_0, ai_16) - NormalizeDouble(ad_8, ai_16)) >= MathPow(10, -ai_16)) return (FALSE); return (TRUE); } double LotsRisk(string a_symbol_0) { int li_8 = 100; double ld_ret_12 = Lots; double l_minlot_20 = MarketInfo(a_symbol_0, MODE_MINLOT); if (l_minlot_20 < 1.0) gi_256 = 1; if (l_minlot_20 < 0.1) gi_256 = 2; if (l_minlot_20 < 0.01) gi_256 = 3; if (!FixedLot) ld_ret_12 = NormalizeDouble(AccountFreeMargin() * MaximumRisk / 1000.0 / li_8, gi_256); else ld_ret_12 = Lots; if (ld_ret_12 < l_minlot_20) ld_ret_12 = l_minlot_20; return (ld_ret_12); } 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); } int CountNZi(int aia_0[][2], int ai_4) { int li_ret_20; int li_16 = ArraySize(aia_0) / ai_4; for (int l_index_8 = 0; l_index_8 < li_16; l_index_8++) if (aia_0[l_index_8][0] > 0) li_ret_20++; return (li_ret_20); } int AddNoTrade(int ai_0) { int l_arr_size_4 = ArraySize(gia_260); ArrayResize(gia_260, l_arr_size_4 + 1); gia_260[l_arr_size_4] = ai_0; return (0); } bool IsNoTrade(int ai_0) { int l_arr_size_4 = ArraySize(gia_260); for (int l_index_8 = 0; l_index_8 < l_arr_size_4; l_index_8++) if (gia_260[l_index_8] == ai_0) return (TRUE); return (FALSE); } int SaveArrayIToFile(int aia_0[][2], string a_name_4) { int li_16; int l_file_12 = FileOpen(a_name_4, FILE_CSV|FILE_WRITE); if (l_file_12 < 1) { Print("File " + a_name_4 + " not opened, the last error is ", ErrorDescription(GetLastError())); return (0); } for (int l_index_20 = 0; l_index_20 < ArraySize(aia_0) / 2; l_index_20++) li_16 = FileWrite(l_file_12, aia_0[l_index_20][0], aia_0[l_index_20][1]); if (li_16 < 0) { Print("writing file error : ", ErrorDescription(GetLastError())); return (0); } FileFlush(l_file_12); FileClose(l_file_12); return (1); }