PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL wird nicht richtig ausgeführt

 

Hallo zusammen,

wie im Betreff beschrieben nutze ich die Funktion of zusammen mit PositionSelect(_Smbol)==true um auf offene Kauf bzw in dem fall, offene Verkaufspositionen prüfen zu lassen.

Zuerst mal mein Code zu einem Test-Experten:

#include <Trade\Trade.mqh>
CTrade trade;


datetime Timestamp;
int Week = 0, WeekStamp;

int OnInit()
{
   Timestamp = iTime(_Symbol,PERIOD_W1,0);
   return(INIT_SUCCEEDED);
}



void OnTick()
{
   int WeeksAgo = iBarShift (_Symbol, PERIOD_W1, Timestamp); 
   if (WeeksAgo == 17) Timestamp = iTime(_Symbol,PERIOD_W1,1);  
   
   Week = WeeksAgo;
   
   
   
         // Ask Preis berechnen
   double Ask = NormalizeDouble (SymbolInfoDouble (_Symbol, SYMBOL_ASK), _Digits);
      // Bid Preis berechnen
   double Bid = NormalizeDouble (SymbolInfoDouble (_Symbol, SYMBOL_BID), _Digits);  
   
  
   bool Buy_opened = false;  // hält das Ergebnis einer offenen Kauf Position
   bool Sell_opened = false; // hält das Ergebnis einer offenen Verkauf Position

   if(PositionSelect(_Symbol)==true) // ist eine Position offen
   {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)   //prüft ob die offene Position eine Kaufsposition ist
      {
         Buy_opened = true;  //Es ist eine Kaufpositin offen
      }
      else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)  //prüft ob die offene Position eine Verkaufsposition ist
      {
         Sell_opened = true; // Es ist eine Verkaufsposition offen
      }
   }         
    Comment ("Week ", Week, " Sell_open: ", Sell_opened, " PositionSelect: ", PositionSelect(_Symbol));
    
   if ((Week == 13) || (Week == 14) || (Week == 15)) 
      if (!Buy_opened) 
      {
         trade.Buy (0.1, _Symbol, Ask, Bid - (Bid * 7 / 100), 0, "Gebert Woche Long: "+ Week);  
         WeekStamp = Week;
         
      }
   if ((Week == 8) || (Week == 11) || (Week == 16)) 
      if (!Sell_opened) 
      {
         trade.Sell (0.1, _Symbol, Bid, Ask + (Ask * 7 / 100), 0, "Gebert Woche Short: " + Week);
         WeekStamp = Week;         
      }

      if (WeekStamp != Week)
         DelPosition (_Symbol);
   
}

void DelPosition (string sym)
{
   for (int i=PositionsTotal() - 1; i >= 0; i--)                   // Zählerschleife für alle offenen Positionen
   {   
         ulong   Ticket = PositionGetTicket(i);                    // Ticketnummer der order auslesen
         string  Symbol = PositionGetString(POSITION_SYMBOL);     // Symbol der Order auslesen 
         if (Symbol == sym)                                       // Wenn das Symbol der Order = dem übergebenem Symbol ist  
               trade.PositionClose(Ticket);                         // Ordern mit dem ermitteltem Ticket schliessen
                                   
      }
      
}

Der fehler kommt bei der Woche 16. Dort gibt

(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)

in der Woche, und ausschliesslich in der Woche. (In anderen EA´s ist es mir auch noch nicht passiert) ==false zurück und somit werden endlos Positionen eröffnent.

Ich hoffe ihr versteht was ich meine. Ansonsten gerne fragen oder selbst testen. Ich kann mir kein reim darauf bilden, weshalb genau in der Woche ein Falscher wert zurück gegeben wird.

Für Hilfe bin ich sehr Dankbar.

In diesem Sinne

LG Nils M.

 

Wie ich sehe soll eine performancekurve angepasst werden für einen Verkauf 😂😂

vermutlich hat der markt geschlossen, aber da ist meine glaskugel aufgrund des Bruchstückhaften codes nicht aktuell.

Auch eine Fehlermeldung wäre intere

 
amando #:

Wie ich sehe soll eine performancekurve angepasst werden für einen Verkauf 😂😂

vermutlich hat der markt geschlossen, aber da ist meine glaskugel aufgrund des Bruchstückhaften codes nicht aktuell.

Auch eine Fehlermeldung wäre intere

Der Code ist nicht bruchstückenhaft sondern komplett und Funktionsfähig. Er soll in einigen von insgesamt 16 Wochen kaufen und an anderen, z. B. Woche 16 verkaufen. Das problem liegt aber daran, das mir die genannte Sell_opened == false zurückgibt obwohl schon eine Position in Woche 16 geöffnet wurde. Dadurch eröffnet er zig Positionen auf einmal. In allen anderen Wochen klappt dies ja, nur in Wo 16 nicht. WARUM? 
 
Nils Müller #:
Der Code ist nicht bruchstückenhaft sondern komplett und Funktionsfähig. Er soll in einigen von insgesamt 16 Wochen kaufen und an anderen, z. B. Woche 16 verkaufen. Das problem liegt aber daran, das mir die genannte Sell_opened == false zurückgibt obwohl schon eine Position in Woche 16 geöffnet wurde. Dadurch eröffnet er zig Positionen auf einmal. In allen anderen Wochen klappt dies ja, nur in Wo 16 nicht. WARUM? 

Nutze dafür den Debugger.

 

Wenn der Fehler zeitlich so genau bekannt ist, ist es doch ein Leichtes das Verhalten des EAs mit dem Debugger mit hist Daten zu verfolgen und so in den allermeisten Fällen die Fehler schnell zu finden:

Einstellen unter: Extras => Optionen => Tab; Debug/Profiling (Symbol, Zeit, ...= und dann starten mit Ctrl+F5.

Hier ist Lit. dazu: Tracing, Debugging und strukturelle Analyse von Quellcodes
https://www.metatrader5.com/de/metaeditor/help/development/debug
https://www.mql5.com/de/articles/654&nbsp; // Zur Fehlerbehebung von MQL5-Programmen (Debugging)
https://www.mql5.com/de/articles/35 // Einführung in MQL5: Schreiben eines einfachen Expert Advisor und benutzerdefinierten Indikators, Siehe Ende: Starten und Debuggen
https://www.mql5.com/de/articles/2041 // Die Fehlerverarbeitung und Protokollierung in MQL5
https://www.mql5.com/de/articles/272

Code-Debugging - Programme entwickeln - MetaEditor Hilfe
Code-Debugging - Programme entwickeln - MetaEditor Hilfe
  • www.metatrader5.com
MetaEditor hat einen eingebauten Debugger, mit dem Sie die Programmausführung Schritt für Schritt (durch einzelne Funktionen) ü...
 
Carl Schreiber #:

Wenn der Fehler zeitlich so genau bekannt ist, ist es doch ein Leichtes das Verhalten des EAs mit dem Debugger mit hist Daten zu verfolgen und so in den allermeisten Fällen die Fehler schnell zu finden:

Einstellen unter: Extras => Optionen => Tab; Debug/Profiling (Symbol, Zeit, ...= und dann starten mit Ctrl+F5.

Hier ist Lit. dazu: Tracing, Debugging und strukturelle Analyse von Quellcodes
https://www.metatrader5.com/de/metaeditor/help/development/debug
https://www.mql5.com/de/articles/654&nbsp; // Zur Fehlerbehebung von MQL5-Programmen (Debugging)
https://www.mql5.com/de/articles/35 // Einführung in MQL5: Schreiben eines einfachen Expert Advisor und benutzerdefinierten Indikators, Siehe Ende: Starten und Debuggen
https://www.mql5.com/de/articles/2041 // Die Fehlerverarbeitung und Protokollierung in MQL5
https://www.mql5.com/de/articles/272

Danke, aber auch damit komme ich leider nicht wirklich weiter. Ist jemand so nett und könnte es mal durchlaufen lassen und versuchen den fehler zu verstehen. Normalerweise funtioniert:
 
bool Buy_opened = false;  // hält das Ergebnis einer offenen Kauf Position
   bool Sell_opened = false; // hält das Ergebnis einer offenen Verkauf Position

   if(PositionSelect(_Symbol)==true) // ist eine Position offen
   {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)   //prüft ob die offene Position eine Kaufsposition ist
      {
         Buy_opened = true;  //Es ist eine Kaufpositin offen
      }
      else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)  //prüft ob die offene Position eine Verkaufsposition ist
      {
         Sell_opened = true; // Es ist eine Verkaufsposition offen
      }
   }         
Der teil in meinen EA's immer einwandfrei.
Oder gibt es eine zuverlässigere Methode bzw Funtion um abzufragen,
ob eine offene Buy/Sell Position für ein Symbol vorhanden ist?
Vielen Dank für Hilfe schonmal
LG Nils M.
 

Lies mal in der Dok. (Editor-Kursor auf PositionSelect() + F1 drücken), da steht:

Bei einer unabhängigen Verrechnung von Positionen (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) können gleichzeitig mehrere Positionen pro Symbol vorhanden sein. In diesem Fall wählt PositionSelect die Funktion mit dem kleinsten Ticket.

Das bedeutet, dass, wenn die Pos. mit dem kleinsten Ticket ein Buy ist,  ...! Aber das kann man alles mit dem Debugger herauskriegen.

Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Medium Zustand / Information über das Konto
Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Medium Zustand / Information über das Konto
  • www.mql5.com
Information über das Konto - Medium Zustand - Konstanten, Enumerationen und Strukturen - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 

Ahhhh, alles klar. Jetzt hab ich es verstanden. Der Debugger hatt mir leider nicht dabei geholfen, einen blick in die Doku zu werfen. Aber man lernt ja nie aus.

Danke Carl und alle anderen die mir behilflich waren!!

LG

Und einen schönen Sonntag noch....

Nils M.

Grund der Beschwerde: