Cycle Operator 'für' Fragen - Seite 10

 
WhooDoo22:

Ich habe den Fehler "ungültiges Ticket" für die Codierungsübung, die Sie mir empfohlen haben, behoben. Ich habe eine Kopie des Expertenberaters zu Ihrer persönlichen Ansicht beigefügt.

Der Abschnitt der Funktion OrderClose() dieser Übung ist meines Erachtens vollständig.

Der Abschnitt der Print()-Funktion dieser Übung ist meines Erachtens vollständig.

Ich glaube, es fehlt nur noch der dritte Abschnitt, die OrderModify()-Funktion.

Ich danke Ihnen.

Sie haben das Problem nicht behoben, sondern umgangen, was typisch ist, wenn das Problem nicht verstanden wird. Wie ich bereits sagte, beheben Sie die Ursache, nicht das Symptom...

Sie drucken immer noch nicht die USDJPY-Ticketnummer, bitte überprüfen Sie die ursprüngliche Anforderung.

Ihre MarketInfo()-Aufrufe sind falsch, auch wenn sie funktionieren...

 

Simon,

Die Funktion OrderModify() wird ohne Fehler ausgeführt.

Die Funktion OrderPrint() wird ohne Fehler ausgeführt.

Die Funktion OrderClose() wird ohne Fehler ausgeführt.

Bitte posten Sie Ihre Antwort.

Ich danke Ihnen.

 
WhooDoo22:


Bitte posten Sie Ihre Antwort.


RaptorUK:

Sie haben das Problem nicht behoben, Sie haben es umgangen, das ist typisch, wenn das Problem nicht verstanden wird. Wie ich schon sagte, beheben Sie die Ursache, nicht das Symptom...

Sie drucken immer noch nicht die USDJPY-Ticketnummer, bitte überprüfen Sie die ursprüngliche Anforderung.

Ihre MarketInfo()-Aufrufe sind falsch, auch wenn sie funktionieren...

Und außerdem...

wenn Sie die gleiche Situation wie zuvor haben, wo es keine USDJPY-Order gibt, haben Sie fehlgeschlagene OrderStopLoss(), OrderTakeProfit(), OrderSelect() und OrderType() Aufrufe

Was soll dies bewirken? Was erwarten Sie von dieser Codezeile? Bitte antworten Sie, ohne in der Dokumentation nachzuschlagen.

GetLastError();

Warum wollen Sie diese Codezeile im letzten Codeblock ausführen? . . .

   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}

nur wenn . . .

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       

aber Sie werden diese Codezeile und den gesamten nachfolgenden Code immer ausführen, unabhängig von TP und SL?

   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);} 

Ihre MarketInfo()-Aufrufe sind immer noch falsch ... sehen Sie in der Dokumentation nach, um herauszufinden, warum.

 

Simon,


Sie haben das Problem nicht behoben, sondern es nur umgangen...

Welches Problem habe ich Ihrer Meinung nach noch nicht behoben?


Sie drucken immer noch nicht die USDJPY-Ticketnummer...

Nummer des Bestellscheins.



Ihre MarketInfo()-Aufrufe sind falsch, auch wenn sie funktionieren...

MetaEditor-Wörterbuch MarketInfo() Funktionsbeispiel:

Beispiel:

// MarketInfo() function example;

   double bid   =MarketInfo("EURUSD",MODE_BID);
   double ask   =MarketInfo("EURUSD",MODE_ASK);
   double point =MarketInfo("EURUSD",MODE_POINT);
   int    digits=MarketInfo("EURUSD",MODE_DIGITS);
   int    spread=MarketInfo("EURUSD",MODE_SPREAD);

Hier ist ein Beispiel für meinen OrderClose() Funktionscodeblock:

// OrderClose() function code block example;

   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();
     }

Was ist Ihrer Meinung nach falsch an meinem OrderClose()-Funktionscode-Beispielformat? Es scheint fast identisch zu sein mit dem 'MarketInfo()'-Beispiel, das vom MetaEditor-Wörterbuch bereitgestellt wird.


Und außerdem...


Was soll diese Funktion bewirken? Was erwarten Sie von dieser Code-Zeile? Bitte antworten Sie, ohne in der Dokumentation nachzuschlagen.

GetLastError();

Die Funktion GetLastError() gibt während der Ausführung von Tests einen Fehler auf der Seite 'Experts' aus. Wenn die Funktion keinen Fehler findet, wird Null (0) gedruckt. Beachten Sie die Null, die in dem oben gezeigten Schnappschuss gedruckt wird.


Warum wollen Sie diese Codezeile im letzten Codeblock ausführen? . . .

if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}

nur wenn . . .

if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))

aber Sie werden diese Codezeile und den gesamten darauf folgenden Code immer ausführen, unabhängig von TP und SL?

if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}


Ja, ich bin froh, dass Sie das angesprochen haben, denn ich werde meine Gründe für diese Vorgehensweise erklären.

Wenn alle anderen Codeblöcke bei der Programmausführung mit Hilfe von mehrzeiligen Kommentaren "/* - */" weggelassen werden und die einzigen zwei Codeblöcke, die innerhalb der Funktionen Start() und Return(0) verbleiben, sind...

   int i;
   double bid_ask,
          OM_Param_3,
          OM_Param_4;

// code block 1;   

while(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()!="USDJPY")
   
   i++;

// code block 2;

   if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))   
     {
      Print(OrderTicket());     
      GetLastError();
     }

unter dem zweiten Codeblock ist der Funktionsaufruf:

     {
      Print(OrderTicket());     
      GetLastError();
     }

Die Funktion Print() druckt die Zahl auf unbestimmte Zeit in den Expertenbereich und setzt den Druck fort. Ich dachte, wenn ich...

if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))

hinzufügen würde, würde die Print()-Funktion nur einmal ausgeführt werden, denn sobald die OrderModify()-Funktion direkt darunter ausgeführt würde, wären SL und TP nicht mehr Null und würden die Print()-Funktion zum Abbruch bringen.

Nun ist mir klar, dass dies aufgrund der Art und Weise, wie ein Programm ausgeführt wird, nicht der Fall ist. Ich verstehe, dass ein Programm von oben nach unten ausgeführt wird. Wenn das Programm also seinen gesamten Zyklus beim ersten Mal beendet hat, würde es versuchen, wieder von oben nach unten auszuführen, und es würde scheitern, das Ticket im Expertenfenster zu drucken, weil es keine Order für das Währungspaar USDJPY gibt.


Ich danke Ihnen.

 
WhooDoo22:

Simon,


Sie haben das Problem nicht behoben, sondern umgangen...

Welches Problem habe ich Ihrer Meinung nach noch nicht behoben?

Das zugrundeliegende Problem, das durch die Art und Weise verursacht wird, wie Sie Ihre while-Schleife codiert haben... das Problem, das zu Ungültiges Ticket für die Funktion OrderClose undUnbekanntes Ticket 2 für OrderModify geführt hat, haben Sie nicht behoben, weil Sie das Symptom angegangen sind.

WhooDoo22:

Ihre MarketInfo()-Aufrufe sind falsch, auch wenn sie funktionieren ...

MetaEditor Wörterbuch MarketInfo() Funktion Beispiel:


Entschuldigung, mein Fehler, Sie haben das Problem behoben ... wissen Sie, was das Problem war, auf das ich mich bezog?

WhooDoo22:

Simon,

was soll diese Funktion bewirken? Was erwarten Sie von dieser Codezeile? Bitte antworten Sie, ohne in der Dokumentation nachzuschlagen.

Die Funktion GetLastError() gibt während der Ausführung von Tests einen Fehler auf der Seite 'Experts' aus. Wenn die Funktion keinen Fehler findet, wird Null (0) gedruckt. Beachten Sie die Null in dem Schnappschuss, den ich oben bereitgestellt habe.


Nein, GetLastError() druckt nicht in das Protokoll. Die Funktion gibt den letzten aufgetretenen Fehler zurück, dann wird der Wert der speziellen Variable last_error, in der der letzte Fehlercode gespeichert ist, auf Null gesetzt. Der nächste Aufruf von GetLastError() wird also 0 zurückgeben."

Die 0 in Ihrem Bild ist wahrscheinlich von . .

Print(OrderCloseTime());

. . . und ist ein Fehler, da der Auftrag nicht mehr ausgewählt ist, da er nicht mehr im Auftragspool ist, da er jetzt geschlossen wurde und sich im History-Pool befindet. um das zu tun, was Sie versuchen, bräuchten Sie etwas wie dieses . . .

   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();
     }

. . . fügen Sie diese beiden Zeilen ein und versuchen Sie es.

WhooDoo22:

Die Print()-Funktion druckt die Zahl auf unbestimmte Zeit in den Expertenbereich und druckt weiter. Ich glaubte, wenn ich hinzufügen würde ...

if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))

hinzufügen würde, würde die Print()-Funktion nur einmal ausgeführt werden, denn sobald die OrderModify()-Funktion direkt darunter ausgeführt wird, wären SL und TP nicht mehr Null und würden die Print()-Funktion zum Abbruch bringen.

Nun ist mir klar, dass dies aufgrund der Art und Weise, wie ein Programm ausgeführt wird, nicht der Fall ist. Ich verstehe, dass ein Programm von oben nach unten ausgeführt wird. Wenn das Programm also seinen gesamten Zyklus beim ersten Mal beendet hat, würde es versuchen, wieder von oben nach unten auszuführen, und es würde scheitern, das Ticket im Expertenfenster zu drucken, weil es keine Order für das Währungspaar USDJPY gibt.

Ich glaube, Sie verstehen nicht, worauf ich hinaus will ... wenn ich ein paar geschweifte Klammern hinzufüge, wird es vielleicht klarer. . Sie haben dies getan . . .

   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();
     }

. . . wollten Sie das tun?

   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();
         }
      )
 
WhooDoo22:

Simon,

Sie drucken immer noch nicht die USDJPY-Ticketnummer...


Die Anforderung lautete: "Drucke die Ticketnummer in das Protokoll in der Form "Ticketnummer für USDJPY = " "

 

Simon,


Das zugrundeliegende Problem, das durch die Art und Weise, wie Sie Ihre while-Schleife codiert haben, verursacht wird ... das Problem, das zu Ungültiges Ticket für die Funktion OrderClose und Unbekanntes Ticket 2 für OrderModify geführt hat, haben Sie nicht behoben, denn Sie haben das Symptom behandelt.

Ich möchte dieses Problem mit Ihnen in aller Ausführlichkeit besprechen, damit ich mich auf die Lösung des Problems konzentrieren kann, ohne von anderen Punkten abgelenkt zu werden.


Entschuldigung, mein Fehler, Sie haben das Problem behoben ... wissen Sie, was das Problem war, auf das ich mich bezog?

Ja, danke, dass Sie es angesprochen haben!


"Die Funktion gibt den zuletzt aufgetretenen Fehler zurück, dann wird der Wert der speziellen last_error-Variable, in der der letzte Fehlercode gespeichert ist, auf Null gesetzt. Der nächste Aufruf von GetLastError() wird also 0 zurückgeben."

MetaEditor Wörterbuch liest:

int GetLastError( )
Die Funktion gibt den zuletzt aufgetretenen Fehler zurück, dann wird der Wert der speziellen Variable last_error, in der der letzte Fehlercode gespeichert ist, auf Null gesetzt. Der nächste Aufruf von GetLastError() wird also 0 zurückgeben.

Diese Funktion gibt den zuletzt aufgetretenen Fehler zurück, dann wird der Wert der speziellen Last-Error-Variable, in der der letzte Fehlercode gespeichert ist, auf Null gesetzt...

Grün ist verstanden und gelb ist nicht verstanden.


. . . fügen Sie diese beiden Zeilen ein und versuchen Sie es.

   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();
     }

Wird gemacht.


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

Ich glaube, ich wollte dies tun...

   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();
         }
      }

Das ist, weil ich wollte, dass die Bedingung...

if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))

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


Die Anforderung war ... "die Ticketnummer in das Protokoll in der Form "Ticketnummer für USDJPY = " drucken".

Das kann man machen.


Vielen Dank dafür.

 
WhooDoo22:


"Die Funktion gibt den letzten aufgetretenen Fehler zurück, dann wird der Wert der speziellen last_error-Variable, in der der letzte Fehlercode gespeichert ist, auf Null gesetzt. Der nächste Aufruf von GetLastError() wird also 0 zurückgeben."

MetaEditor-Wörterbuch liest:

int GetLastError( )
Die Funktion gibt den zuletzt aufgetretenen Fehler zurück, dann wird der Wert der speziellen Variable last_error, in der der letzte Fehlercode gespeichert ist, auf Null gesetzt. Der nächste Aufruf von GetLastError() wird also 0 zurückgeben.

Diese Funktion gibt den zuletzt aufgetretenen Fehler zurück, dann wird der Wert der speziellen Last-Error-Variable, in der der letzte Fehlercode gespeichert ist, auf Null gesetzt...

Grün ist verstanden und gelb ist nicht verstanden.

OK, wie Sie aus der Dokumentation ersehen können, gibt GetLastError() nichts aus . . . esgibt nur die Fehlernummerzurück. . um sie zu benutzen, müssen Sie also etwas mit ihr machen . . .

Print("The last error was error number: ", GetLastError());

//  or . . .

int ErrorNumber = GetLastError();

//  or . . .

if(GetLastError() == 130)

Wenn Sie GetLastError() aufrufen, gibt es den Fehler zurück und löscht dann die Variable auf Null, die intern verwendet wurde, um den letzten Fehler zu speichern ... wenn Sie also Folgendes getan haben

OrderDelete(-1);   //  should produce an error 4108 or 3

Print("Last error was number ", GetLastError());    //  should print - Last error was number 4108

Print("Last error was number ", GetLastError());    //  should print - Last error was number 0  the previous call cleared the GetlastError internal variable
 

der 2. Aufruf von GetLastError() wird 0 zurückgeben, da der erste Aufruf die Variable, die die Fehlernummer enthält, auf Null gesetzt hat ... Beachten Sie auch, dass nur der letzte Fehler gespeichert wird.

 
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.

Aber das haben Sie nicht getan ... Sie haben es bei Ihrem Entwurf übersehen, dann beim Programmieren, dann beim Durchlesen Ihres Codes und beim Überprüfen, ob er das tut, was Sie beabsichtigt haben, und dann beim Testen. ... Klammern gehören zu den grundlegenden Dingen, die Sie wie Ihre Westentasche kennen müssen.

Sie müssen verstehen, warum Sie das übersehen haben, und das Problem beheben ... niemand sonst kann das für Sie tun, es sei denn, Sie wollen ihn dafür bezahlen, für Sie zu programmieren.

 

Simon,


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

Print(OrderCloseTime());


Nee, nee, nee! ;)

Lassen Sie uns einen Ausflug in die Dokumentation machen, ja? Hahaha.

datetime OrderCloseTime( )
Gibt die Abschlusszeit für die aktuell ausgewählte Bestellung 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 die Abschlusszeit 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...

   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());
     }

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

Ergebnis im Bereich "Experten".

Aaah, was haben wir denn da? :)


Bitte posten Sie eine Antwort für den neu hinzugefügten Experten-Berater. Erfüllt er bereits alle Kriterien, die in Ihrer Übung enthalten waren?


Das zugrundeliegende Problem, das durch die Art und Weise, wie Sie Ihre while-Schleife kodiert haben, verursacht wird ... das Problem, das zu Ungültiges Ticket für die OrderClose-Funktion und Unbekanntes Ticket 2 für OrderModify geführt hat, haben Sie nicht behoben, weil Sie das Symptom angegangen sind.

Ich möchte dieses Problem mit Ihnen bis ins kleinste Detail besprechen, damit ich mich auf die Lösung des Problems konzentrieren kann, ohne von anderen Punkten abgelenkt zu werden.


Vielen Dank für den Hinweis.