Fehler, Irrtümer, Fragen - Seite 1658

 
Alexey Volchanskiy:

Unabhängig von der Frage ist der Aufruf einer Funktion immer langsamer als der Zugriff auf eine Variable auf dem Stack, in diesem Fall nType.

Ungeachtet dieser Offensichtlichkeit ging es in der Frage um Inline-Funktionen. D.h. wird OrderType() nicht zur Kompilierzeit durch etwas wie order.type ersetzt.

Ich persönlich cache solcheMQL-Funktionsaufrufe immer, wie in Ihrem zweiten Fall.

Wie die Messungen gezeigt haben, ist das unnötig.

 
Sergei Vladimirov:

Ungeachtet dieser Offensichtlichkeit ging es in der Frage um Inline-Funktionen. D.h. wird OrderType() beim Kompilieren nicht durch etwas wie order.type ersetzt.

Wie die Messungen gezeigt haben, ist dies nicht notwendig.

Nach der internen Implementierung von Arrays zu urteilen, muss die gleiche ArraySize inline sein. Aber ich verwende es immer so (ich habe es nicht gemessen)

Anstelle von

for (int i = 0; i < ArraySize(Array); i++)

Ich benutze

const int Amount = ArraySize(Array);

for (int i = 0; i < Amount; i++)
Was die Leistung betrifft, so war ich kürzlich von folgender Tatsache überrascht

Forum für Handel, automatisierte Handelssysteme und Strategietests

Wie gehe ich eine Aufzählung konsequent durch?

fxsaber, 2016.08.22 09:13

Statisch zum Array hinzugefügt. Es funktioniert fast dreimal schneller als ein Schalter! Schmeißen Sie einen solchen Schalter weg. Danke für den Tipp!
Es scheint also besser zu sein, sich nicht auf die Optimierung des Compilers zu verlassen, sondern ihm immer durch möglichst kleine Funktionsaufrufe zu "helfen" und überall dort, wo es möglich ist, logischerweise const und static zu verwenden.
 
Sergei Vladimirov:

Ungeachtet dieser Offensichtlichkeit ging es in der Frage um Inline-Funktionen. D.h. wird OrderType() beim Kompilieren nicht durch etwas wie order.type ersetzt.

Wie die Messungen gezeigt haben, ist das unnötig.

Sie haben es selbst geschrieben:

Sergei Vladimirov2016.09.01 02:53 RU

Ich habe es selbst überprüft. Der zweite Code läuft 4 Mal schneller. Es ist alles klar, die Frage ist vom Tisch.

 
Sergei Vladimirov:
Ich habe es selbst getestet. Der zweite Code läuft viermal schneller. Alles ist klar, die Frage ist geklärt.
Messen Sie nicht nur im Profiling-/Debug-Modus. Dort gibt es überhaupt keine Inline. Nur die Release-Version sollte dort zu finden sein.
 
Inv Андрей Иващенко:

Guten Tag!

Meine Herren Offiziere, können Sie mir sagen, wo ich anfangen soll, eine Wanze zu fangen?

Multicurrency Expert Advisor. Nach dem ersten Handel stoppt das Testgerät.

Es wird ein Fehler ausgegeben, dessen Code ich nicht finden kann.

Ja, der Tester funktioniert ab dem Startdatum 2016.05.01. Wenn ich dieses Datum ändere, stoppt der Tester und es tritt ein Fehler auf, siehe Protokoll unten.

Bitte um Hilfe!

Antwort an mich selbst:

Dies ist ein Fehler im Testprogramm. Zunächst müssen Sie das Handle eines technischen Indikators in OnInit zu allen Symbolen hinzufügen, mit denen der Expert Advisor arbeitet.

 
Alexey Volchanskiy:

Sie haben es selbst geschrieben:

Sergei Vladimirov2016.09.01 02:53 RU

Ich habe es selbst überprüft. Der zweite Code läuft 4 Mal schneller. Es ist alles klar, die Frage ist vom Tisch.

Im nächsten Kommentar schrieb ich Zahlen: der Gewinn bei einer einzigen Operation beträgt 1 Nanosekunde. Bei der Optimierung einer Strategie nach Ticks über einen Zeitraum von zwei Jahren und mehreren tausend Durchläufen kann es sinnvoll sein, ein ns zu sparen. Aber im realen Handel...
 
A100:

In Build 1398 ist die Fehlermeldung "EX5 loading failed" immer noch vorhanden (offenbar nicht im Zusammenhang mit diesem Beispiel).

In der korrigierten Version 1400 wird der Fehler in einem ähnlichen Fall nun als "reiner virtueller Funktionsaufruf " wiedergegeben. Und ohne Kommentar geht's auch

//Script1.mq5
typedef void (*fn)();
#import "Script2.ex5"
        void g( fn );
#import
void h() /*export*/ {} //если export без комментария - нормально
void OnStart() { g( h ); }
//Script2.mq5
#property library
typedef void (*fn)();
void g( fn f ) export { f(); }
 

Kann nicht angewandt werden :: um Mehrdeutigkeiten aufzulösen


#import "Script1.ex5"
        void g();
#import "Script2.ex5"
        void g();
#import
typedef void (*fn)();
void OnStart()
{
        Script1::g(); //нормально
        Script2::g(); //нормально
        fn f = Script1::g; //Error
}
 
Inv Андрей Иващенко:

Antwort an mich selbst:

Dies ist ein Fehler im Testgerät. Zunächst müssen Sie in OnInit allen Symbolen, mit denen der Expert Advisor arbeitet, ein Handle eines beliebigen technischen Indikators hinzufügen.

Und es scheint, dass das Problem auftritt, wenn nur der erste Tick auf einen neuen Balken, der Tester scheint zu "stecken" und hinkt 1 bar hinter, das heißt, der EA denkt, dass der Balken nicht existiert und in der Visualisierung es wirklich nicht, aber nach ein paar Sekunden der Balken erscheint, im Falle der Prüfung auf M1 der richtige Wert kommt auf dem zweiten Tick (wenn ich richtig verstehe), ich hoffe, dass die Entwickler dieses lästige Moment so bald wie möglich beheben ...

Zusatz:

Es stellt sich heraus, dass man, um diesen Punkt zu umgehen, den ersten Tick eines neuen Balkens künstlich überspringen muss...

 
Das Debuggen von EA auf RTS-9.16 BCS-MetaTrader5 mit CTRL+F5 ist nicht möglich. Der Prüfer schreibt
Tester  Leverage 1:1 set error