Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 81

 
oldiol: Ich schreibe in den Code: if(!m_Trade.PositionClose(_Symbol,100))//--- wir schließen die Position um das aktuelle Symbol. Das Ergebnis ist, dass sich die Position umkehrt! Für Hinweise, wie ich die Position schließen kann, wäre ich sehr dankbar.
Die Position ist umgekehrt, da das Programm zwei identische Anfragen an den Server sendet. Das Programm sendet zwei identische Anfragen an den Server, da sein Code nicht prüft, ob eine zuvor gesendete Anfrage vorhanden ist (und das Ergebnis der Verarbeitung dieser Anfrage auf dem Server nicht überprüft).
 
Yedelkin:
Die Position ist umgekehrt, da das Programm zwei identische Anfragen an den Server sendet. Das Programm sendet zwei identische Anfragen an den Server, weil sein Code nicht auf eine früher gesendete Anfrage prüft (und nicht auf das Ergebnis der Verarbeitung dieser Anfrage auf dem Server).
Bitte korrigieren Sie meinen Code auf den richtigen...
 

Yedelkin schreibt: Der Code prüft nicht, ob bereits eine Anfrage gesendet wurde. Können Sie mir sagen, welche Funktion diese Prüfung durchführt?

 
oldiol: Bitte korrigieren Sie meinen Code auf den richtigen...

Jeder hat eine andere Vorstellung vom richtigen Code. Sie müssen also am Ende den "richtigen" Code schreiben. Und noch ein Tipp: Versuchen Sie zu prüfen, ob dieser Code richtig funktioniert (schematische Verwendung des sentRequest-Flags):

bool sentRequest=false;  //задать на уровне глобальных переменных программы
...

   if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
     {
      if(!sentRequest)
        {                           
         if(p_close1<buy_stop_level)
           {
            if(!m_Trade.PositionClose(_Symbol,100))
              Print("Метод PositionClose() потерпел неудачу. Код возврата=",m_Trade.ResultRetcode(),". Описание кода: ",m_Trade.ResultRetcodeDescription());
            else
               {
                Print("Метод PositionClose() выполнен успешно. Код возврата=",m_Trade.ResultRetcode()," (",m_Trade.ResultRetcodeDescription(),")");       
                sentRequest=true;
               }
            }  
         }
       else Print("Блок закрытия позиции: имеется POSITION_TYPE_BUY и ранее отосланный запрос на закрытие позиции");        
       }
    else 
      if(sentRequest) sentRequest=false;
 
Yedelkin:

Jeder hat eine andere Vorstellung vom richtigen Code. Sie müssen also am Ende den "richtigen" Code schreiben. Und noch ein Tipp: Probieren Sie aus, ob dieser Code im richtigen Schlüssel funktioniert (schematische Verwendung des sentRequest-Flags):

Herzlichen Dank! Ich probiere es aus...

 

Das Ergebnis ist wie folgt: Der Code schließt ordnungsgemäß eine Long-Position und eröffnet keine Short-Position... Beim Wiedereröffnen einer Long-Position schließt der EA diese nicht entsprechend der Bedingung. Im EA-Fenster werden ständig Meldungen angezeigt:

Wie kann ich diesen Code im Body des Expert Advisors verwenden, wenn er nur einmal funktioniert?)

 

oldiol: При повторном открытии лонга, эксперт не закрывает больше позу по условию. В окне эксперта всё время идут сообщения:    Как же использовать этот код в теле эксперта, если он работает только 1 раз)?

In dieser Angelegenheit sollte es ganz einfach sein. Im schematischen Code sollte das sentRequest-Flag auf Null gesetzt werden, wenn die offene Position keine Kaufposition ist (letzte Zeile des Codes). Sehen Sie, warum dieses Flag in Ihrem Code nicht auf Null gesetzt wird, wenn entweder keine offene Position vorhanden ist oder die offene Position keine Kaufposition ist.

 

Hurra! Es funktionierte)))) Entfernt if(sentRequest) sentRequest=false; Und schrieb vor den Block if(PositionsTotal()==0) sentRequest=false; Vielen Dank an Yedelkin für seine Hilfe, GOOD Luck!

 
oldiol Entfernt if(sentRequest) sentRequest=false; Und schrieb vor den Block if(PositionsTotal()==0) sentRequest=false;
Es gab also keine Überprüfung der Position im Hauptcode? Dann würde ich hinzufügen, dass die Position für ein bestimmtes Symbol mit den Funktionen PositionGetSymbol oder PositionSelect ausgewählt wird.
 

oldiol : Bei der Wiedereröffnung einer Long-Position schließt EA die Position nicht mehr per Bedingung. Im EA-Fenster erscheinen die ganze Zeit Meldungen: Wie kann ich diesen Code im EA-Body verwenden, wenn er nur 1 Mal funktioniert? Es gibt eine weitere Bedingung im Code

if(PositionSelect(_Symbol)==true) // es gibt eine offene Position
{

POSITION SCHLIESSEN BLOCK

} // ... daher

if(sentRequest) sentRequest=false;// hinter die nächste Klammer gesetzt und alles funktioniert perfekt. Yedelkin DANKE!

Grund der Beschwerde: