|
|
@@ -54,31 +54,8 @@ int OnInit()
|
|
54
|
54
|
|
|
55
|
55
|
getSymbolsFromMarketWatch();
|
|
56
|
56
|
|
|
|
57
|
+// addToStructure(153718680, 153718681, "EURUSD", "XAUUSD.");
|
|
57
|
58
|
|
|
58
|
|
-// if(enableBasketTP == true)
|
|
59
|
|
-// {
|
|
60
|
|
-// checkBasketTakeProfit();
|
|
61
|
|
-// }
|
|
62
|
|
-//
|
|
63
|
|
-// string symbolToBuy = getSymbolWithLowestAsk();
|
|
64
|
|
-// string symbolToSell = getSymbolWithHighestBid();
|
|
65
|
|
-////Print(" Symbol to Buy is: ", symbolToBuy, " Symbol to Sell: ", symbolToSell);
|
|
66
|
|
-//
|
|
67
|
|
-// if(noOfActiveOrdersOfType(POSITION_TYPE_BUY) < maxOpenPositions)
|
|
68
|
|
-// {
|
|
69
|
|
-// if(symbolToBuy != NULL && symbolToBuy != "")
|
|
70
|
|
-// {
|
|
71
|
|
-// placeBuyTrade(symbolToBuy);
|
|
72
|
|
-// }
|
|
73
|
|
-// }
|
|
74
|
|
-//
|
|
75
|
|
-// if(noOfActiveOrdersOfType(POSITION_TYPE_SELL) < maxOpenPositions)
|
|
76
|
|
-// {
|
|
77
|
|
-// if(symbolToSell != NULL && symbolToSell != "")
|
|
78
|
|
-// {
|
|
79
|
|
-// placeSellTrade(symbolToSell);
|
|
80
|
|
-// }
|
|
81
|
|
-// }
|
|
82
|
59
|
|
|
83
|
60
|
//--- create timer
|
|
84
|
61
|
EventSetMillisecondTimer(1000);
|
|
|
@@ -121,23 +98,32 @@ void OnTimer()
|
|
121
|
98
|
|
|
122
|
99
|
string symbolToBuy = getSymbolWithLowestAsk();
|
|
123
|
100
|
string symbolToSell = getSymbolWithHighestBid();
|
|
|
101
|
+ int buyTickett = -1, sellTickett = -1;
|
|
124
|
102
|
//Print(" Symbol to Buy is: ", symbolToBuy, " Symbol to Sell: ", symbolToSell);
|
|
125
|
103
|
|
|
126
|
|
- if(noOfActiveOrdersOfType(POSITION_TYPE_BUY) < maxOpenPositions)
|
|
|
104
|
+ if(canTradeSymbol(symbolToBuy, symbolToSell, POSITION_TYPE_BUY, POSITION_TYPE_SELL))
|
|
127
|
105
|
{
|
|
128
|
|
- if(symbolToBuy != NULL && symbolToBuy != "")
|
|
|
106
|
+ if(noOfActiveOrdersOfType(POSITION_TYPE_BUY) < maxOpenPositions)
|
|
129
|
107
|
{
|
|
130
|
|
- placeBuyTrade(symbolToBuy);
|
|
|
108
|
+ if(symbolToBuy != NULL && symbolToBuy != "")
|
|
|
109
|
+ {
|
|
|
110
|
+ buyTickett = placeBuyTrade(symbolToBuy);
|
|
|
111
|
+ }
|
|
131
|
112
|
}
|
|
132
|
|
- }
|
|
133
|
113
|
|
|
134
|
|
- if(noOfActiveOrdersOfType(POSITION_TYPE_SELL) < maxOpenPositions)
|
|
135
|
|
- {
|
|
136
|
|
- if(symbolToSell != NULL && symbolToSell != "")
|
|
|
114
|
+ if(noOfActiveOrdersOfType(POSITION_TYPE_SELL) < maxOpenPositions)
|
|
137
|
115
|
{
|
|
138
|
|
- placeSellTrade(symbolToSell);
|
|
|
116
|
+ if(symbolToSell != NULL && symbolToSell != "")
|
|
|
117
|
+ {
|
|
|
118
|
+ sellTickett = placeSellTrade(symbolToSell);
|
|
|
119
|
+ }
|
|
139
|
120
|
}
|
|
140
|
121
|
}
|
|
|
122
|
+
|
|
|
123
|
+ if(buyTickett != -1 && sellTickett != -1)
|
|
|
124
|
+ {
|
|
|
125
|
+ addToStructure(buyTickett, sellTickett, symbolToBuy, symbolToSell);
|
|
|
126
|
+ }
|
|
141
|
127
|
}
|
|
142
|
128
|
//+------------------------------------------------------------------+
|
|
143
|
129
|
//| |
|
|
|
@@ -160,7 +146,7 @@ bool newBar()
|
|
160
|
146
|
//+------------------------------------------------------------------+
|
|
161
|
147
|
//| |
|
|
162
|
148
|
//+------------------------------------------------------------------+
|
|
163
|
|
-void placeBuyTrade(string symbol)
|
|
|
149
|
+int placeBuyTrade(string symbol)
|
|
164
|
150
|
{
|
|
165
|
151
|
|
|
166
|
152
|
double ask = SymbolInfoDouble(symbol, SYMBOL_ASK);
|
|
|
@@ -169,16 +155,18 @@ void placeBuyTrade(string symbol)
|
|
169
|
155
|
if(trade.PositionOpen(symbol, ORDER_TYPE_BUY, lotSize, ask, buySL, buyTP, "Buy Trade Placed"))
|
|
170
|
156
|
{
|
|
171
|
157
|
Print("Buy Trade Placed on ", symbol, ": ", trade.ResultOrder());
|
|
|
158
|
+ return (int)trade.ResultOrder();
|
|
172
|
159
|
}
|
|
173
|
160
|
else
|
|
174
|
161
|
{
|
|
175
|
162
|
Print("Error in placing Buy on ", symbol, ": ", GetLastError());
|
|
176
|
163
|
}
|
|
|
164
|
+ return 0;
|
|
177
|
165
|
}
|
|
178
|
166
|
//+------------------------------------------------------------------+
|
|
179
|
167
|
//| |
|
|
180
|
168
|
//+------------------------------------------------------------------+
|
|
181
|
|
-void placeSellTrade(string symbol)
|
|
|
169
|
+int placeSellTrade(string symbol)
|
|
182
|
170
|
{
|
|
183
|
171
|
|
|
184
|
172
|
double bid = SymbolInfoDouble(symbol, SYMBOL_BID);
|
|
|
@@ -187,11 +175,13 @@ void placeSellTrade(string symbol)
|
|
187
|
175
|
if(trade.PositionOpen(symbol, ORDER_TYPE_SELL, lotSize, bid, sellSL, sellTP, "Sell Trade Placed"))
|
|
188
|
176
|
{
|
|
189
|
177
|
Print("Sell Trade Placed on ", symbol, ": ", trade.ResultOrder());
|
|
|
178
|
+ return (int)trade.ResultOrder();
|
|
190
|
179
|
}
|
|
191
|
180
|
else
|
|
192
|
181
|
{
|
|
193
|
182
|
Print("Error in placing Sell on ", symbol, ": ", GetLastError());
|
|
194
|
183
|
}
|
|
|
184
|
+ return 0;
|
|
195
|
185
|
}
|
|
196
|
186
|
//+------------------------------------------------------------------+
|
|
197
|
187
|
//| |
|
|
|
@@ -395,7 +385,7 @@ void removeFromStruct()
|
|
395
|
385
|
bool buyPresent = false;
|
|
396
|
386
|
bool sellPresent = false;
|
|
397
|
387
|
|
|
398
|
|
- if(newTradeStore[i].buyTicket !=-1 || newTradeStore[i].sellTicket !=-1)
|
|
|
388
|
+ if(newTradeStore[i].buyTicket !=-1 && newTradeStore[i].sellTicket !=-1)
|
|
399
|
389
|
{
|
|
400
|
390
|
for(int j = PositionsTotal()-1; j>=0; j--)
|
|
401
|
391
|
{
|
|
|
@@ -413,37 +403,43 @@ void removeFromStruct()
|
|
413
|
403
|
}
|
|
414
|
404
|
}
|
|
415
|
405
|
|
|
416
|
|
- for(int j = OrdersTotal()-1; j>=0; j--)
|
|
|
406
|
+ if(!buyPresent && !sellPresent)
|
|
417
|
407
|
{
|
|
418
|
|
- ulong ticket = OrderGetTicket(j);
|
|
419
|
|
- if(OrderSelect(ticket))
|
|
420
|
|
- {
|
|
421
|
|
- if(ticket == newTradeStore[i].buyTicket)
|
|
422
|
|
- {
|
|
423
|
|
- buyPresent = true;
|
|
424
|
|
- }
|
|
425
|
|
- if(ticket == newTradeStore[i].sellTicket)
|
|
426
|
|
- {
|
|
427
|
|
- sellPresent = true;
|
|
428
|
|
- }
|
|
429
|
|
- }
|
|
430
|
|
- }
|
|
431
|
|
-
|
|
432
|
|
- if(!buyPresent)
|
|
433
|
|
- {
|
|
434
|
|
- Print("Buy ticket closed: ", newTradeStore[i].buyTicket);
|
|
|
408
|
+ Print("Buy ticket closed so removed from struct: ", newTradeStore[i].buyTicket);
|
|
435
|
409
|
newTradeStore[i].buyTicket = -1;
|
|
436
|
410
|
newTradeStore[i].buySymbol = "";
|
|
437
|
|
- }
|
|
438
|
|
- if(!sellPresent)
|
|
439
|
|
- {
|
|
440
|
|
- Print("Sell ticket closed: ", newTradeStore[i].sellTicket);
|
|
|
411
|
+
|
|
|
412
|
+ Print("Sell ticket closed so removed from struct: ", newTradeStore[i].sellTicket);
|
|
441
|
413
|
newTradeStore[i].sellTicket = -1;
|
|
442
|
414
|
newTradeStore[i].sellSymbol = "";
|
|
443
|
415
|
}
|
|
|
416
|
+ }
|
|
|
417
|
+ }
|
|
|
418
|
+ }
|
|
|
419
|
+//+------------------------------------------------------------------+
|
|
|
420
|
+//| |
|
|
|
421
|
+//+------------------------------------------------------------------+
|
|
|
422
|
+bool canTradeSymbol(string symbol1, string symbol2, ENUM_POSITION_TYPE type1, ENUM_POSITION_TYPE type2)
|
|
|
423
|
+ {
|
|
|
424
|
+ for(int i = 0; i < MaxOrders; i++)
|
|
|
425
|
+ {
|
|
444
|
426
|
|
|
|
427
|
+ if(newTradeStore[i].buyTicket != -1 && newTradeStore[i].sellTicket != -1)
|
|
|
428
|
+ {
|
|
|
429
|
+ if(newTradeStore[i].buySymbol == symbol1 && newTradeStore[i].sellSymbol == symbol2)
|
|
|
430
|
+ {
|
|
|
431
|
+ if(type1 == POSITION_TYPE_BUY && type2 == POSITION_TYPE_SELL)
|
|
|
432
|
+ {
|
|
|
433
|
+ Print("Already Have Buy and Sell on this Pair");
|
|
|
434
|
+ Print("----------- Symbol Buy: ", symbol1, " Symbol Sell: ", symbol2, " Buy Ticket: ", newTradeStore[i].buyTicket,
|
|
|
435
|
+ " Sell Ticket: ", newTradeStore[i].sellTicket," ---------------");
|
|
|
436
|
+ return false;
|
|
|
437
|
+ }
|
|
|
438
|
+ }
|
|
445
|
439
|
}
|
|
|
440
|
+
|
|
446
|
441
|
}
|
|
|
442
|
+ return true;
|
|
447
|
443
|
}
|
|
448
|
444
|
//+------------------------------------------------------------------+
|
|
449
|
445
|
//| |
|