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?
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 =)
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"!
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); }
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
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
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
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
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
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
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