☞ 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 Export V1.0                     |
//|                        Copyright @ Gguriru Project                   |
//+------------------------------------------------------------------+

#property copyright "Copyright Gguriru Project"

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

#import "GlobalVariable.dll"
   int GV_SetNamedInt(string a0, int a1);
   double GV_SetNamedDouble(string a0, double a1);
#import

//+------------------------------------------------------------------+
//| 내외생변수 설정                                                  |
//+------------------------------------------------------------------+

extern string system = "gguri";        // 다른 메타에서 전송할 경우는 다른 서버명
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 bool ReverseTrades = TRUE; // 전송받은 거래의 역으로 가나요.
extern int history = 10;          // 최근 종료 계약중 검색 대상 건수  
extern int CycleMilliseconds = 200;    // millisecond 단위로 접속을 체크하는 시간
double gda_104[][11];             // 전송정보를 표시할 단위 시간(180ms)
int g_datetime_112;               // 전송정보를 표시할 단위 시간(180ms)
string gsa_120[];                 // 통화쌍을 받는 배열 



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

int init() {  // 0

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

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


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

int start() {  // 0

  int li_0;
  string ScrStr; 

// EA 접속상황을 체크

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

// 화면표시 정보

     ScrStr = StringConcatenate("시스템이름 : ",system," , 총거래 : ", CountNZ(gda_104, 11))+"\n";
     ScrStr = ScrStr + StringConcatenate("서버이름 : ",AccountServer(),", 현재시간 : ",TimeToStr(TimeLocal(), TIME_SECONDS) ) ;
     Comment(ScrStr);     

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

//+------------------------------------------------------------------+
//| Main Function(주문,청산 판별 및 전송함수)                        |
//+------------------------------------------------------------------+

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


//-------------------------------------------------------------
//*** Reverse Order 설정시 StopLoss와 TakeProfit 설정로직 *****
//-------------------------------------------------------------

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


//-------------------------------------------------
//*** Symbol Set을 판별하여 통화별로 정보정리 *****
//-------------------------------------------------

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

+ Recent posts