Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1374

 
Alexey Viktorov #:

Jemand hat dich schlecht unterrichtet. Die Variable _LastError speichert den Wert, bis der nächste Fehler auftritt.


Nun, sehen Sie, am Anfang des Hauptcodes tritt folgender Fehler auf

ERR_INVALID_DATETIME

4010

Falscher Datums- und/oder Zeitwert


Und dann wird ein Objekt durch den Code erstellt und _LastError wird umgeschrieben in

ERR_OBJECT_NOT_FOUND

4202

Grafikobjekt nicht gefunden


Wenn die _LastError-Prüfung am Ende des Codes steht, wie ich es normalerweise tue, erhalte ich 4202 und ignoriere es einfach. Das heißt, der Fehler 4010 bleibt unbemerkt. Wo liege ich falsch?

Alexey Viktorov #:


Es ist eine Voraussetzung des Marktplatzes, dass keine Ausführungsfehler vom Server des Brokers empfangen werden.

Danke, das wusste ich nicht, ich dachte, alle Fehler seien verboten.

 
leon_17 #:

Am Anfang des Hauptcodes tritt zum Beispiel folgender Fehler auf:

ERR_INVALID_DATETIME

4010

Falscher Datums- und/oder Zeitwert


Und dann wird ein Objekt durch den Code erstellt und _LastError wird umgeschrieben in

ERR_OBJECT_NOT_FOUND

4202

Grafikobjekt nicht gefunden


Wenn die _LastError-Prüfung am Ende des Codes steht, wie ich es normalerweise tue, erhalte ich 4202 und ignoriere es einfach. Das heißt, der Fehler 4010 bleibt unbemerkt. Was mache ich falsch?

Danke, das wusste ich nicht, ich dachte, alle Fehler sind verboten.

Ganz genau. Sie haben nicht unrecht...

 

Hallo, kann mir jemand einen Tipp geben.

Ich schreibe die Zeitwerte jedes Balkens speziell in ein Array. Die Anzahl der Balken im Diagramm ist auf 3000 begrenzt.

Die Aufgabe:

- Um das Wertefeld bei jedem neuen Takt zu verschieben.

void CNewBar::PriceHL2()
  {
   int start= 0;
   ArrayResize(this.m_tim_pr_hl2,this.m_rt);
  
   if(this.m_pc!=0)
     {
      start= this.m_pc;
      ArrayCopy(this.m_tim_pr_hl2, this.m_tim_pr_hl2, 0, this.m_rt-this.m_pc);
     }  
   for(int b= start; b < this.m_rt; b++)
     {
      this.m_tim_pr_hl2[b]= iTime(this.m_symbol, this.m_timeframe, this.m_rt-b);
     }
  }

Ich kann es nicht so einstellen, dass es richtig funktioniert.

Ist es richtig, dass ich das Array bei einem neuen Takt verschiebe, wenn (this.m_rt-this.m_pc)=1?

ArrayCopy(this.m_tim_pr_hl2, this.m_tim_pr_hl2, 0, this.m_rt-this.m_pc); // this.m_rt-this.m_pc=1
 
Mikhail Toptunov #:

Hallo, kann mir jemand einen Tipp geben.

Ich schreibe die Zeitwerte jedes Balkens speziell in ein Array. Die Anzahl der Balken im Diagramm ist auf 3000 begrenzt.

Die Aufgabe:

- Um das Wertefeld bei jedem neuen Takt zu verschieben.

Ich kann es nicht so einstellen, dass es richtig funktioniert.

Ist es richtig, das Array bei einem neuen Takt zu verschieben, wenn (this.m_rt-this.m_pc)=1?

D.h. die Größe des Arrays muss genau 3000 sein und bei Bildung eines neuen Taktes soll zuerst der Nullindex überschrieben werden ......... und am Ende ein neuer Wert geschrieben werden?

Wenn ich es richtig verstanden habe, was ist der Sinn der Schleife? Kopieren Sie einfach das Array selbst in den Null-Index, beginnend mit dem ersten, und schreiben Sie dann den neuen Wert in den letzten Index.

 
Alexey Viktorov #:

Wenn kein Objekt gefunden wird, ist dies der Objektsuchfehler...

ERR_OBJECT_NOT_FOUND

4202

Grafikobjekt nicht gefunden


Kein Grund für eine Warnung...

Ich habe ein paar Tests gemacht... Mir schwebt Folgendes vor. In MQL5 ist es nicht notwendig, ObjectFind() beim Erstellen von Objekten zu verwenden.
Das Objekt kann ohne vorherige Überprüfung seiner Existenz erstellt werden (nur mit ObjectCreate). Selbst innerhalb von OnTick verursacht ein solcher Code keine _LastError-Fehler.

Ich weiß nicht, wie es in den Tiefen des MQL5-Systemcodes implementiert ist, vielleicht gibt es eine Prüfung bereits dort hochgeladen, dass das Objekt nur erstellt wird, wenn es noch nicht vorhanden ist. Aber es stellt sich heraus, dass zumindest beim Erstellen eines Objekts innerhalb von MQL5, ObjectFind() nicht benötigt wird. Und alle seine Eigenschaften werden bei jedem Tick aktualisiert.

Das kann man von MQL4 nicht behaupten. Die Erstellung eines Objekts über ein bereits vorhandenes Objekt führt zu einem Fehler 4200 ("Das Objekt existiert bereits"). Das bedeutet, dass die Verwendung vonObjectFind() für seine Erstellungobligatorisch ist. Dies lässt mich mit einer einfachen Möglichkeit, seine Eigenschaften von konstanten Updates zu schließen, ohne _LastError Fehler zu erzeugen.

Bitte bestätigen Sie meine Schlussfolgerungen.

 
Alexey Viktorov #:

D.h. die Größe des Arrays sollte genau 3000 betragen und wenn ein neuer Balken gebildet wird, sollte der Null-Index zuerst überschrieben werden ......... und der neue Wert sollte am Ende hinzugefügt werden?

Wenn ich es richtig verstanden habe, warum brauche ich eine Schleife? Einfach, das Array selbst sollte in den Null-Index kopiert werden, beginnend mit dem ersten, und dann sollte der neue Wert zum letzten Index hinzugefügt werden.

Nun, ja, es ist klar, aber wenn es eine Pause gibt, zum Beispiel eine Verzögerung, zwei Takte erschienen, schreibe ich sie auf.

Vielen Dank, ich verstehe, ich werde es über CopyTime versuchen.

 
leon_17 #:

Ich habe ein paar Tests gemacht... Das geschieht folgendermaßen. In MQL5 ist es nicht notwendig, ObjectFind() beim Erstellen von Objekten zu verwenden.
Das Objekt kann ohne vorherige Überprüfung seiner Existenz erstellt werden (nur mit ObjectCreate). Selbst innerhalb des OnTick-Codes verursacht dieser Code keine _LastError-Fehler.

Ich weiß nicht, wie es in den Tiefen des MQL5-Systemcodes implementiert ist, vielleicht gibt es eine Prüfung bereits dort hochgeladen, dass das Objekt nur erstellt wird, wenn es noch nicht vorhanden ist. Aber es stellt sich heraus, dass zumindest bei der Erstellung eines Objekts innerhalb von MQL5, ObjectFind() nicht benötigt wird. Und alle seine Eigenschaften werden bei jedem Tick aktualisiert.

Das kann man von MQL4 nicht behaupten. Die Erstellung eines Objekts über ein bereits vorhandenes Objekt führt zu einem Fehler 4200 ("Das Objekt existiert bereits"). Das bedeutet, dass die Verwendung vonObjectFind() für seine Erstellungobligatorisch ist. Dies lässt mich mit einer einfachen Möglichkeit, seine Eigenschaften von konstanten Updates zu schließen, ohne _LastError Fehler zu erzeugen.

Bitte bestätigen Sie meine Schlussfolgerungen.

Es geht überhaupt nicht um Fehler. Der Punkt ist, dass bei der Erstellung eines Objekts diesem bestimmte Eigenschaften zugewiesen werden, und warum sollte man Maschinenzeit und Ressourcen für die Neudefinition von Eigenschaften verschwenden, ohne Änderungen vorzunehmen. Es ist viel billiger, zu prüfen, ob das Objekt existiert, und dann neue Eigenschaften nur denjenigen zuzuweisen, die geändert werden müssen. Zum Beispiel eine Textbeschriftung oder ein Etikett, oft soll nur der Text in diesen Objekten geändert werden. Alle anderen Eigenschaften bleiben wie sie sind...
 
Mikhail Toptunov #:

Nun ja, es scheint klar zu sein, aber wenn es eine Unterbrechung gibt, z.B. eine Verzögerung, zwei Takte erschienen, schreibe ich sie auf.

Danke, ich verstehe, ich werde es über CopyTime versuchen.

Wenn Sie das über CopyTime machen, ist das überhaupt kein Problem. Kopieren Sie einfach die aktuellen 3000 Balken und das war's.

 

Wie stelle ich die Höhe des regulären Trailing-Stops im Programmcode ein, wenn ich eine schwebende Order erteile oder eine Position vom Markt aus eröffne?

Wie dies manuell geschieht, ist klar. Programme für nicht standardmäßige Trailing Stops sind uninteressant.

Ich danke Ihnen im Voraus.

 
   for (int symbols; symbols < SymbolsTotal(true); symbols++) 
      {
        Print(SymbolName(symbols ,true));
      }

Warum funktioniert ein solcher Entwurf nicht? Wo liegt der Fehler... (das Protokoll ist leer)


Und der Yen, ebenfalls leer.

enum c_mode
  {
   Auto,
   Manual,    
  };

input c_mode MODE         = Auto;

if (MODE==Auto) 
      {
      Print("MODE=Auto");
      } 
Grund der Beschwerde: