Test des "CopyTicks". - page 19

 

1434 - 1ms en moyenne prend pour obtenir CopyTicks déjà téléchargé 1000 ticks. Lentement, il semble.

Demande de TRADE0tic avec from_msc du dernier tick reçu précédemment. J'obtiens 3 ticks, mais en 0.3 - 0.9ms ! - Très lent maintenant.

 
fxsaber:

J'ai fortement consigné le code ci-dessus et j'en ai compris les raisons. Si CopyTicks (from > 0) obtient des ticks avant le plus récent, il peut en sauter certains.

Une réponse très importante du Service Desk.

En ce qui concerne le problème original - que CopyTicks sur le prochain appel peut donner plus de ticks pour la même période :

C'est effectivement le cas. Le problème est que les flux de données d'échange bid/ask et flipper/volume sont des flux différents, qui ne sont pas synchronisés les uns avec les autres déjà du côté de l'échange.

Pour cette raison, il y a des situations dans lesquelles il y a d'abord un appel d'offres avec le temps 12:12:12.300, et un peu plus tard un appel d'offres avec le temps 12:12:12.299.

Par conséquent, si vous demandez des données depuis le dernier tick (12:12:12.300), vous n'obtiendrez pas de nouveau flipper pour 12:12:12.299.

PS. Le terminal enregistre et envoie les ticks triés par heure. C'est-à-dire que la séquence temporelle des ticks donnés à CopyTicks est toujours croissante.

Il y a deux flux de réception de ticks - INFO et TRADE. TOUT est une union synthétisée (semble être du côté des terminaux), c'est pourquoi de telles mésaventures peuvent se produire.

C'est à cause de la synthèse qu'il y a eu de tels mots...

Slawa:

les enregistrements initiaux de tick après l'appel de CopyTicks ne contiendront pas de zéros, mais les valeurs actuelles de bid, ask et last au moment demandé.

Ainsi, lorsque vous travaillez avec TOUTES les tiques, vous devez être clairement conscient de ce à quoi vous avez affaire. Il est possible que les drapeaux à tiques soient également synthétisés. Je voudrais une spécificité complète sur ces questions.

Avec la bande, ce problème ne devrait pas se poser si CopyTicks fonctionne correctement.

Je pense que l'aide sera très sérieusement complétée.

 
fxsaber:
Vous pouvez ajouter vous-même les surcharges éventuelles.
Je peux faire beaucoup, vous pouvez faire beaucoup, d'autres programmeurs peuvent faire beaucoup aussi, mais avec un peu de chance, les développeurs connaissent mieux le "stuffing" et peuvent créer des algorithmes rapides pour obtenir les tics nécessaires.
 

Testé CopyTicks avec le drapeau COPY_TICKS_TRADE

Aucune différence.

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

Testé CopyTicks avec le drapeau COPY_TICKS_TRADE

Aucune différence.

 
fxsaber:

J'ai fortement consigné le code ci-dessus et j'en ai compris les raisons. Si CopyTicks (de > 0) obtient des ticks jusqu'au plus récent, il peut en sauter certains.

Exemple.

Ticks demandés avec de = 2016.09.29 11:05:55.564. J'ai eu trois ticks en réponse

Quelque temps plus tard, j'ai demandé l'historique des ticks à distance et j'ai obtenu un tick, que CopyTicks avait manqué auparavant.

Quel insecte !

Il semble qu'il y ait un conflit entre l'écriture et la lecture simultanées dans la base de données des tics.

1434 est le même bug pour les types TRADE. Reproduction du conseiller expert
#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");
  }  
}
Résultat
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

L'historique des tics en temps réel du fil TRADE ne contenait pas de tic avec l'heure 2016.10.04 10:37:08.773, qui est apparu plus tard dans l'historique.

Cela est quelque peu contradictoire avec ce que j'ai dit plus haut. Les problèmes ne concernent pas seulement le flux synthétisé ALL-flow, mais aussi le flux direct - TRADE.

 
fxsaber:
1434 est le même bug pour les types TRADE. Conseiller en reproduction
Je m'excuse, c'est une erreur grossière de ma part.
 
fxsaber:

1434 - 1ms en moyenne prend pour obtenir CopyTicks déjà téléchargé 1000 ticks. Lentement, il semble.

Demande de TRADE0tic avec from_msc du dernier tick reçu précédemment. J'obtiens 3 ticks, mais en 0.3 - 0.9ms ! - Très lent maintenant.

Pertinent ! Aucun moyen d'accélérer le processus ?

 

Je voudrais profiter de cette occasion pour remercier les développeurs pour leur travail avec CopyTicks !

Je ne peux pas prétendre que CopyTicks fonctionne absolument correctement, mais j'ai réussi à travailler avec la bande parfaitement et à comprendre CopyTicks plus profondément.

Pour ne pas réinventer la roue, vous pouvez voir des exemples précis d'écriture d'indicateurs en tic-tac basés sur la bande ici et ici.

 
Quel est l'algorithme optimal (le plus rapide) pour obtenir des ticks de_time à_time ?