Testare 'CopyTicks'. - pagina 19

 

1434 - 1ms in media ci vuole per ottenere CopyTicks già caricato 1000 ticks. Lentamente, sembra.

Richiesta di TRADE0tic con from_msc dell'ultimo tick ricevuto in precedenza. Ottengo 3 tick, ma in 0.3 - 0.9ms! - Molto lento ora.

 
fxsaber:

Ha registrato con forza il codice di cui sopra e ha capito le ragioni. Se CopyTicks (da > 0) riceve tick prima del più fresco, può saltarne alcuni.

Una risposta molto importante dal Service Desk.

Per quanto riguarda il problema originale - che CopyTicks sulla prossima chiamata può dare più tick per lo stesso periodo:

Questo è effettivamente il caso. Il problema è che i flussi di dati dello scambio bid/ask e flipper/volume sono flussi diversi, che non sono sincronizzati tra loro già sul lato dello scambio.

A causa di questo ci sono situazioni in cui prima arriva il bid/ask con il tempo 12:12:12.300, e un po' più tardi arriva il flipper/volume con il tempo 12:12:12.299.

Di conseguenza, richiedendo i dati dall'ultimo tick (12:12:12.300) non otterrete un nuovo flipper per 12:12:12.299.

PS. Il terminale salva e invia i tick ordinati per tempo. Cioè, la sequenza temporale di tick data a CopyTicks è sempre crescente.

Ci sono due flussi di ricezione delle zecche - INFO e TRADE. TUTTO è un'unione sintetizzata (sembra essere sul lato terminale), ecco perché possono verificarsi tali contrattempi.

È a causa di sintetizzato che ci sono state tali parole

Slawa:

i record di tick iniziali dopo la chiamata di CopyTicks non conterranno zeri, ma i valori attuali di bid, ask e last al momento richiesto

Quindi, quando si lavora con TUTTE le zecche, è necessario essere chiaramente consapevoli di ciò con cui si ha a che fare. È possibile che anche le bandiere di spunta siano sintetizzate. Vorrei una completa specificità su questi temi.

Con il nastro questo problema non dovrebbe sorgere con il corretto funzionamento di CopyTicks.

Penso che l'aiuto sarà integrato molto seriamente.

 
fxsaber:
Potete aggiungere voi stessi qualsiasi sovraccarico.
Io posso fare molto, voi potete fare molto, anche altri programmatori possono fare molto, ma si spera che gli sviluppatori conoscano meglio il "ripieno" e possano creare algoritmi rapidi per ottenere i tick necessari.
 

CopyTicks testato con il flag COPY_TICKS_TRADE

Nessuna differenza.

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

CopyTicks testato con il flag COPY_TICKS_TRADE

Nessuna differenza.

 
fxsaber:

Ha registrato con forza il codice di cui sopra e ha capito le ragioni. Se CopyTicks (da > 0) ottiene tick fino al più fresco, potrebbe saltarne alcuni.

Esempio.

Tick richiesti con da = 2016.09.29 11:05:55.564. Ho ricevuto tre tick in risposta

Qualche tempo dopo ho richiesto la cronologia dei tick da lontano e ho ottenuto un tick, che CopyTicks ha mancato prima

Un tale insetto!

Sembra che ci sia qualche conflitto di scrittura e lettura parallela del database delle zecche.

1434 è lo stesso bug per i tipi di commercio. Riproduzione di Expert Advisor
#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");
  }  
}
Risultato
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

La cronologia dei tick raccolti in tempo reale del thread TRADE non conteneva un tick con tempo 2016.10.04 10:37:08.773, che è apparso più tardi nella cronologia.

Questo è in qualche modo incoerente con quello che ho detto sopra. I problemi non sono solo con il flusso ALL sintetizzato, ma anche con quello diretto - TRADE.

 
fxsaber:
1434 è lo stesso bug per i tipi di commercio. Riproduzione del consulente
Mi scuso, questa è una mia grossolana svista.
 
fxsaber:

1434 - 1ms in media ci vuole per ottenere CopyTicks già caricato 1000 ticks. Lentamente, sembra.

Richiesta di TRADE0tic con from_msc dell'ultimo tick ricevuto in precedenza. Ottengo 3 tick, ma in 0.3 - 0.9ms! - Molto lento ora.

Rilevante! Non c'è modo di accelerarlo?

 

Vorrei cogliere l'occasione per ringraziare gli sviluppatori per il loro lavoro con CopyTicks!

Non posso affermare che CopyTicks funziona in modo assolutamente corretto, ma sono riuscito a lavorare perfettamente con il nastro e a capire CopyTicks più a fondo.

Per non reinventare la ruota, puoi vedere esempi di scrittura di indicatori di tick basati sul nastro qui e qui.

 
Qual è l'algoritmo ottimale (più veloce) per ottenere tick da_time a_time?