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)
-   -   Markierung der Range (http://www.expert-advisor.com/forum/showthread.php?t=6406)

Tox01 01.05.19 08:54

Markierung der Range
 
Hallo zusammen,

der folgende Code soll das höchste Hoch und das tiefste Tief von 8 bis einschließlich 9 Uhr erfassen.
Allerdings "vergisst" er die letzte Kerze um 9 Uhr. Habt ihr eine Idee, woran das liegen könnte?
Wo ist der Fehler?

Code:

extern string Anfangszeit_alsString="08:00";
extern string Endzeit_alsString = "09:00";
datetime Anfangszeit_alsZeit, Endzeit_alsZeit;
double Hoechstkurs, Tiefstkurs;

void OnTick()
  {
//---
      Anfangszeit_alsZeit = StringToTime(Anfangszeit_alsString);
      Endzeit_alsZeit = StringToTime(Endzeit_alsString);
     
      if(TimeCurrent()== Endzeit_alsZeit)
      {
        Hoechstkurs  = iHigh(Symbol(), PERIOD_M5, iHighest(Symbol(), PERIOD_M5, MODE_HIGH, 13, 0));
        Tiefstkurs    = iLow(Symbol(), PERIOD_M5, iLowest(Symbol(), PERIOD_M5, MODE_LOW, 13, 0));
      }
     
      if(TimeCurrent() == Endzeit_alsZeit && Hoechstkurs > 0 && Tiefstkurs > 0)
      {
        ObjectCreate("OpenRange "+TimeToString(TimeCurrent(),TIME_DATE),
                    OBJ_RECTANGLE,0,Anfangszeit_alsZeit,Tiefstkurs,
                    Endzeit_alsZeit, Hoechstkurs);
      } 
  }


traderdoc 01.05.19 11:00

Bei

if(TimeCurrent()== Endzeit_alsZeit)

hast Du Glück, wenn diese Bedingung überhaupt true ergibt, denn wenn nicht TimeCurrent() dem Zeitwert Endzeit_alsZeit exakt auf die Sekunde, also 09:00:00, entspricht, dann würde nicht in diese Abfrage eingesprungen werden.
Das zum Einen.
Zum Anderen, wenn das Programm dort einspringt, würde exakt zum Kerzenanfang der Kerze um 09:00:00 das High oder Low benutzt werden, welches jedoch identisch ist mit dem Open der aktuellen Kerze.

D.h. die aktuelle Kerze um 09:00:00 zu nehmen, ist wenig sinnvoll.
Anders läge der Fall, auf den Wechsel der Kerze um 09:05:00 zu warten, um dann mit

Hoechstkurs = iHigh(Symbol(), PERIOD_M5, iHighest(Symbol(), PERIOD_M5, MODE_HIGH, 13, 1));
Tiefstkurs = iLow(Symbol(), PERIOD_M5, iLowest(Symbol(), PERIOD_M5, MODE_LOW, 13, 1));

das High bzw. Low ermitteln zu lassen.

traderdoc

Tox01 01.05.19 12:53

Das mit TimeCurrent() leuchtet mir ein. Wäre wohl sinnvoller mit Time[0] zu arbeiten um die Zeit der Kerzen abzufragen, oder?

Tox01 01.05.19 13:09

Ich habe soeben nochmal am Code gebastelt. Allerdings hatte ich dann das Problem, dass sich die Variablen Hoechstkurs und Tiefskurs nach 9 Uhr weiterhin verändert haben. Habe es aber mit eine bool Variable in den Griff bekommen, welcher am Ende des Tages zurückgesetzt wird. Der Code tut nun das was er soll. Könnte ich hier deiner Ansicht nach noch etwas verbessern?

Code:

extern string Anfangszeit_alsString="08:00";
extern string Endzeit_alsString = "09:00";
extern string EndeDesTages_alsString = "20:00";
datetime Anfangszeit_alsZeit, Endzeit_alsZeit, EndeDesTages_alsZeit;
double Hoechstkurs, Tiefstkurs;
bool Kursdaten_vorhanden;

void OnTick()
  {
//---
      Anfangszeit_alsZeit = StringToTime(Anfangszeit_alsString);
      Endzeit_alsZeit = StringToTime(Endzeit_alsString);
      EndeDesTages_alsZeit = StringToTime(EndeDesTages_alsString);

      if(Time[0]>Endzeit_alsZeit && Kursdaten_vorhanden==false && Time[0]<EndeDesTages_alsZeit)
      {
        Hoechstkurs = iHigh(Symbol(), PERIOD_M5, iHighest(Symbol(), PERIOD_M5, MODE_HIGH, 13, 1));
        Tiefstkurs = iLow(Symbol(), PERIOD_M5, iLowest(Symbol(), PERIOD_M5, MODE_LOW, 13, 1));
        Kursdaten_vorhanden=true;
      }
     
      if(Time[0]>Endzeit_alsZeit && Hoechstkurs > 0 && Tiefstkurs > 0)
      {
        ObjectCreate("OpenRange "+TimeToString(TimeCurrent(),TIME_DATE),
                    OBJ_RECTANGLE,0,Anfangszeit_alsZeit,Tiefstkurs,
                    Endzeit_alsZeit, Hoechstkurs);
      }
     
      Comment("Hoechstkurs: ",Hoechstkurs," Tiefstkurs: ",Tiefstkurs);
     
      if(Time[0]>EndeDesTages_alsZeit)
      {
        Kursdaten_vorhanden=false;
      }
  }


traderdoc 01.05.19 15:18

Einmalige Tagesabfragen werden in der Regel immer über sog. Flags gesteuert. In diesem Falle über den Vergleich der Tageszahl. Ist die Zeit der aktuellen Kerze größer als die Kerze der Zeit "Endzeit_alsZeit", dann wird Hoechstkurs und Tiefstkurs ermittelt und das Flag angepasst - fertig.
Dieses einfache Beispiel funktioniert nur, wenn der EA bis 09:00 eingeschaltet wurde, wegen der Benutzung der Suchstartkerze 1.

Code:

datetime OldDay = Day(); //in den globalen Variablen

if (OldDay !=  Day() && Time[0] > Endzeit_alsZeit) {
  Hoechstkurs = iHigh(Symbol(), PERIOD_M5, iHighest(Symbol(), PERIOD_M5, MODE_HIGH, 13, 1));
  Tiefstkurs  = iLow(Symbol(), PERIOD_M5, iLowest(Symbol(), PERIOD_M5, MODE_LOW, 13, 1));
  OldDay = Day();
}

traderdoc

Tox01 01.05.19 17:25

Funktioniert. Danke :)


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