Historia de la garrapata - página 16

 
Karputov Vladimir:

Esto es lo que se pidió:

La transición después de 24 horas es correcta.
Método de prueba: Con el terminal encendido, he borrado los archivos del historial de ticks. Luego ejecuté el script dos veces (como no había historial, la primera ejecución del script inicializó la carga del historial).

Sí, gracias, hice lo mismo - ayudó. Sin embargo, un comportamiento muy extraño.
 

Pero el extraño comportamiento no termina ahí. He decidido comparar dos momentos de consulta de la misma historia.

El primer momento fue ayer cuando escribí sobre el error de llegada del viernes al lunes:

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Historia de la garrapata

Tapochun, 2015.10.19 08:48

Un poco más tarde - la imagen es así. Modo ALL 3000 ticks:

2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2774 2015.10.16 23:59:05: spread = 0, ask = 0.00000, bid = 0.00000, last = 1.54356
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2775 2015.10.16 23:59:05: spread = 72, ask = 1.54428, bid = 1.54356, last = 0.00000
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2776 2015.10.16 23:59:06: spread = 0, ask = 0.00000, bid = 0.00000, last = 1.54356
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2777 2015.10.16 23:59:06: spread = 75, ask = 1.54431, bid = 1.54356, last = 0.00000
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2778 2015.10.16 23:59:07: spread = 0, ask = 0.00000, bid = 0.00000, last = 1.54357
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2779 2015.10.16 23:59:07: spread = 74, ask = 1.54431, bid = 1.54357, last = 0.00000
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2780 2015.10.16 23:59:10: spread = 0, ask = 0.00000, bid = 0.00000, last = 0.00000
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2781 2015.10.19 09:44:41: spread = 18, ask = 1.54498, bid = 1.54480, last = 1.54480
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2782 2015.10.19 09:44:41: spread = 19, ask = 1.54499, bid = 1.54480, last = 0.00000
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2783 2015.10.19 09:44:42: spread = 19, ask = 1.54499, bid = 1.54480, last = 1.54480
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2784 2015.10.19 09:44:42: spread = 18, ask = 1.54498, bid = 1.54480, last = 0.00000
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2785 2015.10.19 09:44:42: spread = 18, ask = 1.54498, bid = 1.54480, last = 1.54480
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2786 2015.10.19 09:44:42: spread = 19, ask = 1.54499, bid = 1.54480, last = 0.00000
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2787 2015.10.19 09:44:42: spread = 19, ask = 1.54499, bid = 1.54480, last = 1.54480

Un agujero en la historia. En el modo INFO - similar.

Fíjate en los ticks que llegan a partir de las 9.44.41. Ahora el historial para el mismo símbolo, a la misma hora, en el mismo modo (ALL) sólo solicitado hoy:

QK      0       13:04:51.698    test_CopyTicks_1178 (GBPUSD,M5) OnStart: #289463 2015.10.19 09:44:41: spread = 0, ask = 0.00000, bid = 0.00000, last = 1.54480
LN      0       13:04:51.698    test_CopyTicks_1178 (GBPUSD,M5) OnStart: #289464 2015.10.19 09:44:41: spread = 19, ask = 1.54499, bid = 1.54480, last = 0.00000
DO      0       13:04:51.698    test_CopyTicks_1178 (GBPUSD,M5) OnStart: #289465 2015.10.19 09:44:42: spread = 0, ask = 0.00000, bid = 0.00000, last = 1.54480
ES      0       13:04:51.698    test_CopyTicks_1178 (GBPUSD,M5) OnStart: #289466 2015.10.19 09:44:42: spread = 18, ask = 1.54498, bid = 1.54480, last = 0.00000
HR      0       13:04:51.698    test_CopyTicks_1178 (GBPUSD,M5) OnStart: #289467 2015.10.19 09:44:42: spread = 0, ask = 0.00000, bid = 0.00000, last = 1.54480
EG      0       13:04:51.698    test_CopyTicks_1178 (GBPUSD,M5) OnStart: #289468 2015.10.19 09:44:42: spread = 19, ask = 1.54499, bid = 1.54480, last = 0.00000
DI      0       13:04:51.698    test_CopyTicks_1178 (GBPUSD,M5) OnStart: #289469 2015.10.19 09:44:42: spread = 0, ask = 0.00000, bid = 0.00000, last = 1.54480
DH      0       13:04:51.698    test_CopyTicks_1178 (GBPUSD,M5) OnStart: #289470 2015.10.19 09:44:42: spread = 18, ask = 1.54498, bid = 1.54480, last = 0.00000
IM      0       13:04:51.698    test_CopyTicks_1178 (GBPUSD,M5) OnStart: #289471 2015.10.19 09:44:42: spread = 0, ask = 0.00000, bid = 0.00000, last = 1.54480

El método de entrega es diferente. Y definitivamente faltan milisegundos.

¡Y cómo analizar las garrapatas en esta situación!

 
Renat Fatkhullin:

Eso es correcto.

He señalado exactamente - no hay estructura o lógica en el llenado de las garrapatas. Cada campo de precio es independiente de los demás. Lo que viene del proveedor es lo que se traduce.

Renat, resulta que los mismos ticks pueden venir de un proveedor, dependiendo del momento de la solicitud, de diferentes maneras...

¿Depende el formato del historial del servidor al que está conectado?

 
Tapochun:

Esto se promete que estará en la próxima build y seguro que tendrá sus fichas.

Sería bueno si sin "chips", y normalmente ... y se cansó de estos gráficos que dicen 99% de calidad de simulación ... y el real ni siquiera se acerca :) Para mí, en principio, no debería existir, porque si no, no es un probador sino un juguete. Y no se pueden hacer muchas gachas con las estrategias de cierre de los bares...

 
Maxim Dmitrievsky:

Estaría bien si no hubiera "trucos" y estuviera bien... pero estoy cansado de estos gráficos que dicen que el 99% de la calidad del modelado... y el real ni siquiera se acerca :) Para mí, en principio, no debería existir, porque si no, no es un probador sino un juguete. Y no se pueden hacer muchas gachas con las estrategias de cierre de los bares...

Sin chips, rara vez sucede a la vez. Esta historia de garrapatas ha sido esperada durante mucho tiempo, y queremos terminarla cuanto antes. Quiero que esté listo tanto en el probador como en la cuenta real. Lamentablemente, no hay muchos comentarios. Espero que el trabajo para ponerlo al día esté progresando.

 
Karputov Vladimir:

Por favor, especifique la bandera de recepción de ticks COPY_TICKS_INFO (sólo Bid y Ask) - ¿pueden Bid y Ask seguir con el valor "0" o en modo COPY_TICKS_INFO - Bid y Ask no contendrán ceros y el flujo de ticks será similar aldel terminal, en la ventana "Market Watch", pestaña "Ticks"?


Se solucionará en la compilación 1200:

MQL5: Formato extendido de la estructura MqlTick. Ahora, contiene el tiempo de llegada del tick en milisegundos, así como banderas que permiten determinar qué parámetro del tick ha cambiado.
struct MqlTick
  {
   datetime     time;          // Время последнего обновления цен
   double       bid;           // Текущая цена Bid
   double       ask;           // Текущая цена Ask
   double       last;          // Текущая цена последней сделки (Last)
   ulong        volume;        // Объем для текущей цены Last
   long         time_msc;      // Время последнего обновления цен в миллисекундах
   uint         flags;         // Флаги тиков
  };
Cada tic siempre tiene todos los parámetros rellenados, independientemente de que los datos hayan cambiado desde el tic anterior. Esto le permite tener siempre un estado actualizado de los precios en cualquier momento sin tener que buscar en el historial de ticks los valores anteriores. Por ejemplo, con un tick sólo puede haber cambiado el precio de la oferta, pero la estructura contendrá otros parámetros además del nuevo precio: precio de la oferta anterior, volumen, etc. Para saber qué datos han cambiado exactamente con el tick actual, analiza sus banderas:

  • TICK_FLAG_BID - tick de cambio de precio de oferta
  • TICK_FLAG_ASK - el tick ha cambiado el precio de venta
  • TICK_FLAG_LAST - El precio de la última transacción ha cambiado.
  • TICK_FLAG_VOLUME - El tick ha cambiado de volumen
  • TICK_FLAG_BUY - El tick se produjo como resultado de una operación de compra
  • TICK_FLAG_SELL - el tick se produjo como resultado de una operación de venta

La estructura MqlTick se utiliza en dos métodos:

  • CopyTicks - el método no soporta el formato de la estructura antigua. Los archivos EX5 previamente compilados que utilizan el antiguo formato de tick devolverán el error 4006 (ERR_MQL_INVALID_ARRAY) al llamar a la función CopyTicks.
  • SymbolInfoTick - el método admite tanto el formato de la estructura antigua como el de la nueva.
 

Así que:

MetaTrader 5 x64 build 1192 started (MetaQuotes Software Corp.)
...
authorized on MetaQuotes-Demo through Access Point Asia (ping: 556.27 ms)

y la estructura MqlTick actualizada :

Estructura actualizada de MqlTick

 
Karputov Vladimir:

Así que:

y la estructura MqlTick actualizada :


¿Y cómo hacer un seguimiento adecuado de la llegada de una nueva garrapata al terminal? Por ejemplo, en el probador.

"La función OnTick() no es un manejador de cada tick, sino que notifica a un Asesor Experto sobre los cambios en el mercado. Los cambios pueden ser por lotes: varios ticks pueden llegar al terminal simultáneamente, pero la función OnTick() será llamada sólo una vez para notificar al Asesor Experto la última condición del mercado".

 
Maxim Dmitrievsky:

¿Cuál es la forma correcta de seguir la llegada de una nueva garrapata a la terminal? Por ejemplo, en el probador.

"La función OnTick() no es un manejador de cada tick, sino que notifica al Asesor Experto sobre los cambios en el mercado. Los cambios pueden ser por lotes: el terminal puede recibir varios ticks al mismo tiempo, pero la función OnTick() será llamada sólo una vez para informar al Asesor Experto sobre la última condición del mercado".

Si quieres hacer un seguimiento de cada tick, debes hacerlo en el indicador. Un indicador, a diferencia de un EA, maneja cada tick.

Añadido: ahora es posible analizar todos los ticks en el EA también - sólo es necesario introducir controles (por ejemplo para analizar la solicitud de CopyTicks con profundidad de 5 ticks).

 

Construye 1192. Windows 10 x32.

Preliminarmente se ha borrado por completo la carpeta del historial de ticks del servidor MetaQuotes-Demo. Utilizar el indicador

//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property indicator_chart_window
#property indicator_plots 0
//--- input parameter
input int   InpShowTicks=500;    // клубина истории тиков
//--- parameters
MqlTick     arr_mql_tick[];      // массив структур хранящий тики
bool        bingo=false;         // false - скачано тиков меньше запрошенного
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   Comment("");
   ResetLastError();
//--- новый размер массива структур тиков
   if(ArrayResize(arr_mql_tick,InpShowTicks)==-1)
     {
      Print("Error OnInit #1",GetLastError());
      return(INIT_FAILED);
     }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   static int count;
   string text="";
   if(bingo)
      return(rates_total);
   int copied=CopyTicks(_Symbol,arr_mql_tick,COPY_TICKS_INFO,0,InpShowTicks);
   if(copied==InpShowTicks)
      bingo=true;
   text="Запрошено "+IntegerToString(InpShowTicks)+" тиков, скачано "+IntegerToString(copied);
   Comment(text);
   count++;
   return(rates_total);
  }
//+------------------------------------------------------------------+

He comprobado la descarga de garrapatas. Para algunos instrumentos se descargan 500 ticks en el primer o segundo tick y no se descargan más de 200 Kb (simplemente arrastro y suelto los instrumentos desde Market Watch en un gráfico).

Pero en algunos instrumentos ocurren milagros: el historial de ticks no quiere darme los 500 ticks necesarios, pero el terminal descarga unos 20 Mb de historial (historial de 10 y 9 meses).

Archivos adjuntos:
test.mq5  3 kb
Razón de la queja: