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.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4036
Beiträge: 38360
Benutzer: 6.345
Aktive Benutzer: 278
Links: 80
Wir begrüßen unseren neuesten Benutzer: ekman
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor 2 Tagen
- ekman
vor 2 Tagen
- SaxTrade
vor 3 Tagen
- Matthias...
vor 3 Tagen
- wren
vor 4 Tagen
- Unskilled

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 61
Gesamt: 61
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 11.03.18
AVT AVT ist offline
Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 58
AVT befindet sich auf einem aufstrebenden Ast
Standard 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
  #2 (permalink)  
Alt 12.03.18
Mitglied
 
Registriert seit: Jun 2016
Ort: Österreich
Beiträge: 249
Leopold befindet sich auf einem aufstrebenden Ast
Standard

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

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

Zitat:
Zitat von Leopold Beitrag anzeigen
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.
  #5 (permalink)  
Alt 12.03.18
AVT AVT ist offline
Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 58
AVT befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von traderdoc Beitrag anzeigen
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 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 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.
  #6 (permalink)  
Alt 12.03.18
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.086
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #7 (permalink)  
Alt 12.03.18
Mitglied
 
Registriert seit: Jun 2016
Ort: Österreich
Beiträge: 249
Leopold befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von traderdoc Beitrag anzeigen
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---
  #8 (permalink)  
Alt 13.03.18
AVT AVT ist offline
Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 58
AVT befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Leopold Beitrag anzeigen
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
__________________
heute schon gelacht?
  #9 (permalink)  
Alt 14.03.18
AVT AVT ist offline
Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 58
AVT befindet sich auf einem aufstrebenden Ast
Standard

Zwischenbericht
Zitat:
Zitat von AVT Beitrag anzeigen
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
__________________
heute schon gelacht?
Thema geschlossen

Lesezeichen

Stichworte
hoch, hoch tief, max, min, mql4, programmierung, programmierung metatrader, programmierung mql4, tie, zeitraum


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 03:14 Uhr.



Der Wavesnode - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2018 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.
-----------------------------------------------------------------------------------------------------------------------------