Fehler, Irrtümer, Fragen - Seite 743

 
Fia:

Hallo, meine Herren Entwickler!

Können wir Änderungen im MQL5-Compiler vornehmen, um zumindest eine Warnung zu erhalten?

für Fehler dieser Art im Code.

if(Flag_Exitl=true) {break;}


Die Vergleichsbedingung ist hier nicht korrekt (sie sollte == sein), weshalb es immer zu einem Bruch kommen wird.

Wie lässt sich diese Situation im Compiler beheben (falls das überhaupt möglich ist), damit ich beim Schreiben von Code weniger holprig vorankomme?

(Ich habe gedacht, dass es nicht funktionieren wird, es scheint, dass wir die Zuordnung und den Vergleich in if trennen sollten, damit die Frage entfernt wird).

Dies ist möglich, wenn die Bedingung eine boolesche Zuweisung mit einer Konstante auf der rechten Seite enthält.
Variablen vom Typ bool können nicht mit true/false verglichen werden, sondern direkt verwendet werden (im Wesentlichen handelt es sich um ein Ja/Nein-Flag)
if(Flag_Exitl) {break;}
Du machst es butterweich.
Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип bool
Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип bool
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Тип bool - Документация по MQL5
 
notused:

Ich erhalte regelmäßig den Fehler 4401

ERR_HISTORY_NOT_FOUND

Der folgende Indikatorcode

gibt gleich nach dem Start einen Fehler aus (wenn nicht auf D1). Oder besser gesagt, wenn Sie das Terminal starten und den Chart öffnen, um den Indikator zu aktivieren, erhalten Sie eine Fehlermeldung. Wenn das Terminal nicht geschlossen ist, tritt ein solcher Fehler beim Start nicht auf.

Aber nach einiger Zeit (ein paar Stunden - 2 Stunden waren genug für mich) werden wir sehen, dass wir den Fehler auf dem bereits geöffneten Diagramm erhalten werden. (Ich habe es auf m30 laufen lassen)

Repräsentanten, MetaQuotes, bitte kommentieren, soll das so sein?
 
struct SDaylyRange {double min, max, open, close;};
struct SNoDaylyRange {
   uint x;
   double y;
 };

void OnStart()
  {
   SNoDaylyRange tmp;
   SDaylyRange tmp2 = tmp;
  }
Dieser Code lässt sich ohne eine einzige Warnung kompilieren. Obwohl es wahrscheinlich nicht einmal kompiliert werden sollte
 
notused:
...erscheint regelmäßig der Fehler 4401.

Hinweis:

Organisation des Datenzugriffs

Zugänglichkeit der Daten

Die Verfügbarkeit von Daten im HCC-Format oder sogar im gebrauchsfertigen HC-Format bedeutet nicht immer die uneingeschränkte Verfügbarkeit dieser Daten für die Anzeige auf einer Karte oder für die Verwendung in mql5-Programmen.

Beim Zugriff auf Kursdaten oder Indikatorwerte aus mql5-Programmen sollte man bedenken, dass nicht garantiert ist, dass sie zu einem bestimmten Zeitpunkt oder ab einem bestimmten Zeitpunkt verfügbar sind. Dies hat damit zu tun, dass MetaTrader 5 nicht die vollständige Kopie der benötigten Daten für das mql5-Programm speichert, sondern einen direkten Zugriff auf die Terminal-Datenbank ermöglicht, um Ressourcen zu sparen.

Die Kurshistorie für alle Zeitrahmen wird aus den gemeinsamen Daten im HCC-Format erstellt und jede Aktualisierung des Servers führt zur Aktualisierung der Daten für alle Zeitrahmen und zur Neuberechnung der Indikatoren. Daher kann der Zugang zu den Daten verweigert werden, auch wenn die Daten gerade eben noch verfügbar waren.

CopyRate

Wenn Daten vom Indikator angefordert werden und die angeforderten Zeitreihen noch nicht erstellt wurden oder vom Server heruntergeladen werden müssen, gibt die Funktion sofort -1 zurück, aber der Prozess des Herunterladens/Erstellens wird eingeleitet.
Das scheint der richtige Weg zu sein. Vor CopyRate SERIES_SYNCRONIZED können Sie überprüfen...
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту - Документация по MQL5
 
Swan:

Merkblatt:

Sieht so aus, wie es sein sollte. Bis zu CopyRate SERIES_SYNCRONIZED können Sie überprüfen...

Ich streue nur Asche auf mein Haupt, ja. Ich danke Ihnen.

Obwohl es seltsam ist, die Anforderung für zwei Takte und Geschichte nicht verfügbar, obwohl nur Null bar Änderungen zu sehen. Aber keine Sorge - wenn es in der Dokumentation beschrieben ist, ist es kein Fehler.

 

in meinem IsNewBar kam ein Fehler heraus.

Anstelle von

CopyTime(sym, period, 0, 1, currentTime);

Ich hätte schreiben sollen

   if (CopyTime(sym, period, 0, 1, currentTime) < 1) return (false);

Und ich habe mich gefragt, warum alle paar Stunden IsNewBar(PERIOD_D1) == true ist -> daher habe ich die Unzugänglichkeit der Historie herausgefunden, aber ich konnte mich nicht an eine Funktion erinnern, die ich vor ein oder zwei Jahren geschrieben habe.

 
sergeev:

Warum der Indikator keine Farbtypen (COLOR_ARROW, etc.) mit mehr als einem Puffer verarbeiten kann

Code-Beispiel

Wir setzen zwei DRAW_COLOR_ARROW (buf1 und buf2) und für jeden einen zusätzlichen Farbpuffer (clr1, clr2)

Gleichzeitig erhält der zweite Puffer buf2 zwar High/Low-Balken, diese werden aber nicht im Diagramm angezeigt. Es scheint, dass die Farbe der Pfeile in diesem Puffer = clrNONE ist. Das heißt, die Farbeinstellung im clr2-Puffer funktioniert nicht.


hier ist ein bildschirmfoto. nur die werte von buf1/clr1 sind sichtbar. die werte des zweiten puffers werden nicht farblich dargestellt, obwohl werte empfangen werden.


Wo liegt der Fehler?

Die Frage wurde einfach erstellt, um "in MQL5 DNA" zu beantworten.

Solcher Unsinn auch bei DRAW_FILLING und sogar bei relativ normalem DRAW_HISTOGRAM2 (natürlich nicht so stabil, aber Fehler kommen vor).

Allein aus der Instabilität der Fehler schließe ich, dass Sie ohne eine CD wahrscheinlich keine Antwort erhalten werden.

 

Bild 642 für Win32

Ein Problem mit dreidimensionalen Double-Arrays tritt auf, wenn Sie bei der Ausgabe mit der Print-Funktion versehentlich die Array-Grenzen überschreiten

Das Skript geht von selbst in eine Endlosschleife über.

int i1,i2,i3;
double out[3][7][7];
for(i1=0;i1<7;i1++) out[0][0][i1] = inp[i1];
double sum;
sum = 0.0;
for(i3=0;i3<3;i3++){
   for(i2=0;i2<7;i2++){
      for(i1=1;i1<7;i1++)  sum += W[i3][i2][i1] * out[i3][i2][i1-1];
      out[i3][i2][i1] = f(sum + WT[i3][i2]);
      sum = 0.0;
      Print("out[",i3,"][",i2,"][",i1,"] = ",out[i3][i2][i1]);
   }
}
Print("sum = ",sum);

}
//-------------------------------------------------------
double f(double x){return(1/(1+MathExp(-x)));}
 
IgorM:

Bild 642 für Win32

ein Problem mit dreidimensionalen Arrays, das doppelt auftritt, wenn man bei der Ausgabe mit der Print-Funktion versehentlich aus dem Array herausgeht

Tatsächlich tritt die Überschreitung zwei Zeilen früher auf

und du rufst einen Exponenten von einem nicht existierenden Element auf, höchstwahrscheinlich Null.

Schauen Sie in das Protokoll

 
sergeev:

In der Regel tritt die Grenzwertüberschreitung zwei Zeilen früher auf

und du rufst einen Exponenten von einem nicht existierenden Element auf, höchstwahrscheinlich Null.

im Logbuch nachsehen

Ja, ich weiß, und ich habe Code zitiert, der keinen Laufzeitfehler verursacht, sondern das Skript in einer Schleife laufen lässt
Grund der Beschwerde: