|
|
@@ -34,6 +34,7 @@ input double lotSize = 0.01; /
|
|
34
|
34
|
input bool enableBasketTP = true; // Enable Basket TP
|
|
35
|
35
|
input double basketTakeProfit = 1.0; // Basket Take Profit
|
|
36
|
36
|
input int maxOpenPositions = 3; // Maximum number of Combinations
|
|
|
37
|
+input int miniHoldTimeSec = 120; // Mini time in (seconds) to hold trades closing before checking TP
|
|
37
|
38
|
|
|
38
|
39
|
|
|
39
|
40
|
string goldPairs[];
|
|
|
@@ -298,40 +299,42 @@ void checkBasketTakeProfit()
|
|
298
|
299
|
{
|
|
299
|
300
|
if(newTradeStore[i].buyTicket != -1 && newTradeStore[i].sellTicket != -1)
|
|
300
|
301
|
{
|
|
301
|
|
- double combinationProfit = 0;
|
|
302
|
|
-
|
|
303
|
|
- if(PositionSelectByTicket(newTradeStore[i].buyTicket))
|
|
304
|
|
- {
|
|
305
|
|
- Print("Ticket:",newTradeStore[i].buyTicket);
|
|
306
|
|
- Print("Profit:",PositionGetDouble(POSITION_PROFIT), " Swap:",PositionGetDouble(POSITION_SWAP));
|
|
307
|
|
- combinationProfit += PositionGetDouble(POSITION_PROFIT) + PositionGetDouble(POSITION_SWAP) ;
|
|
308
|
|
- }
|
|
309
|
|
-
|
|
310
|
|
- if(PositionSelectByTicket(newTradeStore[i].sellTicket))
|
|
|
302
|
+ if(miniTimeBeforeClosing(newTradeStore[i].buyTicket, newTradeStore[i].sellTicket))
|
|
311
|
303
|
{
|
|
312
|
|
-
|
|
313
|
|
- Print("Ticket:",newTradeStore[i].sellTicket);
|
|
314
|
|
- Print("Profit:",PositionGetDouble(POSITION_PROFIT), " Swap:",PositionGetDouble(POSITION_SWAP));
|
|
315
|
|
- combinationProfit += PositionGetDouble(POSITION_PROFIT) + PositionGetDouble(POSITION_SWAP);
|
|
316
|
|
- }
|
|
|
304
|
+ double combinationProfit = 0;
|
|
317
|
305
|
|
|
318
|
|
- if(combinationProfit >= basketTakeProfit)
|
|
319
|
|
- {
|
|
320
|
|
- Print("Combination TP hit: Closing trades. Profit = ", combinationProfit);
|
|
|
306
|
+ if(PositionSelectByTicket(newTradeStore[i].buyTicket))
|
|
|
307
|
+ {
|
|
|
308
|
+ Print("Ticket:",newTradeStore[i].buyTicket);
|
|
|
309
|
+ Print("Profit:",PositionGetDouble(POSITION_PROFIT), " Swap:",PositionGetDouble(POSITION_SWAP));
|
|
|
310
|
+ combinationProfit += PositionGetDouble(POSITION_PROFIT) + PositionGetDouble(POSITION_SWAP) ;
|
|
|
311
|
+ }
|
|
321
|
312
|
|
|
322
|
|
- if(!trade.PositionClose(newTradeStore[i].buyTicket))
|
|
|
313
|
+ if(PositionSelectByTicket(newTradeStore[i].sellTicket))
|
|
323
|
314
|
{
|
|
324
|
|
- Print(" Error Closing Buy Trade : ", newTradeStore[i].buyTicket," ",GetLastError());
|
|
|
315
|
+ Print("Ticket:",newTradeStore[i].sellTicket);
|
|
|
316
|
+ Print("Profit:",PositionGetDouble(POSITION_PROFIT), " Swap:",PositionGetDouble(POSITION_SWAP));
|
|
|
317
|
+ combinationProfit += PositionGetDouble(POSITION_PROFIT) + PositionGetDouble(POSITION_SWAP);
|
|
325
|
318
|
}
|
|
326
|
|
- else
|
|
327
|
|
- Print("Buy Trade Closed: ", newTradeStore[i].buyTicket);
|
|
328
|
319
|
|
|
329
|
|
- if(!trade.PositionClose(newTradeStore[i].sellTicket))
|
|
|
320
|
+ if(combinationProfit >= basketTakeProfit)
|
|
330
|
321
|
{
|
|
331
|
|
- Print(" Error Closing Sell Trade : ", newTradeStore[i].sellTicket," ",GetLastError());
|
|
|
322
|
+ Print("Combination TP hit: Closing trades. Profit = ", combinationProfit);
|
|
|
323
|
+
|
|
|
324
|
+ if(!trade.PositionClose(newTradeStore[i].buyTicket))
|
|
|
325
|
+ {
|
|
|
326
|
+ Print(" Error Closing Buy Trade : ", newTradeStore[i].buyTicket," ",GetLastError());
|
|
|
327
|
+ }
|
|
|
328
|
+ else
|
|
|
329
|
+ Print("Buy Trade Closed: ", newTradeStore[i].buyTicket);
|
|
|
330
|
+
|
|
|
331
|
+ if(!trade.PositionClose(newTradeStore[i].sellTicket))
|
|
|
332
|
+ {
|
|
|
333
|
+ Print(" Error Closing Sell Trade : ", newTradeStore[i].sellTicket," ",GetLastError());
|
|
|
334
|
+ }
|
|
|
335
|
+ else
|
|
|
336
|
+ Print("Sell Trade Closed: ", newTradeStore[i].sellTicket);
|
|
332
|
337
|
}
|
|
333
|
|
- else
|
|
334
|
|
- Print("Sell Trade Closed: ", newTradeStore[i].sellTicket);
|
|
335
|
338
|
}
|
|
336
|
339
|
}
|
|
337
|
340
|
}
|
|
|
@@ -438,5 +441,38 @@ bool canTradeSymbol(string symbol1, string symbol2, ENUM_POSITION_TYPE type1, EN
|
|
438
|
441
|
//+------------------------------------------------------------------+
|
|
439
|
442
|
//| |
|
|
440
|
443
|
//+------------------------------------------------------------------+
|
|
|
444
|
+bool miniTimeBeforeClosing(ulong buyTicket, ulong sellTicket)
|
|
|
445
|
+ {
|
|
|
446
|
+ datetime currentTime = TimeCurrent();
|
|
|
447
|
+ datetime buyTime = 0;
|
|
|
448
|
+ datetime sellTime = 0;
|
|
|
449
|
+
|
|
|
450
|
+ if(PositionSelectByTicket(buyTicket))
|
|
|
451
|
+ {
|
|
|
452
|
+ buyTime = (datetime)PositionGetInteger(POSITION_TIME);
|
|
|
453
|
+ }
|
|
|
454
|
+
|
|
|
455
|
+ if(PositionSelectByTicket(sellTicket))
|
|
|
456
|
+ {
|
|
|
457
|
+ sellTime = (datetime)PositionGetInteger(POSITION_TIME);
|
|
|
458
|
+ }
|
|
|
459
|
+
|
|
|
460
|
+ datetime comboOpenTime = (buyTime > sellTime) ? buyTime : sellTime;
|
|
|
461
|
+ int secondsHeld = (int)(currentTime - comboOpenTime);
|
|
|
462
|
+
|
|
|
463
|
+ if(secondsHeld >= miniHoldTimeSec)
|
|
|
464
|
+ {
|
|
|
465
|
+ Print("Minimum time REACHED (", secondsHeld, "s) ");
|
|
|
466
|
+ return true;
|
|
|
467
|
+ }
|
|
|
468
|
+ else
|
|
|
469
|
+ {
|
|
|
470
|
+ int secondsRemaining = miniHoldTimeSec - secondsHeld;
|
|
|
471
|
+ Print("Minimum time NOT reached (", secondsHeld, "/", miniHoldTimeSec, "s) ",
|
|
|
472
|
+ secondsRemaining, "s remaining");
|
|
|
473
|
+ return false;
|
|
|
474
|
+ }
|
|
|
475
|
+ }
|
|
|
476
|
+//+------------------------------------------------------------------+
|
|
441
|
477
|
|
|
442
|
478
|
//+------------------------------------------------------------------+
|