Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1720

 
MakarFX #:
Der Fehler liegt nicht im Code der Suche nach dem Vorletzten, sondern in der Ausgabe der Informationen im Text.

Wir haben nie etwas über einen Fehler im Kodex gesagt. Ich wiederhole noch einmal, dieser Code funktioniert, wenn eine neue maximale Order eröffnet wird, und wenn dies nicht geschieht, geht der Expert Advisor davon aus, dass die vorletzte Order die letzte ist. Das ist alles

 
MakarFX #:
Der Fehler liegt nicht im vorletzten Suchcode, sondern höchstwahrscheinlich in der Ausgabe der Informationen in Text

Makar, warum funktioniert die hervorgehobene Bedingung nicht?

//+----------------------------------------------------------------------------+
//| Расчет тикета предпоследнего ордера в сетке                                 |
//+----------------------------------------------------------------------------+
int GetTicketPenultimateOrder()
  {
   penultimate_ticket = 0;
     {
      for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
        {
         if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                 {
                  if(OrderTicket() > penultimate_ticket)
                     if(penultimate_ticket < GetTicketMaxOrder())
                        penultimate_ticket = OrderTicket();

                 }
              }
           }
        }
     }
   return(penultimate_ticket);
  }
 
EVGENII SHELIPOV #:

Makar, sagen Sie mir, warum die hervorgehobene Bedingung nicht funktioniert.

In dieser Zeile finden Sie das maximale Ticket

if(OrderTicket() > penultimate_ticket)

und in dieser Zeile vergleicht man das Maximum mit dem Maximum.

if(penultimate_ticket < GetTicketMaxOrder())
daher immer falsch
 
EVGENII SHELIPOV #:

Wir haben nie etwas über einen Fehler im Kodex gesagt. Ich wiederhole noch einmal, dieser Code funktioniert, wenn eine neue maximale Order eröffnet wird, und wenn dies nicht geschieht, geht der Expert Advisor davon aus, dass die vorletzte Order die letzte ist. Das ist alles

Dies geschieht nur, wenn der EA neu gestartet wird.

 
MakarFX #:

Dies ist nur der Fall, wenn der EA neu gestartet wird.

Nein Makar, schau mal hier, ich habe die Variable des vorletzten Auftrags und die Funktion des letzten Auftrags auf den Monitor gelegt

ObjectCreate("signal400",OBJ_LABEL,0,0,0,0,0);
   ObjectSet("signal400",OBJPROP_XDISTANCE,100);
   ObjectSet("signal400",OBJPROP_YDISTANCE,740);
   ObjectSetText("signal400",DoubleToString(FindPenultimateLots(),2),14,"Tahoma", clrRed);
   ObjectCreate("signal401",OBJ_LABEL,0,0,0,0,0);
   ObjectSet("signal401",OBJPROP_XDISTANCE,200);
   ObjectSet("signal401",OBJPROP_YDISTANCE,740);
   ObjectSetText("signal401",DoubleToString(prev_ticket,0),14,"Tahoma", clrRed);
 
MakarFX #:

In dieser Zeile finden Sie das maximale Ticket

und in dieser Zeile vergleichen Sie das Maximum mit dem Maximum.

daher immer falsch

Wie kann man erreichen, dass alle von dieser Funktion gescannten Tickets

(OrderTicket()

um ein Ticket zu entfernen, das dem Wert

GetTicketMaxOrder()
 
EVGENII SHELIPOV #:

Makar, sagen Sie mir, warum die hervorgehobene Bedingung nicht funktioniert

//+----------------------------------------------------------------------------+
//| Расчет тикета предпоследнего ордера в сетке                                 |
//+----------------------------------------------------------------------------+
int GetTicketPenultimateOrder()
  {
   penultimate_ticket = 0;
     {
      for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
        {
         if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                 {
                  if(OrderTicket() > penultimate_ticket)
                     if(penultimate_ticket < GetTicketMaxOrder())
                        penultimate_ticket = OrderTicket();

                 }
              }
           }
        }
     }
   return(penultimate_ticket);
  }

Eugene, wo ändert sich die Variable für das Ticket? Oder funktioniert die gesamte Schleife mit einem Auftrag?

 
Alexey Viktorov #:

Eugene, wo ändert sich die Variable für das Ticket? Oder funktioniert die gesamte Schleife mit einem Auftrag?

Ich habe bereits an ihn geschrieben
 
EVGENII SHELIPOV #:

Nein Makar, schau mal hier, ich habe die Variable des vorletzten Auftrags und die Funktion des letzten Auftrags auf den Monitor gelegt

prev_ticket wird zurückgesetzt, wenn der EA neu gestartet wird
 
MakarFX #:

Noch einmal... ich habe Ihnen einen funktionierenden Code gegeben!

Führen Sie es in das Prüfgerät ein und drücken Sie die Tasten.

Um es zu sehen, müssen Sie die Aufträge schließen und dieser EA tut das nicht. Und das ganze Problem tritt auf, nachdem der Maximalauftrag abgeschlossen ist

Grund der Beschwerde: