Um die Systemsicherheit zu gewährleisten, durchläuft jeder DLL-Aufruf einen speziellen Stripper, der die Ausführung verlangsamt. Ein DLL-Funktionsaufruf ist kein banaler XXXX-Aufruf, sondern ein komplexes Wrapping mit Adressmaskierung, Stapelkontrolle und Abstürzen innerhalb der DLL. MQL5 sorgt dafür, dass, wenn eine Funktion innerhalb der DLL den Stack durcheinanderbringt oder abstürzt, die Skriptausführung angehalten wird, ohne dass das Terminal selbst abstürzt.
Allgemeiner Ratschlag zur Verwendung von DLL-Funktionen: Versuchen Sie, seltene Aufrufe mit einer großen Menge an Arbeit darin zu machen, anstatt Zehntausende von Aufrufen pro Sekunde mit kleinen Ergebnissen zu tätigen.
Ich frage mich. Warum nicht weiter gehen?
Wie Renat schon sagte, ist der Aufruf billiger Funktionen aus einer DLL teuer.
Warum also nicht Daten direkt in das für diesen Zweck vorgesehene Array kopieren?
Ich frage mich. Warum nicht weiter gehen?
An wen ist die Frage gerichtet - an den Autor oder an die Entwickler?
Wenn an die Entwickler, was genau schlagen Sie vor?
Liegt ein Fehler in der Funktion StringExplode vor? In ihrer jetzigen Form kopiert sie die letzte Komponente der Zeichenkette nicht, wenn sich kein Begrenzungszeichen dahinter befindet (d.h. am Ende der Zeichenkette). IMHO sollte das Ende der Zeichenkette übernommen werden, auch wenn kein Begrenzungszeichen am Ende steht. Beispiel: Wir füttern die Zeichenkette"EURUSD,EURJPY" mit dem Trennzeichen "," und die Funktion wählt nun nur EURUSD aus.
Hier ist die korrigierte Version der Funktion, der Einfachheit halber habe ich die Anzahl der Elemente zurückgegeben:
int StringExplode(string s, string separator, string &result[]) { int i, pos; ArrayResize(result, 0); for(i = 0; ; i++) { ArrayResize(result, ArraySize(result) + 1); pos = StringFind(s, separator); if(pos >= 0) { result[i] = StringSubstr(s, 0, pos); s = StringSubstr(s, pos + StringLen(separator)); } else { result[i] = s; i++; break; } } return(i); }
Es gibt eine sehr ernste Warnung für diejenigen, die häufige Aufrufe von DLL-Funktionen wie Get/Set verwenden.
Um die Systemsicherheit zu gewährleisten, durchläuft jeder DLL-Aufruf einen speziellen Stripper, der die Ausführung verlangsamt. Ein DLL-Funktionsaufruf ist kein banaler XXXX-Aufruf, sondern ein komplexes Wrapping mit Adressmaskierung, Stapelkontrolle und Abstürzen innerhalb der DLL. MQL5 sorgt dafür, dass, wenn eine Funktion innerhalb der DLL den Stack durcheinanderbringt oder abstürzt, die Skriptausführung angehalten wird, ohne dass das Terminal selbst abstürzt.
Allgemeiner Ratschlag zur Verwendung von DLL-Funktionen: Versuchen Sie, seltene Aufrufe mit einer großen Menge an Arbeit darin zu machen, anstatt zehntausende von Aufrufen pro Sekunde mit der Übertragung kleiner Ergebnisse.
Übrigens noch eine Bemerkung zu mehrfachen DLL-Aufrufen - beim Testen habe ich festgestellt, dass bei jedem Aufruf Speicherlecks von mehreren Bytes auftreten
Gibt es keinen Fehler in der StringExplode-Funktion? In ihrer jetzigen Form kopiert sie die letzte Komponente der Zeichenkette nicht, wenn kein Begrenzungszeichen dahinter steht (d.h. am Ende der Zeichenkette). IMHO sollte das Ende der Zeichenkette übernommen werden, auch wenn kein Begrenzungszeichen am Ende steht. Beispiel: Wir füttern die Zeichenkette"EURUSD,EURJPY" mit dem Trennzeichen "," und die Funktion wählt nun nur EURUSD aus.
Hier ist die korrigierte Version der Funktion, der Einfachheit halber habe ich die Anzahl der Elemente zurückgegeben:
Vielen Dank, ich habe nicht darauf geachtet. Sie können sehen, weil das letzte Element im Deskriptor eine Zufallszahl ist, die keine Bedeutung hat.
---------
Ich danke Ihnen! Ich werde alle Verbesserungsvorschläge so weit wie möglich umsetzen. Die Idee an sich ist gut, ich möchte nicht, dass sie ins Stocken gerät.
An wen ist die Frage gerichtet - an den Autor oder an die Entwickler?
Wenn an die Entwickler, was genau schlagen Sie vor?
Autor. Man kann die Array-Größe mit übergeben, dann kann man das einmalige Kopieren des Arrays direkt von Speicher zu Speicher organisieren - sehr billig und umgeht die Probleme in MQL4 mit Element-für-Element-Referenzen. Ich habe jetzt eine Menge zu tun, sonst hätte ich ein Beispiel geschrieben.... Ich hoffe, Sie haben das Wesentliche verstanden.
Im Voraus... -- wenn Sie Sperren verwenden und die Übertragung korrekt implementieren, sollte dieser Ansatz sicher sein.
Wie kompliziert das ist!...
Mit der Hilfe von Ilnur habe ich vor einem Jahr eine Bibliothek in MQL4 für die Arbeit mit Speicher geschrieben. Man kann Speicher zuweisen, Zeiger verschieben, schreiben und lesen, den Namen eines Speicherbereichs an ein anderes Programm übertragen.
Alles basiert auf Mapping. Es ist viel einfacher als das vorgeschlagene Programm.
Wie kompliziert das ist!...
Mit der Hilfe von Ilnur habe ich vor einem Jahr eine Bibliothek in MQL4 für die Arbeit mit Speicher geschrieben. Man kann Speicher zuweisen, Zeiger verschieben, schreiben und lesen, den Namen eines Speicherbereichs an ein anderes Programm übertragen.
Alles basiert auf Mapping. Es ist viel einfacher als der vorgeschlagene Ansatz.
Es gibt eine sehr ernste Warnung für diejenigen, die häufige Aufrufe von DLL-Funktionen wie Get/Set verwenden.
Um die Systemsicherheit zu gewährleisten, durchläuft jeder DLL-Aufruf einen speziellen Stripper, der die Ausführung verlangsamt. Ein DLL-Funktionsaufruf ist kein banaler XXXX-Aufruf, sondern ein komplexes Wrapping mit Adressmaskierung, Stapelkontrolle und Abstürzen innerhalb der DLL. MQL5 sorgt dafür, dass, wenn eine Funktion innerhalb der DLL den Stack durcheinanderbringt oder abstürzt, die Skriptausführung angehalten wird, ohne dass das Terminal selbst abstürzt.
Allgemeiner Ratschlag zur Verwendung von DLL-Funktionen: Versuchen Sie, seltene Aufrufe mit einer großen Menge an Arbeit darin zu machen, nicht zehntausende von Aufrufen pro Sekunde mit kleinen Zwischenergebnissen.
Vielen Dank an den Autor, es ist keine kleine Bibliothek, mit der richtigen Verwendung und
und "Kreuze, die nicht im Widerspruch zu den Gesetzen der Genetik" können Sie gute Ergebnisse zu erhalten.
Ich, zum Beispiel, schließlich "zog" die Daten aus Offline-Charts, im Online-Modus))). MT4-Plattform.
Ein Löffelchen voll Teer)))
Mehr als einmal gab es Situationen, in denen in der Liste der globalen Variablen
in der Liste der globalen Variablen waren "alt" aus irgendeinem Grund nicht gelöscht.
Ich kann den Grund dafür noch nicht herausfinden.

- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Neuer Artikel Sehr einfach: Der Datenaustausch zwischen Indikatoren :
Autor: Alexey Subbotin