Die meisten Broker haben ein Limit für die Anzahl der Lots, die sie Ihnen erlauben, zu eröffnen. In manchen Fällen ist es wünschenswert, mehrere Geschäfte zu eröffnen, um eine Anzahl offener Lots zu erreichen, die über die Höchstgrenze des Brokers für ein einziges Handelsticket hinausgeht. Ich habe einige Experimente durchgeführt und festgestellt, dass die folgende Änderung der Funktion sqOpenOrderWithErrorHandling() dies ermöglicht. Ich biete dies als Vorschlag für zukünftige Versionen an, falls dies von den Entwicklern und anderen Benutzern als wünschenswert erachtet wird. Wenn jemand dies ausprobieren möchte, steht es ihm frei, es zu versuchen, aber stellen Sie sicher, dass Sie es gründlich testen, um sicherzustellen, dass es nichts anderes kaputt macht. Meine persönlichen Tests haben (bisher) ergeben, dass es keine anderen Funktionen beeinträchtigt, und so habe ich es mit gutem Erfolg verwendet.
Bitte beachten Sie, dass ich anstelle von LotsDecimals, das vom EA-Assistenten als double definiert ist, in der Regel eine int-Variable, decimals, verwende, die eine globale int-Variable ist und als die Anzahl der Dezimalstellen definiert ist, die von diesem bestimmten Broker für die Losgröße zugelassen werden. In den meisten Fällen sind es 2, bei Brokern, die Mikro-Lots erlauben. Ich habe LotsDecimals in meiner benutzerdefinierten Codierung unten verwendet, da dies die Norm für EA Wizard ist, aber in meiner eigenen Praxis verwende ich stattdessen die int-Variable decimals.
int sqOpenOrderWithErrorHandling(string symbol, int orderType, double orderLots, double price, double realSL, double realPT, string comment, int orderMagicNumber) {
int ticket, error;
***** Benutzerdefinierter hinzugefügter Code
double mmaxlots=MarketInfo(Symbol(), MODE_MAXLOT) ;
double mminlots=MarketInfo(Symbol(), MODE_MINLOT) ;
double jlots=orderLots ;
double ilots=0.0 ;
while(jlots>0.0)
{
ilots=jlots ;
if(ilots>mmaxlots) ilots=mmaxlots ;
if(ilots<mminlots) ilots=mminlots ;
ilots=NormalizeDouble(ilots,LotsDecimals) ;
jlots=jlots-ilots ;
if(symbol == "NULL") {
ticket = OrderSend(Symbol(), orderType, ilots, price, MaxSlippage, 0, 0, comment, orderMagicNumber);
} sonst {
ticket = OrderSend(symbol, orderType, ilots, price, MaxSlippage, 0, 0, comment, orderMagicNumber);
}
**** Ende des benutzerdefinierten hinzugefügten Codes für diesen Abschnitt...Siehe zusätzlichen Code am Ende der Funktion.
if(ticket < 0) {
// Bestellung fehlgeschlagen, Fehler ins Protokoll schreiben
return(-1*GetLastError());
}
OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
Log("Order geöffnet: ", OrderTicket(), " zum Preis:", OrderOpenPrice());
// Stop-Loss und Gewinnziel einrichten
// es muss separat erfolgen, um ECN-Broker zu unterstützen
if((realSL > 0 || realPT > 0) && (OrderStopLoss() != realSL || OrderTakeProfit() != realPT))) {
if(OrderModify(ticket, OrderOpenPrice(), realSL, realPT, 0, 0)) {
Log("Auftrag geändert, StopLoss: ", realSL,", Profit Target: ", realPT);
} sonst {
error = GetLastError();
Log("Fehler beim Ändern der Bestellung: ",error, " : ", ErrorDescription(error));
RefreshRates();
if(orderType == OP_BUY) price = Ask;
if(orderType == OP_SELL) price = Bid;
if(OrderClose(ticket, orderLots, price, 6) != true) {
error = GetLastError();
Log("Auftrag kann nicht geschlossen werden: ", OrderTicket(), ", Fehler beim Öffnen der Bestellung : ",error, " : ", ErrorDescription(error));
return(-1*Fehler);
}
}
}
***** Zusätzlich hinzugefügter Code
if(jlots>0.0) continue ;
}
**** Ende des individuell hinzugefügten Codes für diesen Abschnitt
zurück(ticket);
}