Expert Advisor funktioniert im Strategietester, aber nicht auf dem Liveaccount - Seite 2

 

Kann man mit gloable variablen oder csv files übergeben

aber ich versteh noch immer nicht was du machen willst

 
Im englischen Forum wurde mir ein Tipp gegeben, es vielleicht über einen schnellen Timer zu versuchen, was ich jetzt mal versuchen werde.
 
DasUnding:

Also so wie ich das verstehe, braucht man ein Fenster auf das der EA angewendet wird - also sollte er erstmal auf einem Chart laufen. Im Code selber werden aber Preisabfragen für alle Symbole gemacht und entsprechende Kriterien ausgewertet. Im Strategietester wird der Test mit einem Symbol gestartet, jedoch über SymbolSelect die anderen ebenfalls "rangeholt". Dies funktioniert auch, er handelt, dann im Tester alle 36 Symbole und gibt mir ein entsprechendes Chart-Bild für jedes Symbol aus.

So wie ich das nun verstehe, ist es mögliche, einen oder mehrere EAs pro "Symbol-Chart" auszuführen und die Variablen an weitere Instanzen  zu übergeben. Wie würde man das machen? Bzw. welche Befehle braucht man dazu, bzw wie funktioniert die Übergabe? Also am Beispiel einer einfachen Zahl int i=1;

Also ich habe einen EA der an Symbol A anliegt und einen an Symbol B

Ich habe nun einen Zahl in A int i=1; Wie kann ich sie in B abrufen?

Entweder über die Globalvariablen (GlobalVariableGet,GlobalVariableSet,etc.) oder mittels Events, die mit EventChartCustom() gesendet werden.

EventChartCustom() halte ich für eleganter, allerdigs etwas aufwändiger. EAs schicken einander Meldungen die mit OnChartEvent() empfangen werden können.

Kommnikation mittels Dateien wären eine weitere Möglichkeit.

 
Otto Pauser:

Entweder über die Globalvariablen (GlobalVariableGet,GlobalVariableSet,etc.) oder mittels Events, die mit EventChartCustom() gesendet werden.

EventChartCustom() halte ich für eleganter, allerdigs etwas aufwändiger. EAs schicken einander Meldungen die mit OnChartEvent() empfangen werden können.

Kommnikation mittels Dateien wären eine weitere Möglichkeit.

Ok ich danke dir erstmal, ich werde die Geschichte mal umbauen und weitersehen.

 
DasUnding :

Ok ich habe jetzt das  Profiling  durchgeführt. Quasi die gesamte zeit wird in CopyBuffer verbracht. Ich verstehe nur nicht genau, warum sich das Programm Live anders verhält wie im Tester. Selbst wenn die Zeit dort verbracht wird, müsste man das doch im Tester merken.

Zwei Bilder dazu sind unten.


Live:

https://www.bilder-upload.eu/bild-138b28-1579512841.jpg.html


Strategietester:

https://www.bilder-upload.eu/bild-d18e16-1579513272.jpg.html

16 Ticks und 6912 Aufruf von CopyBuffer ()? Das sind 432 Aufrufe pro Tick, Sie haben für jedes Symbol in jedem Tick 12 Aufrufe an CopyBuffer getätigt?

Sie müssen Ihren Code reparieren. Geben Sie den entsprechenden Code ein, wenn Sie Hilfe benötigen.

 
Otto Pauser :

Wenn ich es recht verstehe läuft dieser EA auf EINEM Chart.

Was ist wenn auf diesem Chart kein Tick reinkommt? Dann handelt der EA nicht.

Also müsste der EA durch einen Timer 'angestupst' werden um zu handeln.

Diese Vorgehensweise halte ich nicht für klug.

Auf jedem Chart eine Instanz des EAs laufen lassen halte ich für besser,

und diese mit den bereits besprochenen 'Globalen Variablen' steuern.

Das kannst du auf mehreren Instanzen des MT5 auf einem PC laufen lassen, oder auf mehreren PCs.

Warum ? Die Verwendung eines Timers mit mehreren EA-Symbolen ist problemlos möglich. Es funktioniert perfekt, wenn es richtig gemacht wird.

 
Alain Verleyen:

Warum ? Die Verwendung eines Timers mit mehreren EA-Symbolen ist problemlos möglich. Es funktioniert perfekt, wenn es richtig gemacht wird.

Was passiert wenn die Zeit der Berechnung die Timerzeit von OnTimer() übersteigt? Der Code wird vermutlich bis zum Ende ausgeführt und die Triggerzeit von z.B. 500ms übersprungen und bis zum nächsten gewartet oder direkt neu gestartet? Oder doch ganz anders?

---

So wie es aussieht scheint mein Problem nur am Anfang zu existieren, also beim ersten Durchlauf der Schleife (rund 32s), danach ist die Ausführung des Codes wie erwartet schnell (<1s)

 
DasUnding:

Was passiert wenn die Zeit der Berechnung die Timerzeit von OnTimer() übersteigt? Der Code wird vermutlich bis zum Ende ausgeführt und die Triggerzeit von z.B. 500ms übersprungen und bis zum nächsten gewartet oder direkt neu gestartet? Oder doch ganz anders?

---

So wie es aussieht scheint mein Problem nur am Anfang zu existieren, also beim ersten Durchlauf der Schleife (rund 32s), danach ist die Ausführung des Codes wie erwartet schnell (<1s)

dann musst du den Code mal durchgehen und schauen wo es klemmt