Diskussion zum Artikel "Schrittweiser Leitfaden für Anfänger zum Schreiben eines Expert Advisors in MQL5" - Seite 22

 
Guten Morgen, Wenn jemand mir bitte helfen könnte. Nach meinem Verständnis habe ich alles, was in dem Artikel angegeben ist. Aber ich kann nicht verwalten, um zwei gleichzeitige offene Operationen zu haben, über das hinaus, was ich verstehe, dass der Autor tun wollte, um nicht zu kaufen, wenn es bereits kaufen oder verkaufen, wenn es bereits verkaufen war. Meine Strategie, zum Beispiel, sendet ein Verkaufssignal, wenn ich einen offenen Kaufauftrag habe, und anstatt einen Verkauf zu eröffnen, schließt der Code die Kaufoperation, ohne dass er die tp/sl berühren kann. Ich habe also weder einen Kauf- noch einen Verkaufsauftrag. Der Verkauf schließt den Kauf ab und der Kauf schließt den Verkauf ab. Ich verwende nur ein Paar, nur einen Zeitrahmen und nur eine Losgröße in meiner Strategie. Können Sie mir sagen, wie ich Kauf- und Verkaufsaufträge gleichzeitig öffnen kann, wenn dies die Strategie auslöst? Das heißt, dass die Aufträge NUR durch tp/sl geschlossen werden. Vielen Dank im Voraus.
 
Toller Artikel!
 
Sella170:
Weiß jemand, ob ich diesen EA für Mini-Indizes oder Mini-Dollars verwenden kann?
Ja, Sie können den EA verwenden, indem Sie die Maus auf den Chart ziehen oder Menü > Einfügen > Expert Advisor > {nomedoseurobo}.

Ich hoffe, Ihre Frage ist damit beantwortet.

 
Vielen Dank für den hervorragenden Artikel. Wo und wie würde man das Intraday Time Filter Modul in Ihren Code implementieren?
 

Hallo Leute, guten Morgen.

Ich bin im"Strategy Tester" mit dieser Datei vom Ende des Leitfadens und es zeigt folgenden Fehler an:

*Der Fehler wurde bereits hier in diesem Artikel besprochen, aber keine schriftliche Lösung hat bei mir funktioniert und ich brauche eure Hilfe.


OF      0       12:44:39.040    EA_ADX (XAUUSD,H1)      2020.01.03 19:00:00   Alert: The Buy order request could not be completed -error:4756
ED      2       12:44:39.043    Trades  2020.01.03 20:00:00   failed market buy 0.1 XAUUSD sl: 1549.09 tp: 1549.16 [Invalid stops]
JP      0       12:44:39.043    EA_ADX (XAUUSD,H1)      2020.01.03 20:00:00   Alert: The Buy order request could not be completed -error:4756
ER      2       12:44:39.049    Trades  2020.01.03 21:00:00   failed market buy 0.1 XAUUSD sl: 1549.90 tp: 1549.97 [Invalid stops]
MR      0       12:44:39.049    EA_ADX (XAUUSD,H1)      2020.01.03 21:00:00   Alert: The Buy order request could not be completed -error:4756
PP      2       12:44:39.053    Trades  2020.01.03 22:00:00   failed market buy 0.1 XAUUSD sl: 1548.16 tp: 1548.23 [Invalid stops]


Die Datei befindet sich am Ende des Handbuchs.

Wie kann ich dieses Problem lösen?

 
surfdoode2:


Ich habe diesen Fehler auch noch, nachdem ich beide vorgeschlagenen Korrekturen vorgenommen habe:

ZeroMemory(mrequest);

und auch

if(Kauf_geöffnet || Verkauf_geöffnet)

Kann mir bitte jemand bei dem Fehler 4756 helfen? Es scheint einfach nicht möglich zu sein, einen Kaufauftrag zu platzieren.

Überprüfen Sie, ob Sie die Funktion SymbolInfoTick verwendet und diesen Teil des Codes geschrieben haben:

//--- Abrufen der letzten Kursnotierung unter Verwendung der MQL5 MqlTick Struktur
   if(!SymbolInfoTick(_Symbol,latest_price))
     {
      Alert("Error getting the latest price quote - error:",GetLastError(),"!!");
      return;
     }
Documentation on MQL5: Market Info / SymbolInfoTick
Documentation on MQL5: Market Info / SymbolInfoTick
  • www.mql5.com
SymbolInfoTick - Market Info - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
Hier liegt ein Fehler in der Logik des Algorithmus vor:
 //--- Haben wir bereits offene Stellen?
     bool Buy_opened= false ;   // Variable zur Aufnahme des Ergebnisses von Buy opened position
     bool Sell_opened= false ; // Variable zur Aufnahme des Ergebnisses von Sell opened position
    
     if ( PositionSelect ( _Symbol ) == true )   // wir haben eine offene Position
    {
         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
         {
            Buy_opened = true ;   //Es ist ein Kauf
         }
         else if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
         {
            Sell_opened = true ; // Es ist ein Verkauf
         }
    }

Da PositionSelect die erste Position für _Symbol auswählt, wird, wenn der EA eine Kaufposition eröffnet, die Variable Sell_opened immer falsch sein, solange die Kaufposition offen ist, was dazu führt, dass mehrere Verkaufspositionen realisiert werden, sobald ein Verkaufssignal vorliegt.

Um dies zu korrigieren und zu wissen, ob gleichzeitig Kauf- und Verkaufspositionen geöffnet sind, kann die folgende Logik verwendet werden:

 //--- Haben wir bereits offene Stellen?
   bool Buy_opened = false ;   // Variable zur Aufnahme des Ergebnisses von Buy opened position
   bool Sell_opened = false ; // Variablen zur Aufnahme des Ergebnisses von Sell opened position

   if ( PositionSelect ( _Symbol ) == true ) // wir haben eine offene Position
   {
       for ( int i= 0 ;i< PositionsTotal ();i++){
	 
         PositionSelectByTicket ( PositionGetTicket (i));

         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
         {
            Sell_opened = true ; // Es ist ein Verkauf
         } else if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
         {
            Buy_opened = true ; //Es ist ein Kauf
         }
      }
   
Documentação sobre MQL5: Funções de Negociação / PositionSelect
Documentação sobre MQL5: Funções de Negociação / PositionSelect
  • www.mql5.com
PositionSelect - Funções de Negociação - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Vitor Gama Barreto:

Hallo zusammen, guten Morgen.

Ich bin im"Strategy Tester" mit dieser Datei vom Ende des Leitfadens und es zeigt den folgenden Fehler:

*Der Fehler wurde bereits hier in diesem Artikel besprochen, aber keine schriftliche Lösung hat bei mir funktioniert und ich brauche eure Hilfe.



Die Datei befindet sich am Ende des Handbuchs.

Wie kann ich dieses Problem lösen?

Überprüfen Sie den Verkaufspreis, den Sie anfordern. Verwenden Sie dazu einen Haltepunkt, um die Variablen mrequest.price, mrequest.sl und mrequest.tp zu debuggen.

Versuchen Sie zu ändern

mrequest.type_filling = ORDER_FILLING_FOK;                               // Art der Auftragsausführung

zu:

mrequest.type_filling = ORDER_FILLING_IOC;                               // Art der Auftragsausführung


Einige Papiere haben minimale Stop-Loss-Regeln, lesen Sie hier mehr: https://www.mql5.com/pt/forum/319474

ERRO 4756 - INVALID PRICE
ERRO 4756 - INVALID PRICE
  • 2019.08.06
  • www.mql5.com
Ja tentei de tudo, por favor, preciso muito da ajuda de voces!! alguem pode me dar uma luz??? E retorna o : 2019.08.05 13:42:51.236 Core 1 2019.08...
 

Hallo,

Vielen Dank für den Artikel Samuel, du bist ein Knaller!

Es war ein bisschen schwierig, ihn mit meinem Broker zum Laufen zu bringen, weil der Artikel im "Netto"-Modus ist und ich nach Informationen suchen musste, um ihn in den "Hedging"-Modus zu bringen. Das erste Problem, auf das ich stieß, war das mit dem mrequest.type_filling .

Für den XM-Broker ist diejenige, die funktioniert:

mrequest.type_filling = ORDER_FILLING_IOC;                                          // Art der Ausführung des Auftrags

Wenn Sie nicht wissen, welchen Typ Ihr MT5 zulässt, empfehle ich Ihnen, die Funktion TypeFilling() in einem Print(TypeFilling()) oder einem Comment( TypeFilling()) zu verwenden, und sie gibt den Typ zurück; wenn sie Ihnen sagt, dass es 1 (ORDER_FILLING_FOK) oder 2 (ORDER_FILLING_IOC) ist, wissen Sie, welchen Sie eingeben müssen(https://www.mql5.com/docs/constants/tradingconstants/orderproperties#enum_order_type_filling), dennORDER_FILLING_FOK (1) funktioniert bei mir mit diesem Broker nicht.


Sobald das behoben ist, besteht das Problem darin, dass PositionSelect eine Vielzahl von Positionen eröffnet. Obwohl Samuel es in seiner Strategie nicht sagt, verstehe ich, dass das Ziel darin besteht, eine einzige Kauf- oder Verkaufsposition (je nachdem, was zuerst eintritt) mit den festgelegten Kriterien (den 4 booleschen Schritten) zu eröffnen, und dass wir, bis diese Position geschlossen ist, keine weitere eröffnen können.

Was ich getan habe, ist, diesen Code zu ändern ...

//--- wir haben keine Fehler, also fahren wir fort.
//--- Haben wir noch offene Stellen?
    bool Buy_opened=false;  // Variable, die das Ergebnis der offenen Position speichert Kauf
    bool Sell_opened=false; // Variable, die das Ergebnis der offenen Position speichert Sale
    
    if (PositionSelect(_Symbol) ==true)  // wir haben eine offene Stelle
    {
         if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
            Buy_opened = true;  // Es ist ein Kauf
         }
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
            Sell_opened = true; // It's a Sale
         }
    }

Für diese ...

//--- Wir haben keine Fehler, also fahren wir fort.
//--- Haben wir noch offene Stellen?
   bool Buy_opened = false;               // Variable, die das Ergebnis der offenen Kaufposition speichert
   bool Sell_opened = false;              // Variable, die das Ergebnis der offenen Verkaufsposition speichert
   
   // Gehen wir alle Aufträge durch, um zu sehen, ob es offene Aufträge gibt.
   for(int i = 0; i < PositionsTotal(); i++)   
        {
         ulong ticket = PositionGetTicket(i);
         PositionSelectByTicket(ticket);
    
    if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
          Buy_opened = true;       // ist ein Kauf
         }
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
          Sell_opened = true;      // ist ein Verkauf
         }
   }

// Wenn es eine offene Position gibt, warten wir, bis die aktive Operation geschlossen ist (Berührung des SL oder desTP).
   if (Buy_opened || Sell_opened) return; 

Hinweis: Direkt danach kommt die Zeile ...

//--- Kopieren Sie den Schlusskurs des vorherigen Balkens in den aktuellen Balken, d.h. in Balken1.
   p_close=mrate[1].close;

Auf diese Weise hat es bei mir gut funktioniert. Ich hoffe, Sie finden es nützlich.

Mit freundlichen Grüßen.

 
surfdoode2:


Ich habe diesen Fehler auch noch, nachdem ich beide vorgeschlagenen Korrekturen vorgenommen habe:

ZeroMemory(mrequest);

und auch

if(Kauf_geöffnet || Verkauf_geöffnet)

Kann mir bitte jemand bei dem Fehler 4756 helfen? Es scheint einfach nicht möglich zu sein, einen Kaufauftrag zu platzieren.


Vielleicht ist der Filling Type Ihres Brokers ORDER_FILLING_IOC, Sie können versuchen, den Code von zu bearbeiten:

mrequest.type_filling = ORDER_FILLING_FOK;

To:

mrequest.type_filling = ORDER_FILLING_IOC;

Ich hatte das gleiche Problem und habe es jetzt erfolgreich gelöst