☞ Global Variable 기법을 이용하여 Windows/System 폴더에 GlobalVariable.dll 파일을 넣고, 각각의 메타4에 Export와 Import를 차트에 붙여서 사용한다.


 Export EA는 해당 메타4에서 발생한 주문 및 청산정보를 Import가 부착된 메타4에 넘겨주고, Import의 메타4에서 정방향이나 역방향 주문을 발생시키며, 청산시 청산정보를 넘겨주어 청산에 이르게 한다.


 Two or Multi-Broker 동시 주문이 가능하며, Latency Two-Broker 전략구사시 주문처리시간옵션이 있어, 초과시 주문거부가 발생함(Odd Order발생)에 주의한다.

 

//+------------------------------------------------------------------+
//|                            Global Variable Import V1.0               |
//|                        Copyright @ Gguriru Project                  |
//+------------------------------------------------------------------+

#property copyright "Copyright @ Gguriru Project"

//+------------------------------------------------------------------+
//| Data Receiver(Global Variable)                                   |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Include파일/DLL파일 가져오기                                     |
//+------------------------------------------------------------------+

#include <stdlib.mqh>

#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,EURAUD,AUDJPY,AUDNZD,AUDUSD,CADCHF,CADJPY,CHFJPY,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 = "gguri,chiggu";  // 다른 메타에서 전송할 경우는 서버명, comma공백없이 계속 추가가능
extern double Lots = 0.1;
extern bool ExportLots = TRUE;
extern double ExportLotMultiply = 1.0;
extern int Slippage = 3;
extern int MaxMarketDiff = 100;
extern int ExpireMinutes = 60;
extern int NumberTries = 5;
extern bool StopLimitOrders = TRUE;
extern bool ECN = FALSE;
extern bool Wait4TPSL = TRUE;
extern bool TPSL_InPoints = TRUE;
extern bool Own_TPSL = FALSE;
extern int OwnTP = 0;
extern int OwnSL = 0;
extern int CycleMilliseconds = 200;
extern bool closeAllNow = FALSE;
string Commentary = "치지않습니다.V1.0";
int g_count_168;
string g_name_172 = "map.dat";
double gda_180[][11];
double gda_184[][11];
int gia_188[][2];
double gda_unused_192[1][2];
string gsa_196[];
string gsa_200[];
string gsa_204[];
string gs_208;
int g_datetime_216;
int g_datetime_220;
int gi_224;
int gia_228[];

//+------------------------------------------------------------------+
//| 초기화                                                           |
//+------------------------------------------------------------------+

int init() {  // 0

//+------------------------------------------------------------------+
//| Pairs변수에서 Parsing후 통화들을 가져오는 로직                   |
//+------------------------------------------------------------------+

   int li_0;
   int li_4;
   int li_8;
   string ls_12;
  
   g_datetime_220 = 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_196, li_8);
      gsa_196[li_8 - 1] = ls_12;
   }
   ls_12 = StringSubstr(pairs, li_0);
   li_8++;
   ArrayResize(gsa_196, li_8);
   gsa_196[li_8 - 1] = ls_12;
   li_8 = 0;
   li_0 = 0;
   li_4 = 0;


//+------------------------------------------------------------------+
//| SlaveNames변수에서 Parsing후 서버명을 가져오는 로직              |
//+------------------------------------------------------------------+

   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_200, li_8);
      gsa_200[li_8 - 1] = ls_12;
   }
   ls_12 = StringSubstr(SlaveNames, li_0);
   li_8++;
   ArrayResize(gsa_200, li_8);
   gsa_200[li_8 - 1] = ls_12;
   Print(ArraySize(gsa_196), " SymbolNames:");
   ls_12 = "";
   for (li_0 = 0; li_0 < ArraySize(gsa_196); li_0++) ls_12 = ls_12 + gsa_196[li_0] + ", ";
   Print(ls_12);
   Print(ArraySize(gsa_200), " systems:");
   ls_12 = "";
   for (li_0 = 0; li_0 < ArraySize(gsa_200); li_0++) ls_12 = ls_12 + gsa_200[li_0] + ", ";
   Print(ls_12);
   return;

}  // 0


//+------------------------------------------------------------------+
//| EA Start                                                         |
//+------------------------------------------------------------------+

int start() {  // 0

   int li_0;
   string ls_8;

// 5초 쉬고, CycleMilliseconds단위로 전송받은 정보처리 및 파일저장, 화면표시 작업수행 

   Sleep(5000);
   while (IsStopped() == FALSE) {
      Sleep(CycleMilliseconds);
      gs_208 = "서버명 : "+AccountServer()+", local time is : " + TimeToStr(TimeLocal(), TIME_SECONDS);
      Comment(gs_208);
      if (!(IsConnected())) continue;
      if (!(IsTradeAllowed())) continue;
      if (closeAllNow) CloseAll();

      li_0 = FindTrades();
      ls_8 = " ";
      ls_8 = GetSlaveTrades();
      gs_208 = "local time is : " + TimeToStr(TimeLocal(), TIME_SECONDS) + " getting signals from ( " + ls_8 + " ) Slaves";
      Comment(gs_208);

// 120ms 단위로 주문없을시 파일 삭제

      if (CountNZ(gda_180, 9) == 0 && TimeCurrent() - g_datetime_220 > 120 && OrdersTotal() == 0) FileDelete(g_name_172);
      li_0 = ReadMap();
      li_0 = MakeMap();

// 5ms 단위로 탭에 정보표시

      if (TimeCurrent() - g_datetime_216 > 180) {
         Print("MAimp total mytrades:", CountNZ(gda_184, 11));
         Print("MAimp total slave trades:", CountNZ(gda_180, 11));
         Print("MAimp total map:", CountNZi(gia_188, 2));
         g_datetime_216 = TimeCurrent();
      }

// 청산처리

      li_0 = CloseOrders();

// 파일에 저장

      li_0 = SaveArrayIToFile(gia_188, g_name_172);
      if (li_0 <= 0) Print("Error saving Map!");
      li_0 = ModifyOrderPrices();
      Comment(gs_208);

     }

   return (0);
}


//+------------------------------------------------------------------+
//| 현재 주문정보 처리 함수                                          |
//+------------------------------------------------------------------+

int FindTrades() {
   int l_ord_total_4 = OrdersTotal();
   ArrayResize(gda_184, 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_184) / 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_196); l_index_24++) {
         if (gsa_196[l_index_24] == OrderSymbol()) {
            li_28 = l_index_24;
            break;
         }
      }
      if (li_28 < 0) return (0);

// Order Comment에서 매직넘버를 추출

      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_184, li_20);
      gda_184[li_20 - 1][0] = a_ticket_0;
      gda_184[li_20 - 1][1] = OrderType();
      gda_184[li_20 - 1][2] = OrderOpenPrice();
      gda_184[li_20 - 1][3] = OrderStopLoss();
      gda_184[li_20 - 1][4] = OrderTakeProfit();
      gda_184[li_20 - 1][5] = OrderOpenTime();
      gda_184[li_20 - 1][6] = li_28;
      gda_184[li_20 - 1][7] = OrderLots();
      gda_184[li_20 - 1][8] = 0;
      gda_184[li_20 - 1][9] = OrderClosePrice();
      gda_184[li_20 - 1][10] = l_str2int_12;
   }
   return (0);
}


//+------------------------------------------------------------------+
//| Slave 주문정보를 받아오는 함수                                   |
//+------------------------------------------------------------------+

string GetSlaveTrades() {
   int li_0;
   int l_count_16;
   double ld_28;
   string ls_ret_36;
   ArrayResize(gda_180, 0);
   ArrayResize(gsa_204, 0);
   int li_24 = 0;
   for (int l_index_20 = 0; l_index_20 < ArraySize(gsa_200); l_index_20++) {
      l_count_16 = 0;
      li_0 = GV_GetNamedInt(gsa_200[l_index_20] + "lines", -1);
      if (li_0 > 0) {
         ls_ret_36 = ls_ret_36 + " " + gsa_200[l_index_20] + " ";
         for (int l_count_8 = 0; l_count_8 < li_0; l_count_8++) {
            li_24++;
            ArrayResize(gda_180, li_24);
            ArrayResize(gsa_204, li_24);
            gsa_204[li_24 - 1] = gsa_200[l_index_20];
            for (int l_count_12 = 0; l_count_12 < 11; l_count_12++) {
               l_count_16++;
               ld_28 = GV_GetNamedDouble(gsa_200[l_index_20] + "_mt_" + l_count_16, -1);
               if (ld_28 >= 0.0) gda_180[li_24 - 1][l_count_12] = ld_28;
               else gda_180[li_24 - 1][l_count_12] = 0;
            }
         }
      }
   }
   return (ls_ret_36);
}

//+------------------------------------------------------------------+
//| Map파일을 읽는 함수(map.csv파일을 연다.)                         |
//+------------------------------------------------------------------+

int ReadMap() {
   int li_8;
   int l_file_0 = FileOpen(g_name_172, FILE_CSV|FILE_READ);
   if (l_file_0 < 1) return (0);
   ArrayResize(gia_188, 0);
   while (!FileIsEnding(l_file_0)) {
      li_8++;
      ArrayResize(gia_188, li_8);
      gia_188[li_8 - 1][0] = FileReadNumber(l_file_0);
      gia_188[li_8 - 1][1] = FileReadNumber(l_file_0);
   }
   ArrayResize(gia_188, li_8 - 1);
   FileClose(l_file_0);
   return (1);
}

//+------------------------------------------------------------------+
//| Map파일을 만드는 함수                                            |
//+------------------------------------------------------------------+

int MakeMap() {  // 0

   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_180) / 11; l_index_0++) {
      if (gda_180[l_index_0][8] <= 0.9) {
         if (gda_180[l_index_0][10] <= 0.9) {
            li_32 = FALSE;
            li_12 = gda_180[l_index_0][0];
            for (int l_index_4 = 0; l_index_4 < ArraySize(gia_188) / 2; l_index_4++) {
               li_16 = gia_188[l_index_4][0];
               if (li_12 == li_16) {
                  li_20 = gia_188[l_index_4][1];
                  for (int l_index_8 = 0; l_index_8 < ArraySize(gda_184) / 11; l_index_8++) {
                     li_24 = gda_184[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);
}


//+------------------------------------------------------------------+
//| Map파일에 정보를 첨가하는 함수                                   |
//+------------------------------------------------------------------+

int AddMap(int ai_0, int ai_4) {
   int li_8;
   if (ai_4 > 0) {
      li_8 = ArraySize(gia_188) / 2 + 1;
      ArrayResize(gia_188, li_8);
      gia_188[li_8 - 1][0] = ai_0;
      gia_188[li_8 - 1][1] = ai_4;
   }
   return (0);
}

//+------------------------------------------------------------------+
//| 주문 처리 함수                                                   |
//+------------------------------------------------------------------+

int MakeOrder(int ai_0) {  // 0

   int l_count_4;
   int l_ticket_16;
   double l_price_96;
   double l_datetime_104;
   double l_bid_112;
   double l_ask_120;
   int li_128;
   int l_cmd_8 = gda_180[ai_0][1];
   int l_magic_12 = gda_180[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;
   double ld_40 = gda_180[ai_0][3];
   double ld_48 = gda_180[ai_0][4];
   double l_price_24 = ld_40;
   double l_price_32 = ld_48;
   string l_symbol_56 = GetSymbol(gda_180[ai_0][6]);
   double l_minlot_64 = MarketInfo(l_symbol_56, MODE_MINLOT);
   if (l_minlot_64 < 1.0) gi_224 = 1;
   if (l_minlot_64 < 0.1) gi_224 = 2;
   if (l_minlot_64 < 0.01) gi_224 = 3;
   double l_lots_72 = Lots;
   if (ExportLots) l_lots_72 = NormalizeDouble(ExportLotMultiply * gda_180[ai_0][7], gi_224);
   double l_point_80 = MarketInfo(l_symbol_56, MODE_POINT);
   int li_88 = MarketInfo(l_symbol_56, MODE_DIGITS);
   int li_92 = MarketInfo(l_symbol_56, MODE_STOPLEVEL);
   if (l_lots_72 < l_minlot_64) l_lots_72 = l_minlot_64;
   for (g_count_168 = 0; l_ticket_16 <= 0 && g_count_168 < NumberTries; g_count_168++) {
      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_180[ai_0][2];
      if (l_cmd_8 == OP_BUY) l_price_96 = MarketInfo(l_symbol_56, MODE_ASK);
      if (l_cmd_8 == OP_SELL) l_price_96 = MarketInfo(l_symbol_56, MODE_BID);
      l_datetime_104 = gda_180[ai_0][2];
      if (TPSL_InPoints) {
         if (NormalizeDouble(l_price_24, 1) >= 0.1) l_price_24 = NormalizeDouble(l_price_96 - li_20 * MathAbs(l_datetime_104 - ld_40), li_88);
         if (NormalizeDouble(l_price_32, 1) >= 0.1) l_price_32 = NormalizeDouble(l_price_96 + li_20 * MathAbs(ld_48 - l_datetime_104), li_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, li_88);
         if (OwnTP > 0) l_price_32 = NormalizeDouble(l_price_96 + li_20 * OwnTP * l_point_80, li_88);
      }
      l_bid_112 = MarketInfo(l_symbol_56, MODE_BID);
      l_ask_120 = MarketInfo(l_symbol_56, MODE_ASK);
      Print("stoplev=", li_92, ", bid=", l_bid_112, ", ask=", l_ask_120, " , ticket=", l_magic_12, " order : ", l_symbol_56, ", type=", l_cmd_8, ", lots=", l_lots_72, ", entry=", l_price_96, ", slip=", Slippage, ", sl=", l_price_24, ", tp=", l_price_32, ", cmt=", gsa_204[ai_0], " fr # ", gda_180[ai_0][10]);
      if (ExpireMinutes > 0 && TimeCurrent() - gda_180[ai_0][5] > 60 * ExpireMinutes) {
         Print(l_magic_12 + " No trade - ExpireMinutes limitation" + TimeToStr(gda_180[ai_0][5], TIME_DATE|TIME_MINUTES));
         Alert(l_magic_12 + " No trade - ExpireMinutes limitation" + TimeToStr(gda_180[ai_0][5], TIME_DATE|TIME_MINUTES));
         AddNoTrade(l_magic_12);
         return (-1);
      }
      if (MathAbs(l_datetime_104 - l_price_96) > MaxMarketDiff * l_point_80) {
         Print(l_magic_12 + " No trade - MaxMarketDiff limitation, order=", l_datetime_104, "  local=", l_price_96, " pnt=", l_point_80, " ", MaxMarketDiff * l_point_80);
         Alert(l_magic_12 + " No trade - MaxMarketDiff limitation, order=" + l_datetime_104 + "  local=" + l_price_96 + " pnt=" + l_point_80 + " " + (MaxMarketDiff * l_point_80));
         AddNoTrade(l_magic_12);
         return (-1);
      }
      if ((l_cmd_8 == OP_BUYLIMIT || l_cmd_8 == OP_SELLSTOP && l_price_96 > l_bid_112 - li_92 * l_point_80) || (l_cmd_8 == OP_BUYSTOP || l_cmd_8 == OP_SELLLIMIT && l_price_96 < l_ask_120 +
         li_92 * l_point_80)) {
         gs_208 = gs_208 
            + "\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 - li_92 * l_point_80) {
         gs_208 = gs_208 
            + "\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 + li_92 * l_point_80) {
         gs_208 = gs_208 
            + "\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 - li_92 * l_point_80) {
         gs_208 = gs_208 
            + "\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 + li_92 * l_point_80) {
         gs_208 = gs_208 
            + "\n" 
         + "ticket - import - wrong SL for sell!";
         return (0);
      }
      if (l_cmd_8 != OP_BUY && l_cmd_8 != OP_SELL) l_ticket_16 = OrderSend(l_symbol_56, l_cmd_8, l_lots_72, l_price_96, Slippage, l_price_24, l_price_32, gsa_204[ai_0]+"_"+Commentary, l_magic_12, 0, White);
      else {
         if (!ECN) l_ticket_16 = OrderSend(l_symbol_56, l_cmd_8, l_lots_72, l_price_96, Slippage, l_price_24, l_price_32, gsa_204[ai_0]+"_"+Commentary, l_magic_12, 0, White);
         else {
            l_ticket_16 = OrderSend(l_symbol_56, l_cmd_8, l_lots_72, l_price_96, Slippage, 0, 0, gsa_204[ai_0]+"_"+Commentary, 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_196[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_168 = 0; !li_8 && g_count_168 < NumberTries; g_count_168++) {
               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_168 = 0; !li_8 && g_count_168 < NumberTries; g_count_168++) {
               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_168 = 0; !li_8 && g_count_168 < NumberTries; g_count_168++) {
               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 l_ticket_0;
   int l_ticket_20;
   int l_ticket_28;
   int l_ticket_32;
   int l_ticket_36;
   int l_ticket_40;
   int l_ticket_44;
   int l_ticket_48;
   int l_ticket_52;
   int l_ticket_56;
   int l_ticket_60;
   int l_ticket_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_180) / 11; l_index_8++) {
      l_ticket_28 = -1;
      if (gda_180[l_index_8][8] > 0.8) {
         l_ticket_28 = gda_180[l_index_8][0];
         l_ticket_32 = gda_180[l_index_8][10];
         l_lots_80 = ExportLotMultiply * gda_180[l_index_8][7];
         if (!ExportLots) l_lots_80 = Lots;
         l_ticket_0 = gda_180[l_index_8][6];
         l_point_72 = MarketInfo(GetSymbol(l_ticket_0), MODE_POINT);
         l_ticket_44 = gda_180[l_index_8][1];
         if (Wait4TPSL && l_ticket_44 == 0 || l_ticket_44 == 1 && MathAbs(gda_180[l_index_8][9] - gda_180[l_index_8][3]) < l_point_72 || MathAbs(gda_180[l_index_8][9] - gda_180[l_index_8][4]) < l_point_72) continue;
         l_ticket_20 = -1;
         for (int l_index_12 = 0; l_index_12 < ArraySize(gia_188) / 2; l_index_12++) {
            l_ticket_36 = gia_188[l_index_12][0];
            if (l_ticket_28 == l_ticket_36) {
               l_ticket_20 = gia_188[l_index_12][1];
               l_ticket_44 = -1;
               li_104 = FALSE;
               for (int l_index_4 = 0; l_index_4 < ArraySize(gda_184) / 11; l_index_4++) {
                  l_ticket_40 = gda_184[l_index_4][0];
                  if (l_ticket_20 == l_ticket_40) {
                     l_ticket_44 = gda_184[l_index_4][1];
                     li_104 = TRUE;
                     break;
                  }
               }
               if (li_104) {
                  li_112 = FALSE;
                  for (g_count_168 = 0; !li_112 && g_count_168 < NumberTries; g_count_168++) {
                     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)) {
                        if (l_ticket_44 == 0 || l_ticket_44 == 1) li_112 = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, White);
                        else li_112 = OrderDelete(OrderTicket());
                     } else {
                        if (l_ticket_44 == 0 || l_ticket_44 == 1) li_112 = OrderClose(OrderTicket(), l_lots_80, OrderClosePrice(), Slippage, White);
                        if (li_112) {
                           l_ticket_64 = l_ticket_28;
                           l_ticket_48 = l_ticket_32;
                           l_ticket_60 = 0;
                           for (l_index_8 = 0; l_index_8 < ArraySize(gia_188) / 2; l_index_8++) {
                              l_ticket_52 = gia_188[l_index_8][0];
                              if (l_ticket_64 == l_ticket_52) {
                                 gia_188[l_index_8][0] = l_ticket_48;
                                 l_ticket_56 = gia_188[l_index_8][1];
                                 l_count_68 = 0;
                                 li_108 = FALSE;
                                 while (!li_108 && l_ticket_56 != l_ticket_60 && l_count_68 < 100) {
                                    l_count_68++;
                                    Sleep(50);
                                    FindTrades();
                                    for (int l_index_16 = 0; l_index_16 < ArraySize(gda_184) / 11; l_index_16++) {
                                       if (gda_184[l_index_16][10] >= 0.9) {
                                          l_ticket_60 = gda_184[l_index_16][10];
                                          if (l_ticket_56 == l_ticket_60) {
                                             gia_188[l_index_8][1] = gda_184[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 li_12;
   int li_16;
   int li_20;
   int li_24;
   for (int l_index_0 = 0; l_index_0 < ArraySize(gia_188) / 2; l_index_0++) {
      li_16 = gia_188[l_index_0][0];
      li_12 = gia_188[l_index_0][1];
      li_20 = -1;
      for (int l_index_4 = 0; l_index_4 <= ArraySize(gda_184) / 11; l_index_4++)
         if (gda_184[l_index_4][0] == li_12) li_20 = l_index_4;
      li_24 = -1;
      for (int l_index_8 = 0; l_index_8 <= ArraySize(gda_180) / 11; l_index_8++)
         if (gda_180[l_index_8][0] == li_16) li_24 = l_index_8;
      if (li_24 < 0 || li_20 < 0) continue;
      if (!equal(gda_184[li_20][3], gda_180[li_24][3])) ModifyOrder(li_20, 2, gda_180[li_24][3]);
      if (!equal(gda_184[li_20][4], gda_180[li_24][4])) ModifyOrder(li_20, 3, gda_180[li_24][4]);
      if (gda_180[li_24][1] != 1.0 && gda_180[li_24][1] != 0.0)
         if (!equal(gda_184[li_20][2], gda_180[li_24][2])) ModifyOrder(li_20, 1, gda_180[li_24][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_168 = 0;
   if (OrderSelect(gda_184[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_168 < NumberTries) {
         RefreshRates();
         l_bool_16 = OrderModify(OrderTicket(), l_ord_open_price_20, l_ord_stoploss_28, l_ord_takeprofit_36, 0, White);
         Sleep(5000);
         g_count_168++;
      }
      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) {
   if (MathAbs(NormalizeDouble(ad_0, 6) - NormalizeDouble(ad_8, 6)) > 0.0000001) return (FALSE);
   else return (TRUE);
}


//+------------------------------------------------------------------+
//| 전송계약 건수 계산 함수                                          |
//+------------------------------------------------------------------+

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);
}

//+------------------------------------------------------------------+
//| 추가주문 및 No Trade 처리 함수                                   |
//+------------------------------------------------------------------+

int AddNoTrade(int ai_0) {
   int l_arr_size_4 = ArraySize(gia_228);
   ArrayResize(gia_228, l_arr_size_4 + 1);
   gia_228[l_arr_size_4] = ai_0;
   return (0);
}

bool IsNoTrade(int ai_0) {
   int l_arr_size_4 = ArraySize(gia_228);
   for (int l_index_8 = 0; l_index_8 < l_arr_size_4; l_index_8++)
      if (gia_228[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);
}

+ Recent posts