Letzte Ticks permanent speichern

Einloggen oder registrieren, um einen Kommentar zu schreiben
lindomatic
69
lindomatic  

Hallo allerseits,

ich habe hier recherchiert, mir die Funktionen angesehen und die CodeBase durchkämmt, aber offenbar möchte ich einen unüblich simples EA schreiben.
Der EA wird nur zu bestimmten Events gestartet, wenn starke Kursbewegungen zu erwarten sind und läuft dann nur ein paar Sekunden oder max. 2 Minuten.
Dazu brauche ich nur die ca. letzten 100 Ticks.
Mein Problem ist, dass wenn ich bspw. https://www.mql5.com/de/docs/series/copyticks in OnTick verwende, alle Werte mit dem nächsten Tick überschrieben werden.
Wenn ich ein Array in OnStart, wie im Beispiel, fülle, wird es nicht aktualisiert und mir fehlen genau die Ticks die ich brauche. 
Kann ich hier in OnTick mit den permanenten/stable Variablen arbeiten? 
Kann man aus OnTick etwas herausschreiben/speichern, was nicht mit dem nächsten Tick überschrieben wird?

Vielen Dank & Grüße,
Christian

Dokumentation zu MQL5: Zugang zu Zeitreihen und Indikatoren / CopyTicks
Dokumentation zu MQL5: Zugang zu Zeitreihen und Indikatoren / CopyTicks
  • www.mql5.com
die Indizierung erfolgt von der Vergangenheit in die Gegenwart, d.h. der Tick mit dem Index 0 ist der älteste im Array. Für die Analyse eines Ticks muss das Feld [in]  Anzahl angeforderter Ticks. Wenn die Parameter from und count nicht angegeben sind, dann werden alle vorhandenen Ticks im Array ticks_array[] gespeichert, aber nicht mehr als...
Carl Schreiber
Moderator
8691
Carl Schreiber  
Du musst das Array das von CopyTicks gefüllt (immer wieder) wird in ein anderes Array (vom Typ MqlTick) kopieren. Da musst Du dann aber kontrollieren, welche Ticks bei Du doppelt erhalten hast!
amando
2047
amando  

Mit der funktion speichert Mql die letzten 4096 ticks. Jetzt ist die frage wieviel du brauchst.

nehm an du willst schauen, wie stark sich der preis in den letzten xx sekunden verändert hat, das kannst du machen mit dieserr funktion. Sowas hab ich schon mal vor jahren gebastelt

lindomatic
69
lindomatic  
Carl Schreiber:
Du musst das Array das von CopyTicks gefüllt (immer wieder) wird in ein anderes Array (vom Typ MqlTick) kopieren. Da musst Du dann aber kontrollieren, welche Ticks bei Du doppelt erhalten hast!

Das kopierte Array wird doch dann auch pro Tick wieder überschrieben oder wie meinst Du wohin kopieren?

lindomatic
69
lindomatic  
amando:

Mit der funktion speichert Mql die letzten 4096 ticks. Jetzt ist die frage wieviel du brauchst.

nehm an du willst schauen, wie stark sich der preis in den letzten xx sekunden verändert hat, das kannst du machen mit dieserr funktion. Sowas hab ich schon mal vor jahren gebastelt

4096 könnte zu lange dauern.. das muss ja erst eingelesen und dann noch verarbeitet werden..
Ich schau' dann mal weiter.

Danke =)

Carl Schreiber
Moderator
8691
Carl Schreiber  
lindomatic:

4096 könnte zu lange dauern.. das muss ja erst eingelesen und dann noch verarbeitet werden..
Ich schau' dann mal weiter.

Danke =)

Lies mal die Dok. unter "Die Geschwindigkeit"!

Chris70
595
Chris70  

Hier ein kurzer Test zum Kopieren der letzten 1000 Ticks:

- Methode A: mit CopyTicks Array des vorherigen Aufrufs jeweils komplett überschreiben

- Methode B: Array nur beim ersten Aufruf mit CopyTicks auffüllen, dann bei jedem späteren Aufruf jeweils nur den ältesten Tick löschen (ArrayRemove) und nur den einzelnen neuen Tick ans Array-Ende kopieren

Ergebnis:

- Methode B ist deutlich schneller (einfach selbst ausprobieren)

// +------------------------------------------------------------------+
// |                          CopyTicks test                          |
// |                                    Metatrader username "Chris70" |
// |                                             https://www.mql5.com |
// +------------------------------------------------------------------+

#property   copyright     "metatrader username Chris70"
#property   version       "1.0"

//+------------------------------------------------------------------+
//| global scope                                                     |
//+------------------------------------------------------------------+
bool initialized=false;
int elements=1000;
ulong count0,count1;
ulong duration_a=0;
ulong duration_b=0;
MqlTick tick_arr_a[];
MqlTick tick_arr_b[];
MqlTick new_tick[1];
int iterations=0;

int OnInit() 
  {
   ArraySetAsSeries(tick_arr_a,false);
   ArraySetAsSeries(tick_arr_b,false);
   return(INIT_SUCCEEDED);
  }

void OnTick()
  {
//+------------------------------------------------------------------+
//| method A                                                         |
//+------------------------------------------------------------------+
   count0=GetMicrosecondCount();
   CopyTicks(_Symbol,tick_arr_a,COPY_TICKS_ALL,0,elements);
   count1=GetMicrosecondCount();
   duration_a+=count1-count0;
   
//+------------------------------------------------------------------+
//| method B                                                         |
//+------------------------------------------------------------------+
   count0=GetMicrosecondCount();
   if (!initialized)
     {
      CopyTicks(_Symbol,tick_arr_b,COPY_TICKS_ALL,0,elements);
      count1=GetMicrosecondCount();
      initialized=true;
     }
   else
     {
      ArrayRemove(tick_arr_b,0,1);
      SymbolInfoTick(_Symbol,new_tick[0]);
      ArrayResize(tick_arr_b,elements);
      ArrayCopy(tick_arr_b,new_tick,elements-1);
      count1=GetMicrosecondCount();
     }
   duration_b+=count1-count0;
     
   iterations++;
   Comment("\naverage duration method A (msc): ",double(duration_a)/iterations,
           "\naverage duration method B (msc): ",double(duration_b)/iterations);
  }

  
lindomatic
69
lindomatic  
Chris70:

Hier ein kurzer Test zum Kopieren der letzten 1000 Ticks:

- Methode A: mit CopyTicks Array des vorherigen Aufrufs jeweils komplett überschreiben

- Methode B: Array nur beim ersten Aufruf mit CopyTicks auffüllen, dann bei jedem späteren Aufruf jeweils nur den ältesten Tick löschen (ArrayRemove) und nur den einzelnen neuen Tick ans Array-Ende kopieren

Ergebnis:

- Methode B ist deutlich schneller (einfach selbst ausprobieren)

Das ist wieder super, Chris70, danke!

Interessant, dass zum Start des EA Methode A > 5x langsamer ist und sich nach ca. 10 Minuten auf das 2,5fache annährt.

Grüße,
Christian

lindomatic
69
lindomatic  
Chris70:

Hier ein kurzer Test zum Kopieren der letzten 1000 Ticks:

- Methode A: mit CopyTicks Array des vorherigen Aufrufs jeweils komplett überschreiben

- Methode B: Array nur beim ersten Aufruf mit CopyTicks auffüllen, dann bei jedem späteren Aufruf jeweils nur den ältesten Tick löschen (ArrayRemove) und nur den einzelnen neuen Tick ans Array-Ende kopieren

Ergebnis:

- Methode B ist deutlich schneller (einfach selbst ausprobieren)

Ich bin ein mieser Coder, ich weiß.. ich will das schon seit Jahren ändern, aber es fällt mir sehr schwer.

Ich muss an die einzelnen Felder von bspw. dem tick_arr_b kommen, mit:

Print(tick_arr_b); bekomme ich invalid array access, mit:
Print(tick_arr_b[0]); bekomme ich objects are passed by ref only.. was heißt das: ich muss sie als Ref mit & übergeben? Das hilft nicht. Werden sie bereits als Ref übergeben? Sehe ich nicht.
Habe es auch mit ArraySetAsSeries = true versucht, ändert auch nichts.

Das kann doch nicht so schwer sein?!

ArrayPrint funktioniert goldig, aber damit komme ich nicht an die einzelnen Werte =(

VG,
Christian

Chris70
595
Chris70  

tick_arr_b[elements-1].bid, tick_arr_b[elements-1].ask, tick_arr_b[elements-1].time... usw. ...

aber dabei die Richtung der Indizierung beachten: Index [0] ist der älteste Tick, Index [elements-1] der aktuellste

lindomatic
69
lindomatic  
lindomatic:

Ich bin ein mieser Coder, ich weiß.. ich will das schon seit Jahren ändern, aber es fällt mir sehr schwer.

Ich muss an die einzelnen Felder von bspw. dem tick_arr_b kommen, mit:

Print(tick_arr_b); bekomme ich invalid array access, mit:
Print(tick_arr_b[0]); bekomme ich objects are passed by ref only.. was heißt das: ich muss sie als Ref mit & übergeben? Das hilft nicht. Werden sie bereits als Ref übergeben? Sehe ich nicht.
Habe es auch mit ArraySetAsSeries = true versucht, ändert auch nichts.

Das kann doch nicht so schwer sein?!

ArrayPrint funktioniert goldig, aber damit komme ich nicht an die einzelnen Werte =(

VG,
Christian

Chris70:

tick_arr_b[elements-1].close, tick_arr_b[elements-1].open, tick_arr_b[elements-1].high... usw. ...

aber dabei die Richtung der Indizierung beachten: Index [0] ist der älteste Tick, Index [elements-1] der aktuellste

mega.. close/open hab ich nicht, nur bid/ask, aber ist auch gut =)

Ich habe das Buch hier in Hardcopy und echt schon was gewühlt online, aber das hätte ich niemals gefunden.. 

Bist Du auch vom ModeratorenTeam?

1000Dank&VG

12
Einloggen oder registrieren, um einen Kommentar zu schreiben