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)
-   -   aktuelle Kerzen lesen (http://www.expert-advisor.com/forum/showthread.php?t=5737)

amk 05.07.17 11:51

aktuelle Kerzen lesen
 
Hallo,

dies ist ein tolles Forum und so hoffe ich auf eine kleine Unterstützung bei meiner Frage:
In meinem kleinen EA lese ich in der Init-Phase die Open-Kurse der jüngsten 5 Kerzen und zwar für folgende Zeitebenen: M1, M5, M15 und M30:
iOpen(NULL, PERIOD_M1, 0)
iOpen(NULL, PERIOD_M1, 1)
iOpen(NULL, PERIOD_M1, 2)
...
iOpen(NULL, PERIOD_M5, 0)
iOpen(NULL, PERIOD_M5, 1)
iOpen(NULL, PERIOD_M5, 2)
...
usw.

Nun habe ich festgestellt, dass die Open-Kurse nur in der Zeitebene gültig sind, die im Chart-Window sichtbar ist. Die Open-Kurse in den anderen Zeitebenen sind veraltet und beziehen sich noch auf die Zeit des letzten Login.

Offensichtlich werden beim EA-Start nur die Daten der Zeitebene des Chart-Windows aktualisiert.

Der Befehl " RefreshRates(); " bewirkt nichts. Er wirkt wohl nur auf die Daten der Zeitebene des Chart-Windows. Und die sind ja aktuell.

Dann habe ich das Lesen der Open-Kurse in die Tick-Phase verschoben: Leider ohne Erfolg. Auch hier sind beim ersten Tick die Open-Kurse in den nicht sichtbaren Zeitebenen veraltet.

Ich habe den Eindruck, dass die Open-Kurse in den nicht sichtbaren Zeitebenen erst beim zweiten Tick aktuell werden.

Frage:
Gibt es eine Möglichkeit, schon in der Init-Phase oder beim ersten Tick aktuelle Daten in den Zeitebenen zu bekommen, die nicht im Chart-Window sichtbar sind?

Vielen Dank!

Andreas

traderdoc 05.07.17 22:18

Ich kann nicht nachvollziehen, was Du da konkret siehst. Fakt ist, dass die einzelnen Kurse auch in einer Variablen gespeichert werden müssen.
Wenn in der Zeile also stehen würde:

Open_M5_2 = iOpen(NULL, PERIOD_M5, 2);

dann wird auch in der Variablen Open_M5_2 der Öffnungskurs der vorletzten Kerze gespeichert.

traderdoc

amk 07.07.17 09:33

Dann versuche ich mal, den Sachverhalt genauer zu beschreiben:

1) Wenn ein EA z.B. heute am 07.07.2017 um 08:53:48 Uhr gestartet wird, dann würde ich (direkt nach dem Start des EA's) folgendes erwarten:
- im 1M-Chart: Die jüngste Kerze hat um 08:53 Uhr begonnen.
- im 5M-Chart: Die jüngste Kerze hat um 08:50 Uhr begonnen.
- im 15M-Chart: Die jüngste Kerze hat um 08:45 Uhr begonnen.
- im 30M-Chart: Die jüngste Kerze hat um 08:30 Uhr begonnen.

Sind wir bis hier einer Meinung?

2) Nun habe ich in der INIT-Phase u.a. folgende Print-Befehle kodiert, um die Uhrzeit und den Open-Kurs der jüngsten Kerze (Index=0) für die genannten 4 Zeitebenen zu überprüfen:

Code:

 
  Print("init,  iTime(,M1,0)=" , iTime(NULL, PERIOD_M1 , 0) ,
              "  iOpen(,M1,0)=" , iOpen(NULL, PERIOD_M1 , 0) );

  Print("init,  iTime(,M5,0)=" , iTime(NULL, PERIOD_M5 , 0) ,
              "  iOpen(,M5,0)=" , iOpen(NULL, PERIOD_M5 , 0) );

  Print("init,  iTime(,M15,0)=", iTime(NULL, PERIOD_M15, 0) ,
              "  iOpen(,M15,0)=", iOpen(NULL, PERIOD_M15, 0) );

  Print("init,  iTime(,M30,0)=", iTime(NULL, PERIOD_M30, 0) ,
              "  iOpen(,M30,0)=", iOpen(NULL, PERIOD_M30, 0) );

Hier das Ergebnis:

http://www.bilderload.com/bild/399818/journal0JBNI.png

- für den 1M-Chart: Die iTime-Funktion liefert für die jüngste Kerze den Wert 07:53 Uhr. Das ist richtig wegen des Unterschieds zwischen TimeCurrent() und TimeLocal().

- für den 5M-Chart: Die iTime-Funktion liefert für die jüngste Kerze den Wert 14:30 Uhr vom gestern (06.07.2017). Das ist falsch! Warum?

- für den 15M-Chart: Die iTime-Funktion liefert für die jüngste Kerze den Wert 14:30 Uhr vom gestern (06.07.2017). Das ist falsch! Warum?

- für den 30M-Chart: Die iTime-Funktion liefert für die jüngste Kerze den Wert 14:00 Uhr vom gestern (06.07.2017). Das ist falsch! Warum?

Noch ein Hinweis: Das Ergebnis für den 1M-Chart ist wohl deshalb richtig, weil im geöffneten Chart-Window der 1M-Chart eingestellt ist.


3) Kurz zusammengefasst:
Die iTime- und die iOpen-Fuktionen liefern in der Init-Phase die richtigen Werte nur für die Zeitebene, die im Chart-Window geöffnet ist. Für die anderen Zeitebenen werden veraltete Werte geliefert. Ist das immer so oder was mache ich falsch?

Übrigens hatte ich auch mal die Funktion "RefreshRates();" ausprobiert. Sie hatte den Wert "false" geliefert. Demnach müssten die Daten eigentlich aktuell sein.

Ich hoffe, dass der Sachverhalt jetzt klar geworden ist.

Viele Grüße

Andreas

Leopold 07.07.17 10:01

Wenn du meinst, dass die Daten erst ab dem 2. Tick verfügbar sind könntest du eine Schleife einbauen die erst beim nächsten Tick verlassen wird.

ErsterTick = Bid;
while (Bid == ErsterTick) Sleep(100);

Wenn du das vor deinen Code setzt könnte es funktionieren.

--- Leopold ---

traderdoc 07.07.17 10:04

Warum? Weil das einer der Bugs ist, der bisher nicht korrigiert wurde.
Ein ähnliches Problem besteht bei der Tagesumschaltung.

Lösung:
Mittels Schleife direkt nach dem ersten Einsprung in OnTick(), die Aktualisierung der Kursdaten abwarten. Falls diese noch nicht vorliegen, mit return abspringen und erst nach dem Vorliegen in den weiteren Ablauf der OnTick()-Funktion gehen.

traderdoc

traderdoc 07.07.17 10:18

Zitat:

Zitat von Leopold (Beitrag 39096)
Wenn du meinst, dass die Daten erst ab dem 2. Tick verfügbar sind könntest du eine Schleife einbauen die erst beim nächsten Tick verlassen wird.

ErsterTick = Bid;
while (Bid == ErsterTick) Sleep(100);

Wenn du das vor deinen Code setzt könnte es funktionieren.

--- Leopold ---

Das wäre eine klassische Endlosschleife!
Das Programm würde aber erst den zweiten Tick verarbeiten, wenn die Überfunktion verlassen wird.
Desweiteren wollte er ja die Abfragen in der OnInit()-Funktion haben und da tickt eh nichts.

Wie ich schrieb, müsste er in der OnTick()-Funktion warten:

Code:

int OnInit() {
  ...
  aktualisiert = false;
}

void OnTick() {
  if (!aktualisiert) {
      //auf Aktualisierung testen
      //falls aktualisiert, dann Daten in Variablen schreiben, falls nicht,
        dann mit return; aussteigen
      aktualisiert = true;
  }
}

traderdoc

amk 07.07.17 10:22

Zitat:

Zitat von traderdoc (Beitrag 39097)
...
Weil das einer der Bugs ist, der bisher nicht korrigiert wurde.
...
traderdoc

Danke! Das ist bestimmt der Grund!

Also darf man die iTime-, iOpen-Funktionen in der Init-Phase nur dann verwenden, wenn sie sich auf diejenige Zeitebene beziehen, die im Chart-Window eingestellt ist.
Dies gilt bestimmt auch für die Indikatoren iMA, iMACD usw.... Das ist ja echt übel...

Mein Ziel war es, in der Init-Phase eine kleine Statistik über mehrere Kerzen aufzubauen, die dann in der Tick-Phase bei jedem Kerzenwechsel fortgeführt wird. Das geht so also nicht. Der initiale Aufbau der Statistik muss also auch in der Tick-Phase erfolgen.

Vielen Dank für die Unterstützung!

Andreas

amk 07.07.17 18:12

Nun habe ich folgende Abfrage in meinen EA eingebaut:

Code:

  if ( statistik_anz == 0 )
  {
      /*** Prüfen, ob die jüngsten vorhandenen Kurse tatsächlich aktuell sind ***/
      if (  ( TimeCurrent() - iTime(NULL, PERIOD_M1 , 0) < PERIOD_M1  * 60 )
          && ( TimeCurrent() - iTime(NULL, PERIOD_M5 , 0) < PERIOD_M5  * 60 )
          && ( TimeCurrent() - iTime(NULL, PERIOD_M15, 0) < PERIOD_M15 * 60 )
          && ( TimeCurrent() - iTime(NULL, PERIOD_M30, 0) < PERIOD_M30 * 60 ) )
      {
        statistik_init();
      }
  }
  else
  {
      statistik_next();
  }

Und diese i-Funktionen (iTime, iOpen usw.) sind wohl tatsächlich erst beim 2. Tick aktuell - zumindest in den Zeitebenen, die nicht im Chart-Window geöffnet sind.
Das ist echt übel. Ich will gar nicht wissen, welche Werte von diesen Funktionen geliefert werden, wenn man auf ein anderes Symbol geht... :confused:


Alle Zeitangaben in WEZ +2. Es ist jetzt 16:35 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