Tiki en tiempo real - página 20

 
Roman:

Has hecho un lío de todo.

Como he escrito antes, las operaciones y el nivel 2 son suscripciones de datos diferentes, por lo que son diferentes manejadores de eventos.
Por eso las operaciones deben llamarse desde OnTick, y las bandas de volumen desde OnBook.
Estás tratando de llamar a las operaciones desde los eventos OnBook y a las bandas desde OnTick. Todo ello pensando que OnBook será más rápido para las operaciones.
No será más rápido, creo que es un engaño comparar dos manejadores de eventos destinados a cada uno de los diferentes hilos de datos.
Entiendo que todo esto es experimentación, pero sin entender la lógica de los sockets confundirás infinitamente estos manejadores OnTick y OnBook.

Ya he escrito, por si no lo has visto, "para mí no hay alternativa a OnBookEvent()".

Y todos los códigos, los resultados, las explicaciones... para que quede claro el porqué.

A juzgar por tu post, no entiendes... :)

¿Tal vez estás leyendo el mensaje?

Puedo obtener todos los datos rápida y fácilmente a través de OnBookEvent() sin utilizar OnTick().

pero no puedo obtener todos los datos con OnTick(). Entonces, ¿por qué debería usar OnTick()?

 
prostotrader:

Ya he escrito, por si no lo has visto, "para mí no hay alternativa a OnBookEvent()".

Y todos los códigos, los resultados, las explicaciones... para que quede claro el porqué.

A juzgar por tu post, no te queda claro... :)

¿Tal vez estás leyendo el tema?

Sí, entiendo que en su caso no hay alternativa, y con razón.
Y entiendo lo que dices. Sólo quería enfatizar este punto, que las operaciones y el nivel 2 son flujos de datos diferentes.
Tenemos que recordarlo, y los que no lo saben deberían saberlo.
Por eso, si necesita operaciones, debe llamar a las funciones necesarias para ello desde OnTick,
Si necesita pujar con el volumen, o la profundidad de una taza, entonces las funciones apropiadas deben ser llamadas desde OnBook.
No es correcto tomar eventos de OnBook y obtener operaciones, y tratar de obtener volúmenes o profundidad a partir de eventos de OnTick.
Y por eso entiendo que sólo está explicando a los demás, y experimentando por el camino.

 
Roman:



Y así entendí que sólo estás explicando a los demás, y experimentando en el camino.

Has acertado.

Acabo de hacer experimentos similares hace 7 años, elegí OnbookEvent().

Y ahora he decidido comprobar si algo ha cambiado... No lo ha hecho.

 
prostotrader:

El hecho es que el mercado de derivados (FORTS), incluso en los instrumentos "altamente líquidos", es muy débil,

Esto significa que puede comprar unnúmero muylimitado de contratos al precio adecuado, por lo que no sólo necesita el precio,

El volumen de contratos a este precio es muy importante.


Y SymbolInfo no da el volumen de este precio.

Por lo tanto, necesitamos utilizarMarketBookGet() que proporciona tanto el precio como el volumen para todo el libro.

¿Qué tiene que ver con el tema? No necesito OnBook para obtener ticks, porque OnTick definitivamente no es más lento.

¿Y por qué decir 20 veces cada uno que OnBook es indispensable? ¿Hay alguien que lo dude?


prostotrader:

Y no estoy de acuerdo en que cuando se dispara OnTck() podamos obtener ticks del historial.

Recordando el último tiempo de ticks, cuando se dispara OnTck(), podemos obtener los ticks

un nuevo tick(s) llegó en tiempo real - OnTck() se dispara, lo leemos inmediatamente, es decir, no es historia.

Cualquier garrapata que entre en el terminal ya es historia.

Pero no me refería a eso, sino a la construcción de la cinta sin huecos(SymbolInfoTick no ayudará).

 
Aleksey Mavrin:

Quería poner el código a prueba primero

Pero no puedo abrir la cuenta de apertura demo por algo. El tiempo está probablemente fuera de lugar, ¿o hay más complicaciones?

Tiki en tiempo real

prostotrader, 2020.01.31 13:18

Cuenta : 1007932

Inversor : FfiR87ty (contraseña de sólo lectura)
 
Andrey Khatimlianskii:

¿Qué tiene esto que ver con el tema? Esa es la única razón por la que me estoy metiendo en esto, no necesitas OnBook para obtener ticks, ya que OnTick definitivamente no es más lento.

¿Y por qué decir 20 veces cada uno que OnBook es indispensable? ¿Hay alguien que lo dude?

Cualquier garrapata que entre en la terminal es historia.

Pero no me refería a eso, sino a la construcción de una cinta sin saltos (SymbolInfoTick no ayudará en eso).

Parece que no os entendéis :)))
Él te habla de los mejores trajes de oferta con volumen, y tú le hablas de los intercambios y tratos :))
Muy bien, creo que lo tenemos todo aclarado.

Bueno, depende de cómo se mire la garrapata que viene - esto es historia.
Si para el servidor de la bolsa, entonces sí es historia, para el terminal no.
Porque el terminal para OnTick almacena los últimos 4096 registros en caché, para acceder a ellos en caliente, y luego los vuelca al historial en el disco.
Entonces resulta que todavía no es historia ))), es decir, el cierre de emergencia no guardará la caché en el disco.
Y cuando el terminal se reinicie, los datos perdidos en la caché se descargarán del servidor. Pero esto sólo se aplica a los datos OnTick.
Es probable que OnBook no cargue los datos.

 

Pensé que había al menos un OnBook por cada OnTick. pero entonces no entendí esto


 

Ponga este código en la Demo de Apertura para calcular el retraso medio y máximo entre OnTick y el siguiente OnBook.

El código está en la mano, puede ser torcido, voy a mirar los resultados.

//+------------------------------------------------------------------+
//|                                                   TestOnBook.mq5 |
//|                                           Copyright 2019, Allex@ |
//|                                                 alex-all@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, Allex@"
#property link      "alex-all@mail.ru"
#property version   "1.00"
//---
bool is_book;
enum ENUM_BOOK_OR_TICK
{
        USE_BOOK,       // Use OnBookEvent
        USE_TICK        // Use OnTick
};

input ENUM_BOOK_OR_TICK Mode = USE_BOOK;
input int   SecForPrint =  300;
//---
ulong TimeArrayBook[65536];
ulong TimeArrayTick[65536];
ushort curBook,curTick;
ulong  DelaySum=0,DelayCount=0;
int delay,delayMax=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   curBook=0;
   curTick=0; 
   ArrayInitialize(TimeArrayBook,INT_MAX);
   ArrayInitialize(TimeArrayTick,INT_MAX);
  if(Mode == USE_BOOK) is_book = MarketBookAdd(Symbol());
  if (EventSetTimer(SecForPrint)) 
  return(INIT_SUCCEEDED);
  else return (INIT_FAILED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  if(Mode == USE_BOOK)
  {
    if(is_book == true) MarketBookRelease(Symbol());
  }  
}
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
{ 
  TimeArrayBook[curBook++]=GetMicrosecondCount();
 }
void OnTick()
{
  TimeArrayTick[curTick++]=GetMicrosecondCount();
}
//+------------------------------------------------------------------+
void OnTimer()
  {
   string out=NULL;
   int total=MathMax(curBook,curTick);
   int i=0,k=0;
   while(i<total)
     {
      while(i<total && TimeArrayBook[i]<TimeArrayTick[k] )
        {
          Print("Book ",TimeArrayBook[i++]);
        }    
      if(k<curTick-1)
        {
        if(i<total)
          {
           delay=TimeArrayBook[i]-TimeArrayTick[k];
           if (delay>delayMax) 
            delayMax=delay;
           if (delay>0)
              {
                 DelaySum+=delay;
                 DelayCount++;
              }
          }
         Print("Tick ",TimeArrayTick[k++]);
        }       
        i++;
     }
     if (curTick>0)
     {
     Print("Tick ",TimeArrayTick[curTick-1], " last");
     string out="Count Event Book after Tick "+DelayCount+". Delay Average "+DoubleToString(DelaySum/DelayCount,2)+". Max "+delayMax;
     Print (out);
     Comment(out);
     }
     curBook=0;
     curTick=0;
  }
//---  
 
Andrey Khatimlianskii:

Cualquier garrapata que entre en el terminal ya es una historia.

Pero no me refería a eso, sino a la construcción de una cinta sin saltos (SymbolInfoTick no ayudará en eso).

Bien. Su punto de vista sobre la historia es bastante claro.

Pero sigo manteniendo mi opinión, que el método para conseguir las garrapatas dependerá de

su lectura (de la historia o en tiempo real).

Y no estaba en desacuerdo contigo sobre SymbolInfoTick y la cinta sin saltos.

 

Esa es la imagen del día. Por supuesto, no comprobamos si OnBook coincidía con Tick, sino que nos limitamos a tomar el siguiente, con la esperanza de que si OnTick se adelantaba a OnBook, el correspondiente fuera el mismo o ligeramente posterior.

Máximo, por supuesto, sin controles adicionales no es un indicador, o sobrepasar o realmente OnBook en algún lugar lento.


¿Pero es alguien que puede explicar? ¿Por qué hay tantos OnTicks sin fijar, y no cabe ni un solo OnBook entre ellos?


Razón de la queja: