Hilfe! Warum der EA einen Handel nicht schließt

 

Hallo Freunde,

ich brauche eure Hilfe.

Ich habe einen EA gebaut, der einen Teil seines Prozesses hat, um einen Handel mit einer Funktion zu schließen. Hier sind die relevanten kod's Zeilen.

Kann mir jemand helfen, warum der EA den Handel nicht schließt? Thank You.

(Vielleicht, weil, während ich ORDERSELECT im Hauptteil verwende , kann er ORDERSELECT in der Funktion nicht verwenden, auch????)

for(int cnt=0; cnt < OrdersTotal(); cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if ( OrderSymbol() == Pair && OrderType() == OP_BUY )

{

if ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*factor*TP )

{

CLOSE_Single_P(Pair, "LONG", OrderTicket(), OrderLots());

}

}

}

...

...

...

//-----------------------------------------------+

void CLOSE_Single_P(string SYMB, string TREN, int TICKET, double LOTT)

{

int Code, sig;

double PRC;

if ( TREN == "LONG" )

Code = 0;//OP_BUY

sonst

wenn ( TREN == "KURZ" )

Code = 1;//OP_SELL

for ( int k=0; k < OrdersTotal(); k++ )

{

OrderSelect(k, SELECT_BY_POS, MODE_TRADES);

if( OrderSymbol() == SYMB && OrderType() == Code && OrderLots() == LOTT && OrderTicket() == TICKET )

{

if ( OrderType() == OP_BUY )

PRC = MarketInfo(OrderSymbol(),MODE_BID);

sonst

wenn ( OrderType() == OP_SELL )

PRC = MarketInfo(OrderSymbol(),MODE_ASK);

OrderClose(TICKET,LOTT,PRC,Slippage,Yellow);

break;

}

}

return;

}

 

Verwenden Sie bitte die SRC-Schaltfläche, um Ihren Code zum besseren Lesen anzuzeigen :)

Ihr OrderSelect() ist falsch kodiert. Vergleichen Sie Ihren Code mit diesem. Dann schreiben Sie zurück, ob Sie das Problem noch haben oder nicht :)

   for(int cnt=0; cnt<OrdersTotal(); cnt++)
     {
      if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) == true &&
          OrderSymbol()==Pair && 
          OrderType()==OP_BUY)
          {
          // code to close
          }
      }
 
crossy:

Hallo Freunde,

ich brauche eure Hilfe.

Ich habe einen EA gebaut, der einen Teil seines Prozesses hat, um einen Handel mit einer Funktion zu schließen. Hier sind die relevanten kod's Zeilen.

Kann mir jemand helfen, warum der EA den Handel nicht schließt? Vielen Dank!

Wenn Sie eine Schleife haben und (Pending) Orders schließen oder löschen, MÜSSEN Sie abwärts und NICHT aufwärts zählen...

Warum haben Sie eine Schleife in der Close_Single_P Funktion? ist sie nicht dafür gedacht, eine einzelne Order zu schließen? wenn Sie die Funktion aufrufen, übergeben Sie das Symbol, die Ticketnummer, den Ordertyp und die Positionsgröße ... das ist alles, was Sie brauchen, um die Order zu schließen ... nun ja, fast, Sie brauchen den Preis, zu dem geschlossen werden soll, und dafür können Sie OrderClosePrice() verwenden, und dann brauchen Sie sich nicht darum zu kümmern, ob es sich um einen Buy oder Sell handelt ... eigentlich können Sie die Funktion einfach loswerden und diese Zeile anstelle des Funktionsaufrufs verwenden ...

OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow);

Übrigens, wo stellen Sie Slippage ein und kompensieren Sie 4/5-stellige Broker?

Wenn Sie Orderfunktionen verwenden, geben diese einen Wert zurück ... dieser Rückgabewert sagt Ihnen, ob die Funktion funktioniert hat oder nicht ... lernen Sie, diesen Rückgabewert zu verwenden, und wenn er Ihnen sagt, dass es ein Problem gab, verwenden Sie eine Druckanweisung, um die entsprechenden Informationen in die Protokolle zu übertragen ... dann wissen Sie, was schief gelaufen ist, anstatt zu raten ... .

Sollte Ihr Auftrag geschlossen werden? Haben Sie überprüft, ob dies . . .

if ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*factor*TP )

. . . wahr ist?

Warum fügen Sie nicht eine Druckanweisung hinzu, die ausgeführt wird, wenn diese Zeile wahr ist... dann wissen Sie, ob sie wahr ist oder nicht...

if ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*factor*TP )
   {
   Print("Trying to close Order: ", OrderTicket());                             // <---- tells you that the   if  returned true
   if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow)
      Print("OrderClose failed, error # ", GetLastError());                          // <------- reports the error if the OrderClose failed . . 
   }
 
onewithzachy:

Verwenden Sie bitte die SRC-Schaltfläche, um Ihren Code zum besseren Lesen anzuzeigen :)

Was ist die Rückgabe von GetLastError() dann?


Der Code hat etwa 4.000 Zeilen...

Jedenfalls erhalte ich keine Fehlermeldung.

 
crossy:


Der Code hat etwa 4.000 Zeilen...

Wie auch immer, ich bekomme keine Fehlermeldung.

Sie müssen nicht Ihren gesamten Code posten . . aber wenn du IRGENDEINEN Code postest, benutze bitte die SRC-Schaltfläche...

Du bekommst keine Fehlermeldungen, weil du sie nicht ins Protokoll schreibst . . Sie müssen die Rückgabewerte überprüfen und Fehler melden.

 
RaptorUK:

Wenn Sie eine Schleife haben und Aufträge schließen oder löschen (Pending), MÜSSEN Sie abwärts und NICHT aufwärts zählen...

Warum haben Sie eine Schleife in der Close_Single_P Funktion ? ist sie nicht dafür gedacht, eine einzelne Order zu schließen ? wenn Sie die Funktion aufrufen, übergeben Sie das Symbol, die Ticketnummer, den Ordertyp und die Positionsgröße ... das ist alles, was Sie brauchen, um die Order zu schließen ... nun ja, fast, Sie brauchen den Preis, zu dem geschlossen werden soll, und dafür können Sie OrderClosePrice() verwenden, und dann brauchen Sie sich keine Gedanken darüber zu machen, ob es ein Buy oder Sell ist ... eigentlich können Sie die Funktion einfach loswerden und diese Zeile anstelle des Funktionsaufrufs verwenden ...

. . übrigens, wo stellen Sie Slippage ein? und kompensieren Sie 4/5-stellige Brokers?

Wenn Sie Orderfunktionen verwenden, geben diese einen Wert zurück ... dieser Rückgabewert sagt Ihnen, ob die Funktion funktioniert hat oder nicht ... lernen Sie, diesen Rückgabewert zu verwenden, und wenn er Ihnen sagt, dass es ein Problem gab, verwenden Sie eine Druckanweisung, um die entsprechenden Informationen in die Protokolle zu übertragen ... dann wissen Sie, was schief gelaufen ist, anstatt zu raten ... .

Sollte Ihr Auftrag geschlossen werden? Haben Sie überprüft, dass dies ...

. . . wahr ist?

Warum fügen Sie nicht eine Druckanweisung hinzu, die ausgeführt wird, wenn diese Zeile wahr ist ... dann wissen Sie, ob sie wahr ist oder nicht ...


Vielen Dank, Raptor, für deine klugen Angebote. Sie helfen mir immer klug und klar.

Ich werde versuchen, was Sie gerade vorgeschlagen haben.

Beste Wünsche.

 

Sie haben das Ticket bereits ausgewählt, warum müssen Sie eine zweite orderSelect-Schleife durchlaufen, um das gleiche Ticket zu finden?

Warum überprüfen Sie nicht den Rückgabewert von OrderClose und drucken den Fehler aus, um herauszufinden, WARUM?

 
WHRoeder:

Sie haben das Ticket bereits ausgewählt, warum müssen Sie eine zweite orderSelect-Schleife durchlaufen, um das gleiche Ticket zu finden?

Warum überprüfen Sie nicht den Rückgabewert von OrderClose und drucken den Fehler aus, um herauszufinden WARUM?


Nun freinds, Vielen Dank für Ihre Bemühungen.

Ich habe einige Änderungen vorgenommen, aber nichts war hilfreich, bis ich den Kommentar von WHRoeder sah.

Sie sind genial, ich denke Sie haben Recht.

Ich werde den modifizierten EA am Montag ausprobieren.

Ich wünsche Ihnen ein schönes Wochenende.

 
crossy:


Nun Freunde, vielen Dank für Ihre Bemühungen.

Ich habe einige Änderungen vorgenommen und nichts war hilfreich, bis ich den Kommentar von WHRoeder sah.

Sie sind genial, ich denke, Sie sind richtig.

Ich werde den modifizierten EA am Montag ausprobieren.

Ich wünsche Ihnen ein schönes Wochenende.


Nun, meine Freunde,

Ich habe alle Ihre Vorschläge gemacht - und der EA ist fehlgeschlagen.

Haben Sie noch weitere Ideen?

 

Machen wir es noch einmal

  #include "..\libraries\stdlib.mq4" // drag and drop from libraries to very top of your code
  
  for(int cnt = OrdersTotal(); cnt >= 0; cnt--)  // from RaptorUK, count it down to zero 
     {
     if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) == true && OrderSymbol() == Pair) // this is how to write OrderSelect()
        {
        if(OrderType()== OP_BUY) // the code below is to close buy position only
          {
          
          //---
           if(MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT) * factor * TP) // from RaptorUK, is this statemement true ?
             {
              //CLOSE_Single_P(Pair,"LONG",OrderTicket(),OrderLots()) // From RaptorUK & WHRoeder, you don't have to do OrderSelect() twice
             Print("Trying to close buy position : ", OrderTicket());                            
             if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow)) // From Raptor UK, are you doing the slippage correctly ?
                Print("failed to close buy position ", ErrorDescription(GetLastError())  ); 
             }
             else
             {
             Print ("Not qualify to close buy position ", OrderTicket()); // from RaptorUK, is this statemement true ?, if not this print will tell you
             }
          //---
             
           }
           /*
           else
           {
           if (OrderType() == OP_SELL)
              {
              
              }
           }
           */
        }
     }
      

Während ich immer noch Valentino Rossis zweites MotoGP-Podium in Le Mans lese, hoffe ich, dass ich das richtig schreibe :)

 
onewithzachy:

Machen wir es noch einmal

Während ich immer noch Valentino Rossis zweites MotoGP-Podium in Le Mans lese, hoffe ich, dass ich das richtig schreibe :)


Danke onewithzachy,

Zuerst denke ich, dass du einen kleinen Fehler hast mit:

for(int cnt = OrdersTotal() -1 ; cnt >= 0; cnt--)

Sie müssen die grüne und fette Korrektur hinzufügen.

Aber ich verstehe nicht, wie die folgende Zeile uns helfen kann?

#include "..\libraries\stdlib.mq4"

Danke, Y.

Grund der Beschwerde: