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: 4280
Beiträge: 39485
Benutzer: 6.595
Aktive Benutzer: 246
Links: 80
Wir begrüßen unseren neuesten Benutzer: rustembilgi
Mit 667 Benutzern waren die meisten Benutzer gleichzeitig online (vor 3 Wochen um 05:39).
Neue Benutzer:
vor einem Tag
- rustembilg...
vor einem Tag
- plamdam
vor 3 Tagen
- sh3ldn
vor 4 Tagen
- trader2
vor 5 Tagen
- qaseem

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

Empfehlungen

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt vor 3 Wochen
Neues Mitglied
 
Registriert seit: Jul 2019
Beiträge: 5
Matze66 befindet sich auf einem aufstrebenden Ast
Standard Breakout bestimmtes Zeitfenster

Hallo,

Ich möchte gerne den Breakout traden von den Kerzen 8 Uhr bis 10 Uhr! Geht der Kurs nach dem erreichen des TP wieder nach unten und bricht nochmals auf Tageshöchstkurs aus, dann möchte ich auch diesen traden!

Der Expert Advisor müsste also von 8 Uhr an bis zur aktuellen Kerze immer das High und das Low erfassen und dann eine Order eröffnen.


Ich habe von traderdoc diesen Codeschnipsel gefunden:

int shift8 = iBarShift(NULL, 0, StringToTime("08:00"));
int shift9 = iBarShift(NULL, 0, StringToTime("09:00"));
int highest = iHighest(NULL, 0, MODE_HIGH, shift8 - shift9 + 1, shift9);
int lowest = iHighest(NULL, 0, MODE_LOW, shift8 - shift9 + 1, shift9);

double high = iHigh(NULL, 0, highst);
double low = iLow(NULL, 0, lowest);

Aber damit funktioniert es nicht! Der Metatrader erkennt immer nur die vergangenen Kerzen, die bei "StringToTime" angegeben sind und nicht bis zur aktuellen Kerze!

Was müßte ich denn bei "09:00" eingeben, so das alle Kerzen von 08:00 bis zur aktuelle Kerze berücksichtigt wären!

Grüße, Matze
Mit Zitat antworten
  #2 (permalink)  
Alt vor 3 Wochen
Premium Mitglied
 
Registriert seit: Jun 2016
Ort: Österreich
Beiträge: 351
Leopold befindet sich auf einem aufstrebenden Ast
Standard

Ich kann dir was heraus suchen, wie ich das gemacht habe, komme aber frühestens morgen Abend dazu.

---Leopold---
Mit Zitat antworten
  #3 (permalink)  
Alt vor 3 Wochen
Neues Mitglied
 
Registriert seit: Jul 2019
Beiträge: 5
Matze66 befindet sich auf einem aufstrebenden Ast
Standard

Hallo Leopold,

Danke, dass wäre nett.

Habe mir inzwischen damit beholfen, dass ich bei 09:00 TimeCurrent() eingefügt habe. Damit funktioniert es eigentlich sehr gut.

Aber bestimmt ist dein Lösungsweg vielversprechender.
Mit Zitat antworten
  #4 (permalink)  
Alt vor 3 Wochen
Elite Mitglied
 
Registriert seit: Sep 2015
Beiträge: 773
MA-EA befindet sich auf einem aufstrebenden Ast
Standard

https://docs.mql4.com/series/itime
Mit Zitat antworten
  #5 (permalink)  
Alt vor 3 Wochen
Premium Mitglied
 
Registriert seit: Jun 2016
Ort: Österreich
Beiträge: 351
Leopold befindet sich auf einem aufstrebenden Ast
Standard

Also bei mir schaut das Folgendermaßen aus:

Beim ersten Tick des Tages führe ich eine "Tagesinitialisierung" durch und unter anderen werden auch die Zeiten Festgelegt:

Code:
Time_RangeBegin         = iTime(MarketCurrent, PERIOD_D1, 0)   + (DayMinute_RangeBegin_I * 60);
Time_RangeEnd           = iTime(MarketCurrent, PERIOD_D1, 0)   + (DayMinute_RangeEnd_I * 60);
Meine Parameter für die Tageszeit sind immer Minuten nach Tagesbeginn, damit kann man besser Parametrieren, weil das nur ein Parameter ist und dieser dann fortlaufend ist.


Dann gehts so weiter:

Code:
if (TickTime >= Time_RangeEnd && Last_TickTime < Time_RangeEnd)
Damit stelle ich sicher, dass der nachfolgende Code auch nur einmal am Ende der Range ausgeführt wird.


Jetzt kommt die Ermittlung von High und Low der Range:

Code:
...
int Shift_RangeBegin = iBarShift(MarketCurrent, 0, Time_RangeBegin, True);
int Shift_RangeEnd   = iBarShift(MarketCurrent, 0, Time_RangeEnd, True) + 1;
         
         if (Shift_RangeBegin > 0 && Shift_RangeEnd > 0)
            {
            int NumberCandles = Shift_RangeBegin - Shift_RangeEnd + 1;
            double RangeHigh  = iHigh  (MarketCurrent, 0, iHighest(MarketCurrent, 0, MODE_HIGH, NumberCandles, Shift_RangeEnd));
            double RangeLow   = iLow   (MarketCurrent, 0, iLowest (MarketCurrent, 0, MODE_LOW,  NumberCandles, Shift_RangeEnd));
...

Zusammengefasst sieht das dann so aus:

Code:
...
if (TagesStartZeit != iTime(MarketCurrent, PERIOD_D1, 0))
   {
   Time_RangeBegin         = iTime(MarketCurrent, PERIOD_D1, 0)   + (DayMinute_RangeBegin_I * 60);
   Time_RangeEnd           = iTime(MarketCurrent, PERIOD_D1, 0)   + (DayMinute_RangeEnd_I * 60);
   ...
   }

if (TickTime >= Time_RangeEnd && Last_TickTime < Time_RangeEnd)
   {
   int Shift_RangeBegin = iBarShift(MarketCurrent, 0, Time_RangeBegin, True);
   int Shift_RangeEnd   = iBarShift(MarketCurrent, 0, Time_RangeEnd, True) + 1;
         
         if (Shift_RangeBegin > 0 && Shift_RangeEnd > 0)
            {
            int NumberCandles = Shift_RangeBegin - Shift_RangeEnd + 1;
            double RangeHigh  = iHigh  (MarketCurrent, 0, iHighest(MarketCurrent, 0, MODE_HIGH, NumberCandles, Shift_RangeEnd));
            double RangeLow   = iLow   (MarketCurrent, 0, iLowest (MarketCurrent, 0, MODE_LOW,  NumberCandles, Shift_RangeEnd));
            ...
            }
   }

---Leopold---
Mit Zitat antworten
  #6 (permalink)  
Alt vor 3 Wochen
Neues Mitglied
 
Registriert seit: Jul 2019
Beiträge: 5
Matze66 befindet sich auf einem aufstrebenden Ast
Standard

Danke Leopold für deinen sehr ausführlichen Code!
Ich habe das jetzt mal versucht auf ein Rectangle umzusetzen.
Leider wird mir kein Rectangle im Chart angezeigt!

Kannst Du mir sagen, wo hier der Fehler ist?
Wie sieht denn der Code aus, wenn die Daten über 24 Uhr gesammelt werden sollen?
Was muss ich da zusätzlich einfügen?

Grüße, Mathias

siehe bitte Anhang!!!
Weiß leider nicht wie man sonst einen Codeschnipsel eingefügt.
Wenn ich den Code kopiere und so einfüge, wirds unübersichtlich!
Angehängte Grafiken
Dateityp: jpg Codeschnipsel.JPG (85,4 KB, 3x aufgerufen)
Mit Zitat antworten
  #7 (permalink)  
Alt vor 3 Wochen
Mitglied
 
Registriert seit: Feb 2016
Beiträge: 175
RetepM befindet sich auf einem aufstrebenden Ast
Standard

Hi, den nachfolgenden Code habe ich aus dem Netz. Ein Indikator, Du kannst den Code aber ohne Probleme in einem EA umsetzen. Have fun!

//+------------------------------------------------------------------+
//| ranges.mq4 |
//+------------------------------------------------------------------+

#property indicator_chart_window

//+------------------------------------------------------------------+
extern bool DrawRange = true;
extern string RangeBegin = "00:05";
extern string RangeEnd = "07:30";
extern color RangeColor = clrGreen;
extern bool DrawTrading = true;
extern string TradingBegin = "08:00";
extern string TradingEnd = "16:59";
extern color TradingColor = clrDarkOrange;
extern bool DrawDaily = true;
extern string DailyBegin = "00:05";
extern string DailyEnd = "23:59";
extern color DailyColor = clrLightGray;
extern bool ShowRecBgrd = true;
extern int NumberOfDays = 1;

int dig;
double pnt, spr, tickval;
string ccy;

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
void init() {
ccy = Symbol();
pnt = MarketInfo(ccy,MODE_POINT);
dig = MarketInfo(ccy,MODE_DIGITS);
spr = MarketInfo(ccy,MODE_SPREAD);
tickval = MarketInfo(ccy,MODE_TICKVALUE);
if (dig == 3 || dig == 5) {
pnt *= 10;
spr /= 10;
tickval *= 10;
}
DeleteObjects();
for (int i=0; i<NumberOfDays; i++) {
CreateObjects("RB"+i, RangeColor);
CreateObjects("TB"+i, TradingColor);
CreateObjects("DB"+i, DailyColor);
}
Comment("");
}

//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
void deinit() {
DeleteObjects();
Comment("");
}

//+------------------------------------------------------------------+
void CreateObjects(string no, color cl) {
//+------------------------------------------------------------------+
ObjectCreate(no, OBJ_RECTANGLE, 0, 0,0, 0,0);
ObjectSet(no, OBJPROP_STYLE, STYLE_SOLID);
ObjectSet(no, OBJPROP_COLOR, cl);
ObjectSet(no, OBJPROP_BACK, ShowRecBgrd);
}

//+------------------------------------------------------------------+
void DeleteObjects() {
//+------------------------------------------------------------------+
for (int i=0; i<NumberOfDays; i++) {
ObjectDelete("RB"+i);
ObjectDelete("TB"+i);
ObjectDelete("DB"+i);
}
ObjectDelete("TBup");
ObjectDelete("TBdn");
ObjectDelete("RBup");
ObjectDelete("RBdn");
ObjectDelete("DBup");
ObjectDelete("DBdn");
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
void start() {
datetime dt= TimeCurrent();
for (int i=0; i<NumberOfDays; i++) {
if(DrawRange == true) DrawObjects(dt, "RB"+i, RangeBegin, RangeEnd);
if(DrawTrading == true) DrawObjects(dt, "TB"+i, TradingBegin, TradingEnd);
if(DrawDaily == true) DrawObjects(dt, "DB"+i, DailyBegin, DailyEnd);
dt=decDateTradeDay(dt);
while (TimeDayOfWeek(dt)>5) dt=decDateTradeDay(dt);
}
}

//+------------------------------------------------------------------+
void DrawObjects(datetime dt, string no, string tb, string te) {
//+------------------------------------------------------------------+
datetime t1, t2;
double p1, p2;
int b1, b2;

t1=StrToTime(TimeToStr(dt, TIME_DATE)+" "+tb);
t2=StrToTime(TimeToStr(dt, TIME_DATE)+" "+te);
b1=iBarShift(NULL, 0, t1);
b2=iBarShift(NULL, 0, t2);
p1=High[Highest(NULL, 0, MODE_HIGH, b1-b2, b2)];
p2=Low [Lowest (NULL, 0, MODE_LOW , b1-b2, b2)];
ObjectSet(no, OBJPROP_TIME1 , t1);
ObjectSet(no, OBJPROP_PRICE1, p1);
ObjectSet(no, OBJPROP_TIME2 , t2);
ObjectSet(no, OBJPROP_PRICE2, p2);
ObjectSetText(no,DoubleToStr((p1-p2)/pnt,0));
}

//+------------------------------------------------------------------+
datetime decDateTradeDay (datetime dt) {
//+------------------------------------------------------------------+
int ty=TimeYear(dt);
int tm=TimeMonth(dt);
int td=TimeDay(dt);
int th=TimeHour(dt);
int ti=TimeMinute(dt);

td--;
if (td==0) {
tm--;
if (tm==0) {
ty--;
tm=12;
}
if (tm==1 || tm==3 || tm==5 || tm==7 || tm==8 || tm==10 || tm==12) td=31;
if (tm==2) if (MathMod(ty, 4)==0) td=29; else td=28;
if (tm==4 || tm==6 || tm==9 || tm==11) td=30;
}
return(StrToTime(ty+"."+tm+"."+td+" "+th+":"+ti));
}

//+------------------------------------------------------------------+
Mit Zitat antworten
  #8 (permalink)  
Alt vor 3 Wochen
Premium Mitglied
 
Registriert seit: Jun 2016
Ort: Österreich
Beiträge: 351
Leopold befindet sich auf einem aufstrebenden Ast
Standard

Was meinst du mit über 24 Uhr gesammelt werden?

---Leopold---
Mit Zitat antworten
  #9 (permalink)  
Alt vor 3 Wochen
Neues Mitglied
 
Registriert seit: Jul 2019
Beiträge: 5
Matze66 befindet sich auf einem aufstrebenden Ast
Standard

Leopold, ich hab mich undeutlich ausgedrückt!

Meinte über Nacht!

z.B. 22:00 Uhr - 06:00 Uhr!

Du sagtest ja deine Tagesberechnung fängt bei 00:00 an und Endet um 23:59 Uhr.
Deine Parameter für die Tageszeit sind immer Minuten nach Tagesbeginn,
z. B. 1380 für 23:00 Uhr.
Mit Zitat antworten
  #10 (permalink)  
Alt vor 3 Wochen
Neues Mitglied
 
Registriert seit: Jul 2019
Beiträge: 5
Matze66 befindet sich auf einem aufstrebenden Ast
Standard

Hallo RetepM!

Danke für den Code!!
Werde Ihn am Wochenende ausprobieren!
Vielen, vielen Dank!!!!
Mit Zitat antworten
Antwort

Lesezeichen


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 09:01 Uhr.


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