Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.


Portalsuche


Werbung

Login
Benutzername:
Kennwort:


Statistik
Themen: 3809
Beiträge: 36861
Benutzer: 6.032
Aktive Benutzer: 487
Links: 80
Wir begrüßen unseren neuesten Benutzer: FAB
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor 17 Stunden
- FAB
vor 19 Stunden
- expertyer
vor 2 Tagen
- tuz13
vor 3 Tagen
- roteaugen
vor 5 Tagen
- cutson

Onlineuser
'Wer ist online' anzeigen Benutzer: 1
Gäste: 46
Gesamt: 47
Team: 0
Team:  
Benutzer:  Domke01
Freunde anzeigen

Empfehlungen

Werbung

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 05.07.17
amk amk ist offline
Neues Mitglied
 
Registriert seit: Jul 2017
Beiträge: 4
amk befindet sich auf einem aufstrebenden Ast
Standard 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
  #2 (permalink)  
Alt 05.07.17
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.868
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #3 (permalink)  
Alt 07.07.17
amk amk ist offline
Neues Mitglied
 
Registriert seit: Jul 2017
Beiträge: 4
amk befindet sich auf einem aufstrebenden Ast
Standard

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:



- 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

Geändert von amk (07.07.17 um 09:49 Uhr)
  #4 (permalink)  
Alt 07.07.17
Mitglied
 
Registriert seit: Jun 2016
Ort: Österreich
Beiträge: 117
Leopold befindet sich auf einem aufstrebenden Ast
Standard

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 ---
  #5 (permalink)  
Alt 07.07.17
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.868
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #6 (permalink)  
Alt 07.07.17
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.868
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Leopold Beitrag anzeigen
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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #7 (permalink)  
Alt 07.07.17
amk amk ist offline
Neues Mitglied
 
Registriert seit: Jul 2017
Beiträge: 4
amk befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von traderdoc Beitrag anzeigen
...
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
  #8 (permalink)  
Alt 07.07.17
amk amk ist offline
Neues Mitglied
 
Registriert seit: Jul 2017
Beiträge: 4
amk befindet sich auf einem aufstrebenden Ast
Standard

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...
Thema geschlossen

Lesezeichen

Stichworte
kerzen, kerzen auslesen, kurs kerzen, mql4, programmierung, programmierung metatrader, programmierung mql4


Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 Uhr.



Der Wavesnode - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2017 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2017 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------