Zeit-Enumeration über 0Uhr Problem optimieren (EA mit 2 Zeitfenstern (Signal&Trading) Wie zeiteffizient gestalten?? - Seite 4

 

Jetzt isses gelungen und getestet unter MT4 und MT5. Inclusive Eventhandling, Testprogramm und geilem Info-Tool.

Info.mqh bitte in den Ordner Include kopieren.
TimeRange.mqh in den Ordner Ordner Include\Tools kopieren.
TestTimes.mq5 in den Ordner Experts kopieren, für MT4 einfach umbenennen.
Kommentare sind im Code.


LG Otto

Dateien:
Info.mqh  41 kb
TimeRange.mqh  20 kb
TestTimes.mq5  8 kb
 
Otto Pauser:

Jetzt isses gelungen und getestet unter MT4 und MT5. Inclusive Eventhandling, Testprogramm und geilem Info-Tool.

Info.mqh bitte in den Ordner Include kopieren.
TimeRange.mqh in den Ordner Ordner Include\Tools kopieren.
TestTimes.mq5 in den Ordner Experts kopieren, für MT4 einfach umbenennen.
Kommentare sind im Code.


LG Otto

Hört sich echt super an, da ich es auf den ersten Blick nicht genau lesen kann bzw. es erstmal echt schwierig ist sich da durchzuwühlen, was macht er denn genau jetzt?

Ich finde leider keinen Einstieg, bzw nichteinmal eine OrderSend Funktion... :(

 
Bayne:
Hört sich echt super an, da ich es auf den ersten Blick nicht genau lesen kann bzw. es erstmal echt schwierig ist sich da durchzuwühlen, was macht er denn genau jetzt?

Lass TestTimes einfach mal im Tester laufen und du siehst es. Schau dir nur TestTimes an, die include-dateien sind schon komplex und OOP. Die verwende einfach.

Natürlich kannst du dich mit dem Debugger durch alles durchführen lassen.

Da gibt es einen Trick: Du initalisierst irgendeine Variable und setzt einen Breakpoint (hier Zeile10). Das Programm hält dort und du kannst mit 'Step into F11' schrittweise in alles 'hineinkriechen'.

Es wird die Funktion '@global_initialisation' ausgeführt. Ich denke die kennen nur sehr wenige.


 
Otto Pauser:

Lass TestTimes einfach mal im Tester laufen und du siehst es. Schau dir nur TestTimes an, die include-dateien sind schon komplex und OOP. Die verwende einfach.

Natürlich kannst du dich mit dem Debugger durch alles durchführen lassen.

Da gibt es einen Trick: Du initalisierst irgendeine Variable und setzt einen Breakpoint (hier Zeile10). Das Programm hält dort und du kannst mit 'Step into F11' schrittweise in alles 'hineinkriechen'.

Es wird die Funktion '@global_initialisation' ausgeführt. Ich denke die kennen nur sehr wenige.


Bei mir werden keine Trades ausgeführt (macht sinn, da ich zumindest keine Ordersend finde) Den rest werd ich also ergänzen (für den fall dass ich sie übersehen habe: Sorry)


Du Otto... kann es sein, dass wir ab der zweiten hälfte des Threads etwas unterschiedliches suchen?

Ich such nur nach einem Weg, wie ich die Werte Refreshen kann (unabhängig von dem damaligen Day() Befehl sondern in abhängigkeit der Range)

(die High/Low Werte müssen ja irgendwie refresht werden)

=>Was kann ich denn als Signal für die OnInit() ansetzen?


Das frühere Problem war ja das Day() vom tag abhängig war, wir brauchen einen int, der bei veränderung die OnInit() auslöst (damit alle Werte Refresht werden)

Hast du eine Idee woher ich dieses Signal für die OnInit() herbekomme? ?(Bitte verzweifelt um Antwort)

 

Gibt es vllt sowas wie RangeChanged in dem Code? Das wäre genau was ich brauche (Und nochmal ein Super Dankeschön  für den Code, aber sorry dass ich nun noch eine Forderung gestellt habe)

{ if(RangeChanged()){OnInit();}

   inCheckRange=CheckRange.InRange();
   inTradeRange=TradeRange.InRange();
   
   if(!InCheckRange)
      if(!calculated)
         {calculated=Calculate();}
         
   
   if (inTradeRange)
      if(!setpending)
      {setpending=SetPending();}
 

Genauer gesagt sowas, nur dafür, dass beide Ranges einmal durchelaufen sind, anstatt dem Tagesdatum...

bool DayChanged()
{
   static int oldDay=Day();
   int newDay=Day();
   if(oldDay!=newDay)
      {
         oldDay=newDay;
         return(true);
      }
   return(false);
}
 
void OnTick()
{


   inCheckRange=CheckRange.InRange();
   inTradeRange=TradeRange.InRange();
   
   if (inCheckRange && !refresh){Refresh();Print ("Test123");}
   if (inTradeRange &&!done) {refresh=false; done=true;}

}
so scheint es endlich zu funktionieren :)))
 

Nutze doch die Eventhandler. Die werden aufgerufen wie die Ontick() oder OnTimer() usw. Nur eben wenn die Timerange beginnt und/oder endet.

Bequemer gehts ja nicht.

//+------------------------------------------------------------------+
//| derived classes for CheckRange / TradeRange / Eventhändler       |
//+------------------------------------------------------------------+
class CCheckTime : public CTimeRange                        // kompakte Variante
{
   public:
      void OnRangeStart(void) {Print("CheckTime START");}   // sehr kompakt
      void OnRangeEnd  (void)                               // kompakt
         {
            Print("CheckTime END");
         }
};

                                                            // falls Eventhandling nicht benötigt, einfach löschen 
class CTradeTime : public CTimeRange                        // ausführliche Variante
{
   public:
      void OnRangeStart(void);                              // nicht benötigte handler können gelöscht werden
      void OnRangeEnd  (void);                              // nicht benötigte handler können gelöscht werden
};

void CTradeTime::OnRangeStart(void)
{
   Print("TradeTime START");
}

void CTradeTime::OnRangeEnd(void)
{
   Print("TradeTime END");
}

Ist im TestTimes.mq4/TestTimes.mq5 enthalten. Da gehört Code hinein, nicht nur Print.

Den EA musst du schon selber schreiben.

Tools\TimeRange.mqh ist ein Zeitfilter mit zusätzlichem Eventhandler. Sonst nix.

 
Otto Pauser:


@Otto Pauser

Hätte da noch 2 kleine Fragen zum TimeRange.mqh:

Wieso setzt du this day() und lastday() beide =day() und dass in der selben funktion? (bzw. keiner von beiden ist ein static,

Können son überhaupt die Tage verglichen werden bzw Ist das nicht einwenig unsicher ?

void CTimeRange::CTimeRange(void)
{
   lastDay=Day();
   thisDay=Day();
   oldState=false;
}


und:

Was bringt die Daychanged Funktion in dem mqh, wenn beide inCheckRange & inTradeRange doch schon automatisch die Uhrzeiten setzen (für welchen fall kann ich sie Nutzen)

bool CTimeRange::DayChanged(void)
{
   thisDay=Day();
   if(lastDay!=thisDay)
      {
         lastDay=thisDay;
         return(true);
      }
   return(false);
}

OnTick(){
inCheckRange=CheckRange.InRange();
inTradeRange=TradeRange.InRange();
}



+Ich bin dir nochmals 1000mal dankbar, dass du mit mir diesen Code geteilt hast :D

Bekommst du wenn du mit den OnEventhandlings arbeitest jedoch auch ein stark unterschiedliches Ergebnis im Vergleich zum TestPending EAs raus (=Dem EA den du für die EURUSD Breakoutstrategie zuallererst geschieben hattest? (Mich wundert woran das liegen könnte.

 

1.) In Klassen brauchst du Variablen nicht static definieren. Die verändern sich nicht wie in Funktionen.

2.) bool CTimeRange::DayChanged(void) ist quasi 'auf Vorrat' programmiert und wird im Code weiter nicht verwendet, wenn ich mich so recht erinnere.

Grund der Beschwerde: