Erzwungenes Array-Clearing in MT5? - Seite 4

 
Ich wusste nicht, dass in 4 die Initialisierung mit Nullen während der Größenänderung erfolgt. Dies ist keine Bequemlichkeit, sondern eine Art Unsinn, der zu einer geringeren Geschwindigkeit der Programme führt. D.h. wenn ich Array mit dem Wert -1 initialisieren muss, dann geschieht eine doppelte Initialisierung.
Und dann wundern Sie sich, warum MT4 langsamer ist.
 
Vasiliy Sokolov:

... MQL5 versucht im Gegensatz zu MQL4 nicht zu verstehen, was ein Benutzer will, und das ist auch richtig so.

Ich schlage vor, es auf ein Poster zu drucken. :) (nur ein Scherz)

Vasily, ich verstehe, dass es einige Nuancen gibt, die einen solchen Ansatz von MT5 für die Bequemlichkeit des Programmierers rechtfertigen. Und es macht mir nichts aus. Das soll auch so sein.

 
Реter Konow:

1. Die Logik besagt, dass der Compiler das Löschen von Arrays einmal zur Kompilierungszeit durchführt.

Ja, Sie haben ein Problem mit der Logik :)

 
Nikolai Semko:
Ich wusste nicht, dass in 4ka die Initialisierung durch Nullen während der Größenänderung erfolgt. Das ist kein Komfort, sondern eine Art Unsinn, der zu einer geringeren Geschwindigkeit der Programme führt. D.h. wenn ich ein Array mit dem Wert -1 initialisieren muss, erfolgt eine doppelte Initialisierung.
Und dann wundern sie sich, warum MT4 langsamer ist.

Im Prinzip könnte man bei der Deklaration eines Arrays ein Flag hinzufügen, das den Compiler anweist, das Array zu löschen. Es wäre entweder bequem oder schnell - Sie haben die Wahl.

 
Реter Konow:

Im Prinzip könnte man bei der Deklaration eines Arrays eine Art Flag hinzufügen, das den Compiler anweist, das Array zu löschen. Es wäre entweder bequem oder schnell - Sie haben die Wahl.

Welchen Unterschied macht das? Sie führen die Initialisierung nach der Größenänderung durch, das ist alles, was die Flagge ausmacht.
Insbesondere bei der Deklaration eines dynamischen Arrays ist die Größe nicht bekannt.
 
Nikolai Semko:
Was ist der Unterschied? Sie führen die Initialisierung nach der Größenänderung durch, das ist das ganze Kennzeichen.
Insbesondere bei der Deklaration eines dynamischen Arrays ist die Größe nicht bekannt.

Ja, nach jeder Deklaration eines globalen Arrays und nach jeder Größenänderung des Arrays. Und was ist, wenn Sie 20-30 globale Arrays haben, von denen einige unter bestimmten Umständen ihre Größe ändern? Müssen Sie die Initialisierung überall in Schleifen schreiben? (Arrays können zweidimensional sein). Ist das nicht eine potenzielle Fehlerquelle?

 
Реter Konow:

Ja, nach jeder Deklaration eines globalen Arrays und nach jeder Größenänderung des Arrays. Aber was ist, wenn Sie 20 bis 30 globale Arrays haben, von denen einige unter bestimmten Umständen ihre Größe ändern? Müssen Sie die Initialisierung überall in Schleifen schreiben? (Arrays können zweidimensional sein). Ist dies nicht ein potenzieller Nährboden für Fehler?

Dieser chirurgische Eingriff ist ganz einfach. Ersetzen Sie das Wort"ArrayResize" durch etwas anderes - es wird der Name Ihrer Funktion für die Größenänderung sein. Prüfen Sie darin, ob die Größenänderung positiv ist, gehen Sie dann die neuen Elemente in der Schleife durch und weisen Sie ihnen Null zu.

Initialisieren Sie außerdem in der inite alle Arrays, die eine Größe haben (falls vorhanden).

Es kann auch Arrays einer bestimmten Größe in Funktionen geben - auch diese. Suchen Sie sie mit eckigen Klammern.

 
Dmitry Fedoseev:

Dieser chirurgische Eingriff ist ganz einfach. Ersetzen Sie das Wort "ArrayResize" durch etwas anderes - dies wird der Name Ihrer Resize-Funktion sein. Prüfen Sie darin, ob die Größe nach oben korrigiert wurde, gehen Sie dann die neuen Elemente in der Schleife durch und weisen Sie ihnen Null zu.

Initialisieren Sie außerdem in der inite alle Arrays, die eine Größe haben (falls vorhanden).

Es kann auch Arrays einer bestimmten Größe in Funktionen geben - auch diese. Sie sind durch eckige Klammern gekennzeichnet.

Übrigens, ja.
Pjotr, Dmitri sagt etwas Vernünftiges.
Ein richtig geschriebenes Define erspart es Ihnen, den gesamten Code neu zu schreiben.
 
Nikolai Semko:
Übrigens, ja.
Peter, Dimitri sagt eine vernünftige Sache.
Ein richtig geschriebenes Define erspart es Ihnen, den gesamten Code neu zu schreiben.

Ich werde es ausprobieren. Das ist ein interessanter Hack.

 

Ich werde den Themenstarter unterstützen, obwohl es viele Fragen zu seiner Erstellung gibt ))))

Die MQL5-Entwickler haben in ihrem Streben nach schnellerer Berechnung (oder anderen schönen Zahlen?) all die "kleinen Extras" entfernt, die MQL4 freundlicher machten,

Wenn es eine Faustregel in MQL5 gibt, werden die Indikatoren, die in MQL4 verwendet werden, zu einer "Fibel" in MQL5, und diese "Fibel" muss im Kontext des Handelsterminals gelesen werden:

1. beim Aufruf von OnInit() werden die Indikatorpuffer nicht automatisch initialisiert

2. ich habe mir etwa hundert Indikatoren in der kodobase angesehen, leider schreiben sie unter dem Deckmantel der Programmierung in MQL5 Indikatoren im Stil von MQL4 - sie erweitern die Nummerierung von Arrays und Zeitreihen

3. iHighest / iLowest funktionieren nicht richtig - sie suchen nach Balken mit den höchsten / niedrigsten Werten in Richtung der aufsteigenden Zeitreihennummerierung... D.h., wenn wir das Standardschema der Indikatoren in MQL4 verwenden - Berechnung von den vorherigen Daten bis zur Gegenwart, wird dieses Problem nicht mit iHighest und iLowest gelöst, da der Balken ganz links 0 ist, und wenn iLowest aufgerufen wird, suchen wir nach Werten in der Zukunft....

4. das gleiche Problem mit ArrayMaximum() - es ist schwer, in Indikatoren zu verwenden... es ist schwer, die Nummerierung der Zeitreihe nicht zu erhöhen, wir nehmen und subtrahieren ständig von der Start-El-ta einige Anzahl von Bars und erhalten ArrayMaximum(high[i], i -Period,Period)

5. leider verwenden selbst MQL5-Experten fragwürdige Konstruktionen.... Nehmen wir an, ein gewisser Grundstock an Krücken, der beim Übergang von MT4 eingespart wurde, wird immer noch mit sich herumgetragen.


Was ist der Punkt? - MQL gibt nicht vor, rein С++ zu sein, warum sie einfachere Implementierungen für Benutzer entfernt haben... Ich habe Python für etwa einen Monat überprüft, warum so viele Arbeiten in es... Erst jetzt verstehe ich, dass Python den Leuten erlaubt, die kleinen Dinge zu ignorieren und eine benutzerfreundlichere Schnittstelle hat ;) - Für einen erfahrenen Programmierer scheint das alles falsch zu sein, aber die Leute benutzen es, und Python ist ziemlich beliebt.