Höchster Kurs zwischen 0 & 8 Uhr - Wie zuverlässig herausfinden?

 

Hey, wollte diesen EA in MQL4 automatisieren: https://www.deutschefxbroker.de/daily-breakout-strategie-einfaches-konzept-grosse-wirkung/ (hoffe darf das hierfür posten)

Hieran hänge ich fest: Ich kriege den Höchstkurs & Tiefstkurs zwischen 0 & 8 Uhr nicht rein :( (wird immer falsch angezeigt, wenn die Order dann ausgeführt wird)

(Die Uhrzeitenparameter 0 & 8 sollen jedoch später im Tester verändert werden können (z.B. von 17Uhr bis 3Uhr)

Jemand ideen was noch funktionieren könnte... oder wie man mit hier iHighest arbeitet? (habe immernoch schwierigkeiten mit arrays)



extern int signalzeitbeginn =0; //init -> 
extern int signalzeitende =8;

static bool newday=false;
bool SignalZeit =(Hour()> signalzeitbeginn && Hour()< signalzeitende); 
bool TradeZeit =(Hour()< signalzeitbeginn || Hour()> signalzeitende);


static double DayHigh =0;
static double DayLow =0;
double ShortOpenPrice,LongOpenPrice;
bool Highgesetzt;
bool Lowgesetzt;
int LongPendingOrder,ShortPendingOrder;
static bool longgesetzt=false,shortgesetzt=false;


//TPs& SLs für Long & Short
extern int LongSLVal=50;
extern int LongTPVal=100;
extern int ShortSLVal=50;
extern int ShortTPVal=100;

double Stoplvl = _Point*30;
double LongSL=LongSLVal*_Point;
double LongTP=LongTPVal*_Point;
double ShortSL=ShortSLVal*_Point;
double ShortTP=ShortTPVal*_Point;

extern double Lots = 0.01;
extern int MagicNummer = 30001;
double Slippage = 10*_Point;
string Kommentar = "LongBreakout";
int Expirationdauer;  /// WAS Muss hier hin?





int OnInit()
  {

//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  
  if(Bars<100) //50 stunden in diesem Fall
    {
      Print("bars less than 100");
      return;  
    }
  
  
//--- // Wen zwischen 0 & 8 Uhr wird dies als newday bzw neue Orientierungsperiode für Highs & Lows angesehen
if ((Hour()> signalzeitbeginn && Hour()< signalzeitende) && newday==false){newday=true;}
if (Hour()> signalzeitbeginn && Hour()< signalzeitende){Comment(true);}

// (Wenn die Vorbereitungszeit zuende ist, also die Trading zeit beginnt, soll die bisherige periode nicht mehr als new gelten
if ((Hour()< signalzeitbeginn || Hour()> signalzeitende) && newday==true){newday=false;}

//Wenn hingegen die zuvor benannte "Vorbereitungsphase" zur findung von Highs & Lows gerade stattfindet, sollen diese auch festgehalten werden
if (newday && (Hour()> signalzeitbeginn && Hour()< signalzeitende)){
if (Bid> DayHigh){DayHigh=Bid; Highgesetzt=true;}
if (Ask< DayLow){DayLow=Ask; Lowgesetzt=true;}
}Comment (DayHigh,newday);



//Orders setzen
if ((Hour()< signalzeitbeginn || Hour()> signalzeitende) && Highgesetzt && longgesetzt==false && Bid<DayHigh){

LongOpenPrice = DayHigh;
LongPendingOrder = OrderSend(NULL,OP_BUYSTOP,Lots,DayHigh,Slippage,0,0,Kommentar,MagicNummer,0,clrSpringGreen);
longgesetzt=true;}


if ((Hour()< signalzeitbeginn || Hour()> signalzeitende) && Lowgesetzt && shortgesetzt==false &&Ask> DayLow){
ShortOpenPrice = DayLow;
ShortPendingOrder = OrderSend(NULL,OP_BUYSTOP,Lots,ShortOpenPrice,Slippage,0,0,Kommentar,MagicNummer,0,clrSpringGreen);
shortgesetzt=true;}


//======================TP&SL
//SL & TP für LongOrder setzen
      if(OrderSelect(LongPendingOrder,SELECT_BY_TICKET)==true && OrderCloseTime()==0)
        {
         //SL
         if(OrderStopLoss()==false)//Order noch nicht geschlossen & SL nochnicht gesetzt
           {
           SL_Setzen=OrderModify(OrderTicket(),OrderOpenPrice(),LongSL,OrderTakeProfit(),0,Yellow);GetLastError();
           }
         //TP
         if(OrderTakeProfit()==false) //Order noch nicht geschlossen & TP nochnicht gesetzt
           {
            TP_Setzen=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),LongTP,0,Orange);GetLastError();
           }

        }

//SL & TP für ShortOrder setzen
      if(OrderSelect(ShortPendingOrder,SELECT_BY_TICKET)==true && OrderCloseTime()==0)
        {
         if(OrderStopLoss()==false) //Order noch nicht geschlossen & SL nochnicht gesetzt
           {
            SL_Setzen=OrderModify(OrderTicket(),OrderOpenPrice(),ShortSL,OrderTakeProfit(),0,Yellow);GetLastError();
           }
         if(OrderTakeProfit()==false) //Order noch nicht geschlossen & TP nochnicht gesetzt
           {
           TP_Setzen=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),ShortTP,0,Orange);GetLastError();
           }

        }
Daily Breakout Strategie – Einfaches Konzept, große Wirkung
Daily Breakout Strategie – Einfaches Konzept, große Wirkung
  • Google+
  • www.deutschefxbroker.de
Die Daily Breakout Strategie bietet in volatilen Marktphasen beste Gewinnchancen. Wir zeigen wie Strategie funktioniert und worauf sie achten müssen.
 

Stell einfach mal auf Englisch (oben rechts) und gib dann in das Suchfeld (rechts daneben die Lupe) "trade session" ein und wähle dann  entweder CodeBase oder Artikel, dann findest haufenweise Beispiele für Dein Problem.

Du kannst auch gleich nach Morning Breakout suchen!

 
Bayne:

Hey, wollte diesen EA in MQL4 automatisieren: https://www.deutschefxbroker.de/daily-breakout-strategie-einfaches-konzept-grosse-wirkung/ (hoffe darf das hierfür posten)

Hieran hänge ich fest: Ich kriege den Höchstkurs & Tiefstkurs zwischen 0 & 8 Uhr nicht rein :( (wird immer falsch angezeigt, wenn die Order dann ausgeführt wird)

(Die Uhrzeitenparameter 0 & 8 sollen jedoch später im Tester verändert werden können (z.B. von 17Uhr bis 3Uhr)

Jemand ideen was noch funktionieren könnte... oder wie man mit hier iHighest arbeitet? (habe immernoch schwierigkeiten mit arrays)


Du kannst mit den Funktionen iHigh und iHighest arbeiten.

iHighest bringt dir die höchste Kerze als int. Wert

iHigh gibt dir dann den Kurs als double aus.

 

@Carl Schreiber @amando Danke für die Antworten, ich finde in der englischen codebase nichts für "morning breakout". Bei trade session, sind nur indikatoren deren Sinn ich nicht nachvollziehen kann:

(wie z.B. Warum zählt z.b. der loop bis 50?(siehe ganz unten)... aber egal nicht so wichtig)

whatever: iHigh & iHighest wusste ich schon, ich weiß nur nicht wie ich sieh anwenden kann (F1 hilft nicht), da ich arrays nicht richtig anwenden kann:

Ich würde es jetzt so schreiben ( Frage steht drinnen)

double DayHigh[] = iHigh;
double DayLow[] = iLow;

bool Longgesetzt=true;

//Highs
if (Hour() >0 && Hour()<8){
for (int i=0; Hour()<8; i++)
DayHigh[i]=iHigh;
}

//Lows
if (Hour() >0 && Hour()<8){
for (int i=0; Hour()<8; i++)
DayLow[i]=iLow;
}

//Bars von 0 bis 8 Uhr zählen(werden gleich gebraucht)
int BarAnzahl Bars(NULL,PERIOD_M30,
   datetime         start_time,      // start date and time  // In welcher Einheit muss die Zeit hierhin ??
   datetime         stop_time        // end date and time       // In welcher Einheit muss die Zeit hierhin ??
   );


int  iHighest(NULL,PERIOD_M30,MODE_High,BarAnzahl
   int              start            // start        //muss ich hier 0 hinsetzen? Schließlich habe ich das Array DayHigh[], ja dann umsonst deklariert ??
);

//wenn phase vorbei-> Pending Order setzen
if (Hour() == 8 && Longgesetzt==false){
int LongPendingOrder = OrderSend(NULL,OP_BUYSTOP,Lots,DayHigh,Slippage,0,0,Kommentar,MagicNummer,0,clrSpringGreen);
Longgesetzt= true;
}



(das ist der indikator bei der suche nach "Tradesessions" wobei ich die 50 nicht ganz nachvollziehen kann

extern int    NumberOfDays = 50;        // Количество дней
extern string AsiaBegin    = "01:00";   // Открытие азиатской сессии
extern string AsiaEnd      = "10:00";   // Закрытие азиатской сессии
extern color  AsiaColor    = Goldenrod; // Цвет азиатской сессии
extern string EurBegin     = "07:00";   // Открытие европейской сессии
extern string EurEnd       = "16:00";   // Закрытие европейской сессии
extern color  EurColor     = Tan;       // Цвет европейской сессии
extern string USABegin     = "14:00";   // Открытие американской сессии
extern string USAEnd       = "23:00";   // Закрытие американской сессии
extern color  USAColor     = PaleGreen; // Цвет американской сессии
void start() {
  datetime dt=CurTime();

  for (int i=0; i<NumberOfDays; i++) {
    DrawObjects(dt, "AS"+i, AsiaBegin, AsiaEnd);
    DrawObjects(dt, "EU"+i, EurBegin, EurEnd);
    DrawObjects(dt, "US"+i, USABegin, USAEnd);
    dt=decDateTradeDay(dt);
    while (TimeDayOfWeek(dt)>5) dt=decDateTradeDay(dt);
  }
}
 
Bayne:

@Carl Schreiber @amando Danke für die Antworten, ich finde in der englischen codebase nichts für "morning breakout". Bei trade session, sind nur indikatoren deren Sinn ich nicht nachvollziehen kann:

(wie z.B. Warum zählt z.b. der loop bis 50?(siehe ganz unten)... aber egal nicht so wichtig)

whatever: iHigh & iHighest wusste ich schon, ich weiß nur nicht wie ich sieh anwenden kann (F1 hilft nicht), da ich arrays nicht richtig anwenden kann:

Ich würde es jetzt so schreiben ( Frage steht drinnen)


(das ist der indikator bei der suche nach "Tradesessions" wobei ich die 50 nicht ganz nachvollziehen kann

er zählt bis 50, weil du in deiner Schleife NuberofDays verwendest, welche Du zuerst mit 50 definiert hast. So wie ich das lese, zeichnet der Indi 50 Tage zurück.


Das kann nicht Funktionieren, jetzt muss ich mal dem Carl seine Standartantwort nehmen, drück F1 und schau in der Doku wie iHigh und iHighest funktioniert 

DayLow[i]=iLow;
 
Bayne:Ich kriege den Höchstkurs & Tiefstkurs zwischen 0 & 8 Uhr nicht rein

 

In MQL5 kannst du es so lösen (bitte schau selber wie Kompatibel der Code zu MQL4 ist).

Je nachdem welchen Zeitbereich du benötigst musst du die Periode eventuell anpassen.


double GetHighestHigh(datetime fromDate, datetime toDate, string aSymbol = "") {

   if (aSymbol == "") aSymbol = Symbol();
   
   double Arr[], retVal = -1;
   int aCnt = CopyHigh(aSymbol, PERIOD_M15, fromDate, toDate, Arr);
   
   if (aCnt > 0) {
      retVal = Arr[0];
      
      for (int i = 0; i < aCnt; i++) {
         retVal = MathMax(retVal, Arr[i]);
      }
   }
   
   return(retVal);
}

double GetLowestLow(datetime fromDate, datetime toDate, string aSymbol = "") {

   if (aSymbol == "") aSymbol = Symbol();
   
   double Arr[], retVal = -1;
   int aCnt = CopyLow(aSymbol, PERIOD_M15, fromDate, toDate, Arr);
   
   if (aCnt > 0) {
      retVal = Arr[0];
      
      for (int i = 0; i < aCnt; i++) {
         retVal = MathMin(retVal, Arr[i]);
      }
   }
   
   return(retVal);
}
 
Dominique Mikes:

 

In MQL5 kannst du es so lösen (bitte schau selber wie Kompatibel der Code zu MQL4 ist).

Je nachdem welchen Zeitbereich du benötigst musst du die Periode eventuell anpassen.


Du kannst im MQL5 auch iHigh, iHighest verwenden, wurde implementiert

 

Die Strategie hat mich interessiert, also hab ich das auf die Schnelle (haha) in MQL5 implementiert.

Fazit: Die Strategie ist profitabel, obwohl Monstergewinne liegengelassen werden.
100% PA (EURUSD/M15) im Tester mit realen Daten konnten mit der ersten Variante erreicht werden!

Es ist noch zu früh (zu wenig geprüft) um hier Code reinzustellen.

Ich habe die Zeiteingabe überarbeitet und in eine mqh gestellt, das vereinfacht die Sache. Werde ich wohl in die CodeBase stellen.

Es tritt da ein Problem auf, daß die Zeitperiode normalisiert werden muss. Start 22:00 und Ende 08:00 muss der Tag korrigiert werden.


Das Ergebnis für 2018:


Ist doch nicht schlecht! Ich bleib da dran, und informiere euch weiter.

 

Hier der Code für die Eingabe von Uhrzeiten und die Behandlung von Zeitspannen wie ich mir das vorstelle.

Die enums haben den Vorteil, daß man sie im Tester optimieren kann. Im Gegensatz zu Texteingaben wie '10:30'.

Excel war da sehr hilfreich um die Listen zu erstellen.

Das Beispiel ist lauffähig(im MT5), aber bei weitem nicht optimal, bei USDJPY versagt es.

TradeTimes.mqh sollte auch unter MQL4 funktionieren. Die Trade.mqh gibt es halt unter MQL4 nicht.

Dateien:
 
Dominique Mikes:

 

In MQL5 kannst du es so lösen (bitte schau selber wie Kompatibel der Code zu MQL4 ist).

Je nachdem welchen Zeitbereich du benötigst musst du die Periode eventuell anpassen.


Was macht copyhigh/copylow wenn ich fragen darf?(F1 ist mir wenig aufschlussreich)

Ist das etwa speziell für Arrays?(wenn ja warum ist es dann ein int?)
Macht es das gleiche, wie iHigh/ilow?

 
Bayne:
Was macht copyhigh/copylow wenn ich fragen darf?(F1 ist mir wenig aufschlussreich)

Ist das etwa speziell für Arrays?(wenn ja warum ist es dann ein int?)
Macht es das gleiche, wie iHigh/ilow?

Oh je, da fehlt noch viel. F1 drücken alleine ist halt zuwenig, man muss dann auch lesen und verstehen. Entschuldige bitte.

Return Value
   Returns the copied data count or -1 in case of an error.

Es ist wirklich ausreichend dokumentiert.

Die Arrays, TimeSeries oder nicht, sind halt schon ein Stolperstein.
Grund der Beschwerde: