Probando 'CopyTicks' - página 19

 

1434 - 1ms de media tarda en llegar CopyTicks ya cargado 1000 ticks. Lento, parece.

Solicitar TRADE0tic con from_msc del último tick recibido anteriormente. ¡Obtengo 3 ticks, pero en 0.3 - 0.9ms! - Muy lento ahora.

 
fxsaber:

Registró fuertemente el código de arriba y descubrió las razones. Si CopyTicks (desde > 0) obtiene ticks antes del más reciente, puede omitir algunos.

Una respuesta muy importante de Service Desk.

En cuanto al problema original - que CopyTicks en la siguiente llamada puede dar más ticks para el mismo período:

Así es. El problema es que los flujos de datos de la bolsa bid/ask y flipper/volumen son flujos diferentes, que no están sincronizados entre sí ya en el lado de la bolsa.

Debido a esto hay situaciones, cuando primero llega la oferta/compra con el tiempo 12:12:12.300, y más tarde llega el flipper/volumen con el tiempo 12:12:12.299.

En consecuencia, al solicitar datos desde el último tick (12:12:12.300) no obtendrá una nueva aleta para las 12:12:12.299.

PD: El terminal guarda y envía los ticks ordenados por tiempo. Es decir, la secuencia de tiempo de los ticks dados a CopyTicks es siempre creciente.

Hay dos flujos de recepción de ticks: INFO y TRADE. TODO es una unión sintetizada (parece que está en el lado del terminal), por eso pueden ocurrir estos percances.

Es por sintetizar que había tales palabras

Slawa:

los registros de ticks iniciales después de la llamada de CopyTicks no contendrán ceros, sino los valores actuales de bid, ask y last en el momento solicitado

Por lo tanto, cuando se trabaja con TODAS las garrapatas, hay que ser claramente consciente de lo que se está tratando. Es posible que las banderas de las garrapatas también se sinteticen. Me gustaría que se concretaran todas estas cuestiones.

Con la cinta este problema no debería surgir con el correcto funcionamiento de CopyTicks.

Creo que la ayuda se complementará muy seriamente.

 
fxsaber:
Puede añadir cualquier sobrecarga usted mismo.
Yo puedo hacer mucho, tú puedes hacer mucho, otros programadores también pueden hacer mucho, pero es de esperar que los desarrolladores conozcan mejor el "relleno" y puedan crear algoritmos rápidos para obtener los ticks necesarios.
 

CopyTicks probados con la bandera COPY_TICKS_TRADE

No hay diferencia.

2016.10.03 15:50:48.507 Check_ticks (RTS-12.16,M1)      History ticks = 9
2016.10.03 15:50:48.507 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 9
2016.10.03 15:50:48.956 Check_ticks (RTS-12.16,M1)      History ticks = 11
2016.10.03 15:50:48.956 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 11
2016.10.03 15:50:49.184 Check_ticks (RTS-12.16,M1)      History ticks = 12
2016.10.03 15:50:49.184 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 12
2016.10.03 15:50:49.510 Check_ticks (RTS-12.16,M1)      History ticks = 14
2016.10.03 15:50:49.511 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 14
2016.10.03 15:50:51.568 Check_ticks (RTS-12.16,M1)      History ticks = 15
2016.10.03 15:50:51.568 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 15
2016.10.03 15:50:51.627 Check_ticks (RTS-12.16,M1)      History ticks = 16
2016.10.03 15:50:51.627 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 16
2016.10.03 15:50:53.143 Check_ticks (RTS-12.16,M1)      History ticks = 19
2016.10.03 15:50:53.143 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 19
2016.10.03 15:50:54.514 Check_ticks (RTS-12.16,M1)      History ticks = 27
2016.10.03 15:50:54.514 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 26
2016.10.03 15:50:54.542 Check_ticks (RTS-12.16,M1)      History ticks = 27
2016.10.03 15:50:54.542 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 27
2016.10.03 15:50:54.847 Check_ticks (RTS-12.16,M1)      History ticks = 30
2016.10.03 15:50:54.847 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 30
2016.10.03 15:50:57.052 Check_ticks (RTS-12.16,M1)      History ticks = 31
2016.10.03 15:50:57.052 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 31
2016.10.03 15:50:57.301 Check_ticks (RTS-12.16,M1)      History ticks = 32
2016.10.03 15:50:57.301 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 32
2016.10.03 15:51:00.498 Check_ticks (RTS-12.16,M1)      History ticks = 44
2016.10.03 15:51:00.498 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 44
Archivos adjuntos:
Check_ticks.mq5  41 kb
 
prostotrader:

CopyTicks probados con la bandera COPY_TICKS_TRADE

No hay diferencia.

 
fxsaber:

Registró fuertemente el código de arriba y descubrió las razones. Si CopyTicks (desde > 0) obtiene ticks hasta el más reciente, puede omitir algunos.

Ejemplo.

Ticks solicitados con from = 2016.09.29 11:05:55.564. Obtuve tres ticks en respuesta

Algún tiempo después he solicitado el historial de gar rapatas desde lejos y he obtenido una garrapata, que CopyTicks pasó por alto antes

¡Qué bicho!

Parece que hay algún conflicto de escritura y lectura concurrente en la base de datos de ticks.

1434 es el mismo error para los tipos de comercio. Reproducción del Asesor Experto
#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

long LastTime = 0; // time_msc-время последнего тика (самого свежего), полученного из истории
int Count = 0;     // Количество тиков в последенем запросе, у которых time_msc == LastTime

// Возвращает свежие тики, пришедшие после предыдущего вызова
int GetFreshTicks( MqlTick &Ticks[], const uint flags = COPY_TICKS_TRADE, const uint count = 100000 )
{
  int Res = 0;

  MqlTick NewTicks[];
  const int NewAmount = CopyTicks(Symbol(), NewTicks, flags, LastTime, count);

  if ((NewAmount > 0) && (Count < NewAmount))
  {
    Res = ArrayCopy(Ticks, NewTicks, 0, Count);

    // Взяли крайнее время из текущей истории
    LastTime = Ticks[Res - 1].time_msc;
    Count = 1;

    // Находим (Count) в текущей истории количество тиков со временем LastTime
    for (int i = Res - 2; i >= 0; i--)
    {
      if (Ticks[i].time_msc < LastTime)
        break;

      Count++;
    }
  }
  
  return(Res);
}

string GetTickFlag( uint tickflag )
{
  string flag = "";

#define  TICKFLAG_MACRO(A) flag += ((bool)(tickflag & TICK_FLAG_##A)) ? " TICK_FLAG_" + #A : "";
  TICKFLAG_MACRO(BID)
  TICKFLAG_MACRO(ASK)
  TICKFLAG_MACRO(LAST)
  TICKFLAG_MACRO(VOLUME)
  TICKFLAG_MACRO(BUY)
  TICKFLAG_MACRO(SELL)
#undef  TICKFLAG_MACRO

  if (flag == "")
    flag = " FLAG_UNKNOWN (" + (string)tickflag + ")";
     
  return(flag);
}

#define  TOSTRING(A) " " + #A + " = " + (string)Tick.A

string TickToString( const MqlTick &Tick )
{
  return(TOSTRING(time) + "." + (string)IntegerToString(Tick.time_msc %1000, 3, '0') +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags));
}

#define  TOSTRING2(A) #A + " = " + (string)(A) + " "

template <typename T>
bool ArrayEqual( const T &Array1[], const T &Array2[] )
{
  const int Amount = MathMin(ArraySize(Array1), ArraySize(Array2));
  bool Res = (Amount > 0);

  if (Res)
    for (int i = 0; i < Amount; i++)
      if (_R(Array1[i]) != Array2[i]) // https://www.mql5.com/ru/code/16280
      {
        Print(TOSTRING2(i) + TOSTRING2(ArraySize(Array1)) + TOSTRING2(ArraySize(Array2)));
        Print(TOSTRING2(TickToString(Array1[i])) + "\n" + TOSTRING2(TickToString(Array2[i])) + "\n");
        Print(TOSTRING2(TickToString(Array1[i - 1])) + "\n" + TOSTRING2(TickToString(Array2[i - 1])) + "\n");
        
        Res = false;
        
        ExpertRemove();

        break;
      }

  return(Res);
}

void OnTick( void )
{
  static bool FirstRun = true;
  static MqlTick PrevTicks[];
  
  if (FirstRun)
  {
    LastTime = TimeCurrent() * 1000;
    Count = 0;
    
    FirstRun = false;
  }
  
  MqlTick Ticks[];

  // Взяли свеженькие тики
  const int Amount = GetFreshTicks(Ticks);

  ArrayCopy(PrevTicks, Ticks, ArraySize(PrevTicks));
  
  if (ArraySize(PrevTicks) > 0)    
  {
    MqlTick NewTicks[];
    
    // Взяли историю тиков
    Print(CopyTicks(_Symbol, NewTicks, COPY_TICKS_TRADE, PrevTicks[0].time_msc, 1000000));
    
    // Проверка на совпадение собираемой истории с самой историей
    Print(ArrayEqual(NewTicks, PrevTicks) ? "Equal" : "Not Equal");
  }  
}
Resultado
2016.10.04 10:36:17.743 Test13 (RTS-12.16,M1)   Not Equal
2016.10.04 10:36:17.743 Test13 (RTS-12.16,M1)   ExpertRemove() function called
2016.10.04 10:36:17.743 Test13 (RTS-12.16,M1)   
2016.10.04 10:36:17.743 Test13 (RTS-12.16,M1)   TickToString(Array2[i-1]) =  time = 2016.10.04 10:37:07.791 bid = 99680.0 ask = 99690.0 last = 99690.0 volume = 4 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY 
2016.10.04 10:36:17.743 Test13 (RTS-12.16,M1)   TickToString(Array1[i-1]) =  time = 2016.10.04 10:37:07.791 bid = 99680.0 ask = 99690.0 last = 99690.0 volume = 4 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY 
2016.10.04 10:36:17.743 Test13 (RTS-12.16,M1)   
2016.10.04 10:36:17.743 Test13 (RTS-12.16,M1)   TickToString(Array2[i]) =  time = 2016.10.04 10:37:07.791 bid = 99680.0 ask = 99690.0 last = 99690.0 volume = 4 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY 
2016.10.04 10:36:17.743 Test13 (RTS-12.16,M1)   TickToString(Array1[i]) =  time = 2016.10.04 10:37:08.773 bid = 99690.0 ask = 99700.0 last = 99690.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL 
2016.10.04 10:36:17.743 Test13 (RTS-12.16,M1)   i = 144 ArraySize(Array1) = 145 ArraySize(Array2) = 146 
2016.10.04 10:36:17.743 Test13 (RTS-12.16,M1)   145
2016.10.04 10:36:16.768 Test13 (RTS-12.16,M1)   Equal

El historial de ticks en tiempo real recopilado del hilo TRADE no contenía un tick con la hora 2016.10.04 10:37:08.773, que apareció más tarde en el historial.

Esto es algo incoherente con lo que he dicho más arriba. Los problemas no son sólo del flujo sintetizado, sino también del directo: el comercio.

 
fxsaber:
1434 es el mismo error para los tipos de comercio. Asesor de reproducción
Pido disculpas, se trata de un grave descuido mío.
 
fxsaber:

1434 - 1ms de media tarda en llegar CopyTicks ya cargado 1000 ticks. Lento, parece.

Solicitar TRADE0tic con from_msc del último tick recibido anteriormente. ¡Obtengo 3 ticks, pero en 0.3 - 0.9ms! - Muy lento ahora.

¡Relevante! ¿No hay forma de acelerarlo?

 

¡Me gustaría aprovechar esta oportunidad para agradecer a los desarrolladores su trabajo con CopyTicks!

No puedo afirmar que CopyTicks funcione de forma absolutamente correcta, pero he conseguido trabajar con la cinta perfectamente y entender CopyTicks más profundamente.

Para no reinventar la rueda, puede ver ejemplos afinados de escritura de indicadores de tick basados en la cinta aquí y aquí.

 
¿Cuál es el algoritmo óptimo (más rápido) para obtener ticks de_tiempo a_tiempo?