Fehler, Irrtümer, Fragen - Seite 1999

 
Alexey Viktorov:

Nehmen wir das Indikatorpuffer-Array als Beispiel: Beim Initialisieren eines Indikators hat der Puffer eine Länge von Null. Was gibt es mit Nullen zu initialisieren? Wenn ein weiterer Index hinzugefügt wird, wird er zwangsweise auf Null gesetzt und dann mit einem Wert gefüllt? Wozu dient dieses Nullsetzen oder Auffüllen mit EMPTY_VALUE? Und wenn es notwendig ist, PLOT_EMPTY_VALUE und nicht 0 oder EMPTY_VALUE zuzuweisenoder eines zu erzwingen, aber wir brauchen ein anderes... Wie man es auch dreht und wendet, am Ende verschwendet man seine Zeit...

Und eine benutzerdefinierte Anordnung... Das Array wird für einige von Null verschiedene Daten deklariert und EMPTY_VALUE. Welchen Zweck hat es also, ihn zwangsweise mit etwas zu initialisieren?

Es zeigt sich also, dass die Leistung in den meisten Fällen beeinträchtigt wird.

Ich habe offensichtlich den Bezug zum Leben verloren. Meines Erachtens hat der Indikatorpuffer immer die gleiche Länge wie die Anzahl der Balken. Und die Verweigerung seiner Initialisierung in MT5 führt zur Anzeige von Unsinn auf dem Bildschirm. Es stellt sich heraus, dass die explizite Initialisierung obligatorisch ist. Und es ist nicht klar, warum sie einfach vom Kern (wie in MT4) an den MQL-Programmierer übertragen wird. Ich habe keine wirklichen Argumente dafür gesehen, dass es irgendwie möglich ist, die Geschwindigkeit ohne Initialisierung zu erhöhen und trotzdem die miserable Anzeige zu erhalten.

Ich sage nichts über ein benutzerdefiniertes dynamisches Array - es gibt wirklich eine Regel: Derjenige, der es zugewiesen hat, ist für die korrekte Reinigung verantwortlich. ArrayInitialize ist in vielen Fällen nützlich. Es geht nicht um die Geschwindigkeit, sondern um die Korrektheit des Programms. Prioritäten setzen: schnell und/oder richtig. Gewöhnlich erfordern einige Prüfungen auf Korrektheit und Datenaufbereitung zusätzliche Zeit (auch wenn sie minimal ist), aber man kann nicht darauf verzichten - Wunder geschehen nie.

 
Stanislav Korotky:

Ich sage nichts über ein benutzerdefiniertes dynamisches Array - dort gilt die Regel, dass derjenige, der es zugewiesen hat, dafür verantwortlich ist, es korrekt zu reinigen.

Beleidigen Sie die Arrays nicht.

#property strict

void OnStart()
{
  uchar Array[];
  
  const int Size = ArrayResize(Array, 10000);
  
  bool Res = false;
  
  for (int i = 0; (i < Size) && (!Res); i++)
    Res = Array[i];
    
  Print(Res);
}

In MT4 wird es immer falsch zurückgeben, weil ohne Müll - alle Nullen. Im MT5 ist das der Fall.

Daher wird derselbe Code im MT4-Tester von Durchlauf zu Durchlauf immer die gleichen Ergebnisse zeigen. In einem MT5-Tester ist das nicht der Fall.

 
fxsaber:

In MT4 wird es immer false zurückgeben, weil es ohne Müll nur Nullen sind. Im MT5 ist das der Fall.

Ist dies ein Test, dass MT4 das Feld mit Nullen füllt? Dann müssen wir bedenken, dass, wenn ArrayResize einen dritten Parameter mit Reserve verwendet, nachfolgende Neuzuweisungen innerhalb der Reserve nichts initialisieren werden. Es wird Müll geben. Ich empfehle eine explizite Initialisierung, damit Sie später nicht versehentlich überrascht werden, wie in dem Optimierungsbeispiel, das diese Diskussion ausgelöst hat.

Wer sich wegen der Initialisierung Sorgen macht, dem sei gesagt, dass es in der Regel viele andere Stellen und Techniken gibt, an denen die Effizienz in einem viel größeren Umfang verbessert werden kann.

 
Stanislav Korotky:

Ist dies ein Test für MT4, der das Feld mit Nullen füllt? Dann müssen Sie beachten, dass, wenn ArrayResize einen dritten Parameter mit einer Reserve verwendet, nachfolgende Neuzuweisungen innerhalb der Reserve nichts initialisieren werden. Es wird Müll geben.

Es wird keinen Müll geben.

Ich empfehle eine explizite Initialisierung, damit Sie später nicht versehentlich überrascht werden, wie in dem Optimierungsbeispiel, das diese Diskussion ausgelöst hat.

Dies wird nicht speichern

Forum zum Thema Handel, automatische Handelssysteme und Strategietests

Wanzen, Wanzen, Fragen

fxsaber, 2017.09.12 11:18

Selbst wenn ich perfekt schreiben würde (ohne Fehler zu machen - was ich nicht tue), ist es normal, die Bibliothek von jemand anderem zu nehmen (manchmal ohne Quellcode - auf dem Marktplatz) und sie zu verwenden, in der Hoffnung, dass sie kompetent geschrieben ist. Und es gibt keine Garantie dafür, dass Sie danach im Testgerät andere Ergebnisse erzielen werden. Und es wird SEHR schwierig sein, die wahre Ursache zu finden. Und manchmal ist es unmöglich, sie zu reparieren.

Das Ziel ist, dass das Ergebnis von Lauf zu Lauf reproduzierbar ist - identisch, selbst bei einem Fehler.

 
fxsaber:

Es wird keinen Müll geben.



Sollten wir dann die Dokumentation korrigieren?

DieInitialisierung eines Arrays mit dem AusdruckArrayInitialize(array, init_val) bedeutet nicht, dass die Elemente der für dieses Array reservierten Reserve mit demselben Wert initialisiert werden. Wenn dieFunktion ArrayResize() anschließend die Größe des Arrays innerhalb der aktuellen Reserve erhöht, werden die Elemente, deren Werte nicht definiert sind und meistens nicht gleichinit_val sind, am Ende des Arrays hinzugefügt.

 
Stanislav Korotky:

Müssen wir dann die Dokumentation korrigieren?

DieInitialisierung eines Arrays mit dem AusdruckArrayInitialize(array, init_val) bedeutet nicht, dass die Elemente der Reserve, die für dieses Array reserviert sind, mit demselben Wert initialisiert werden. WennArrayResize() anschließend die Größe des Arrays innerhalb der aktuellen Reserve erhöht, werden die Elemente am Ende des Arrays hinzugefügt, deren Werte nicht definiert sind und meistens nicht gleichinit_val sind.

Das ist nicht der Fall, denn in der MT4-Dokumentation gibt es so etwas einfach nicht.


Es ist erschreckend, dass eine mathematische Bibliothek (Include\Math -7Mb Quellcode) an einer/zwei Stellen nicht initialisiert wurde! Und wie lässt sich dieser Fehler beheben, der im MT5-Tester unterschiedliche Einzelläufe und im MT4-Tester denselben auslöst?

 
Stanislav Korotky:

Ich bin wohl nicht auf der Höhe der Zeit. Mir scheint, dass die Länge des Indikatorpuffers immer der Anzahl der Balken entspricht. Und die Verweigerung seiner Initialisierung im MT5 führt zu einer unsinnigen Anzeige auf dem Bildschirm. Es stellt sich heraus, dass die explizite Initialisierung obligatorisch ist. Und es ist nicht klar, warum sie einfach vom Kern (wie in MT4) an den MQL-Programmierer übertragen wird. Ich habe keine wirklichen Argumente dafür gesehen, dass es irgendwie möglich ist, die Geschwindigkeit ohne Initialisierung zu erhöhen und trotzdem die miserable Anzeige zu erhalten.

Ich sage nichts über ein benutzerdefiniertes dynamisches Array - es gibt wirklich eine Regel: Derjenige, der es zugewiesen hat, ist für die korrekte Reinigung verantwortlich. ArrayInitialize ist in vielen Fällen nützlich. Es geht nicht um die Geschwindigkeit, sondern um die Korrektheit des Programms. Prioritäten setzen: schnell und/oder richtig. Normalerweise erfordern einige Prüfungen auf Korrektheit und Datenaufbereitung zusätzliche Zeit (wenn auch nur minimal), aber es geht nicht ohne - es geschehen Wunder.

Sie haben nicht auf den Satz geachtet, der

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Wanzen, Wanzen, Fragen

Alexey Viktorov, 2017.09.12 10:50

Nehmen wir als Beispiel das Puffer-Array des Indikators: Beim Initialisieren des Indikators hat der Puffer die Länge Null. Was gibt es mit Nullen zu initialisieren? Wenn ein weiterer Index hinzugefügt wird, wird er zwangsweise auf Null gesetzt und dann mit einem Wert gefüllt. Wozu dient dieses Nullsetzen oder Auffüllen mit EMPTY_VALUE? Und wenn es notwendig ist, PLOT_EMPTY_VALUE und nicht 0 oder EMPTY_VALUE zuzuweisenoder eines zu erzwingen, aber wir brauchen ein anderes... Wie man es auch dreht und wendet, am Ende verschwendet man seine Zeit...

Und eine benutzerdefinierte Anordnung... Das Array wird für einige von Null verschiedene Daten deklariert und EMPTY_VALUE. Warum sollte es also zwangsweise mit etwas initialisiert werden?

Es stellt sich heraus, dass dies in den meisten Fällen die Leistung beeinträchtigt.



Und es macht keinen Sinn, dies in OnCalculate zu tun. Warum sollten wir das Array mit etwas initialisieren und es dann mit Werten aus der Formel füllen? Wenn Sie einen Balken bzw. eine Array-Zelle hinzufügen, welchen Sinn hat es dann, diese mit etwas zu füllen und dann sofort mit einem Wert aus der Formel oder einem leeren Wert?

 
Alexey Viktorov:

Und schon in OnCalculate macht es keinen Sinn. Warum sollten wir das Array mit etwas initialisieren und es dann sofort mit einigen Werten aus der Formel füllen? Wenn Sie einen Balken bzw. eine Array-Zelle hinzufügen, was bringt es, diese mit etwas zu füllen und dann sofort mit einem Wert aus der Formel oder einem leeren Wert?

Es werden nur neue Array-Elemente initialisiert. Und der Punkt ist immer noch derselbe - identische Ergebnisse von Durchlauf zu Durchlauf, selbst wenn ein Fehler im Code vorliegt (oft nicht der eigene). Ich habe oben ein Beispiel mit der mathematischen Bibliothek gegeben.

Der Müll ist böse.

 
fxsaber:

Tun Sie es nicht, denn in der MT4-Dokumentation gibt es einfach keine.

Woher habe ich es dann? Gehen Sie hier.

ArrayInitialize - Операции с массивами - Справочник MQL4
ArrayInitialize - Операции с массивами - Справочник MQL4
  • docs.mql4.com
ArrayInitialize - Операции с массивами - Справочник MQL4
 
Stanislav Korotky:

Woher habe ich das denn? Gehen Sie hier.

Es geht also nicht um ArrayResize, es geht um ArrayInitialize. ArrayResize garantiert Nullen in MT4.


Aus Gründen des Interesses, habe ich in allen meinen Quellen für MT5, wie oft ich ArrayInitialize verwenden gesucht. Nur ein paar Mal. Das scheint weniger als ein Prozent aller dynamischen Arrays zu sein. Und wo ich es verwendet habe, musste ich absichtlich Nullen verwenden, also habe ich einen kürzeren Eintrag anstelle von for verwendet.