Librerías: OnTickMulti - página 3

 
Stanislav Korotky #:

No hay anticipación al futuro, porque si para el momento X hay ticks en varios símbolos, junto con el primer evento en uno de los instrumentos, en los demás símbolos (para los que los eventos aún están en la cola) aparecerá el tick anterior, y no el siguiente (como en el ejemplo, las 00:04 fueron antes de las 00:05, y no después).

Para la sincronización, hay que garantizarla algorítmicamente en el código; por ejemplo, en el controlador OnTick hay que consultar la hora de los ticks de todos los símbolos implicados antes de iniciar una operación. Pero, en principio, si el arbitraje se basa precisamente en los ticks (y no en las barras o los minutos), resulta difícil imaginar una sincronización fiable, ya que los ticks de algunos instrumentos pueden llegar a ausentarse durante varios segundos.

Todo es relativo: para un instrumento habrá un retraso, mientras que para otro habrá un adelanto.

Ahí todo fluctúa; en el depurador todo está sincronizado, incluso con OnTick casi vacío.

Hay que convertir las barras en ticks para la prueba, con el fin de simular correctamente la comisión y el spread.

Esto es lo que tuve que hacer en OnTick para que los cálculos del tester personalizado coincidieran con los de 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 #:

Para garantizar la sincronización, hay que implementarla algorítmicamente en el código; por ejemplo, en el controlador OnTick, consultar el tiempo de los ticks de todos los símbolos implicados antes de iniciar una operación.

Me temo que esto no permitirá que el OnTick detecte que la secuencia de ticks con la hora actual ha finalizado. Lo más probable es que solo sirva de ayuda un OnTimer de milisegundos.

 
Rorschach #:

Todo es relativo: para un instrumento habrá un retraso, mientras que para otro habrá un adelanto.

Existe el tiempo actual (del probador): solo en relación con él se puede utilizar la terminología relativa a «adelantarse al futuro». Si la hora actual es X y para dos instrumentos hay ticks correspondientes a los momentos X-1 y X-2, respectivamente, esos son los últimos ticks actuales conocidos, y el algoritmo debe basarse en ellos para realizar los cálculos. Ahora bien, si en el momento X-2 alguien intentara calcular los ticks para X-1 y X, eso sí que sería una «previsión del futuro». Pero, técnicamente, el tester no permite hacerlo.
 
fxsaber #:

Me temo que esto no permitirá que OnTick detecte que la cola de ticks con la hora actual ha terminado. Lo más probable es que solo sirva un OnTimer de un milisegundo.

Depende de cómo se escriba la condición del «if» en función del tiempo: hay que usar un «>» estricto, en lugar de «>=», y no tener en cuenta el tick que ha provocado que se cumpla la condición. Con el temporizador se conseguirá lo mismo.
 
Stanislav Korotky #:
Depende de cómo se escriba la condición del «if» en función del tiempo: hay que usar el operador «>» estricto, en lugar de «>=», y no tener en cuenta el tick que ha provocado que se cumpla la condición.
No lo entiendo.
 
Stanislav Korotky #:
Con el temporizador se consigue lo mismo.
Ahí es más sencillo.
 
fxsaber #:
No lo entiendo.

A grandes rasgos, con una identificación del tiempo con una precisión de milisegundos (lo mismo ocurre con los segundos):

// TODO: ArrayResize(lookback, <número de símbolos>)
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) // No es el principio absoluto, así que este es un nuevo milisegundo
      {
         // TODO: utilizar los ticks de lookback[] para el análisis y las operaciones
         // Todavía no incluyen el tick actual, porque corresponde al siguiente milisegundo
         // ...
      }
      timeCurrentMsc = t[0].time_msc;
   }

   // Solo tras el análisis, actualiza el registro con la nueva marca de tiempo
   lookback[index] = t[0];
}

Pero volveré a repetir (para Rorschach) que la sincronización en intervalos tan pequeños es ilusoria. Las cotizaciones de algún instrumento pueden estar ausentes durante segundos, por lo que el precio vigente para ellas puede, de hecho, «quedar obsoleto». Si para alguien es importante que todos los precios correspondan a un mismo [mili]segundo, entonces en el fragmento citado (en el bloque de análisis comentado) hay que comprobar además que los tiempos de los tics sean iguales y operar únicamente si se cumple esta condición.

 
Stanislav Korotky #:

A grandes rasgos, con identificación del tiempo con una precisión de milisegundos (lo mismo ocurre con los segundos):

Con este método no se puede garantizar en absoluto que los ticks de todos los caracteres estén actualizados. Solo a través de un OnTimer de milisegundos.
 
fxsaber #:
Con este método no hay forma de garantizar que los ticks de todos los instrumentos sean actuales. Solo se puede hacer mediante un OnTimer en milisegundos.
¿Qué se entiende por «actualidad» (este método devuelve los últimos ticks conocidos de todos los instrumentos; ¿se puede utilizar CopyTicks si es de eso de lo que se trata)? ¿Y de qué manera el OnTimer dará un resultado diferente?
 

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

Ya no habrá más ticks con la última hora conocida.

¿Y cómo es que OnTimer dará un resultado diferente?

El OnTimer en milisegundos garantiza que se hayan producido todos los ticks ANTES de ese evento del temporizador. Es decir, los ticks están actualizados para todos los símbolos.