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