EA öffnet im Live-Betrieb mehr Positionen als im Strategietester

Einloggen oder registrieren, um einen Kommentar zu schreiben
Tobse24
108
Tobse24  

Hallo zusammen,


mein EA soll maximal eine Position gleichzeitig offen haben dürfen. Wenn Ausgestoppt wird oder bei einem Gegensignal geschlossen wird, darf eine Neue geöffnet werden - mehr nicht.

Das funktioniert auch im Strategietester. Im Live-Betrieb kommt es jedoch vor, dass nach dem Öffnen einer Position manchmal und scheinbar zufällig eine Zweite geöffnet wird - nicht direkt, sondern viele Minuten oder gar Stunden später. Allerdings auch nicht immer. Das System schein manchmal einfach zu vergessen, dass schon eine Position offen ist und schaltet meine boolische Prüfvariable "OffeneOrder" kurz auf false und schon ist eine zweite Position offen...

Was stimmt nicht mit der Handelsmechanik, bzw. warum verliert die "trans.order" aus der "void OnTradeTransaction" manchmal scheinbar die Nummer der noch offenen Position?

//Handelsmechanik

   bool OffeneOrder;
   OffeneOrder = PositionSelectByTicket(TicketNr);

  if(HandelsSignal < MinNeutralSignal){
   
      if (OffeneOrder == true){
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL){  
            trade.PositionClose(TicketNr);                                                                                                      
         }                                                                                     
      }
      
      Richtung = "long";
      
      if (OffeneOrder == false){
         
         double SL = ask - SL_Punkte * _Point;
         double TP = ask + TP_Punkte * _Point;
         
         trade.Buy (Handelsvolumen,_Symbol,ask,SL,TP,"buy");         
      }
      

      
   }else if(HandelsSignal > MaxNeutralSignal) {
   
    if (TicketNr > 0 && OffeneOrder == true){
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY){  
            trade.PositionClose(TicketNr);                                                                  
         }                                                                                     
      }
      
      Richtung = "short";
      
      if (OffeneOrder == false){
         
         double SL = ask + SL_Punkte * _Point;
         double TP = ask - TP_Punkte * _Point;
         
         trade.Sell (Handelsvolumen,_Symbol,ask,SL,TP,"sell");       
      }  
   } 

//+------------------------------------------------------------------+
 
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
  
  

   if(trans.order_state == ORDER_STATE_FILLED){
      if(trans.deal_type == DEAL_TYPE_BUY || trans.deal_type == DEAL_TYPE_SELL){
         TicketNr = trans.order;
      }
   }  
  }
  


Grüße und vielen Dank vorab


Tobse24
ScalpXpert
30
ScalpXpert  

Ich glaube, Deine OrderSend Funktion ist nicht ganz richtig. 

int  OrderSend(
   string   symbol,              // symbol
   int      cmd,                 // operation
   double   volume,              // volume
   double   price,               // price
   int      slippage,            // slippage
   double   stoploss,            // stop loss
   double   takeprofit,          // take profit
   string   comment=NULL,        // comment
   int      magic=0,             // magic number
   datetime expiration=0,        // pending order expiration
   color    arrow_color=clrNONE  // color
   );

https://docs.mql4.com/trading/ordersend

OrderSend - Trade Functions - MQL4 Reference
OrderSend - Trade Functions - MQL4 Reference
  • docs.mql4.com
Returns number of the ticket assigned to the order by the trade server or -1 if it fails. To get additional error information, one has to call the GetLastError() function. At opening of a market order (OP_SELL or OP_BUY), only the latest prices of Bid (for selling) or Ask (for buying) can be used as open price. If operation is performed with a...
Carl Schreiber
Moderator
8411
Carl Schreiber  
Tobse24:

Hallo zusammen,


mein EA soll maximal eine Position gleichzeitig offen haben dürfen. Wenn Ausgestoppt wird oder bei einem Gegensignal geschlossen wird, darf eine Neue geöffnet werden - mehr nicht.

Das funktioniert auch im Strategietester. Im Live-Betrieb kommt es jedoch vor, dass nach dem Öffnen einer Position manchmal und scheinbar zufällig eine Zweite geöffnet wird - nicht direkt, sondern viele Minuten oder gar Stunden später. Allerdings auch nicht immer. Das System schein manchmal einfach zu vergessen, dass schon eine Position offen ist und schaltet meine boolische Prüfvariable "OffeneOrder" kurz auf false und schon ist eine zweite Position offen...

Was stimmt nicht mit der Handelsmechanik, bzw. warum verliert die "trans.order" aus der "void OnTradeTransaction" manchmal scheinbar die Nummer der noch offenen Position?


Grüße und vielen Dank vorab


Tobse24

Du musst die Bedingungen für den Kauf einer Position ins Log schreiben und überprüfen, so kommst Du auf den Fehler.

Carl Schreiber
Moderator
8411
Carl Schreiber  
ScalpXpert:

Ich glaube, Deine OrderSend Funktion ist nicht ganz richtig. 

https://docs.mql4.com/trading/ordersend

Er arbeitet mit MQL5, da sieht die OrderSend-Funktion anders aus!
amando
1887
amando  

Ich würde sagen deine PositionSelect funktioniert nicht. 

Du selektierst nach ticket, aber wo bekommst du die ticketnummer her?

ich suche immer nach offenen positionen, dann selektiere ich nach den positionen des symbols und dann nach der mn und long oder short


da fehlt bei dir was

Tobse24
108
Tobse24  

Hallo zusammen und Danke für Eure Antworten!

ich habe die Sache jetzt mit der Funktion gelöst, die kannte ich darvor nicht:

 bool OffeneOrder = false;
      if (PositionsTotal() == 1){
         OffeneOrder = true;
      }


Es funktioniert damit jetzt zuverlässig.


PS: Die Ordernummer (nicht die Ticketnummer, so hab ich das nur genannt) habe ich aus der  OnTradeTransaction gezogen. MT5 verknüpft Ordernummer und die vom Broker zugeweisene Ticketnummer normaerweise sowieso, auch wenn sie unterschiedlich sind.

Eine Frage habe ich aber noch:

PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL

Die hier benutze ich zwischen offenen Buy oder Sell-Positionen zu selektieren. In der Praxis dringt das System bei einer offenen Buy-Position aber auch in eine if-Bedigunge ein, die mit der == von oben eigentlich gesichert ist und macht mir die dann blöderweise zu, da eine close-Methode dahinter steht. Auch hier gilt - nur im Life-Betrieb, nicht im Tester.

Beispiel:

if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL){  
            trade.PositionClose(TicketNr);                                                                 
            }   


Habe das jetzt zwar mit Strings gelöst, aber das kann es ja auch nicht sein... ist auch nicht so gut bei Verbindungsabbrüchen, keine Ahnung ob er dass dann noch blickt...


Was stimmt hier nicht?

Um weiteren Verwirrungen vorzubeugen: Ja, ich nutze MQL5


Grüße
Carl Schreiber
Moderator
8411
Carl Schreiber  

Tobse24, es gibt soooo viele Artikel und Code darüber! Statt als Neuling alles durchzuprobieren und alle Fehler zu machen kannst Du mait viel Zeit sparen!

Such mal einfach nach "Position" hier und hier.

amando
1887
amando  

Mal eine grundsätzliche frage die du dir stellen solltest, handelst du im netting mode oder im hedge mode.

dementsprechend musst du deine positionen selektieren


wenn du bei der selektion auf das symbol vergisst, bzw auf die magic number, dann wird der ea im livebetrieb mehrere positionen nicht handeln können sofern du im hedge mode bist


Auf fragst du nach der zahl der positions, die geht über alle symbole.

deine eigene musst du dir mit position select raussuchen

Tobse24
108
Tobse24  

Hallo amando,


der Handel läuft im hedge-mode.


Kannst du mir einen frei zugänglichen EA (oder eienn Artikel) empfehlen in dem das gut umgesetzt ist bei dem ich mir das beispielshaft abschauen kann?


Grüße

Einloggen oder registrieren, um einen Kommentar zu schreiben