Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Datenaktualisierung (http://www.expert-advisor.com/forum/showthread.php?t=6797)

traderdoc 09.10.20 20:01

Datenaktualisierung
 
Jetzt habe ich tatsächlich einen Bug im MT4 gefunden:

Wenn man z.B. schreibt:

datetime draw_time = iTime(NULL, PERIOD_H1, 1);

Und man öffnet eine neues Chartfenster (default-Datei im M5 abgespeichert) , so dass das Chart im M5 öffnet, mit einem WP welches "lange" nicht benutzt wurde (sprich wo die Kurse intern "lange" nicht aktualisiert wurden), dann steht in draw_time eine Zeit, die definitv nicht der vorletzten Kerze des H1 entspricht.

Wer kennt eine Methode, nach dem Öffnen des Charts und Laden des EAs die Historie dieses WP aus dem EA-Programm heraus automatisch zu aktualisieren?

traderdoc

Indikator-Trading 09.10.20 20:50

Vielleicht helfen dir diese beiden Funktionen:
SymbolIsSynchronized()
SymbolSelect()


Ich habe sie mal in einem von mir geschriebenen CurrencyStrange Indicator verwendet.

Beispiel für die OnInit()-Funktion mit EURUSD:
Code:

if(!SymbolIsSynchronized("EURUSD"))
        SymbolSelect("EURUSD",true);


traderdoc 09.10.20 21:06

Zitat:

Zitat von Indikator-Trading (Beitrag 44541)
Vielleicht helfen dir diese beiden Funktionen:
SymbolIsSynchronized()
SymbolSelect()


Ich habe sie mal in einem von mir geschriebenen CurrencyStrange Indicator verwendet.

Beispiel für die OnInit()-Funktion mit EURUSD:
Code:

if(!SymbolIsSynchronized("EURUSD"))
        SymbolSelect("EURUSD",true);


Danke, aber das hilft auch nicht.
Die Funktion SymbolIsSynchronized() steht nicht mal im Hilfeindex. Ein Compilerfehler wird aber auch nicht angezeigt.

Das Problem ist sofort behoben, wenn man nach Öffnen des Charts im M5 auf irgendein anderes TF wechselt und wieder zurück zu M5 geht oder wenn man den EA frisch raufgezogen hat, mit F7 die Eigenschaften aufruft, nichts ändert, sondern nur OK drückt.

Das ist schon merkwürdig!

traderdoc

Indikator-Trading 09.10.20 21:11

Per Google-Suche:

while(!SeriesInfoInteger(_Symbol,0,SERIES_SYNCHRON IZED))Comment("Synchronizing");
Comment("Ready");

Würde ich nur ohne While-Schleifen machen, da du sonst ggf. für ewig drin gefangen bist.

Ca$hDigger 09.10.20 21:16

Zitat:

Zitat von traderdoc (Beitrag 44540)
datetime draw_time = iTime(NULL, PERIOD_H1, 1);
traderdoc

Versuche doch mal den Value einfach auf anderem Wege abrufen zB über MqlRates und CopyRates().

ps: bei MT5 kann ich per MqlTick und CopyTicks() das (nach)laden der History erzwingen.

traderdoc 09.10.20 21:27

Zitat:

Zitat von Indikator-Trading (Beitrag 44543)
Per Google-Suche:

while(!SeriesInfoInteger(_Symbol,0,SERIES_SYNCHRON IZED))Comment("Synchronizing");
Comment("Ready");

Würde ich nur ohne While-Schleifen machen, da du sonst ggf. für ewig drin gefangen bist.

Auch SERIES_SYNCHRONIZED ist nach dem Hilfeindex kein existierender Parameter.
Funktioniert aber trotzdem nicht.

traderdoc 09.10.20 21:37

Zitat:

Zitat von Ca$hDigger (Beitrag 44544)
Versuche doch mal den Value einfach auf anderem Wege abrufen zB über MqlRates und CopyRates().

ps: bei MT5 kann ich per MqlTick und CopyTicks() das (nach)laden der History erzwingen.

Leider keine Chance!
Das kann es doch nicht geben!

Indikator-Trading 09.10.20 23:03

Eigentlich brauchst du doch nur RefreshRates() zu nutzen oder?

Wenn RefreshRates() == false ist, dann müssen die Daten in der History aktuell sein. Also müsstest du solange warten, bis dieser Fall eingetreten ist.

Ich hab die Funktion nie genutzt, aber vielleicht läuft anderenfalls (also falls der EA nicht einfach bei RefreshRates anhält bis alle Daten geladen worden sind, müsstest du mal selbst austesten) läuft dein EA schon weiter, da RefreshRates() == true ist, aber die History noch nicht komplett geladen worden ist.

Hier ein Link zu einem Artikel. Ist aber für den MT5, kannst aber vielleicht dennoch was für dich mitnehmen:

https://www.mql5.com/en/docs/series/timeseries_access

traderdoc 10.10.20 11:43

Nein, RefreshRates() löst das Problem eigenartigerweise auch nicht. Das war auch mein erster Gedanke, zumal man die Funktion immer vor der Orderöffnung einsetzt, um aktuelle Kurswerte zu verarbeiten.

Der Link führt leider wie so häufig zu MQL5-Seiten und MQL5 "tickt" aber nun mal anders. Es sollte auch gestern für den MT5 ein Update kommen, in welchem die Kurshistorie vielfach berücksichtigt wurde:

https://www.mql5.com/de/forum/353030

traderdoc

Ca$hDigger 10.10.20 12:19

Scheint so, als würden die Funktionen beim Abruf nicht blockieren bis die Kurse aktualisiert sind und so dann einen alten Wert zurück liefern.
Angenommen die Funktionen iTime() CopyRates() etc blockieren bei MT4 nicht selbst, sorgen aber hoffentlich dafür, dass die History angefangen wird zu laden, dann wäre eine mögliche Lösung manuell etwas zu warten:

Schleife:
1. Funktion aufrufen (um damit das Laden der Kurse zu triggern) Wert ignorieren bis wirklich aktuell.
2. Sleep(5000);
Wiederhole solange bis die Kurse wirklich aktuell sind. -> break


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:47 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum