Tiki en temps réel - page 5

 
Aleksey Mavrin:

Les tiques ne peuvent-elles pas avoir plus d'un drapeau à la fois ?

Vous avez raison, je l'ai fait.

//+------------------------------------------------------------------+
//|                                                   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_cnt;
bool is_first;
int t_cnt, result;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  is_book = MarketBookAdd(Symbol());
  result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, 0, 1);
  if(result > 0)
  {
    last_time = ulong(ticks[0].time_msc);
    is_first = true;
  }
  else
  {
    is_first = false;
    Alert("No start time!");
    return(INIT_FAILED);
  }   
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+ 
//| возвращает строковое описание тика                               | 
//+------------------------------------------------------------------+ 
string GetTickDescription(MqlTick &tick) 
  { 
   string res = string(tick.time) + "." +  string(tick.time_msc%1000); 
// 
   bool buy_tick=((tick.flags&TICK_FLAG_BUY)==TICK_FLAG_BUY); 
   bool sell_tick=((tick.flags&TICK_FLAG_SELL)==TICK_FLAG_SELL); 
   bool ask_tick=((tick.flags&TICK_FLAG_ASK)==TICK_FLAG_ASK); 
   bool bid_tick=((tick.flags&TICK_FLAG_BID)==TICK_FLAG_BID); 
   bool last_tick=((tick.flags&TICK_FLAG_LAST)==TICK_FLAG_LAST); 
   bool volume_tick=((tick.flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME); 
// 
   if((buy_tick== true) || (sell_tick == true)) 
   { 
     res = res + (buy_tick?StringFormat(" Buy Tick: Last=%G Volume=%d ",tick.last,tick.volume):""); 
     res = res + (sell_tick?StringFormat(" Sell Tick: Last=%G Volume=%d ",tick.last,tick.volume):""); 
     res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); 
     res = res + (bid_tick?StringFormat(" Bid=%G ",tick.ask):""); 
   } 
   else 
   { 
     res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); 
     res = res + (bid_tick?StringFormat(" Bid=%G ",tick.ask):""); 
     res = res + (last_tick?StringFormat(" Last=%G ",tick.last):""); 
     res = res + (volume_tick?StringFormat(" Volume=%d ",tick.volume):""); 
   } 
   return res; 
  } 
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  if(is_book == true) MarketBookRelease(Symbol());
}
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
//void OnTick()
void OnBookEvent(const string &symbol)
{
  if(Symbol() == symbol)
  {
    if(is_first == true)
    {
      result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
      if(result > 0)
      {
        Print("First packet of ticks:");
        t_cnt = 0;
        for(int i= 0; i<result; i++)
        {
          if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++;
          Print(GetTickDescription(ticks[i]));
        }
        is_first = false;
        last_time = ulong(ticks[0].time_msc);
      } 
    }
    else
    {
      result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
      if(result > 0)
      {
        if(result > t_cnt)
        {
          mem_cnt = t_cnt;
          t_cnt = 0;
          for(int i= 0; i<(result - int(mem_cnt)); i++)
          {
            if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++;
            Print(GetTickDescription(ticks[i]));
          } 
          if(last_time == ulong(ticks[0].time_msc))
          {
            t_cnt += int(mem_cnt);
          }
          else last_time = ulong(ticks[0].time_msc + 1);
        }
        else
        {
          t_cnt = 0;
          last_time++;
        }
      }
      else
      {
        t_cnt = 0;
        last_time++;
      }
    }
  }
}
//+------------------------------------------------------------------+
J'ai montré le principe du collecteur de tous les ticks et vous pouvez utiliser ce code comme vous le souhaitez (en extrayant tous les drapeaux).
 
Aleksey Mavrin:

Mais est-ce que cela signifie qu'il y a une garantie que vous allez traiter TOUS les événements OnBookEvent ?

Signifie

 
prostotrader:

Répéter

OnBookEvent() est exactement le genre de garantie qu'un nouveau lot de tics est arrivé !

Vous avez un tick de stock.

OnTick signifie exactement qu'un tick est arrivé, et vous pouvez obtenir le tout avec CopyTicks.

De plus, vous pouvez les obtenir de n'importe où (même de l'événement graphique). OnBookEvent a son propre objectif et vous n'avez pas besoin de l'envoyer où vous voulez ou ne voulez pas.


prostotrader:

De la référence :

Taux d'émission: Le terminal stocke pour chaque caractère 4096 derniers ticks dans le cache pour un accès rapide (pour les caractèresavec la pile en marche, 65536 ticks), les requêtes sur ces données sontles plus rapides.

Fin de la citation----

Si vous ne pouvez pas vous passer des derniers tics de 4K, alors n'hésitez pas à vous abonner à la pile. Mais je ne peux pas imaginer où cela serait nécessaire (autre que la première manche).

 
prostotrader:

Signifie

Oui, et il n'est pas nécessaire de collecter une file d'attente de ces événements et de les traiter tous si vous ne voulez qu'un historique des tics.

 
Andrey Khatimlianskii:

Vous avez un tick de stock.

OnTick signifie simplement qu'un tick est arrivé et vous pouvez obtenir le package complet avec CopyTicks.

De plus, vous pouvez les obtenir de n'importe où (même de l'événement graphique). OnBookEvent a son propre objectif et vous n'avez pas besoin de l'envoyer où vous voulez ou ne voulez pas.


Si vous n'avez pas assez de 4K derniers tics, alors bien sûr abonnez-vous au tumblr. Mais je ne peux pas imaginer où il pourrait être nécessaire (autre que la première manche).

Andrew !

Le sujet s'appelait "tics en temps réel".

Il n'est pas nécessaire de rappeler 100 fois que les ticks peuvent être reçus par l'événement OnTick() sur un timer ou autre.

 
prostotrader:

Andrei !

Le sujet s'intitulait "Tics en temps réel".

Il n'est pas nécessaire de rappeler 100 fois que vous pouvez obtenir des ticks par l'événement OnTick() sur un timer ou autre.

Exactement ! Et OnBookEvent a le même rapport avec le sujet que OnTimer.

 
Andrey Khatimlianskii:

Exactement ! Et OnBookEvent a autant à voir avec le sujet que OnTimer.

Exécuté cette année sur un instrument de stock

//+------------------------------------------------------------------+
//|                                                   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;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
    is_book = MarketBookAdd(Symbol());
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    if(is_book == true) MarketBookRelease(Symbol());
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
    Print(__FUNCTION__ + " Tick is done!");
   
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
    if(Symbol() == symbol)
    {
      Print(__FUNCTION__ + " Tick is done!");
    }
   
  }
//+------------------------------------------------------------------+
 
prostotrader:

Lancement cette année sur un instrument d'actions

Merci, je sais comment ça marche.

Imaginez un instant qu'il puisse y avoir une approche du commerce différente de la vôtre.

 
Andrey Khatimlianskii:

Merci, je sais comment ça marche.

Imaginez un instant qu'il puisse y avoir une approche du commerce différente de la vôtre.

Andrei(avec tout le respect que je vous dois).

Pourquoi tu "déconnes" ?

Ou ne connaissez-vous pas la différence entre l'obtenir en temps réel ou l'obtenir par l'histoire ?

Et qu'est-ce que cela a à voir avec l'autre approche du commerce ?

Chacun échange et écrit des robots comme il l'entend !

Ajouté par

Vous n'aimez pas ma version de l'obtention de tics en temps réel ?

Puis postez votre version !

Alors voyons une approche différente...

 
prostotrader:

Andrei(avec tout le respect que je vous dois)

Pourquoi tu "déconnes" ?

Ou ne connaissez-vous pas la différence entre l'obtenir en temps réel ou l'obtenir par l'histoire ?

Et qu'est-ce que cela a à voir avec l'autre approche du commerce ?

Chacun échange et écrit des robots comme il l'entend !

Ajouté par

Vous n'aimez pas ma version de l'obtention de tics en temps réel ?

Puis postez votre version !

Alors voyons une approche différente...

Remplacez OnBookEvent par OnTick dans votre code, et comparez le résultat.

Raison: