Cycle Operator 'für' Fragen - Seite 11

 
WhooDoo22:


Ich glaube, Sie verstehen nicht, worauf ich hinaus will ... wenn ich ein paar Klammern hinzufüge, wird es vielleicht klarer. . du hast das gemacht ...

Ich glaube, ich wollte dies tun...

Ich wollte nämlich, dass die Bedingung...

auf den Codeabschnitt innerhalb der geschweiften Klammern ("{ }") angewendet werden sollte.

Warum haben Sie diese Änderung nicht in Ihrer neuesten Version des Codes vorgenommen? . wenn Sie es vorhatten, warum haben Sie es nicht getan?

 
WhooDoo22:

Simon,


Die 0 in deinem Bild ist wahrscheinlich von... .


Nee, nee, nee! ;)

Machen wir einen Ausflug in die Dokumentationsspur, ja? Hahaha.

datetime OrderCloseTime( )
Gibt die Abschlusszeit für die aktuell ausgewählte Order zurück. Wenn der Zeitpunkt des Auftragsabschlusses nicht 0 ist, wurde der ausgewählte Auftrag abgeschlossen und aus der Kontohistorie abgerufen. Bei offenen und schwebenden Aufträgen ist der Zeitpunkt des Abschlusses gleich 0.

Hinweis: Die Bestellung muss zuvor mit der Funktion OrderSelect() ausgewählt worden sein.


Werfen wir zunächst einen Blick auf den Code-Block der Funktion OrderClose(), den ich vor kurzem programmiert habe...

Als Nächstes wollen wir beide einen Blick auf das angezeigte Ergebnis in einem Schnappschuss des Expertenfensters werfen...

Aaah, was haben wir denn da? :)

Ich bin mir nicht sicher, worauf Sie hier hinauswollen, können Sie das bitte erklären? Print(OrderCloseTime()) ist offensichtlich falsch, aber Sie haben es immer noch in Ihrem Code, warum? Was ist passiert, als Sie die 2 von mir vorgeschlagenen Codezeilen hinzugefügt haben?
 

Simon,

Warum haben Sie diese Änderung nicht in Ihrer neuesten Version des Codes vorgenommen? . wenn Sie es vorhatten, warum haben Sie es nicht getan?

Geben Sie mir bitte eine Sekunde Zeit, um einen Blick darauf zu werfen.

Ich hatte vor, dies zu kodieren, aber ich habe nicht vor, es jetzt zu kodieren. Es gibt keinen Grund, dies zu kodieren...

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
      {
      if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
      if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
         {
         OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
         Print(OrderCloseTime());
         GetLastError();
         }
      }

Wenn ich stattdessen dies codieren kann...

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      Print(OrderCloseTime());
     }

Alle 'if'-Bedingungen gelten für das, was innerhalb der geschweiften Klammern ("{}") steht. Das Hinzufügen von geschweiften Klammern zu diesem Codeblock (so wie ich es vorhatte ) ist ineffizient und dient keinem Zweck.


Ich danke Ihnen.

 

Simon,


Ich bin mir nicht sicher, worauf Sie hier hinauswollen, können Sie das bitte erklären?

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      Print(OrderCloseTime());
     }

// replace above code block with...

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
//      Print(OrderCloseTime());
     }

Probieren Sie den EA (ohne die Print()-Funktion) im Terminal auf einem Demokonto aus, klicken Sie dann auf den Bereich "Experts" und sehen Sie, dass die Null (0) in den übrigen Ergebnissen im Bereich "Experts" fehlt.

Beachten Sie, dass es keine 0 gibt. Hmm, nicht wahr? ;)

Probieren Sie nun den EA aus (mit der Funktion Print()).

Beachten Sie die 0 im Bereich "Experten".


Sie haben eine Vermutung geäußert, warum in den Ergebnissen des Expertenfensters eine Null steht, und Sie hatten Recht (streichen Sie "Nee, nee, nee! ;)" am Anfang der Nachricht durch).

Die 0 in Ihrem Bild stammt wahrscheinlich von... .

Print(OrderCloseTime());

Erinnern Sie sich? Aber sicher doch :)


der Print(OrderCloseTime()) ist offensichtlich falsch, aber Sie haben ihn trotzdem in Ihrem Code, warum?

Bitte erklären Sie, warum Sie glauben, dass es falsch ist.

Ich habe es im Code, um Ihnen einen Punkt zu zeigen. Der Punkt ist: Die Null erscheint im Bereich "Experten", weil dieser Teil des Codes im Code enthalten ist.


Was ist passiert, als Sie die 2 von mir vorgeschlagenen Codezeilen hinzugefügt haben?

Ich arbeite zur Zeit mit Hochdruck an diesem Problem :)


Ich danke Ihnen

 
WhooDoo22:

Print(OrderCloseTime()) ist offensichtlich falsch, aber Sie haben es trotzdem in Ihrem Code, warum?

Bitte erklären Sie, warum Sie glauben, dass es falsch ist.

Ich habe es im Code, um Ihnen einen Punkt zu zeigen. Der Punkt ist: Die Null erscheint im Bereich "Experten", weil dieses Stück Code im Code enthalten ist.


Das letzte Bild, das Sie gepostet haben, zeigt, dass die USDJPY-Order um 01:45:35 geschlossen wurde ... die nächste Code-Zeile, die auf die Zeile folgt, in der die Order geschlossen wurde, ist Print(OrderCloseTime()); und sie ergibt den Wert 0 ... . 0 als Datumszeitpunkt ist Mitternacht am 1. Januar 1970, das ist nicht der Zeitpunkt, an dem Sie die Order geschlossen haben. Wie Sie richtig bemerkt haben, kann ein Rückgabewert von 0 von OrderCloseTime() auch dann sein, wenn die Order offen ist oder eine schwebende Order ist. . wie kann also ein Wert von 0 richtig sein? die Antwort ist, dass es nicht richtig sein kann, das heißt, es ist falsch.

 

Simon,

ich arbeite gerade daran...

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      int ClosedTicketNum = OrderTicket();   //  <---- add this line
      
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      
      OrderSelect(ClosedTicketNum, SELECT_BY_TICKET);   //  <---- add this line

      Print(OrderCloseTime());
      GetLastError();
     }

Ich danke Ihnen.

 
WhooDoo22:

Simon,

Warum haben Sie diese Änderung nicht in Ihrer neuesten Version des Codes vorgenommen? . wenn Sie es vorhatten, warum haben Sie es nicht getan?

Geben Sie mir bitte eine Sekunde Zeit, um mir das anzusehen.

Ich hatte vor, dies zu kodieren, aber ich habe nicht vor, es jetzt zu kodieren. Es gibt keinen Grund, dies zu kodieren...

Wenn ich stattdessen dies codieren kann...

Alle 'if'-Bedingungen gelten für das, was innerhalb der geschweiften Klammern ("{}") steht. Das Hinzufügen von geschweiften Klammern zu diesem Codeblock (so wie ich es vorhatte ) ist ineffizient und dient keinem Zweck.

OK, wenn man sich diesen Code ansieht . . . .

if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))                                  // 1.
if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}                   // 2.
if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}                  // 3.
if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))   // 4.
     {  
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);                   // 5.
      Print(OrderCloseTime());                                                    // 6.
     }

Ich habe die Zeilen nummeriert, um die Diskussion zu erleichtern.

Welche der anderen nummerierten Codezeilen wird ausgeführt, wenn OrderStopLoss() und OrderTakeProfit() beide0 sind?

 

Simon,

Behoben, so dass es wie vorgesehen funktioniert.

if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}                   // 2.
if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}                  // 3.
if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))                                  // 1.
if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))   // 4.
     {  
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);                   // 5.
      Print(OrderCloseTime());                                                    // 6.
     }

Zeilen 2 und 3.

Danke, Simon.

 

Simon,

   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}
   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      int ClosedTicketNum=OrderTicket();
      
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);

      OrderSelect(ClosedTicketNum,SELECT_BY_TICKET);
      
      Print(OrderCloseTime());
     }

Ergebnis:

Ergebnis im Bereich "Experten".

Warum wird der Orderschlusszeitpunkt in einer solchen Form dargestellt (1357306061)?

Ist der Grund, warum die Print()-Funktion funktioniert, dass die OrderSelect()-Funktion (innerhalb der geschweiften Klammern) die geschlossene Order auswählen muss und NICHT eine offene Order? Das muss innerhalb der geschweiften Klammern geschehen, oder? ;) Knifflig, knifflig.

Ich danke Ihnen.

 

Simon,

Jetzt kommt's... BAM!

   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}
   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {      
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);

      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)
      
      Print(OrderCloseTime());
     }

Noch besser! Hahaha ;)

Ich danke dir.