Tiki en tiempo real - página 3

 
Aleksey Mavrin:

Sinceramente no entendí lo que querías que leyera en este enlace sobre ECN, sobre todo algo que no se sabía antes)

¿Lo hice? Eras tú quien quería algo. )))

No entiendes la diferencia entre el mercado de divisas y la bolsa, por eso te he dado el enlace.

Por favor, no ensucie la sección de intercambio con forex.

 
Sergey Chalyshev:

¿Quería hacerlo? Tú eras el que quería algo. )))

No entiendes la diferencia entre forex y exchange, por eso te he puesto el enlace.

Por favor, no ensucie la sección de intercambio con forex.

Sí, me gustaría mucho que la gente pudiera comunicarse con claridad, pero es inalcanzable, así que tenemos que contentarnos con lo que tenemos.

Y puede que tú tampoco entiendas algo, ¿has pensado? Por ejemplo, el motivo por el que has publicado el enlace)

Y una cosa más: no fui yo quien mencionó el Forex en primer lugar, estoy entrando en una discusión que ya ha comenzado. En primer lugar.

B 2 - ¿Alguien prohibió una discusión en la sección de intercambio para comparar diferentes mercados con la bolsa?

Y 3 - Dejemos de puntuar ala esquiadores vs snowboarders, ¿o estás en contra?

 

Un pequeño resumen con experimentos sobre el análisis de tics.

1. el manejador OnTick se salta un número significativo de ticks.
Por lo tanto, si se quiere analizar una franja de operaciones a través de un tick entrante, no tiene sentido.
Con este enfoque, los resultados del algoritmo en el probador y los resultados comerciales reales serán diferentes.

Como alternativa, se puede analizar la franja de operaciones para un periodo seleccionado o una cantidad determinada de últimas operaciones obteniendo los ticks del historial mediante las funciones CopyTicks() o CopyTicksRange().
En este caso, los resultados de la prueba del algoritmo en el probador y los resultados comerciales reales son los mismos.
Las desventajas son el menor rendimiento del algoritmo.

2. El número de eventos en el OnBookEvent es mucho mayor que el número de ticks históricos, lo cual es comprensible, porque además de los ticks este evento procesa el cambio de ticks.
Así que puede parecer que todos los ticks entrantes pueden ser analizados usando este evento.
Sin embargo, este no es el caso, no todas las operaciones pasan por los ticks.
Las órdenes de mercado pueden no pasar por el deslizador, pero se reflejarán en el feed de operaciones.
La razón es que el deslizador del mercado es, de hecho, un libro de órdenes, que están a la espera de ser ejecutadas si se cumplen las condiciones requeridas.

Ejemplo - Una operación no pasó por el manejador OnEventBook (que es hasta 5 ticks).

MT5

De nuevo la solución, como en la primera variante, es el análisis de los ticks históricos.
El inconveniente de esta solución es la imposibilidad de realizar pruebas en el probador. No se generan eventos de cambio del tick en el probador.

3. Los 8 bits indocumentados en la bandera de la garrapata nunca fueron respondidos. Hice la misma pregunta en otro hilo del foro.

Ya he decidido la forma de analizar la alimentación de los oficios: a través de la historia, aunque con una productividad reducida.
Esto me permite obtener resultados fiables al probar el algoritmo en el probador.

Gracias a todos por las ideas y los debates.

 
Vladimir Mikhailov:

Un pequeño resumen con experimentos sobre el análisis de tics.

1. El manejador OnTick se salta un número significativo de ticks.
Por lo tanto, si se quiere analizar una franja de operaciones a través de un tick entrante, no tiene sentido.
Con este enfoque, los resultados del algoritmo en el probador y los resultados de la negociación real serán diferentes.

Como alternativa, se puede analizar la franja de operaciones para un periodo seleccionado o una cantidad determinada de últimas operaciones obteniendo los ticks del historial mediante las funciones CopyTicks() o CopyTicksRange().
En este caso, los resultados de la prueba del algoritmo en el probador y los resultados comerciales reales son los mismos.
Las desventajas son el menor rendimiento del algoritmo.

2. Los eventos de OnBookEvent son significativos.....
Pero esto no es cierto, no todos los tratos pasan por el libro.

Ejemplo - Una operación no ha pasado por el manejador OnEventBook (y son hasta 5 ticks).

3. Los 8 bits indocumentados en la bandera de la garrapata nunca fueron respondidos. Hice la misma pregunta en otro hilo del foro.


2. Por favor, publique su código del constructor de ticks (estoy seguro de que está haciendo algo mal).

3. En la impresora, haz el EnumToString(flags)

 
prostotrader:

2. Publica el código de tu constructor de garrapatas (seguro que estás haciendo algo mal)

3. En la impresora hacer EnumToString(flags)

El código es el habitual, el mínimo. El OnBookEvent obtiene el último tick conocido y lo imprime.

//+------------------------------------------------------------------+
//|                                               TicksCollector.mq5 |
//|                               Copyright 2020, Vladimir Mikhailov |
//|                                                mikh.vl@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, Vladimir Mikhailov"
#property link      "mikh.vl@gmail.com"
#property version   "1.00"
MqlTick tick[1];
int counter=0;
string type;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   MarketBookAdd(_Symbol);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   MarketBookRelease(_Symbol);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnBookEvent(const string&  symbol)
  {
   CopyTicks(_Symbol,tick,COPY_TICKS_ALL,0,1);
   counter++;
   if((tick[0].flags&TICK_FLAG_BID)==TICK_FLAG_BID || (tick[0].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK)
      {
       printf("Symbol: %s; tick #: %d; flags: %d; Time: %s.%03d; Ask: %s; Bid: %s", _Symbol, counter, tick[0].flags, TimeToString(tick[0].time,TIME_MINUTES|TIME_SECONDS),tick[0].time_msc%1000, DoubleToString(tick[0].ask,_Digits), DoubleToString(tick[0].bid,_Digits));
      }
   else if((tick[0].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY || (tick[0].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL)
      {
       type=(tick[0].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY? "Buy": (tick[0].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL? "Sell": "";
       printf("Symbol: %s; tick #: %d; flags: %d; Time: %s.%03d; Volume: %.0f; Type: %s; Last: %s", _Symbol, counter, tick[0].flags, TimeToString(tick[0].time,TIME_MINUTES|TIME_SECONDS),tick[0].time_msc%1000, tick[0].volume_real, type, DoubleToString(tick[0].last,_Digits));
      }  
  }
//+------------------------------------------------------------------+

En cuanto al tercer punto, las banderas de tic no son una enumeración, por lo que la función EnumToString no es aplicable a ellas.

 
Vladimir Mikhailov:

El código es sencillo, mínimo. El evento OnBookEvent obtiene el último tick conocido y lo imprime.

En cuanto al tercer punto, las banderas de tic no son una enumeración, por lo que la función EnumToString no es aplicable a ellas.

Copias 1 tick y quieres que no haya saltos:)

OnBookEvent() se activa con cualquier cambio en el tick, pero en un momento dado

puede haber varias garrapatas. El terminal no recibe un tic, sino un PAQUETE de tic.

El indicador que recomendé (Cinta de todas las ofertas) tiene una descripción

en ruso. No seas perezoso, léelo.

 
prostotrader:

Copias 1 tick y no quieres saltos:)

OnBookEvent() se activa con cualquier cambio en el vaso, pero en un momento dado

puede haber varias garrapatas. El terminal no recibe un tic, sino un PAQUETE de tic.

El indicador que recomendé (Cinta de todas las ofertas) tiene una descripción

en ruso. No tengas pereza de leerlo.

Ver más de una garrapata es una inversión de la historia.

 
Vladimir Mikhailov:

Ver más de una garrapata es una apelación a la historia.

No entiendes en absoluto cómo funciona el terminal.

¡¡¡Lee los comentarios en el indicador!!!

//+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
bool is_book;
MqlTick ticks[];
ulong last_time;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
    is_book = MarketBookAdd(Symbol());
    int result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, 0, 1);
    if(result > 0)
    {
      last_time = ticks[0].time_msc;
    }  
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    if(is_book == true) MarketBookRelease(Symbol());
   
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
    if(Symbol() == symbol)
    {
       int result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
       if(result > 0)
       {
         for(int i= 0; i<result; i++)
         {
           if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
           if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
           if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
           if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
           if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
           if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
           Print("Unknown flag is ", ticks[i].flags);
         }
         last_time = ticks[0].time_msc + 1;
       }
     
    }
   
  }
//+------------------------------------------------------------------+
2020.01.29 10:51:42.077 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_ASK
2020.01.29 10:51:42.077 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_ASK
2020.01.29 10:51:42.077 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:42.121 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:42.194 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:50.903 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:52.235 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:52.399 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:52:05.174 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:52:24.630 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:52:24.630 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_LAST
2020.01.29 10:52:28.027 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_LAST

Añadido

En el ejemplo anterior, no todas las garrapatas son "atrapadas" como el paquete de garrapatas recién llegado

puede contener garrapatas con un tiempo anterior.

Estudia detenidamente el código "Cinta de todos los oficios" (está con comentarios).

 

Si le resulta difícil (o le da pereza) entender el código del indicador, entonces

mira el código más simple de un colector en tiempo real de todos los ticks

//+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
bool is_book;
MqlTick ticks[];
ulong last_time, mem_time;
bool is_first;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
    is_first = false;
    is_book = MarketBookAdd(Symbol());
    int result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, 0, 1);
    if(result > 0)
    {
      last_time = ticks[0].time_msc;
      is_first = true;
    }
    else
    {
      Alert("No start time!");
      return(INIT_FAILED);
    }   
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    if(is_book == true) MarketBookRelease(Symbol());
   
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
    if(Symbol() == symbol)
    {
      int result;
      if(is_first == true)
      {
        Print("First packet of ticks:");
        result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
        if(result > 0)
       {
         for(int i= 0; i<result; i++)
         {
           if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
           if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
           if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
           if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
           if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
           if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
           Print("Unknown flag is ", ticks[i].flags);
         }
         is_first = false;
         mem_time = last_time;
         last_time = ticks[0].time_msc + 1;
       } 
      }
      else
      {
        result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, mem_time, 0);
        if(result > 0)
        {
          for(int i= 0; i<result; i++)
          {
            if(ticks[i].time_msc == mem_time)
            {
              Print("Tick with old time:");
              if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
              if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
              if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
              if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
              if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
              if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
              Print("Unknown flag is ", ticks[i].flags);
            }
          }
        }
        result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
        if(result > 0)
        {
          Print("Ticks with new time:");
          for(int i= 0; i<result; i++)
          {
            if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
            if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
            if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
            if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
            if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
            if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
            Print("Unknown flag is ", ticks[i].flags);
          }
          mem_time = last_time;
          last_time = ticks[0].time_msc + 1;
        }
      }
    }
 }
//+------------------------------------------------------------------+
 
prostotrader:

ver un código más sencillo para un correcto colector en tiempo real de todos los ticks

¿Por qué recogerlos "en tiempo real" si se utiliza de todos modos CopyTicks?

Puedes copiar las garrapatas a la profundidad adecuada en el momento que quieras.

Razón de la queja: