Mir schaut das sehr nach einem typischen Problem eines Thread Races aus.
Metaquotes hat versucht beim MT5 zu parallelisieren was geht. Und jetzt ist der lokale PC schneller als die Kurse eintrudeln können.
Warum verschiebst Du Deine Lösung nicht in OnCalclate() mit einem return(0) (= alles neu berechnen) und einem ChartRedraw(0) - hast Du das schon mal versucht.
Es gibt bestimmte Dinge der Initialisierung, die man leider nicht in OnInit() durchführen kann, weil die Kurse noch nicht da sind und zB. ein Indikator kein Sleep kennt.
Ein Beispiel dafür ist diese Lösung eines Indiaktors (iTrend, der andere verwendet als erstes in in OnCalcualte():
//---- checking the number of bars to be enough for the calculation if(BarsCalculated(BandsHandle)<rates_total || BarsCalculated(BearsHandle)<rates_total || BarsCalculated(BullsHandle)<rates_total || rates_total<min_rates_total) return(RESET);
Unübersichtlicher wird es wenn die OOP verwendest und die Instanzen mit Kursen initialisieren musst :(
Der Vorteil von OnCalculate() ist, dass sie bei jedem Tick neu aufgerufen wird, von daher meine ich, wäre Deine "Preissuche" besser in OnCalculate() aufgehoben.
Nur so eine Idee, da ich nicht weiß, ob das bei Deinem Problem funktionieren würde.
Beim Grünen Tee kam mir jetzt die Idee, man könnte ja einen KursLadeIndikator.mq5 schreiben, der eigentlich nix tut als das Vorhandensein von genug Tickdaten prüft, dann rates_total zurückgibt andernfalls 0 und nach der Prüfung in OnCalculate() wieder gelöscht wird:
//---- checking the number of bars to be enough for the calculation if(NeedMore && BarsCalculated(HDL_KursLadeIndikator)<rates_total || rates_total<min_rates_total) return(RESET); NeedMore = false; IndicatorRelease(HDL_KursLadeIndikator);
Beim Grünen Tee kam mir jetzt die Idee, man könnte ja einen KursLadeIndikator.mq5 schreiben, der eigentlich nix tut als das Vorhandensein von genug Tickdaten prüft, dann rates_total zurückgibt andernfalls 0 und nach der Prüfung in OnCalculate() wieder gelöscht wird:
Ich hab keine Ahnung wieso keiner das Problem, bzw. die Tatsachen sieht.
Ich habe doch bewußt die Lösung mit der OnInit() gewählt, weil diese Aktion nur ein einziges mal erforderlich ist,
nämlich beim Start des Metatraders. ChartRedraw() hat mit den Tickdaten im Marketwatch überhaupt nix zu tun.
Ich hab auch keine Frage gestellt, sondern eine Lösung präsentiert.
Zum besseren Verständnis: Startet man bei geschlossenem Markt den MT5 (beim MT4 ist es genauso) und schaut sich im Marketwatch die Ticks an, ist das Fenster vollkommen leer.
Mit obigem Indi sind die Tickdaten wie durch Zauberhand plötzlich da. Für ALLE Symbole.
Grüße Otto
Ah - da habe ich Dich falsch verstanden, 'tschuldigung. Ich dachte es ginge bei Dir um ein Tickchart als Hauptchart.
Ich habe dort das Problem, dass ich bei der Initialisierung von Instanzen warten muss, bis die Kurse da sind und deren Laden extra forcieren muss/will.
Ah - da habe ich Dich falsch verstanden, 'tschuldigung. Ich dachte es ginge bei Dir um ein Tickchart als Hauptchart.
Ich habe dort das Problem, dass ich bei der Initialisierung von Instanzen warten muss, bis die Kurse da sind und deren Laden extra forcieren muss/will.
Na da hätt ich doch was fertiges. Dieser Indi berechnet den SMA, EMA, WMA im Tickchart.
Ich häng da das ex5 an. Bei Interesse schick ich dir die mq5 und die zugehörigen mqh.
Dieser Indi verwendet auch CopyTicks(..) damit er die Daten sofort hat.
- 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.
Schon seit langem hat es mich gestört, daß im 'Market Watch', Tab 'Ticks',
nach einem Neustart des Terminals ein Kurssprung (Gap) entstand, da das Terminal die Tickdaten nicht aktualisiert.
Auch im build 1910 hat sich daran nichts geändert. Urgenz beim Servicedesk brachte nichts.
Angeregt durch eine Anfrage hier im Forum https://www.mql5.com/de/forum/283940 ist mir eine Lösung eingefallen.
In Form eines Indikators, der nur in irgend einem Chart unsichtbar und unbemerkt läuft, aber seinen Zweck erfüllt.
Er benötigt eigentlich nur die OnInit(), die OnCalculate() muss lediglich für den Compiler vorhanden sein, damit er den Code als Indikator erkennt.
Anderenfalls erscheint die Meldung: 'OnCalculate function not found in custom indicator'.
Nur so nebenbei: OnInit() und OnDeinit() können bedenkenlos weggelassen werden. Also ein Indikator benötigt einzig und allein die OnCalculate.
Gleiches gilt für EAs. Nur die OnTick ist erforderlich.
Viel Freude damit, für den der's auch brauchen kann.