EAs müssen so kodiert sein, dass sie sich erholen. Wenn der Strom ausfällt, das Betriebssystem abstürzt, das Terminal oder der Chart versehentlich geschlossen wird, sind beim nächsten Tick alle statischen/globalen Ticketvariablen verloren. Sie haben eine offene Order, wissen es aber nicht, so dass der EA nie versuchen wird, sie zu schließen, SL zu verfolgen usw. Wie wollen Sie das wiederherstellen? Verwenden Sie eine OrderSelect-Schleife zur Wiederherstellung oder eine dauerhafte Speicherung (GV/Datei) der erforderlichen Ticketnummern.
Hallo, ich habe den Code auf folgende Weise geändert.
//---------------------- Buy/Sell function (limit orders) int BuyCall( double BC) { if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true) { if ( BuyTicket == 0) { BuyStopLoss = BC - (StopLoss * CalcPoint1); BuyTakeProfit = BC + (TakeProfit * CalcPoint1); BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green); SellTicket = 0; // counter trade// if( Bid < BuyStopLoss && SellTicket == 0 ) { if(!OrderSelect(SellTicket, SELECT_BY_TICKET) == true) { SellStopLoss = Bid + (StopLoss * CalcPoint1); SellTakeProfit = Bid - (TakeProfit * CalcPoint1); SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red); BuyTicket = 0; } } } }
Es immer noch die gleichen Aufträge mehrere Male mit jedem Tick.
Plus wenn ich das "!"-Zeichen entfernen, dann seine keine Trades nehmen.
Zuletzt muss ich die buyticket & sellticket Überprüfung von meiner Hauptfunktion entfernen?
Ich danke Ihnen
if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
-
Video abspielenBitte bearbeiten Sie Ihren Beitrag.
Bei großen Mengen an Code, fügen Sie ihn bei.
- Sie würden niemals if( (2+2 == 4) == true) schreiben, oder? if(2+2 == 4) ist ausreichend. Schreiben Sie also nicht if(bool == true), sondern verwenden Sie if(bool) oder if(! bool). Der Code wird selbstdokumentierend, wenn Sie aussagekräftige Variablennamen verwenden, wie bool isLongEnabled. Long_Entry klingt wie ein Triggerpreis oder eine Ticketnummer und "if long entry" ist ein unvollständiger Satz.
- Wo überprüfen Sie, ob BuyTicket geschlossen wurde? Die Auswahl nach Ticket wird immer wahr sein (wenn eine gültige Ticketnummer vorhanden ist), die Bestellung könnte in der Schwebe, offen, geschlossen oder gelöscht sein.
- Sie haben meinen Vorschlag einer OrderSelect-Schleife völlig ignoriert.
Hallo WHReder, danke für deine Antwort.
Ja, ich habe diese auf SRC-Code hinzugefügt. Aber es wurde nicht angezeigt, als ich editierte.
Ich habe == true terms entfernt, wie du vorgeschlagen hast.
Verstehen Sie mich bitte nicht falsch, ich habe eine Schwachstelle im Verständnis dieser orderselect-Schleife. Ich habe sie nicht ignoriert. Ich habe versucht, es hinzuzufügen, seine zu komplex, obwohl, es zeigt 16 Fehler und 2 Warnungen. In diesem Code, was ist MN.Count?
// extern int Magic.Number.Base = ... // int magic.number.max; // Export to OpenOrder/MySelect // string market.pair; // Export to OpenOrder/MySelect // int init(){ // market.pair = Symbol(); // magic.number.max = Magic.Number.Base + MN.COUNT - 1;
Über die Überprüfung des geschlossenen Kauftickets. Ich habe es nicht überprüft, weil ich geprüft habe, ob der aktuelle Preis unter dem Buystoploss liegt, dann wurde der Kaufhandel geschlossen, also wurde der Verkaufsauftrag geöffnet.
Bid < BuyStopLoss
Mit freundlichen Grüßen
Ich ordne den Code einige wie diese... Aber zeigen 2 Fehler jetzt... "Myselect" & "MyOrdersTotal" kann nur im globalen Bereich decleared werden.
int BuyCall( double BC) { //-----------code bool MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){ if(!OrderSelect(iWhat, eSelect, ePool) ) return (false); int mn = OrderMagicNumber(); if(mn < MNB1 ) return (false); if(mn > MNB2 ) return (false); if(OrderSymbol() != Pair ) return (false); if(ePool != MODE_HISTORY ) return (true); return(OrderType() <= OP_SELL); } int MyOrdersTotal(int op=-1, int ePool=MODE_TRADES){ #define OP_ALL -1 if(ePool == MODE_TRADES) iPos = OrdersTotal() - 1; else iPos = OrdersHistoryTotal() - 1; for(nOrders=0; iPos >= 0; iPos--) if( MySelect(iPos, SELECT_BY_POS, ePool)) if( op == OP_ALL || op == OrderType() ) nOrders++; return(nOrders); } if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)) { if ( BuyTicket == 0) { BuyStopLoss = BC - (StopLoss * CalcPoint1); BuyTakeProfit = BC + (TakeProfit * CalcPoint1); BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green); SellTicket = 0; // counter trade// if( Bid < BuyStopLoss && SellTicket == 0 ) { if(!OrderSelect(SellTicket, SELECT_BY_TICKET)) { SellStopLoss = Bid + (StopLoss * CalcPoint1); SellTakeProfit = Bid - (TakeProfit * CalcPoint1); SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red); BuyTicket = 0; } } } } return(BuyTicket); }
Sie können eine Funktion nicht innerhalb einer anderen Funktion deklarieren.
Wie kann ich dies dann tun? Ich meine, ich muss viele Bedingungen einzeln prüfen, um einen Kauf-/Verkaufsauftrag zu eröffnen.
Deshalb habe ich eine buycall/sellcall-Funktion erstellt, um den Code einfacher zu machen.
Es ist nur so, dass EA so viele gleiche Trades macht. Ich weiß nicht, wie man das stoppen kann.
Sie können eine Funktion nicht innerhalb einer anderen Funktion deklarieren
Wie kann ich dies dann tun? Ich meine, ich muss viele Bedingungen einzeln prüfen, um einen Kauf-/Verkaufsauftrag zu eröffnen.
Deshalb habe ich eine buycall/sellcall-Funktion erstellt, um den Code einfacher zu machen.
Es ist nur so, dass EA so viele gleiche Trades macht. Ich weiß nicht, wie man das stoppen kann.
Versuchen Sie zunächst einmal nicht, eine Funktion innerhalb einer anderen Funktion zu deklarieren.
Ich bin nicht in der Lage, anhand des von Ihnen geposteten Codes herauszufinden, was Sie zu tun versuchen. Daher kann ich Ihnen nicht helfen.
![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Hallo, ich habe eine Ea, aber wenn ich tun, Backtesting seine Schaffung viele gleiche schwebende Aufträge auf jedem Tick. Wie das zu stoppen. Ich brauche nur einen Auftrag zu einer Zeit, ich brauche nicht seine Kopie.
Wenn ich diesen EA auf dem Stundenchart mit"open price only" laufen lasse, dann erstellt er keine Kopie.
Außerdem hat mein EA eine Option für den Umkehrhandel, wenn das Kauflimit fehlschlägt, dann öffnet er den Verkaufshandel. Bitte lassen Sie mich auch wissen, dass ich es richtig oder nicht einrichten. Jede Hilfe wird geschätzt werden.
Ich danke Ihnen für Ihre Zeit.