Test des "CopyTicks". - page 17

 
fxsaber:
Le volume des barres de tic-tac est-il un rudiment ? Un indicateur qui, en principe, ne signifie rien en bourse. Vous ne pouvez pas l'utiliser consciemment. C'est n'importe quoi.

En fait, le volume de ticks à la bourse est le nombre de flippers. C'est-à-dire le nombre réel de transactions.

 
Slawa:

En fait, le volume de ticks à la bourse est le nombre de flippers. C'est-à-dire le nombre réel de transactions.

Ainsi, la barre ne change pas lorsqu'une transaction identique à la précédente entre en jeu.
 
fxsaber:
Ainsi, la barre ne change pas lorsqu'une transaction identique à la précédente entre en jeu.
Changement des volumes de coche et des volumes réels
 
L'Expert Advisor écrit des ticks d'histoire fraîche et révèle le bug N-tiers dans CopyTicks
#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

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)(Tick.time_msc %1000) +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags));
}

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

int AddFreshTicks( MqlTick &Ticks[], const string Symb = NULL, const uint flags = COPY_TICKS_ALL )
{
  int Res = 0;
  const int Amount = ArraySize(Ticks);
  
  MqlTick NewTicks[];  
  const int NewAmount = (Amount == 0) ? CopyTicks((Symb == NULL)? Symbol() : Symb, NewTicks, flags) :
                                        CopyTicks((Symb == NULL)? Symbol() : Symb, NewTicks, flags, Ticks[Amount - 1].time_msc);
  
  if (NewAmount > 0)
  {
    if (Amount > 0)
    {
      // Взяли крайнее время из предыдущей истории
      const long LastTime = Ticks[Amount - 1].time_msc;
      
      int Count = 1;
      
      // Находим (Count) в предыдушей истории количество тиков со временем LastTime
      for (int i = Amount - 2; i >= 0; i--)
      {
        if (Ticks[i].time_msc < LastTime)
          break;
          
        Count++;
      }

      if ((Count < Amount) && (Count < NewAmount))      
      {
        // Если Count-тик c LastTime-временем в новой истории не равен самому последнего тику в старой истории, выводим в журнал
        if (_R(Ticks[Amount - 1]) != NewTicks[Count - 1]) // https://www.mql5.com/ru/code/16280
          Print(TOSTRING2(TickToString(Ticks[Amount - 1])) + "\n" +
                TOSTRING2(TickToString(NewTicks[Count - 1])) + "\n" + TOSTRING2(TickToString(NewTicks[Count])) + "\n");              

        Res = ArrayCopy(Ticks, NewTicks, Amount, Count);
      }
    }
    else
      Res = ArrayCopy(Ticks, NewTicks);
  }
  
  return(Res);
}

void OnTick( void )
{
  static MqlTick PrevTicks[];
  
  // Дописываем свежие тики
  AddFreshTicks(PrevTicks);
}

Cette fois, j'ai écrit des commentaires détaillés, donc le résultat devrait être clair

2016.09.22 12:20:03.762 Test8 (RTS-12.16,M1)    TickToString(NewTicks[Count]) =  time = 2016.09.22 12:19:53.233 bid = 0.0 ask = 0.0 last = 98560.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY
2016.09.22 12:20:03.762 Test8 (RTS-12.16,M1)    TickToString(NewTicks[Count-1]) =  time = 2016.09.22 12:19:51.968 bid = 0.0 ask = 0.0 last = 98550.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL
2016.09.22 12:20:03.762 Test8 (RTS-12.16,M1)    TickToString(Ticks[Amount-1]) =  time = 2016.09.22 12:19:51.968 bid = 98550.0 ask = 0.0 last = 98550.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL
2016.09.22 12:20:02.504 Test8 (RTS-12.16,M1)    
2016.09.22 12:20:02.504 Test8 (RTS-12.16,M1)    TickToString(NewTicks[Count]) =  time = 2016.09.22 12:19:51.968 bid = 98550.0 ask = 0.0 last = 98550.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL
2016.09.22 12:20:02.504 Test8 (RTS-12.16,M1)    TickToString(NewTicks[Count-1]) =  time = 2016.09.22 12:19:51.813 bid = 98550.0 ask = 0.0 last = 0.0 volume = 0 TICK_FLAG_BID
2016.09.22 12:20:02.504 Test8 (RTS-12.16,M1)    TickToString(Ticks[Amount-1]) =  time = 2016.09.22 12:19:51.813 bid = 98550.0 ask = 98560.0 last = 0.0 volume = 0 TICK_FLAG_BID
Le problème ne se pose pas seulement avec COPY_TICKS_ALL mais aussi avec d'autres modes (LAST, INFO).
 
fxsaber:
L'Expert Advisor a terminé l'écriture des ticks de l'historique frais et a trouvé le neuvième bug dans CopyTicks.

Cette fois, j'ai écrit des commentaires détaillés, donc le résultat devrait être clair

Le problème ne concerne pas seulement le mode COPY_TICKS_ALL, mais aussi d'autres modes (LAST, INFO).

J'ai essayé d'ajouter des ticks via From == 0. Ça ne marche pas ! - Bugs dans CopyTicks.

Chers développeurs, j'ai vraiment besoin de cette fonction (pour ajouter un nouvel historique de données). Laisse le retarder pour l'instant, mais ça va marcher. Veuillez écrire ici sa version de travail.

Vous devrez corriger des bugs dans CopyTicks pendant longtemps et pas une seule construction. Comment les autres utilisent CopyTicks - je ne peux pas comprendre. Apparemment, ils ne les utilisent pas du tout. Ils manquent d'imagination.

 

Vous devriez indiquer clairement ce que vous considérez comme un bug.

 
Renat Fatkhullin:

Vous devriez indiquer clairement ce que vous considérez comme un bug.

Répondu très clairement en code. J'ai créé une demande au Service Desk, où j'ai écrit encore plus de détails.
 
fxsaber:
Réponse très claire à cette question par le code. J'ai fait une demande au Service Desk où je l'ai décrite en détail.

L'erreur consiste dans le fait que dans le tableau de ticks nouvellement obtenu, les premières entrées contiennent zéro bid, ask ou last. Alors que dans le tableau précédent, les mêmes ticks à la fin du tableau ne contiennent pas de zéros, mais contiennent les valeurs actuelles de bid, ask et last au moment où

Cette erreur dans CopyTicks a été corrigée après la publication de la version. Maintenant, les entrées initiales de ticks après l'appel de CopyTicks ne contiendront pas de zéros, mais les valeurs actuelles de bid, ask et last au moment demandé.

Malheureusement, les corrections n'ont pas été incluses dans la version actuelle.

 
Slawa:

L'erreur consiste en ce que dans le tableau de ticks nouvellement obtenu, les premières entrées contiennent des valeurs de bid, ask ou last nulles, alors que dans le tableau précédent, les mêmes ticks à la fin du tableau ne contiennent pas de zéros, mais contiennent les valeurs actuelles de bid, ask et last.

Ce bogue dans CopyTicks a été corrigé déjà après la publication de la version. Maintenant, les enregistrements initiaux de ticks après l'appel de CopyTicks ne contiendront pas de zéros, mais les valeurs actuelles de bid, ask et last au moment demandé.

Je ne vous comprends pas. Vous dites que vous avez votre propre format interne de stockage de l'histoire. Et CopyTicks en prend un morceau à chaque demande et génère sa propre séquence de MqlTick? Les mêmes indicateurs sont calculés par CopyTicks, et ils ne sont pas stockés dans l'historique ? Un tampon qui calcule également quelque chose, et ne se contente pas de le convertir dans un format convivial.

Je n'ai pas besoin de CopyTicks pour remplir quelque chose là, en fonction du moment de la demande. Je veux juste connaître l'histoire sans déformation. Et l'ajouter sans aucun problème.

Malheureusement, il n'y a pas de correctifs dans la version actuelle.

Veuillez publier la version bêta sur votre serveur. Je suis sûr que je trouverai d'autres incohérences. Allons lécher ce CopyTicks pour qu'on puisse enfin lui faire confiance !

 
fxsaber:
L'Expert Advisor complète les ticks historiques frais et détecte le N-ième bug CopyTicks.
Si vous n'avez besoin QUE du ruban (COPY_TICKS_TRADE - time_msc, last, volume et flags), alors cette solution est tout à fait adaptée - aucun bogue détecté.