Tiki en temps réel - page 3

 
Aleksey Mavrin:

Honnêtement, je n'ai pas compris ce que vous vouliez que je lise dans ce lien à propos de l'ECN, surtout quelque chose qui n'était pas connu avant).

Je l'ai fait ? C'est toi qui voulais quelque chose. )))

Vous ne comprenez pas la différence entre le marché Forex et la bourse, alors je vous ai donné le lien.

Veuillez ne pas encombrer la section des échanges avec du forex.

 
Sergey Chalyshev:

Est-ce que j'en avais envie ? C'est toi qui voulais quelque chose. )))

Vous ne comprenez pas la différence entre forex et exchange, alors je vous ai donné le lien.

Veuillez ne pas encombrer la section des échanges avec du forex.

Oui, j'aimerais vraiment que les gens soient capables de communiquer clairement, mais c'est irréalisable, nous devons donc nous contenter de ce que nous avons.

Et vous pouvez ne pas comprendre quelque chose non plus, avez-vous pensé ? Prenez par exemple la raison pour laquelle vous avez posté le lien)

Et une dernière chose - ce n'est pas moi qui ai mentionné Forex en premier lieu, j'interviens dans une discussion qui a déjà commencé. Tout d'abord.

B 2 - A-t-on interdit une discussion dans la section échange pour comparer différents marchés avec la bourse ?

Et 3 - Arrêtons de ponctuer comme les skieurs contre les snowboarders, ou êtes-vous contre ?

 

Un petit résumé avec des expériences sur l'analyse des tics.

1. le gestionnaire OnTick saute un nombre important de ticks.
Ainsi, si vous voulez analyser une bande de transactions à travers un tick entrant, cela n'a aucun sens.
Avec cette approche, les résultats de l'algorithme dans le testeur et les résultats réels du trading seront différents.

Comme alternative, vous pouvez analyser la bande de transactions pour une période sélectionnée ou une certaine quantité de dernières transactions en obtenant les ticks de l'historique à l'aide des fonctions CopyTicks() ou CopyTicksRange().
Dans ce cas, les résultats du test de l'algorithme dans le testeur et les résultats du commerce réel sont les mêmes.
Les inconvénients sont une performance moindre de l'algorithme.

2. Le nombre d'événements sur le OnBookEvent est beaucoup plus important que le nombre de ticks historiques, ce qui est compréhensible, car en plus des ticks, cet événement traite le changement de ticks.
Il peut donc sembler que tous les ticks entrants peuvent être analysés à l'aide de cet événement.
Cependant, ce n'est pas le cas, toutes les transactions ne passent pas par les ticks.
Les ordres au marché peuvent ne pas passer par le curseur, mais ils seront reflétés dans le flux des transactions.
La raison en est que le curseur du marché est en fait un carnet d'ordres, qui attendent d'être exécutés si les conditions requises sont remplies.

Exemple - Une transaction n'est pas passée par le gestionnaire OnEventBook (ce qui représente jusqu'à 5 ticks).

MT5

Là encore, la solution, comme dans la première variante, est l'analyse des ticks historiques.
L'inconvénient de cette solution est l'impossibilité d'effectuer des tests dans le testeur. Les événements de changement du tick dans le testeur ne sont pas générés.

3. Le 8 bits non documenté dans le drapeau tick n'a jamais été répondu. J'ai posé la même question dans un autre fil du forum.

J'ai déjà décidé de la manière d'analyser l'alimentation des métiers - à travers l'histoire, mais avec une productivité réduite.
Cela me permet d'obtenir des résultats fiables lorsque je teste l'algorithme dans le testeur.

Merci à tous pour les idées et les discussions.

 
Vladimir Mikhailov:

Un petit résumé avec des expériences sur l'analyse des tics.

1. le gestionnaire OnTick saute un nombre important de ticks.
Ainsi, si vous voulez analyser une bande de transactions à travers un tick entrant, cela n'a aucun sens.
Avec cette approche, les résultats de l'algorithme dans le testeur et les résultats réels du trading seront différents.

Comme alternative, vous pouvez analyser la bande de transactions pour une période sélectionnée ou une certaine quantité de dernières transactions en obtenant les ticks de l'historique à l'aide des fonctions CopyTicks() ou CopyTicksRange().
Dans ce cas, les résultats du test de l'algorithme dans le testeur et les résultats du commerce réel sont les mêmes.
Les inconvénients sont une performance moindre de l'algorithme.

2. Les événements de OnBookEvent sont significatifs : ......
Mais ce n'est pas vrai, toutes les transactions ne passent pas par le livre.

Exemple - Une transaction n'est pas passée par le gestionnaire OnEventBook (et cela peut aller jusqu'à 5 ticks).

3. Le 8 bits non documenté dans le drapeau tick n'a jamais été répondu. J'ai posé la même question dans un autre fil du forum.


2. Veuillez poster votre code de tick builder (je suis sûr que vous faites quelque chose de mal).

3. Dans l'imprimante, faites le EnumToString(flags)

 
prostotrader:

2. Affichez votre code de construction de tique (je suis sûr que vous faites quelque chose de mal).

3. Dans l'imprimante faire EnumToString(flags)

Le code est le code habituel, minimal. Le OnBookEvent récupère le dernier tick connu et l'imprime.

//+------------------------------------------------------------------+
//|                                               TicksCollector.mq5 |
//|                               Copyright 2020, Vladimir Mikhailov |
//|                                                mikh.vl@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, Vladimir Mikhailov"
#property link      "mikh.vl@gmail.com"
#property version   "1.00"
MqlTick tick[1];
int counter=0;
string type;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   MarketBookAdd(_Symbol);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   MarketBookRelease(_Symbol);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnBookEvent(const string&  symbol)
  {
   CopyTicks(_Symbol,tick,COPY_TICKS_ALL,0,1);
   counter++;
   if((tick[0].flags&TICK_FLAG_BID)==TICK_FLAG_BID || (tick[0].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK)
      {
       printf("Symbol: %s; tick #: %d; flags: %d; Time: %s.%03d; Ask: %s; Bid: %s", _Symbol, counter, tick[0].flags, TimeToString(tick[0].time,TIME_MINUTES|TIME_SECONDS),tick[0].time_msc%1000, DoubleToString(tick[0].ask,_Digits), DoubleToString(tick[0].bid,_Digits));
      }
   else if((tick[0].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY || (tick[0].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL)
      {
       type=(tick[0].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY? "Buy": (tick[0].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL? "Sell": "";
       printf("Symbol: %s; tick #: %d; flags: %d; Time: %s.%03d; Volume: %.0f; Type: %s; Last: %s", _Symbol, counter, tick[0].flags, TimeToString(tick[0].time,TIME_MINUTES|TIME_SECONDS),tick[0].time_msc%1000, tick[0].volume_real, type, DoubleToString(tick[0].last,_Digits));
      }  
  }
//+------------------------------------------------------------------+

Troisièmement, les drapeaux à cocher ne sont pas une énumération. La fonction EnumToString ne leur est donc pas applicable.

 
Vladimir Mikhailov:

Le code est le code habituel, minimal. L'événement OnBookEvent récupère le dernier tick connu et l'imprime.

Troisièmement, les drapeaux à cocher ne sont pas une énumération. La fonction EnumToString ne leur est donc pas applicable.

Vous copiez 1 coche et vous voulez qu'il n' y ait pas de sauts:)

OnBookEvent() est déclenché par tout changement dans le tick, mais à un moment donné

il peut y avoir plusieurs tiques. Le terminal ne reçoit pas une tique, mais un PAQUET de tiques.

L'indicateur que j'ai recommandé (Tape of all deals) a une description

en russe. Ne soyez pas paresseux, lisez-le.

 
prostotrader:

Vous copiez 1 tick et ne voulez pas de sauts:)

OnBookEvent() est déclenché par toute modification du verre, mais à un moment donné

il peut y avoir plusieurs tics. Le terminal ne reçoit pas une tique, mais un PAQUET de tiques.

L'indicateur que je recommande (Tape of all deals) a une description

en russe. Ne soyez pas paresseux pour le lire.

Regarder plus d'un tic est un renversement de l'histoire.

 
Vladimir Mikhailov:

Regarder plus d'un tic est un appel à l'histoire.

Vous ne comprenez pas du tout comment fonctionne le terminal.

Lisez les commentaires dans l'indicateur! !!

//+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
bool is_book;
MqlTick ticks[];
ulong last_time;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
    is_book = MarketBookAdd(Symbol());
    int result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, 0, 1);
    if(result > 0)
    {
      last_time = ticks[0].time_msc;
    }  
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    if(is_book == true) MarketBookRelease(Symbol());
   
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
    if(Symbol() == symbol)
    {
       int result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
       if(result > 0)
       {
         for(int i= 0; i<result; i++)
         {
           if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
           if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
           if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
           if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
           if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
           if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
           Print("Unknown flag is ", ticks[i].flags);
         }
         last_time = ticks[0].time_msc + 1;
       }
     
    }
   
  }
//+------------------------------------------------------------------+
2020.01.29 10:51:42.077 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_ASK
2020.01.29 10:51:42.077 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_ASK
2020.01.29 10:51:42.077 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:42.121 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:42.194 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:50.903 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:52.235 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:52.399 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:52:05.174 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:52:24.630 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:52:24.630 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_LAST
2020.01.29 10:52:28.027 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_LAST

Ajouté

Dans l'exemple ci-dessus, toutes les tiques ne sont pas "attrapées" comme le paquet de tiques nouvellement arrivé.

peut contenir des tics avec un temps antérieur.

Étudiez attentivement le code "Ruban à tout faire" (il est assorti de commentaires).

 

Si vous trouvez qu'il est difficile (ou paresseux) de comprendre le code de l'indicateur, alors

regardez le code plus simple d'un collecteur en temps réel de tous les ticks

//+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
bool is_book;
MqlTick ticks[];
ulong last_time, mem_time;
bool is_first;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
    is_first = false;
    is_book = MarketBookAdd(Symbol());
    int result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, 0, 1);
    if(result > 0)
    {
      last_time = ticks[0].time_msc;
      is_first = true;
    }
    else
    {
      Alert("No start time!");
      return(INIT_FAILED);
    }   
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    if(is_book == true) MarketBookRelease(Symbol());
   
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
    if(Symbol() == symbol)
    {
      int result;
      if(is_first == true)
      {
        Print("First packet of ticks:");
        result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
        if(result > 0)
       {
         for(int i= 0; i<result; i++)
         {
           if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
           if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
           if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
           if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
           if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
           if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
           Print("Unknown flag is ", ticks[i].flags);
         }
         is_first = false;
         mem_time = last_time;
         last_time = ticks[0].time_msc + 1;
       } 
      }
      else
      {
        result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, mem_time, 0);
        if(result > 0)
        {
          for(int i= 0; i<result; i++)
          {
            if(ticks[i].time_msc == mem_time)
            {
              Print("Tick with old time:");
              if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
              if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
              if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
              if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
              if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
              if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
              Print("Unknown flag is ", ticks[i].flags);
            }
          }
        }
        result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
        if(result > 0)
        {
          Print("Ticks with new time:");
          for(int i= 0; i<result; i++)
          {
            if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
            if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
            if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
            if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
            if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
            if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
            Print("Unknown flag is ", ticks[i].flags);
          }
          mem_time = last_time;
          last_time = ticks[0].time_msc + 1;
        }
      }
    }
 }
//+------------------------------------------------------------------+
 
prostotrader:

voir un code plus simple pour un collecteur en temps réel de tous les ticks

Pourquoi les collecter "en temps réel" si CopyTicks est utilisé de toute façon ?

Vous pouvez copier les tics à la bonne profondeur à tout moment.