Nur nach M1 OHLC - Openkurs traden lassen

 

Hallo zusammen,


ich habe mein System im Tester mit mit dem "1 Minute OHLC"-Chart entwickelt, getestet und optimiert, da der über längere Zeiträume von >1Jahr deutlich schneller durchläuft. Leider verhält sich das System in echt bzw. auf Tick-Ebene dann ganz und gar nicht so wie in den Tests.

Ich habe deshalb hinter die OnTick() folgende Bedigung geschaltet:

      if(!isNewBar())
     {  
      return;
     }


mit

bool isNewBar()
  {
   datetime lastbar_time=datetime(SeriesInfoInteger(Symbol(),PERIOD_M1,SERIES_LASTBAR_DATE));
   if(last_time==0)
     {
      last_time=lastbar_time;
      return(false);
     }
   if(last_time!=lastbar_time)
     {
      last_time=lastbar_time;
      return(true);
     }
   return(false);
  
  }


Das heisst, der EA soll auch im Echtbetrieb nur einmal pro Minute bzw. bei einem neu eröffneten Minutenbar durchlaufen werden und dann Handelsentscheidungen treffen, so wie in den Tests, wo er mangels Daten ja nicht anderes machen konnte.

Das tut er jetzt auch, nur weichen die Testergebnisse auf echter Tickbasis mit dieser Funktion jetzt immer noch von den Testergebnissen auf M1-Basis ohne diese Funktion  ab.


Hat damit jemand Erfahrung? Woran könnte das liegen?

 
Tobse24:

Hallo zusammen,

Hat damit jemand Erfahrung? Woran könnte das liegen?

Vergleich doch mal die historischen Positionseröffnungen Deines Echt-Kontos mit denen bei einem Debugging mit historischen Kursen..

 

Daran rätsle ich auch schon lange herum.

An den Bar-Daten liegt es jedenfalls nicht.

Kleines Testprogramm und dessen Ergebnisse:

MqlRates rates[];
int      toCopy = 2;
int      toPrint=10;

int OnInit()
{
   ArraySetAsSeries(rates,true);
   return(INIT_SUCCEEDED);
}

void OnTick()
{
   if(!isNewBar())
      return;

   if(CopyRates(_Symbol,_Period,0,toCopy,rates)!=toCopy)
      return;
   
   Print(" T: ",TimeToString  (rates[1].time ),
         " O: ",DoubleToString(rates[1].open ,_Digits),
         " H: ",DoubleToString(rates[1].high ,_Digits),
         " L: ",DoubleToString(rates[1].low  ,_Digits),
         " C: ",DoubleToString(rates[1].close,_Digits));

   toPrint--;

   if(toPrint<=0)
      ExpertRemove();
}

bool isNewBar()
{
   static datetime barTime=NULL;
   
   if(barTime==NULL)
      barTime=iTime(_Symbol,_Period,0);
   
   if(barTime==iTime(_Symbol,_Period,0))
      return(false);

   barTime=iTime(_Symbol,_Period,0);

   return(true);
}

Ergebnis realeTicks:


Ergebnis 1M OHLC:


Kann man daraus folgern, daß die Unterschiede also nur in der aktuellen Kerze(Bar) entstehen???


Hier wird beschrieben wie die Ticks generiert werden.

https://www.metatrader5.com/en/terminal/help/algotrading/tick_generation

Real and Generated Ticks - Algorithmic Trading, Trading Robots - MetaTrader 5
Real and Generated Ticks - Algorithmic Trading, Trading Robots - MetaTrader 5
  • www.metatrader5.com
Ticks are required for testing and optimizing Expert Advisors, because they use tick data for operation. Testing can be performed on real ticks provided by a broker or on ticks generated by the strategy and based on minute data. Real Ticks # Testing and optimization on real ticks are as close to real conditions as possible. Instead of generated...
 

Otto Du vergisst den Schlupf, der zB. bei News ganz besonders groß wird, weil Broker dann keine Kurse stelle für ein paar Momente!

So was macht der Tester nicht, daher zeigt das nur ein Ausführungsvergleich!

 
Carl Schreiber:

Otto Du vergisst den Schlupf, der zB. bei News ganz besonders groß wird, weil Broker dann keine Kurse stelle für ein paar Momente!

So was macht der Tester nicht, daher zeigt das nur ein Ausführungsvergleich!

Da hast du vollkommen recht! Im Extremfall kann das mehrere Sekunden werden!!!

Im Tester habe ich das Delay auf 50ms eingestellt. Das ist aber nicht ausschlaggebend, sondern die Verzögerung beim Broker.

Ich habe die Daten einer einzelnen Bar als Dateien extrahiert. Wer sich die Mühe machen möchte das zu analysieren ist herzlich dazu eingeladen.

1M_OHC:

 T: 2019.01.04 00:00 O: 1.26334 H: 1.26334 L: 1.26334 C: 1.26334
 T: 2019.01.04 00:00 O: 1.26334 H: 1.26334 L: 1.26323 C: 1.26323
 T: 2019.01.04 00:00 O: 1.26334 H: 1.26364 L: 1.26323 C: 1.26364
 T: 2019.01.04 00:00 O: 1.26334 H: 1.26364 L: 1.26323 C: 1.26354
 T: 2019.01.04 00:00 O: 1.26334 H: 1.26364 L: 1.26323 C: 1.26356
 T: 2019.01.04 00:00 O: 1.26334 H: 1.26364 L: 1.26323 C: 1.26348
 T: 2019.01.04 00:00 O: 1.26334 H: 1.26366 L: 1.26323 C: 1.26366
 T: 2019.01.04 00:00 O: 1.26334 H: 1.26366 L: 1.26323 C: 1.26360
 T: 2019.01.04 00:00 O: 1.26334 H: 1.26366 L: 1.26323 C: 1.26360
 T: 2019.01.04 00:00 O: 1.26334 H: 1.26366 L: 1.26323 C: 1.26356
 T: 2019.01.04 00:00 O: 1.26334 H: 1.26366 L: 1.26323 C: 1.26365
 T: 2019.01.04 00:00 O: 1.26334 H: 1.26366 L: 1.26323 C: 1.26361
 T: 2019.01.04 00:00 O: 1.26334 H: 1.26366 L: 1.26323 C: 1.26364
 T: 2019.01.04 00:00 O: 1.26334 H: 1.26366 L: 1.26323 C: 1.26360
 T: 2019.01.04 00:00 O: 1.26334 H: 1.26370 L: 1.26323 C: 1.26370
 T: 2019.01.04 00:00 O: 1.26334 H: 1.26370 L: 1.26323 C: 1.26370
 T: 2019.01.04 00:00 O: 1.26334 H: 1.26370 L: 1.26323 C: 1.26368
 T: 2019.01.04 00:00 O: 1.26334 H: 1.26370 L: 1.26323 C: 1.26370
 T: 2019.01.04 00:00 O: 1.26334 H: 1.26370 L: 1.26323 C: 1.26357
 T: 2019.01.04 00:00 O: 1.26334 H: 1.26370 L: 1.26323 C: 1.26365

Und reale Ticks: Die hänge ich als Datei dran, sind fast 1700 Zeilen(Ticks)!!!

Dateien:
TicksReal.txt  110 kb
 

Otto, Ticks sind OHLC sind zwei verschiedene Dinge!

Du kriegst NIE alle Ticks(*), vorallem nicht, "Wenn's schnell geht"! Aber in OHLC schaut es so aus als hättest Du sie bekommen.

Das führt dazu, dass zB. plötzlich ein High in der 1M-Bar existiert, dessen Tick Du nie bekommen hast!

Du müsstest die Ticks einzeln mitschreiben und dann mit OHLC vergleichen - ein Demokonto liefert dafür wahrscheinlich auch nicht das, was der Broker auf dem Echtgeldkonten macht!

------------------------------

(*) Ist ja auch begründbar, oder willst Du zB. 100 Ticks noch abarbeiten, obwohl der Preis sich schon viel weiterentwickelt hat?
 
Carl Schreiber:

Otto, Ticks sind OHLC sind zwei verschiedene Dinge!

Du kriegst NIE alle Ticks(*), vorallem nicht, "Wenn's schnell geht"! Aber in OHLC schaut es so aus als hättest Du sie bekommen.

Das führt dazu, dass zB. plötzlich ein High in der 1M-Bar existiert, dessen Tick Du nie bekommen hast!

Du müsstest die Ticks einzeln mitschreiben und dann mit OHLC vergleichen - ein Demokonto liefert dafür wahrscheinlich auch nicht das, was der Broker auf dem Echtgeldkonten macht!

------------------------------

(*) Ist ja auch begründbar, oder willst Du zB. 100 Ticks noch abarbeiten, obwohl der Preis sich schon viel weiterentwickelt hat?


Und was macht dann der 1 Minute OHLC-Tester? Nimmt der immer die "optimalen" Kurse?


Das ist der Tester mit 1 Minute OHLC-Modelling bei einem M5 Chart


Das ist die gleiche Sequenz in M5 mit einem realen Tick-Modelling und einer aktiven isNewBar()-Funktion:



Scheinbar war der EA zu der Zeit als Low-Kurs-Tick erreicht war in der Tick-Simulation gerade inaktiv, da noch kein neuer Bar angebrochen war, während das 1 Minute OHLC-Modelling scheinbar auch Low-Kurse in der laufenden Minute berücksichtigt, was die isNewBar()-Funktion ja nicht kann.

Damit handelt das Minute OHLC-Modelling natürlich deutlich besser, wie wir in der Grafik erkennen. Die Frage ist also:

Kann man eine isNewBar()-Funktion basteln, die das auch so macht???

Wenn ich jetzt keinem Denkfehler unterliege dürfte das ja unmöglich sein, da der High und der Low ja dann noch nicht bekannt sind wenn ein neuer Bar anbricht...das 1 Minute OHLC-Modelling wäre demnach für die Tonne...

 
Tobse24:


Und was macht dann der 1 Minute OHLC-Tester? Nimmt der immer die "optimalen" Kurse?


Das ist der Tester mit 1 Minute OHLC-Modelling bei einem M5 Chart


Das ist die gleiche Sequenz in M5 mit einem realen Tick-Modelling und einer aktiven isNewBar()-Funktion:



Scheinbar war der EA zu der Zeit als Low-Kurs-Tick erreicht war in der Tick-Simulation gerade inaktiv, da noch kein neuer Bar angebrochen war, während das 1 Minute OHLC-Modelling scheinbar auch Low-Kurse in der laufenden Minute berücksichtigt, was die isNewBar()-Funktion ja nicht kann.

Damit handelt das Minute OHLC-Modelling natürlich deutlich besser, wie wir in der Grafik erkennen. Die Frage ist also:

Kann man eine isNewBar()-Funktion basteln, die das auch so macht???

Wenn ich jetzt keinem Denkfehler unterliege dürfte das ja unmöglich sein, da der High und der Low ja dann noch nicht bekannt sind wenn ein neuer Bar anbricht...das 1 Minute OHLC-Modelling wäre demnach für die Tonne...

Du könntest OHLC der aktuellen, noch nicht fertigen Bar verwenden, dann "sieht" der EA auch die High/Low-Ticks, die er nicht bekopmmen oder die er ignoriert hat (um immer mit dem letzten Tick zu arbeiten).

 
Carl Schreiber:

Du könntest OHLC der aktuellen, noch nicht fertigen Bar verwenden, dann "sieht" der EA auch die High/Low-Ticks, die er nicht bekopmmen oder die er ignoriert hat (um immer mit dem letzten Tick zu arbeiten).

Kapier ich nicht Carl, was H und was L und was C ist sieht man doch erst hinterher, wenn die Kerze schon rum ist....
 
Nein, auch die aktuelle unvollständige Kerze (nach alter Zählung mit Index 0) haben ein Open,High, Low,Close, die letzten drei können sich allerdings ändern.
 
Carl Schreiber:
Nein, auch die aktuelle unvollständige Kerze (nach alter Zählung mit Index 0) haben ein Open,High, Low,Close, die letzten drei können sich allerdings ändern.
Aber das wäre dann ja wieder eine Simulation auf Tick-Basis, da er ja dann jeden Tick analysieren müsste um an das jeweils letzte High oder Low zukommen... oder etwa nicht?