Sehr merkwürdiges Verhalten des MT5 - Seite 2

 
liju1970:

Richtig, OnTick().

Aber genau das meinte ich ja weiter oben, das laut Doku von der OnInit() gesprochen wird - allerdings in Indikatoren.


Ihr seid also der Meinung, das das ungeahnte Effekte haben kann?

Komisch nur, das in einer Vielzahl an Backtests die Ergebnisse reproduzierbar gleich sind. "Nur" im heutigen Live betrieb gab es dbzgl. ein Problem...

Aber gut, ich mache mir Gedanken, wie ich es vernünftig um designen kann.

Die OnInit() ist immer im EA


Möglich, deswegen erstmal das Standarddesign nutzen.

Möglich das du ja die ganze Zeit gleich falsche Ergebnisse hattest und nach einen eventuellen MT5 Update gehts schief.

Und nun gabs eben mal eine Auswirkung.


Wenn du weiterhin Merkwürdigkeiten hast nutze den Debugger.

Synchronisiere beide EAs über die GlobalParameters.

Schema:


EA1 ****

Trade.entry()

set Global.ea1.entry = buy
Timer(500ms)
if Global.ea1.entry != Global.ea2.entry

  set Global.debug
  
  DebugBreak()

if Global.debug
   DebugBreak()





EA2 ******


Trade.entry()

set Global.ea1.entry = sell
Timer(500ms)
if Global.ea1.entry != Global.ea2.entry

  set Global.debug
  
  DebugBreak()

if Global.debug
   DebugBreak()

Bei ungleichheit springt der Debugger an und dann schaust du dir alle Werte an.

Dann findest du auch was wie warum anders war.

 

Daß die OnInit() in EA's existiert ist mir bewußt. Für verschiedene Zwecke nutze ich sie sogar.

Allerdings wird der Metatrader Indikatoren und EA's vermutlich unterschiedlich behandeln, da ja der Einsatzzweck ein anderer ist.

Und da das/die Handles bei jedem Aufruf gleich waren und nicht neu vergeben wurden, dachte ich, der MT könnte das.

@amando: ArraySetAsSeries stellt doch nur die Daten-Reihenfolge (Sortierrichtung) ein...?


Danke erstmal!

 

Ups sehe grade das du 2 Instanzen benutzt.

Dann sind die Globals ja nicht zielführend.

Nimm dann die Sockets oder ein File zum Synchronisieren.

 
Wenn Du bei jedem Tick zwei neue Handle erstellst, verlangsamst Du erstmal Deinen EA, weil die Historie ja immer wieder neu berechnet werden muss und, da Du keines Deiner Handles schließt hast Du irgendwann die Obergrenze erreicht - entweder der Handles oder des RAMs und Dein PC crasht.
 
Carl Schreiber:
Wenn Du bei jedem Tick zwei neue Handle erstellst, verlangsamst Du erstmal Deinen EA, weil die Historie ja immer wieder neu berechnet werden muss und, da Du keines Deiner Handles schließt hast Du irgendwann die Obergrenze erreicht - entweder der Handles oder des RAMs und Dein PC crasht.

Die Funktion wird je Tag nur in einer gewissen Zeitspanne aufgerufen, um zu entscheiden, ob und in welche Richtung gehandelt werden soll.

Grundsätzlich ist mir die Problematik mit Handles, RAM, etc. klar, allerdings ging ich - wie schon erwähnt - davon aus, daß der MT das intern auf die Reihe bekommt, da bei meinen Tests im Debugger innerhalb eines Testlaufs das Handle je EMA immer den gleichen (int) Wert hatte und ich somit darauf schloß, daß das Handle das Gleiche ist.

Das Ganze ist das Ergebnis einer möglichst großen Variabilität (verschiedene Indikatoren) meines EA.

Aber letztlich ist etwas faul daran, sonst hätte ich dieses Problem heute nicht gehabt ;-)

Danke nochmal!

 
liju1970 :

Die Funktion wird je Tag nur in einer gewissen Zeitspanne aufgerufen, um zu entscheiden, ob und in welche Richtung gehandelt werden soll.

Grundsätzlich ist mir die Problematik mit Handles, RAM, etc. klar, allerdings ging ich - wie schon erwähnt - davon aus, daß der MT das intern auf die Reihe bekommt, da bei meinen Tests im Debugger innerhalb eines Testlaufs das Handle je EMA immer den gleichen (int) Wert hatte und ich somit darauf schloß, daß das Handle das Gleiche ist.

Das Ganze ist das Ergebnis einer möglichst großen Variabilität (verschiedene Indikatoren) meines EA.

Aber letztlich ist etwas faul daran, sonst hätte ich dieses Problem heute nicht gehabt ;-)

Danke nochmal!

Nein, es ist dir nicht klar. Das Problem liegt in Ihrem Code aufgrund Ihres Missverständnisses der Funktionsweise von MT5.

Sie müssen Ihren iCustom in OnInit () platzieren oder zumindest sicherstellen, dass Ihr Indikator bereit ist, bevor Sie CopyBuffer () aufrufen.

 
Alain Verleyen:

Nein, es ist dir nicht klar. Das Problem liegt in Ihrem Code aufgrund Ihres Missverständnisses der Funktionsweise von MT5.

Sie müssen Ihren iCustom in OnInit () platzieren oder zumindest sicherstellen, dass Ihr Indikator bereit ist, bevor Sie CopyBuffer () aufrufen.

Wenn Du mit "Grundsätzlich" nur die MT/MQL-Welt verbindest, dann hast Du damit Recht, daß es mir nicht klar ist ;-)

Aber Du kannst mir bestimmt einige spezifische MQL5-Fragen beantworten:

1. Muß ein Indikator-Handle (z.B. via "iMA(...)") im Rahmen eines EA zwingend im OnInit() erzeugt werden?

2. Falls mehrmals hintereinander ein Indikator-Handle mit dem gleichen Aufruf (also z.B. "iMA(...)" mit identischen Parametern) erzeugt würde, vergibt MT dann separate Handles, oder wird das bereits beim ersten Aufruf erzeugte Handle zurückgegeben?


"iCustom" nutze ich nicht.

Daß ich "CopyBuffer(...)" nach dem Erzeugen des Indikator-Handles aufrufe, sollte aus meinem Code-Auszug hervorgehen.

 
liju1970 :

Wenn Du mit "Grundsätzlich" nur die MT/MQL-Welt verbindest, dann hast Du damit Recht, daß es mir nicht klar ist ;-)

Aber Du kannst mir bestimmt einige spezifische MQL5-Fragen beantworten:

1. Muß ein Indikator-Handle (z.B. via "iMA(...)") im Rahmen eines EA zwingend im OnInit() erzeugt werden?

2. Falls mehrmals hintereinander ein Indikator-Handle mit dem gleichen Aufruf (also z.B. "iMA(...)" mit identischen Parametern) erzeugt würde, vergibt MT dann separate Handles, oder wird das bereits beim ersten Aufruf erzeugte Handle zurückgegeben?


"iCustom" nutze ich nicht.

Daß ich "CopyBuffer(...)" nach dem Erzeugen des Indikator-Handles aufrufe, sollte aus meinem Code-Auszug hervorgehen.

iCustom, iMA oder was auch immer "iFunction", das einen Indikator zurückgibt, funktioniert alle gleich, kein Unterschied, deshalb habe ich über iCustom gesprochen.

Wenn Sie den Indikator mit einer iFunction () starten, dauert die Berechnung einige Zeit. Sie müssen dies berücksichtigen. Der einfachere Weg, dies zu tun, besteht darin, den Aufruf in OnInit () zu platzieren. Nehmen Sie niemals an, dass die Plattform intern funktioniert. Ich kann Ihnen versichern, dass sie nicht so funktioniert, wie Sie denken. Ja, wenn iMA, iCustom, iXYZ mit identischen Parametern platziert werden, kann dies zu unterschiedlichen Indikatoren und Handles führen. Sie haben keine Kontrolle darüber, nehmen Sie also nichts an und Ihr Code wird weiterhin funktionieren.

 
liju1970:

"iCustom" nutze ich nicht.

Daß ich "CopyBuffer(...)" nach dem Erzeugen des Indikator-Handles aufrufe, sollte aus meinem Code-Auszug hervorgehen.

Ich würde Dir dringend empfehlen, einen der Beispiel-EAs des MT5 aus ..\MQL5\Experts\Examples zu nehmen und zu studieren, wie das dort gemacht ist! Die sind von denen geschrieben, die alles programmiert haben. Man kann also annehmen, dass sie bestens auf korrekte und schnelle Ausführung ausgelegt sind.

 
Danke nochmal an alle für die Infos!
Grund der Beschwerde: