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: 3690
Beiträge: 36325
Benutzer: 5.838
Aktive Benutzer: 535
Links: 80
Wir begrüßen unseren neuesten Benutzer: Tradan
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor einer Stunde
- Tradan
vor 4 Stunden
- pfg
vor 16 Stunden
- Traderin
vor einem Tag
- wehu58
vor einem Tag
- chrislybar...

Onlineuser
'Wer ist online' anzeigen Benutzer: 2
Gäste: 40
Gesamt: 42
Team: 0
Team:  
Benutzer:  Stengah966, tomtrader
Freunde anzeigen

Empfehlungen

Werbung

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt vor 2 Wochen
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
Mit Zitat antworten
  #2 (permalink)  
Alt vor 2 Wochen
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.782
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.
Mit Zitat antworten
  #3 (permalink)  
Alt vor 2 Wochen
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 (vor 2 Wochen um 09:49 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt vor 2 Wochen
Mitglied
 
Registriert seit: Jun 2016
Ort: Österreich
Beiträge: 95
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 ---
Mit Zitat antworten
  #5 (permalink)  
Alt vor 2 Wochen
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.782
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.
Mit Zitat antworten
  #6 (permalink)  
Alt vor 2 Wochen
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.782
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.
Mit Zitat antworten
  #7 (permalink)  
Alt vor 2 Wochen
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
Mit Zitat antworten
  #8 (permalink)  
Alt vor 2 Wochen
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...
Mit Zitat antworten
Antwort

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 +2. Es ist jetzt 15:13 Uhr.



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