Test des "CopyTicks". - page 40

 
Copytix n'arrive pas à faire sortir le tick existant.
struct MQLTICK
{
  uchar Data[sizeof(MqlTick)];
};

union UNION
{
  MQLTICK Tick1;
  MqlTick Tick2;  
  
  UNION()
  {
    ArrayInitialize(this.Tick1.Data, 1);
  }
};

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

void OnStart()
{  
  const string Name = "A1234";

  if (CustomSymbolCreate(Name) || SymbolInfoInteger(Name, SYMBOL_CUSTOM))
  {    
    UNION Union;
    
    MqlTick Ticks[] = {{0}};
    Ticks[0] = Union.Tick2;
    
    Ticks[0].time = TimeCurrent();
    Ticks[0].time_msc = Ticks[0].time * 1000;
    
    Print(TOSTRING(CustomTicksReplace(Name, Ticks[0].time_msc, Ticks[0].time_msc, Ticks))); // Тик записали без проблем
    
    MqlTick Ticks2[];
    
    SymbolSelect(Name, true);            
    
    // Прочесть тик не можем
    Print(TOSTRING(CopyTicksRange(Name, Ticks2)));
    Print(TOSTRING(CopyTicks(Name, Ticks2)));
    
    SymbolSelect(Name, false);            
    CustomSymbolDelete(Name);    
  }
}

Résultat

CustomTicksReplace(Name,Ticks[0].time_msc,Ticks[0].time_msc,Ticks) = 1
CopyTicksRange(Name,Ticks2) = 0
CopyTicks(Name,Ticks2) = 0
 

Copytix modifie les données brutes

struct MQLTICK
{
  uchar Data[sizeof(MqlTick)];
};

union UNION
{
  MQLTICK Tick1;
  MqlTick Tick2;  
  
  UNION()
  {
    ArrayInitialize(this.Tick1.Data, 1);
  }
};

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

void OnStart()
{  
  const string Name = "A1234";

  if (CustomSymbolCreate(Name) || SymbolInfoInteger(Name, SYMBOL_CUSTOM))
  {    
    UNION Union;
    
    MqlTick Ticks[] = {{0}};
    Ticks[0] = Union.Tick2;
    
    Ticks[0].time = 0;
    Ticks[0].time_msc = 0;

    Print(TOSTRING(Ticks[0].ask));
    
    Print(TOSTRING(CustomTicksReplace(Name, Ticks[0].time_msc, Ticks[0].time_msc, Ticks)));
    
    MqlTick Ticks2[];
    
    SymbolSelect(Name, true);            
    
    // Прочесть тик не можем
    Print(TOSTRING(CopyTicksRange(Name, Ticks2)));

    Print(TOSTRING(Ticks2[0].ask));
    
    SymbolSelect(Name, false);            
    CustomSymbolDelete(Name);    
  }
}


Résultat

Ticks[0].ask = 7.748604185489348 e-304
CustomTicksReplace(Name,Ticks[0].time_msc,Ticks[0].time_msc,Ticks) = 1
CopyTicksRange(Name,Ticks2) = 1
Ticks2[0].ask = 0.0
 

Pourquoi des tics inutiles sont-ils générés ?


Le script produit des tics excessifs

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));
}

struct MQLTICK : public MqlTick
{
  bool operator ==( const MqlTick &Tick ) const
  {
    return((!Tick.ask || (Tick.ask == this.ask)) &&
           (!Tick.bid || (Tick.bid == this.bid)));
  }
  
  void operator =( const MqlTick &Tick )
  {
    this.ask = Tick.ask ? Tick.ask : this.ask;
    this.bid = Tick.bid ? Tick.bid : this.bid;
  }
};

void OnStart()
{
  MqlTick Ticks[];
  const int Amount = CopyTicks(_Symbol, Ticks, COPY_TICKS_ALL, 0, 1 e4);

  MQLTICK Tick = {0};  
  
  for (int i = 0; i < Amount; i++)
    if (Tick == Ticks[i])
      Print(TickToString(Ticks[i]));
    else
      Tick = Ticks[i];
}


Résultat sur EURUSD Metaquotes-Demo

 time = 2017.11.14 02:27:14.352 bid = 1.16679 ask = 1.16682 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 02:29:11.325 bid = 1.16685 ask = 1.16687 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 03:04:02.402 bid = 1.16715 ask = 1.16717 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 03:41:09.453 bid = 1.16707 ask = 1.1671 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 03:42:53.101 bid = 1.16718 ask = 1.16721 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 04:51:22.072 bid = 1.16719 ask = 1.16721 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 04:53:55.649 bid = 1.16714 ask = 1.16717 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 04:56:12.254 bid = 1.16713 ask = 1.16716 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 04:57:12.497 bid = 1.16713 ask = 1.16716 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 04:58:28.934 bid = 1.16719 ask = 1.16722 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 05:18:44.717 bid = 1.16728 ask = 1.16731 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 05:25:39.559 bid = 1.16725 ask = 1.16728 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 05:27:54.243 bid = 1.16718 ask = 1.1672 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 05:29:38.909 bid = 1.16718 ask = 1.1672 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 05:31:40.868 bid = 1.16719 ask = 1.1672 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 05:38:29.393 bid = 1.16709 ask = 1.16712 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 05:39:29.429 bid = 1.16709 ask = 1.16712 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 05:47:36.539 bid = 1.16718 ask = 1.1672 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 06:19:44.287 bid = 1.16726 ask = 1.16729 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 06:21:11.941 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 06:22:22.686 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 06:23:11.019 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 06:23:24.926 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 06:24:22.060 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 06:24:26.871 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 06:25:26.704 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 06:25:27.401 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 06:42:16.087 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 06:44:00.557 bid = 1.16734 ask = 1.16737 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 06:44:36.362 bid = 1.16734 ask = 1.16737 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 06:45:00.577 bid = 1.16734 ask = 1.16737 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 06:51:36.472 bid = 1.16734 ask = 1.16737 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 06:52:37.091 bid = 1.16734 ask = 1.16737 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 06:53:38.025 bid = 1.16734 ask = 1.16737 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 06:56:11.389 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 07:03:22.022 bid = 1.16708 ask = 1.16711 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 07:08:35.305 bid = 1.16718 ask = 1.16721 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 07:24:15.039 bid = 1.16755 ask = 1.16758 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 07:27:16.339 bid = 1.16751 ask = 1.16754 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 07:39:26.342 bid = 1.16739 ask = 1.16742 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 07:43:33.909 bid = 1.16744 ask = 1.16747 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 07:45:25.462 bid = 1.16744 ask = 1.16747 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 07:47:05.824 bid = 1.16741 ask = 1.16744 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 07:48:19.985 bid = 1.16744 ask = 1.16747 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 07:49:57.642 bid = 1.16744 ask = 1.16747 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 07:52:39.036 bid = 1.16738 ask = 1.16741 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 08:04:47.750 bid = 1.16739 ask = 1.16741 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 08:23:23.778 bid = 1.16705 ask = 1.16707 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 08:28:22.233 bid = 1.16706 ask = 1.16708 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 08:28:37.245 bid = 1.16706 ask = 1.16708 last = 0.0 volume = 0 TICK_FLAG_ASK
 

Copitix, en mode COPY_TICKS_ALL, remplit en amateur des champs d'offre et de demande nuls.

void OnStart()
{
  MqlTick Ticks[];
  const int Amount = CopyTicks(_Symbol, Ticks);
  
  ArrayPrint(Ticks);
}
[1986] 2017.11.14 10:12:11 1.16873 1.16873 0.0000        0 1510654331879       6
[1987] 2017.11.14 10:12:12 1.16871 1.16873 0.0000        0 1510654332026       2
[1988] 2017.11.14 10:12:12 1.16871 1.16871 0.0000        0 1510654332947       4
[1989] 2017.11.14 10:12:16 1.16869 1.16870 0.0000        0 1510654336930       6
[1990] 2017.11.14 10:12:17 1.16867 1.16868 0.0000        0 1510654337028       6
[1991] 2017.11.14 10:12:20 1.16866 1.16868 0.0000        0 1510654340943       2
[1992] 2017.11.14 10:12:22 1.16868 1.16869 0.0000        0 1510654342728       6
[1993] 2017.11.14 10:12:22 1.16868 1.16870 0.0000        0 1510654342834       4
[1994] 2017.11.14 10:12:22 1.16868 1.16869 0.0000        0 1510654342954       4
[1995] 2017.11.14 10:12:23 1.16867 1.16869 0.0000        0 1510654343339       2
[1996] 2017.11.14 10:12:27 1.16867 1.16868 0.0000        0 1510654347042       4
[1997] 2017.11.14 10:12:31 1.16867 1.16869 0.0000        0 1510654351428       4
[1998] 2017.11.14 10:12:31 1.16868 1.16869 0.0000        0 1510654351832       2
[1999] 2017.11.14 10:12:31 1.16869 1.16871 0.0000        0 1510654351942       6


C'est pour quoi faire ? En mode INFO, ce comportement est pratique, mais en mode ALL, vous attendez d'obtenir les données brutes et seule l'interface graphique les affiche.



Si le prix n'a pas changé, il est nul. En l'état actuel des choses, les drapeaux semblent être une entité inutile. Au lieu de montrer des prix nuls, augmentez la structure de MqlTick par ce drapeau.

Est-ce que tkc ne stocke que des drapeaux (sans prix nuls), ne stocke que des prix (sans drapeaux), ou est-il irrationnel d'y avoir à la fois des drapeaux et des prix ?


Et pourquoi un drapeau est-il introduit ?

  • TICK_FLAG_VOLUME – тик изменил объем

Que le volume ait changé ou non n'est absolument pas pertinent. Ou est-ce que je comprends mal quelque chose ?


Les données ZS Raw ALL sont nécessaires en particulier pour les caractères personnalisés, car elles sont directement liées à la question du canal d'échange de données par le biais des caractères personnalisés.

 
fxsaber:

Copitix, en mode COPY_TICKS_ALL, remplit en amateur les champs Bid/Ask zéro.


Pour quoi faire ? En mode INFO, ce comportement est utile, mais en mode ALL, nous attendons les données brutes, mais elles ne sont affichées que dans l'interface graphique.



Si le prix n'a pas changé, il est nul. En l'état actuel des choses, les drapeaux semblent être une entité inutile. Au lieu de montrer des prix nuls, augmentez la structure de MqlTick par ce drapeau.

Est-ce que tkc ne stocke que des drapeaux (sans prix nuls), ne stocke que des prix (sans drapeaux), ou est-il irrationnel d'y avoir à la fois des drapeaux et des prix ?


Et pourquoi un drapeau est-il introduit ?

Que le volume ait changé ou non n'est absolument pas pertinent. Ou est-ce que je comprends mal quelque chose ?


Les données SZY Raw ALL sont particulièrement nécessaires pour les caractères personnalisés, car elles abordent directement la question du canal d'échange de données par le biais des caractères personnalisés.


Écrivez-vous à Servicedeck pour lui faire part des lacunes que vous avez identifiées ?

J'ai l'impression que tout est gâché.


Et pourquoi le drapeau ?

  • TICK_FLAG_VOLUME - le volume du tick a changé.

Je pense que c'est un indicateur très important. Sinon, comment savoir si l'opération a été exécutée, et non pas simplement modifiée, déplacée de l'offre à la demande ?

 
Sergey Chalyshev:

Écrivez-vous au service d'assistance pour signaler les déficiences que vous avez identifiées ?

Le SD répond rapidement à toutes les demandes. D'autres discussions y sont menées.

Je pense que c'est un indicateur très important. Sinon, comment savoir si l'affaire a été conclue et que ce ne sont pas seulement l'offre et la demande qui ont changé ?

Seul le drapeau est suffisant.

  • TICK_FLAG_LAST - le tick a modifié le prix de la dernière transaction.
En le changeant en "commerce passé". Le fait que le dernier prixait changé - tout le monde s'en fiche. Il peut y avoir plusieurs transactions consécutives avec exactement le même prix et le même volume. Par conséquent, il ne devrait y avoir qu'un seul drapeau - l'accord.
 

TICK_FLAG_VOLUME - le volume du tick a changé.

Je n'ai pas pensé à ce qui est écrit dans l'aide avant.

Le volume de ce qui a changé ?

Que signifie ce qui est écrit ci-dessus ?)

 
fxsaber:

Le SR répond rapidement à toutes les demandes. D'autres discussions y sont menées.

Il suffit d'un drapeau.

En le changeant en "commerce passé". Le fait que le prix ait changé ne concerne personne. Il peut y avoir plusieurs transactions consécutives avec exactement le même prix et le même volume. Par conséquent, il ne devrait y avoir qu'un seul drapeau - un accord.

Si elle est réactive, c'est bien.

Quant aux drapeaux :

J'ai aussi eu cette pensée, dans les Expert Advisors pour analyser la situation, pour combiner les trades correspondants, c'est un peu suffisant.

Dans cette situation, l'heure de l'échange, l'heure du serveur et l'heure de l'ordinateur ne coïncident pas. Comment puis-je savoir que MarketClosed, s'il y a une transaction même au dernier prix, cela signifie que la transaction est en cours.

Et si l'on regroupe toutes les transactions à un même niveau, on ne sait pas exactement à quel moment le niveau a été échangé ?

P.S. Les drapeaux supplémentaires n'affectent pas le volume des drapeaux transmis.

 
Sergey Chalyshev:

S'il répond, c'est bien.

A propos des drapeaux :

J'ai aussi eu cette idée, dans les EAs d'analyse de situation, de combiner des trades coïncidents, c'est un peu suffisant.

Dans une telle situation, l'heure de l'échange, l'heure du serveur et l'heure de l'ordinateur ne coïncident pas. Comment puis-je savoir que MarketClosed, s'il y a une transaction même au dernier prix, cela signifie que la transaction est en cours.

Et si l'on regroupe toutes les transactions à un même niveau, on ne pourra pas savoir pendant combien de temps ce niveau a été échangé ?

Pourquoi combiner à un seul niveau ? Je ne fusionnerais pas, et laisserais le ruban tel qu'il est maintenant - ce qui est issu de l'échange.

P.S. : les drapeaux inutiles n'affectent pas le volume des drapeaux transmis.
Les drapeaux sont des mesures forcées, car les MQ ne renvoient pas de données brutes. Ils les modifient à l'intérieur de CopyTicks.
 

Les fichiers tkc sont ventilés par mois. Des questions à cause de cela

  1. Si le terminal n'a pas encore téléchargé les données tick, lorsque vous appelez CopyTicks, comment le terminal saura-t-il quels fichiers tkc extraire ?
  2. CopyTicksRange est-il implémenté sur la base de CopyTicks ou indépendamment ?
  3. Est-ce que je comprends bien que l'obtention des ticks pour le mois de septembre, par exemple, sera toujours plus rapide par le biais de CopyTicksRange, que par CopyTicks, parce que CopyTicks ne sait pas, via les paramètres d'entrée, pour quel mois il doit extraire les données ?
  4. Nous devons mettre l'histoire dans l'indicateur aussi vite que possible. Il est possible d'interroger via CopyTicksRange et d'obtenir un rebond comme -1, jusqu'à ce que tout soit téléchargé. Et si vous demandez par mois : le mois en cours, puis le mois précédent, etc. Il ne sera pas plus lent, mais l'indicateur sera prêt à fonctionner avec au moins un historique. N'est-ce pas ?