Testando 'CopyTicks'. - página 19

 

1434 - 1ms em média leva para que o CopyTicks já tenha carregado 1000 ticks. Devagar, ao que parece.

Solicitando TRADE0tic com from_msc do último tick recebido anteriormente. Recebo 3 carrapatos, mas em 0,3 - 0,9ms! - Muito lento agora.

 
fxsaber:

Registramos fortemente o código acima e descobrimos as razões. Se o CopyTicks (de > 0) recebe carrapatos antes do mais fresco, pode pular alguns.

Uma resposta muito importante do Service Desk.

Em relação ao problema original - que o CopyTicks na próxima chamada pode dar mais carrapatos para o mesmo período:

Este é, de fato, o caso. O problema é que os fluxos de troca de dados bid/ask e flipper/volume são fluxos diferentes, que não estão sincronizados entre si já no lado da troca.

Por causa disso, há situações em que, pela primeira vez, o lance/venda com o tempo 12:12:12.12.300, e depois vem o flipper/volume com o tempo 12:12:12.299.

Assim, solicitando dados desde o último tick (12:12:12.300) você não receberá um novo flipper para 12:12:12.12.299.

PS. O terminal salva e envia carrapatos ordenados por tempo. Ou seja, a seqüência temporal de ticks dada ao CopyTicks está sempre aumentando.

Há duas correntes de recebimento de carrapatos - INFO e TRADE. ALL é uma união sintetizada (parece estar no lado terminal), é por isso que tais contratempos podem ocorrer.

É por causa da sintetização que existem tais palavras

Slawa:

os registros iniciais de tick após a chamada do CopyTicks não conterão zeros, mas os valores atuais de licitação, pedido e último no momento solicitado

Portanto, ao trabalhar com TODOS os carrapatos, você precisa ser claro sobre o que você está lidando. Também é possível que as bandeiras de seleção sejam sintetizadas. Eu gostaria de ter uma especificidade total sobre estas questões.

Com a fita, este problema não deve surgir se o CopyTicks funcionar corretamente.

Penso que a Ajuda será muito seriamente complementada.

 
fxsaber:
Você mesmo pode acrescentar qualquer sobrecarga.
Eu posso fazer muito, você pode fazer muito, outros programadores também podem fazer muito, mas espero que os desenvolvedores conheçam melhor o "recheio" e possam criar algoritmos rápidos para obter os carrapatos necessários.
 

Testes com a bandeira COPY_TICKS_TRADE

Não há diferença.

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
Arquivos anexados:
Check_ticks.mq5  41 kb
 
prostotrader:

Testes com a bandeira COPY_TICKS_TRADE

Não há diferença.

 
fxsaber:

Registramos fortemente o código acima e descobrimos as razões. Se o CopyTicks (de > 0) recebe carrapatos até os mais frescos, pode pular alguns.

Exemplo.

Carrapatos solicitados a partir de = 2016.09.29 11:05:55.564. Recebi três carrapatos em resposta

Algum tempo depois eu pedi o histórico do tick de longe e recebi um tick, que o CopyTicks perdeu antes.

Que insecto!

Parece haver algum conflito de escrita e leitura simultâneas no banco de dados de carrapatos.

1434 é o mesmo bug para os tipos TRADE-tipos. Consultor especialista em reprodução
#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

O histórico coletado do tick em tempo real do tópico TRADE não continha um tick com o tempo 2016.10.04 10:37:08.773, que apareceu mais tarde na história.

Isto é um tanto inconsistente com o que eu disse acima. Os problemas não são apenas com o fluxo sintetizado de TODOS, mas também com o fluxo direto - TRADE.

 
fxsaber:
1434 é o mesmo bug para os tipos TRADE-tipos. Conselheiro de reprodução
Peço desculpas, esta é a minha supervisão grosseira.
 
fxsaber:

1434 - 1ms em média leva para que o CopyTicks já tenha carregado 1000 ticks. Devagar, ao que parece.

Solicitando TRADE0tic com from_msc do último tick recebido anteriormente. Recebo 3 carrapatos, mas em 0,3 - 0,9ms! - Muito lento agora.

Relevante! Não há como acelerá-lo?

 

Gostaria de aproveitar esta oportunidade para agradecer aos desenvolvedores por seu trabalho com o CopyTicks!

Não posso afirmar que o CopyTicks funciona absolutamente corretamente, mas consegui trabalhar com a fita perfeitamente e entender o CopyTicks mais profundamente.

Para não reinventar a roda, você pode ver exemplos de indicadores de carrapatos de escrita bem ajustados baseados na fita aqui e aqui.

 
Qual é o algoritmo ideal (mais rápido) para obter carrapatos de_tempo a_tempo?