Bibliotheken: OnTickMulti - Seite 3

 
Stanislav Korotky #:

Es gibt keinen Blick in die Zukunft, denn wenn für den Zeitpunkt X Ticks für mehrere Symbole vorliegen, dann wird zusammen mit dem ersten Ereignis auf einem der Instrumente bei den übrigen Symbolen (für die die Ereignisse noch in der Warteschlange stehen) der vorherige Tick angezeigt und nicht der nächste Tick (wie im Beispiel: 00:04 lag vor 00:05 und nicht danach).

Zur Synchronisation muss diese algorithmisch im eigenen Code gewährleistet werden, beispielsweise indem im OnTick-Handler die Tick-Zeiten aller beteiligten Symbole abgefragt werden, bevor ein Handel initiiert wird. Grundsätzlich ist es jedoch schwer vorstellbar, eine zuverlässige Synchronisation zu erreichen, wenn die Arbitrage genau auf Ticks basiert (und nicht auf Balken oder Minuten), da Ticks bei bestimmten Wertpapieren tatsächlich mehrere Sekunden lang ausbleiben können.

Das ist alles relativ: Bei einem Instrument kommt es zu einer Verzögerung, bei einem anderen zu einer Vorverlegung.

Dort schwankt alles; im Debugger läuft alles synchron, auch mit einem fast leeren OnTick.

Man muss die Bars für den Test in Ticks umwandeln, um die Provision und den Spread korrekt zu simulieren.

Das musste ich in OnTick umsetzen, damit die Berechnungen des benutzerdefinierten Testers mit MT übereinstimmen.

   int size=ArraySize(T);
   if(size==0) return;
   datetime dt1=(datetime)SymbolInfoInteger(name1,SYMBOL_TIME);
   datetime dt2=(datetime)SymbolInfoInteger(name2,SYMBOL_TIME);
   while(sh1<size && T[sh1]<dt1) sh1++;
   while(sh2<size && T[sh2]<dt2) sh2++;
   while(sh1<size && T[sh1]==dt1)
     {if(D1[sh1]>0)  Buy(name1);
      if(D1[sh1]<0) Sell(name1);
      if(D1[sh1]==0) Close(name1);
      sh1++;
     }
   while(sh2<size && T[sh2]==dt2)
     {if(D2[sh2]>0)  Buy(name2,D2[sh2]);
      if(D2[sh2]<0) Sell(name2,fabs(D2[sh2]));
      if(D2[sh2]==0) Close(name2);
      sh2++;
     }
 
Stanislav Korotky #:

Um die Synchronisation zu gewährleisten, muss dies algorithmisch im eigenen Code umgesetzt werden, beispielsweise indem im OnTick-Handler die Tick-Zeiten aller beteiligten Symbole abgefragt werden, bevor ein Handel initiiert wird.

Ich fürchte, damit lässt sich im OnTick-Handler nicht erkennen, dass die Reihe der Ticks mit der aktuellen Zeit beendet ist. Wahrscheinlich hilft hier nur ein OnTimer im Millisekundenbereich.

 
Rorschach #:

Alles ist relativ: Bei dem einen Instrument entsteht ein Rückstand, beim anderen ein Vorsprung.

Es gibt die aktuelle Zeit (des Testers) – nur in Bezug darauf kann man von „in die Zukunft blicken“ sprechen. Wenn der aktuelle Zeitpunkt X ist und für zwei Instrumente Ticks für die Zeitpunkte X-1 bzw. X-2 vorliegen, dann sind dies die letzten bekannten aktuellen Ticks, und diese müssen vom Algorithmus berechnet werden. Wenn nun zum Zeitpunkt X-2 jemand versuchen würde, die Ticks für X-1 und X zu berechnen, wäre das ein Blick in die Zukunft. Technisch gesehen lässt der Tester dies jedoch nicht zu.
 
fxsaber #:

Ich fürchte, dadurch kann OnTick nicht erkennen, dass die Reihe der Ticks mit der aktuellen Zeit beendet ist. Wahrscheinlich hilft hier nur ein OnTimer im Millisekundenbereich.

Es hängt davon ab, wie die Zeitbedingung in der if-Anweisung formuliert wird – es muss ein striktes „>“ statt „>=“ verwendet werden, und der Tick, der zur Auslösung der Bedingung geführt hat, darf nicht mitgezählt werden. Mit einem Timer funktioniert es ähnlich.
 
Stanislav Korotky #:
Das hängt davon ab, wie man die Bedingung in der if-Anweisung in Bezug auf die Zeit formuliert – man muss ein striktes „>“ statt „>=“ verwenden und den Takt, der zur Auslösung der Bedingung geführt hat, nicht mitzählen.
Das verstehe ich nicht.
 
Stanislav Korotky #:
Mit dem Timer funktioniert es genauso.
Das ist dort einfacher.
 
fxsaber #:
Das habe ich nicht verstanden.

Auf den ersten Blick, bei einer Zeitidentifizierung mit einer Genauigkeit von einer Millisekunde (bei Sekunden gilt Ähnliches):

// TODO: ArrayResize(lookback, <Anzahl der Symbole>)
MqlTick lookback[];

void OnTickMulti(const string &symbol, const uint &index)
{
   static MqlTick t[1];
   static long timeCurrentMsc;
   
   SymbolInfoTick(symbol, t[0]);
   
   if(t[0].time_msc > timeCurrentMsc)
   {
      if(!timeCurrentMsc) // Nicht ganz am Anfang, also ist dies eine neue Millisekunde
      {
         // TODO: „lookback[] ticks“ für Analysen und Handelsgeschäfte verwenden
         // Der aktuelle Tick ist darin noch nicht enthalten, da er erst in der nächsten Millisekunde erfolgt
         // ...
      }
      timeCurrentMsc = t[0].time_msc;
   }

   // Erst nach der Analyse die Registrierung mit dem neuen Zeitstempel aktualisieren
   lookback[index] = t[0];
}

Aber ich wiederhole noch einmal (für Rorschach), dass eine Synchronisation in solch kleinen Intervallen illusorisch ist. Die Ticks eines bestimmten Instruments können über Sekunden hinweg ausbleiben, sodass der für sie relevante Kurs tatsächlich „veraltet“ sein kann. Wenn es für jemanden wichtig ist, dass alle Kurse auf dieselbe [Millisekunde] genau sind, muss im angeführten Ausschnitt (im auskommentierten Analyseblock) zusätzlich die Gleichheit der Tick-Zeitpunkte überprüft werden, und erst bei Erfüllung dieser Bedingung sollte gehandelt werden.

 
Stanislav Korotky #:

Auf den ersten Blick, mit einer Zeitangabe auf die Millisekunde genau (bei Sekunden gilt dasselbe):

Mit dieser Methode lässt sich die Aktualität der Ticks aller Symbole keinesfalls garantieren. Dies ist nur über einen Millisekunden-OnTimer möglich.
 
fxsaber #:
Mit dieser Methode lässt sich die Aktualität der Ticks aller Symbole keinesfalls gewährleisten. Dies ist nur über einen OnTimer im Millisekundenbereich möglich.
Was ist unter „Aktualität“ zu verstehen (diese Methode liefert die zuletzt bekannten Ticks für alle Instrumente; kann man „CopyTicks“ verwenden, wenn es darum geht)? Und inwiefern würde „OnTimer“ zu einem anderen Ergebnis führen?
 

Stanislav Korotky #:
Что подразумевается под актуальностью (этот метод отдает последние известные тики по всем инструментам)?

Es gibt keine Ticks mehr mit der zuletzt bekannten Zeit.

Und wie kommt es, dass OnTimer ein anderes Ergebnis liefert?

Der Millisekunden-OnTimer garantiert, dass alle Ticks VOR diesem Timer-Ereignis abgelaufen sind. Das heißt, die Ticks sind für alle Zeichen aktuell.