|
|
@@ -114,8 +114,8 @@ enum lot_option
|
|
114
|
114
|
{
|
|
115
|
115
|
fix, //Fixed Lot
|
|
116
|
116
|
mul, //Multiplied Lot
|
|
117
|
|
- Balance, // Balance Base Multiplier
|
|
118
|
|
- slaveLotCal,
|
|
|
117
|
+// Balance, // Balance Base Multiplier
|
|
|
118
|
+ slaveLotCal, // Slave Lot formula based
|
|
119
|
119
|
};
|
|
120
|
120
|
enum tradeCopy_type
|
|
121
|
121
|
{
|
|
|
@@ -133,22 +133,19 @@ sinput string string_0 = "<><><><><><> G
|
|
133
|
133
|
input int slip = 5; // Master Order Variation in Pips
|
|
134
|
134
|
input int sec = 10; // Master Order Expired After Seconds
|
|
135
|
135
|
input tradeCopy_type tradeType = buySell; // Trades To Copy
|
|
136
|
|
-input lot_option lotoption = slaveLotCal; // Lot Option
|
|
137
|
|
-input double mult = 1.0; // Multiplier (for Client)
|
|
138
|
|
-input double fixed = 0.1; // Fixed Lot (for Client)
|
|
139
|
|
-input double Bmult = 1; // Balance Multiplier (for Client)
|
|
140
|
|
-input double recoveryAmount = 3000; // Recovery Amount (for Client Lot)
|
|
141
|
|
-input double maxDd = 8000; // Max DrawDown (for Client Lot)
|
|
142
|
136
|
input string suffix = ""; // Suffix
|
|
143
|
137
|
input string symbolExclude = ""; // Symbol to Exclude
|
|
144
|
138
|
input string prefix = ""; // Prefix
|
|
145
|
|
-input string mappingSymbol = "GOLD,XAUUSD;bitcoin,BTCUSD"; // Mapping Pairs Inp,Out;Inp,Out
|
|
|
139
|
+input string mappingSymbol = "GOLD:XAUUSD,bitcoin:BTCUSD"; // Mapping Pairs Inp:Out,Inp:Out
|
|
|
140
|
+
|
|
|
141
|
+sinput string string_1 = "<><><><><><> Lotsize SETTINGS <><><><><><>"; //__
|
|
|
142
|
+input lot_option lotoption = mul; // Lot Option
|
|
|
143
|
+input double fixed = 0.1; // Fixed Lot (for Client)
|
|
|
144
|
+input double mult = 1.0; // Multiplier (for Client)
|
|
|
145
|
+double Bmult = 1; // Balance Multiplier (for Client)
|
|
|
146
|
+input double recoveryAmount = 3000; // Recovery Amount (for Client Lot)
|
|
|
147
|
+input double maxDd = 8000; // Max drawdown prop (for Client Lot)
|
|
146
|
148
|
|
|
147
|
|
-// Heart Beat
|
|
148
|
|
-sinput string string_1 = "<><><><><><> HeartBeat Setting <><><><><><>"; //__
|
|
149
|
|
-input string clientServer = ""; // Master Server
|
|
150
|
|
-input string localApiKey = "U2FsdGVkX18vBY4H1uzQiZwuh8B++8VBtCGJ3yGr2XPII0qCodmfuhjssKu5oug1J4e97bkwPtDQLi4py1OODQ=="; // Local API Key
|
|
151
|
|
-input string localHB_req_link = "http://localhost/api/slastConnected"; // Request Link For LastConnected
|
|
152
|
149
|
|
|
153
|
150
|
//+------------------------------------------------------------------+
|
|
154
|
151
|
//| |
|
|
|
@@ -163,7 +160,7 @@ bool contractChk = true;//Contract Checking
|
|
163
|
160
|
bool doReversal = true; // Reverse Trades
|
|
164
|
161
|
bool fileLastEmpty=false;
|
|
165
|
162
|
long accountNumber=AccountInfoInteger(ACCOUNT_LOGIN);
|
|
166
|
|
-int counter=0,testCounterVar=0;
|
|
|
163
|
+
|
|
167
|
164
|
order order_array[];
|
|
168
|
165
|
datetime lastModified1=0;
|
|
169
|
166
|
long lastFileSize1=0;
|
|
|
@@ -647,18 +644,6 @@ void readData()
|
|
647
|
644
|
if(lastModified==lastFileModified && fileSize==lastFileSize) // lastModified==lastFileModified && fileSize==lastFileSize
|
|
648
|
645
|
{
|
|
649
|
646
|
FileClose(filehandle);
|
|
650
|
|
- if(counter>=count1 && TerminalInfoInteger(TERMINAL_CONNECTED))
|
|
651
|
|
- {
|
|
652
|
|
- if(testCounterVar==testCounter)
|
|
653
|
|
- {
|
|
654
|
|
- testCounterVar=0;
|
|
655
|
|
- }
|
|
656
|
|
- adminHeartBeat();
|
|
657
|
|
- counter=0;
|
|
658
|
|
-
|
|
659
|
|
- }
|
|
660
|
|
- counter++;
|
|
661
|
|
- testCounterVar++;
|
|
662
|
647
|
}
|
|
663
|
648
|
else
|
|
664
|
649
|
{
|
|
|
@@ -741,12 +726,15 @@ void readData()
|
|
741
|
726
|
if(PositionSelectByTicket(ticket))
|
|
742
|
727
|
{
|
|
743
|
728
|
if(history_ticket_present(PositionGetInteger(POSITION_MAGIC)))
|
|
|
729
|
+ {
|
|
|
730
|
+ // Print(" inside Array size 1: ",ticket);
|
|
744
|
731
|
if(!trade.PositionClose(ticket))
|
|
745
|
732
|
{
|
|
746
|
733
|
Print(" Order Close Error on No Master Trade: "+IntegerToString(GetLastError()));
|
|
747
|
734
|
}
|
|
748
|
735
|
else
|
|
749
|
736
|
Print(" ------------- Order Close by empty array ------------------ ");
|
|
|
737
|
+ }
|
|
750
|
738
|
}
|
|
751
|
739
|
}
|
|
752
|
740
|
}
|
|
|
@@ -1441,11 +1429,11 @@ string getSymbol(string symbol)
|
|
1441
|
1429
|
if(mappingSymbol!="")
|
|
1442
|
1430
|
{
|
|
1443
|
1431
|
string symbollist[];
|
|
1444
|
|
- StringSplit(mappingSymbol,';',symbollist);
|
|
|
1432
|
+ StringSplit(mappingSymbol,',',symbollist);
|
|
1445
|
1433
|
for(int i=0; i<ArraySize(symbollist); i++)
|
|
1446
|
1434
|
{
|
|
1447
|
1435
|
string symbolPairs[];
|
|
1448
|
|
- StringSplit(symbollist[i],',',symbolPairs);
|
|
|
1436
|
+ StringSplit(symbollist[i],':',symbolPairs);
|
|
1449
|
1437
|
if(ArraySize(symbolPairs)==2)
|
|
1450
|
1438
|
{
|
|
1451
|
1439
|
if(symbol==symbolPairs[0])
|
|
|
@@ -1473,16 +1461,16 @@ double getLotSize(string symbol,double masterAccountBalance,double masterLot,int
|
|
1473
|
1461
|
{
|
|
1474
|
1462
|
lotsize = NormalizeDouble(masterLot*mult,2);
|
|
1475
|
1463
|
}
|
|
|
1464
|
+//else
|
|
|
1465
|
+// if(lotoption == Balance)
|
|
|
1466
|
+// {
|
|
|
1467
|
+// lotsize=((AccountInfoDouble(ACCOUNT_BALANCE)/masterAccountBalance)*masterLot)*Bmult;
|
|
|
1468
|
+// }
|
|
1476
|
1469
|
else
|
|
1477
|
|
- if(lotoption == Balance)
|
|
|
1470
|
+ if(lotoption == slaveLotCal)
|
|
1478
|
1471
|
{
|
|
1479
|
|
- lotsize=((AccountInfoDouble(ACCOUNT_BALANCE)/masterAccountBalance)*masterLot)*Bmult;
|
|
|
1472
|
+ lotsize = masterLot * (recoveryAmount / maxDd);
|
|
1480
|
1473
|
}
|
|
1481
|
|
- else
|
|
1482
|
|
- if(lotoption == slaveLotCal)
|
|
1483
|
|
- {
|
|
1484
|
|
- lotsize = masterLot * (maxDd / recoveryAmount);
|
|
1485
|
|
- }
|
|
1486
|
1474
|
|
|
1487
|
1475
|
|
|
1488
|
1476
|
Print("Before Lot Size: ",lotsize);
|
|
|
@@ -1520,71 +1508,7 @@ double getLotSize(string symbol,double masterAccountBalance,double masterLot,int
|
|
1520
|
1508
|
|
|
1521
|
1509
|
return lotsize;
|
|
1522
|
1510
|
}
|
|
1523
|
|
-//+------------------------------------------------------------------+
|
|
1524
|
|
-//| |
|
|
1525
|
|
-//+------------------------------------------------------------------+
|
|
1526
|
|
-void adminHeartBeat()
|
|
1527
|
|
- {
|
|
1528
|
|
-
|
|
1529
|
|
- string headers = "apikey:"+localApiKey+"\r\naccept: */* \r\nContent-Type: application/json\r\nUser-Agent: MetaTraderApi";
|
|
1530
|
1511
|
|
|
1531
|
|
- string url =localHB_req_link;// Request_link+(string)accountNumber;
|
|
1532
|
|
-
|
|
1533
|
|
- bool isPost;
|
|
1534
|
|
- int timeout = 100000;
|
|
1535
|
|
- string lastConnected=TimeToString(TimeCurrent());
|
|
1536
|
|
-
|
|
1537
|
|
- StringReplace(lastConnected,".","-");
|
|
1538
|
|
- StringReplace(lastConnected," ","T");
|
|
1539
|
|
- string gmtTime=TimeToString(TimeGMT());
|
|
1540
|
|
-
|
|
1541
|
|
- string jsonData="{\"sLogin\":\""+(string)accountNumber+"\",\"sServer\":\""+clientServer+"\",\"sVersion\":\"5\" ,\"sLastConnected\":\""+gmtTime+"\"}";//\",\"url\":"+"\""+url+"\""+headers+"}";
|
|
1542
|
|
-
|
|
1543
|
|
- uchar data[];
|
|
1544
|
|
- StringToCharArray(jsonData, data, 0, StringLen(jsonData));
|
|
1545
|
|
-
|
|
1546
|
|
-// Print("Making the heart beat request to the local host");
|
|
1547
|
|
-
|
|
1548
|
|
- POST_function(url,headers,timeout,data,isPost);
|
|
1549
|
|
-
|
|
1550
|
|
- }
|
|
1551
|
|
-//+------------------------------------------------------------------+
|
|
1552
|
|
-//| |
|
|
1553
|
|
-//+------------------------------------------------------------------+
|
|
1554
|
|
-bool POST_function(string url, string headers, int timeout, uchar &data[], bool &IsPost)
|
|
1555
|
|
- {
|
|
1556
|
|
- ResetLastError(); // clear previous error
|
|
1557
|
|
- static int lastErrorPrinted = 0;
|
|
1558
|
|
- uchar result[]; // use uchar for WebRequest result
|
|
1559
|
|
- string resultHeaders;
|
|
1560
|
|
-
|
|
1561
|
|
- int res = WebRequest("POST", url, headers, timeout, data, result, resultHeaders);
|
|
1562
|
|
-
|
|
1563
|
|
- if(res == 200 || res == 201)
|
|
1564
|
|
- {
|
|
1565
|
|
- Print("***Request success. HTTP response code POST: ", res);
|
|
1566
|
|
- string result_string = CharArrayToString(result);
|
|
1567
|
|
- Print("content POST: ", result_string);
|
|
1568
|
|
- lastErrorPrinted = 0; // reset remembered error on success
|
|
1569
|
|
- IsPost = true;
|
|
1570
|
|
- return true;
|
|
1571
|
|
- }
|
|
1572
|
|
- else
|
|
1573
|
|
- {
|
|
1574
|
|
- int err = GetLastError(); // read the error once
|
|
1575
|
|
- // only print when there's a real error and it's different from last time
|
|
1576
|
|
- if(err != 0 && err != lastErrorPrinted)
|
|
1577
|
|
- {
|
|
1578
|
|
- Print("Get last error: ", err);
|
|
1579
|
|
- Print("***Request failed. HTTP response code: ", res);
|
|
1580
|
|
- string result_string = CharArrayToString(result);
|
|
1581
|
|
- Print("content: ", result_string);
|
|
1582
|
|
- lastErrorPrinted = err; // remember this error so we don't spam it
|
|
1583
|
|
- }
|
|
1584
|
|
- IsPost = false;
|
|
1585
|
|
- return false;
|
|
1586
|
|
- }
|
|
1587
|
|
- }
|
|
1588
|
1512
|
//+------------------------------------------------------------------+
|
|
1589
|
1513
|
//| |
|
|
1590
|
1514
|
//+------------------------------------------------------------------+
|