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)
-   -   Min und Max über bestimmten Zeitraum (http://www.expert-advisor.com/forum/showthread.php?t=6035)

AVT 11.03.18 20:24

Min und Max über bestimmten Zeitraum
 
Nachdem ich die Erkennung von benutzerdefinierten Zeiten endlich hinbekommen habe, kriege ich jetzt neue Schwierigkeiten mit der Kalkulation von Min/Max (oder High/Low) Werten für diesen Zeitraum. (Dummerweise sind wohl alle entweder nur an glatten H1 Werten oder nur in einem einzigen Zeitfenster interessiert, also alles, was an Beispielen dienen könnte, half mir nicht.)
Die Aufgabe: High/Low zwischen 16:30 und 17:30 ermitteln.
Das Problem: im jetzigen Code fehlt mir eine halbe Stunde wegen PERIOD_M30

Code:

  static double Max, Min;
  for(i=limit;i>=0;i--)
  {
      // extern values: string RStartHour = "16:30"; string RStopHour  = "17:30";
      // date string format looks like this: "2018.03.23 16:30"
      string RStartTime=(    TimeYear(Time[i])+"."+TimeMonth(Time[i])
                        +"."+TimeDay(Time[i]) +" "+RStartHour );
      string RStopTime=(    TimeYear(Time[i])+"."+TimeMonth(Time[i])
                        +"."+TimeDay(Time[i]) +" "+RStopHour );
      if(  (TimeDayOfWeek(Time[i])>=1 && TimeDayOfWeek(Time[i])<=5)
        && Time[i]>=StringToTime(RStartTime)
        && Time[i]<StringToTime(RStopTime) )
        {
            Max=iHigh(NULL,PERIOD_M30,iBarShift(NULL,PERIOD_M30,Time[i],false));
            Min=iLow(NULL,PERIOD_M30,iBarShift(NULL,PERIOD_M30,Time[i],false));
        }
      }

Die Idee: PERIOD_M1 benutzen und halt für jede Minute sehen, ob es ein neues High/Low gibt. Nur fehlt mir dazu irgendwas und ich habe keine Ahnung was. Habt Ihr einen Hinweis? Danke

Leopold 12.03.18 09:13

Das erste, das mir mal auffällt, wieso benutzt du hier eine Schleife?

Vielleicht hilft dir das weiter: https://docs.mql4.com/series/ihighest

---Leopold---

traderdoc 12.03.18 11:09

Zitat:

Zitat von Leopold (Beitrag 40514)
Das erste, das mir mal auffällt, wieso benutzt du hier eine Schleife?

Vielleicht hilft dir das weiter: https://docs.mql4.com/series/ihighest

---Leopold---

Korrekt! Für das Feststellen von High und Low zwischen zwei Zeiten eignet sich iHighest() und iLowest() ideal. Kurzer Code und eine eindeutige Auusage.
Die Funktionen sind etwas tricky bei der Festlegung der beiden Kerzenpositionen, aber das sollte für Dich machbar sein.

traderdoc

AVT 12.03.18 20:18

Zitat:

Zitat von Leopold (Beitrag 40514)
Das erste, das mir mal auffällt, wieso benutzt du hier eine Schleife?
---Leopold---

Ich wüßte nicht, wie ich das sonst für täglich Mo-Fr machen sollte. Das ganze ist nur der problematische Ausschnitt aus einem Indikator.

AVT 12.03.18 20:31

Zitat:

Zitat von traderdoc (Beitrag 40515)
Korrekt! Für das Feststellen von High und Low zwischen zwei Zeiten eignet sich iHighest() und iLowest() ideal. Kurzer Code und eine eindeutige Auusage.
Die Funktionen sind etwas tricky bei der Festlegung der beiden Kerzenpositionen, aber das sollte für Dich machbar sein.
traderdoc

Ist wohl doch etwas mehr als tricky :eek: Ich habe mich trotzdem mal damit auseinander gesetzt. Ergebnis bis jetzt:
Code:

  // vor der Schleife definiert: int Hval_index, Lval_index;
  // Werte ermitteln:
  Hval_index=iHighest(NULL,PERIOD_M1,MODE_HIGH,60,i);
  Lval_index=iLowest(NULL,PERIOD_M1,MODE_LOW,60,i);
  Max=High[Hval_index];
  Min=Low[Lval_index];

So, und nun geht es los :mad: Im M1 Chart ist das perfekt, ABER sobald ich auf eine andere Zeiteinheit umschalte, werden die Wert verschoben. Ok, das i bezieht sich auf die Nummer der Bar im aktuellen Chart, ABER - schon wieder ein Aber - darum schreibe ich im Code ja explizit PERIOD_M1 und nicht etwa Period().
Sind also noch mehr Kommentare Eurerseits erforderlich, um mich auf die richtige Bahn zu bringen - bitte. Danke.

traderdoc 12.03.18 22:12

Wozu das i?
Es soll doch das High und Low zwischen 16:30 und 17:30 gefunden werden?
D.h. entweder es soll im laufenden Betrieb ab 16:30 ständig bis 17:30 die Extrema gefunden werden, dann läuft das ab 16:30 über folgenden Code.

Code:

//zu Beginn zu setzen:
double High_Temp = 0;
doubke Low_Temp = 100000;

if (OldBar != Time[0]) {
  if (High[1] > High_Temp) High_Temp = High[1];
  if (Low[1] < Low_Temp)  Low_Temp = Low[1];
  OldBar = Time[0];
}

Wenn retrospektive die Extrema am aktuellen Tag gesucht werden, dann geht das über:

Code:

int i = iBarShift(NULL, PERIOD_M1, StringToTime("16:30"));
Hval_index = iHighest(NULL, PERIOD_M1, MODE_HIGH, 60, i);
Lval_index = iLowest(NULL, PERIOD_M1, MODE_LOW, 60, i);
Max = High[Hval_index];
Min = Low[Lval_index];

traderdoc

Leopold 12.03.18 23:10

Zitat:

Zitat von traderdoc (Beitrag 40521)
Code:

int i = iBarShift(NULL, PERIOD_M1, StringToTime("16:30"));
Hval_index = iHighest(NULL, PERIOD_M1, MODE_HIGH, 60, i);
Lval_index = iLowest(NULL, PERIOD_M1, MODE_LOW, 60, i);
Max = High[Hval_index];
Min = Low[Lval_index];


Bei der Zeit müsste man die Endzeit eingeben, also 17:30 oder? Weil er ja von Rechts nach links die 60 zählt. Und der Start müsste dann bei i+1 sein weil die 17:30 Kerze wahrscheinlich nicht erfasst werden soll.

Soll das ganze in einen EA oder Indikator verwendet werden? Bei einem Indikator würdest du schon einen Zähler (i) benötigen.

---Leopold---

AVT 13.03.18 13:41

Zitat:

Zitat von Leopold (Beitrag 40524)
Soll das ganze in einen EA oder Indikator verwendet werden? Bei einem Indikator würdest du schon einen Zähler (i) benötigen.

Das ist/wird die Änderung eines Indikators. Ich habe mir schon einen gebastelt, der auf vollen Stundentakt einstellbar ist und der funktioniert gut. Er pinselt mir (max. im H1 Chart) für sämtliche Mo-Fr in einem einstellbaren Zeitraum die High- und Lowlinien (HiBuf[] und LoBuf[]). Nur gibt es halt Märkte (Forex z.B.) wo optimale Range-Zeiten nicht im Stundentakt laufen - und um die zu finden brauche ich die Ermittlung von Highest/Lowest einstellbar im Minutentakt.

Ich denke zur Zeit noch über die Antworten von traderdoc nach.
AVT

AVT 14.03.18 15:13

Zwischenbericht
Zitat:

Zitat von AVT (Beitrag 40511)
Die Idee: PERIOD_M1 benutzen und halt für jede Minute sehen, ob es ein neues High/Low gibt.

Mit der Hilfe von traderdoc und Leopold sieht der M1 Chart perfekt aus und es spielt keine Rolle, ob ich von 15:30-16:30 oder von 15:47- 16:03 gehen will WENN Period()==1 ist; relevanter Code-Snip dazu:
Code:

int TotalSecs=(StringToTime(RStopHour)-StringToTime(RStartHour));
int NoOfBars=TotalSecs/60/Period(); // core M1 without /Period()
string RStartTime, RStopTime, PStartTime, PStopTime;
static double Max, Min;
int Hval_index, Lval_index;
int i=iBarShift(NULL,PERIOD_M1,StringToTime(RStopHour));

for(i=limit;i>=0;i--) // MUST count down to zero, 250,249 ... 2,1,0
{
  // day, start, stop conditions
  // == core M1 calc:
  //Hval_index = iHighest(NULL,PERIOD_M1,MODE_HIGH,NoOfBars,i+1);
  //Lval_index = iLowest(NULL,PERIOD_M1,MODE_LOW,NoOfBars,i+1);
  Hval_index = iHighest(NULL,Period(),MODE_HIGH,NoOfBars,i+1);
  Lval_index = iLowest(NULL,Period(),MODE_LOW,NoOfBars,i+1);
  Max = High[Hval_index];
  Min = Low[Lval_index];
}

Das einzige was mir fehlt, ist eine Möglichkeit, die finalen Max/Min Werte aus einer M1 Berechnung für die Dauer des Tages festzuhalten. Wie Ihr seht habe ich im Code eine annähernde Weise für höhere Zeiteinheiten eingbaut, die weichen aber im Ergebnis teilweise gravierend ab.

Wenn ich NULL,PERIOD_M1 explizit benutze, dann heißt das für mich Berechnung für aktuellen Markt im M1 Chart und nicht in dem gerade geladenen Chart! Spaßeshalber habe ich mal versucht, im Dow-Chart als Symbol statt NULL den Dax einzutragen - und da ging dann alles durcheinander. Sieht danach aus, als wäre iHighest/Lowest hier nicht die erste Wahl.

Also, in diesem Zustand ist der Indikator noch unbrauchbar. AVT


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