ich verzeifel so langsam. Es ist also folgende Situation: ich möchte zu Handelsbeginn einen Trade eröffnen. Je nach Situation ist dass dann long oder short. Danach soll überprüft werden, ob die Anzahl der maximalen Trades überschritten ist. Wenn ja, soll der älteste gelöscht werden. Im Backtest funktioniert das einwandfrei. In der Praxis schafft er es jedoch nicht, den Trade zu schließen. Dabei dachte ich, ich hätte schon genug Schleifen eingebaut. Eventuell kann ja jemand helfen. Danke vorab .
Hier der verkürzte Code (nur die short Seite):
datetime today,prevday;
today = iTime(NULL,PERIOD_D1,0);
int MaxShortOrders = 3;
if (today>prevday) OpenTrade(Symbol(), OP_SELL, Lots, Ask, Slippage, 0, 0, "Sell(#" + MagicNumber + ")", MagicNumber, 0, CLR_NONE);
for (k = Total; k >= 0; k--) {
OrderSelect(k, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) {
if (OrderType()==OP_SELL) OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()+StopLoss, OrderOpenPrice()-TPs, 0, CLR_NONE);
Sleep(2000);
OldOrderClose (MagicNumber, MaxLongOrders, MaxShortOrders);
}
}
[...]
//Close oldest Order
int OldOrderClose (int MagicNumber, int MaxLongOrders, int MaxShortOrders) {
int i, j, OldestOrder=2147483646, ShortTradesThisEA = 0, loopcount=0;
datetime OldestOpenTime=2147483646;
// Orders zählen
for (i=OrdersTotal(); i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderMagicNumber() == MagicNumber && OrderType()==OP_SELL) ShortTradesThisEA++;
}
}
if ((ShortTradesThisEA <= MaxShortOrders)) prevday = today;
if (ShortTradesThisEA > MaxShortOrders) {
for (j=OrdersTotal(); j>=0; j--)
{
if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) {
if (OrderMagicNumber() == MagicNumber && OrderType()==OP_SELL) {
if (OrderOpenTime() < OldestOpenTime) {
OldestOrder = OrderTicket();
OldestOpenTime = OrderOpenTime();
}
}
}
}
if (OrderSelect(OldestOrder, SELECT_BY_TICKET)) {
if (OrderType()==OP_SELL){
int STicket=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, CLR_NONE);
while(STicket == -1) {
Sleep(1000);
loopcount++;
if(loopcount > 100) break;
STicket=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, CLR_NONE);
}
prevday = today;
}
}
}
}
Moin Leute,
ich verzeifel so langsam. Es ist also folgende Situation: ich möchte zu Handelsbeginn einen Trade eröffnen. Je nach Situation ist dass dann long oder short. Danach soll überprüft werden, ob die Anzahl der maximalen Trades überschritten ist. Wenn ja, soll der älteste gelöscht werden. Im Backtest funktioniert das einwandfrei. In der Praxis schafft er es jedoch nicht, den Trade zu schließen. Dabei dachte ich, ich hätte schon genug Schleifen eingebaut. Eventuell kann ja jemand helfen. Danke vorab
.
Hier der verkürzte Code (nur die short Seite):
datetime today,prevday; today = iTime(NULL,PERIOD_D1,0); int MaxShortOrders = 3; if (today>prevday) OpenTrade(Symbol(), OP_SELL, Lots, Ask, Slippage, 0, 0, "Sell(#" + MagicNumber + ")", MagicNumber, 0, CLR_NONE); for (k = Total; k >= 0; k--) { OrderSelect(k, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) { if (OrderType()==OP_SELL) OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()+StopLoss, OrderOpenPrice()-TPs, 0, CLR_NONE); Sleep(2000); OldOrderClose (MagicNumber, MaxLongOrders, MaxShortOrders); } } [...] //Close oldest Order int OldOrderClose (int MagicNumber, int MaxLongOrders, int MaxShortOrders) { int i, j, OldestOrder=2147483646, ShortTradesThisEA = 0, loopcount=0; datetime OldestOpenTime=2147483646; // Orders zählen for (i=OrdersTotal(); i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == MagicNumber && OrderType()==OP_SELL) ShortTradesThisEA++; } } if ((ShortTradesThisEA <= MaxShortOrders)) prevday = today; if (ShortTradesThisEA > MaxShortOrders) { for (j=OrdersTotal(); j>=0; j--) { if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == MagicNumber && OrderType()==OP_SELL) { if (OrderOpenTime() < OldestOpenTime) { OldestOrder = OrderTicket(); OldestOpenTime = OrderOpenTime(); } } } } if (OrderSelect(OldestOrder, SELECT_BY_TICKET)) { if (OrderType()==OP_SELL){ int STicket=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, CLR_NONE); while(STicket == -1) { Sleep(1000); loopcount++; if(loopcount > 100) break; STicket=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, CLR_NONE); } prevday = today; } } } }