☞ 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);
}
'IT관련' 카테고리의 다른 글
메타트레이더 EA - Named Pipe Main (0) | 2019.09.18 |
---|---|
메타트레이더 EA - GV Import (0) | 2019.09.17 |
Entry Logic 구성 Indicator(Backtest) (0) | 2019.09.15 |
메타트레이더 EA - BaseCurrency_WPR Version (0) | 2019.09.14 |
메타트레이더 EA - Combination Version (0) | 2019.09.13 |