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)
-   -   Breakout bestimmtes Zeitfenster (http://www.expert-advisor.com/forum/showthread.php?t=6467)

Matze66 29.07.19 18:35

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

Leopold 30.07.19 14:43

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

---Leopold---

Matze66 30.07.19 16:07

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.

MA-EA 31.07.19 02:38

https://docs.mql4.com/series/itime

Leopold 01.08.19 22:05

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

Matze66 02.08.19 16:06

Liste der Anhänge anzeigen (Anzahl: 1)
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!

RetepM 02.08.19 18:16

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));
}

//+------------------------------------------------------------------+

Leopold 02.08.19 20:39

Was meinst du mit über 24 Uhr gesammelt werden?

---Leopold---

Matze66 02.08.19 22:52

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.

Matze66 02.08.19 22:53

Hallo RetepM!

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


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