Librerie: SuTickMulti - pagina 3

 
Stanislav Korotky #:

Non è possibile anticipare il futuro, perché se per l'istante X sono presenti dei tick su più simboli, insieme al primo evento su uno degli strumenti, sugli altri simboli (per i quali gli eventi sono ancora in coda) apparirà il tick precedente e non quello successivo (come nell’esempio, le 00:04 precedevano le 00:05, e non le seguivano).

Per la sincronizzazione, è necessario garantirla algoritmicamente nel proprio codice; ad esempio, nel gestore OnTick, interrogare l’ora dei tick su tutti i simboli coinvolti prima di avviare un’operazione. Ma, in linea di principio, se l’arbitraggio si basa proprio sui tick (e non sulle barre o sui minuti), è difficile immaginare una sincronizzazione affidabile, poiché i tick su alcuni simboli potrebbero effettivamente mancare per diversi secondi.

Tutto è relativo: per un instrumento ci sarà un ritardo, mentre per un altro un anticipo.

Lì è tutto instabile; nel debugger è tutto sincronizzato, anche con OnTick quasi vuoto.

Bisogna convertire le barre in tick per il test, in modo da simulare correttamente la commissione e lo spread.

Questo ho dovuto farlo in OnTick, affinché i calcoli del tester personalizzato coincidessero con quelli di MT.

   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 #:

Per garantire la sincronizzazione, è necessario implementarla algoritmicamente nel proprio codice; ad esempio, nel gestore OnTick, è necessario interrogare i tempi di tick di tutti i simboli coinvolti prima di avviare un'operazione.

Temo che ciò non permetta all’OnTick di capire che la sequenza di tick con l’ora corrente sia terminata. Probabilmente, l’unica soluzione sarà un OnTimer in millisecondi.

 
Rorschach #:

Tutto è relativo: per uno strumento si tratterà di un ritardo, mentre per un altro di un anticipo.

C'è l'ora corrente (del tester): solo rispetto ad essa è possibile utilizzare la terminologia relativa all'anticipazione del futuro. Se l’ora corrente è X e per due strumenti sono disponibili i tick rispettivamente per i momenti X-1 e X-2, allora questi sono gli ultimi tick attuali noti e sono quelli che devono essere elaborati dall’algoritmo. Se al momento X-2 qualcuno tentasse di calcolare i tick per X-1 e X, si tratterebbe di uno sguardo al futuro. Ma tecnicamente il tester non consente di farlo.
 
fxsaber #:

Temo che ciò non permetta a OnTick di capire che la sequenza di tick con l'ora corrente è terminata. Probabilmente l'unica soluzione sarà un OnTimer in millisecondi.

Dipende da come si scrive la condizione nel ciclo if in base al tempo: occorre utilizzare un > rigoroso, anziché >=, ed evitare di conteggiare il tick che ha determinato l’attivazione della condizione. Con il timer si otterrà un risultato analogo.
 
Stanislav Korotky #:
Dipende da come si scrive la condizione nel ciclo if in base al tempo: occorre usare il segno > (maggiore di), non >= (maggiore o uguale a), e non conteggiare il tick che ha determinato l'attivazione della condizione.
Non ho capito.
 
Stanislav Korotky #:
Con il timer funziona allo stesso modo.
Lì è più semplice.
 
fxsaber #:
Non ho capito.

A prima vista, con l'identificazione del tempo con una precisione al millisecondo (lo stesso vale per i secondi):

// TODO: ArrayResize(lookback, <numero-di-simboli>)
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) // non proprio all'inizio, quindi questo è un nuovo millisecondo
      {
         // TODO: utilizzare i tick di lookback[] per l'analisi e le operazioni di trading
         // non includono ancora il tick corrente, perché appartiene al millisecondo successivo
         // ...
      }
      timeCurrentMsc = t[0].time_msc;
   }

   // solo dopo l'analisi, aggiornare il registro con il nuovo timestamp
   lookback[index] = t[0];
}

Ma ribadisco ancora una volta (per Rorschach) che la sincronizzazione su intervalli così piccoli è illusoria. I tick di un determinato strumento possono mancare per interi secondi, quindi il prezzo attuale per essi potrebbe in realtà diventare "obsoleto". Se per qualcuno è importante che tutti i prezzi corrispondano allo stesso [mili]secondo, allora nel frammento riportato (nel blocco di analisi commentato) è necessario verificare ulteriormente la corrispondenza dei tempi dei tick e operare solo se questa condizione è soddisfatta.

 
Stanislav Korotky #:

A prima vista, con l'identificazione del tempo con una precisione al millisecondo (lo stesso vale per i secondi):

Con questo metodo non è assolutamente possibile garantire l'aggiornamento dei tick di tutti i simboli. È possibile farlo solo tramite un OnTimer al millisecondo.
 
fxsaber #:
Con questo metodo non è assolutamente possibile garantire l'attualità dei tick di tutti i simboli. Solo tramite un OnTimer in millisecondi.
Cosa si intende per "aggiornamento" (questo metodo restituisce gli ultimi tick noti per tutti gli strumenti; si può utilizzare CopyTicks se è di questo che si tratta)? E in che modo OnTimer fornirebbe un risultato diverso?
 

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

Non ci saranno più tick con l'ultimo tempo noto.

E in che modo OnTimer fornirà un risultato diverso?

OnTimer in millisecondi garantisce che tutti i tick siano trascorsi PRIMA di quell'evento del timer. Cioè, per tutti i simboli i tick sono aggiornati.