Tiki en temps réel - page 10

 
prostotrader:

Investisseur : FfiR87ty (mot de passe en lecture seule)

Plus de numéro de compte

 
prostotrader:

Comment ça, tu ne l'as pas vu ?

Qu'est-ce que c'est ?

Ce sont des tiques avec les mêmes prix qui se sont retrouvées dans le magazine (elles n'auraient pas dû). Pourquoi sont-ils entrés - Je vais vérifier sur Discover.

Il n'y a pas de sauts.

 
Andrey Khatimlianskii:

Il n'y a qu'un seul fan, et c'est vous.

Je travaille avec des informations techniques.

L'analyse du verre dans ce fil n'était pas du tout la tâche à accomplir. Les ticks sans changement de prix ne sont pas nécessaires selon les termes de la tâche.

Je vois, considérez que vous avez gagné (c'est idiot de continuer pour l'évidence de la situation), mais pas du tout convaincant!

Encore une fois, chacun choisit ce qu'il veut faire et comment il veut le faire !

Bonne chance !

 
Andrey Khatimlianskii:

Vous avez également besoin d'un numéro de compte.

Pratique


 
prostotrader:

Vous, je ne pense pas que ce soit volontaire, ne prenez qu'une seule coche.

Ainsi, vous manquez tout ce qui se trouve avant ce temps (0, c'est-à-dire le temps actuel) !

Dans mon implémentation, TOUS les ticks sont pris en compte.

Votre code n'est pas adapté à ce type de test!

Vous, entre autres choses, êtes inattentif :

        if ( last_tick_time <= 0 )
        {
                if ( CopyTicks( _Symbol, cur_ticks, COPY_TICKS_ALL, 0, 1 ) > 0 )
...
        }
        if ( last_tick_time > 0 )
        {
                int new_ticks = CopyTicks( _Symbol, cur_ticks, COPY_TICKS_ALL, last_tick_time, 0 );

Sans cela, l'EA obtiendrait toujours un tick à chaque gestionnaire d'événement, ce qui n'est pas le cas.

 
prostotrader:

Je vois, considérez que vous gagnez (juste idiot de continuer pour l'évidence de la situation), mais pas convaincant du tout !

Encore une fois, chacun choisit ce qu'il veut faire et comment il veut le faire !

Bonne chance !

Génial !

Vous êtes arrivé, vous n'avez pas compris le problème, vous avez agité votre drapeau FORTS, vous vous êtes trompé sur les gestionnaires d'événements, et en réponse à la preuve de votre erreur, vous avez souhaité bonne chance et vous êtes parti.

Et surtout, vous ne comprenez toujours pas où vous avez tort.


Bonne chance à vous aussi !

 
prostotrader:

Pratique

Merci, connecté.

Les résultats sont similaires, OnBOOK est souvent retardé par rapport à OnTick.


Et dans quelle situation OnTick peut être significativement meilleur (même SUR LES FORTS ! y compris, pour vous !), je vous le montrerai quand vous admettrez que vous aviez tort.

 

À propos, il y a eu un excellent article de Vasiliy Sokolov sur la collecte correcte des tiques. Il traite en détail du processus de synchronisation (dont je ne dispose pas, ce qui entraîne parfois l'impression de ticks identiques) :

Но функция CopyTiks не позволяет запрашивать N последних тиков. Вместо этого она предоставляет все тики, пришедшие с указанного момента времени. Это усложняет задачу. Мы должны выполнить запрос, получить массив тиков и сравнить его с массивом тиков, полученным на предыдущем обновлении. При этом мы выясним, какие из вновь пришедших тиков не входили в "прошлую поставку", то есть являются новыми. Но сравнивать тики между собой напрямую невозможно, просто потому что видимых различий между ними может вообще не быть. Например, обратимся к нижеприведенной таблице сделок:

Fig. 5. Tableau de toutes les transactions avec un exemple de transactions identiques.

On voit immédiatement deux groupes de tiques absolument identiques. Ils sont marqués par des cadres rouges et ont le même temps, volume, direction et prix. Nous constatons donc qu'il est impossible de comparer les tics individuels entre eux.

Mais il est possible de comparerun groupe de tiques. Si deux groupes de ticks sont égaux l'un à l'autre, nous pouvons en conclure que ces ticks et les suivants ont déjà été analysés lors de la précédente mise à jour des prix.

Пишем скальперский стакан цен на основе графической библиотеки CGraphic
Пишем скальперский стакан цен на основе графической библиотеки CGraphic
  • www.mql5.com
Именно с этой, улучшенной и дополненной версией мы и начнем работать, чтобы постепенно превратить ее в скальперский стакан цен. Краткий обзор графической библиотеки CPanel Созданию пользовательских интерфейсов в MQL5 посвящено много статей. Среди них особенно выделяется серия Анатолия Кажарского "Графические интерфейсы", после которой сложно...
 
J'ai écrit un conseiller expert de test.
int OnInit()
{
  return(!MarketBookAdd(_Symbol)); // Подписались на стакан.
}

void OnDeinit( const int )
{
  MarketBookRelease(_Symbol); // Отписались от стакана.
}

// Получает BestBands
bool GetBidAsk( double &PriceBid, double &PriceAsk, const MqlBookInfo &MarketDepth[] )
{  
  PriceAsk = 0;
  
  const int Size = ArraySize(MarketDepth);
  int Pos = 0;
  
  while ((Pos < Size) && (MarketDepth[Pos].type == BOOK_TYPE_SELL))
  {
    PriceAsk = MarketDepth[Pos].price;
    
    Pos++;
  }
    
  PriceBid = (Pos < Size) ? MarketDepth[Pos].price : 0;
  
  return(true);
}

// Получает последний известный тик.
bool GetLastTick( const string &Symb, MqlTick &Tick )
{
  static MqlTick Ticks[1];
  
  const bool Res = SymbolInfoTick(Symb, Tick) && (CopyTicks(Symb, Ticks, COPY_TICKS_INFO, 0, 1) == 1);
  
  if (Res && (Ticks[0].time_msc > Tick.time_msc))
    Tick = Ticks[0];
  
  return(Res);
}

// Получает тики через стакан и стандартным методом.
bool GetLastTicks( const string &Symb, MqlTick &Tick, MqlTick &TickBook )
{
  MqlBookInfo MarketDepth[];

  return(MarketBookGet(Symb, MarketDepth) && GetLastTick(Symb, Tick) && GetBidAsk(TickBook.bid, TickBook.ask, MarketDepth));
}

// Сравнивает тики.
bool IsDiff( const MqlTick &Tick1, const MqlTick &Tick2 )
{
  return((Tick1.bid != Tick2.bid) || (Tick1.ask != Tick2.ask));
}

#define  TOSTRING(A) (FuncName + " " + #A + ": " + (string)A.bid + "/" + (string)A.ask + "\n")

// Распечатываем тики, полученные разными способами.
void TestFunc( const string FuncName )
{
  static MqlTick Tick = {0};
  static MqlTick Book = {0};

  if (GetLastTicks(_Symbol, Tick, Book))
    Print((IsDiff(Tick, Book) ? "* " : NULL) + TOSTRING(Tick) + TOSTRING(Book)); // Если тики отличаются, добавляем '*'.
}

void OnTick()
{
  TestFunc(__FUNCTION__); // Распечатываем тики, полученные разными способами.
}

void OnBookEvent( const string &Symb )
{  
  if (Symb == _Symbol)
    TestFunc(__FUNCTION__); // Распечатываем тики, полученные разными способами.
}


Le résultat est mauvais : dans OnTick/OnBookEvent, les ticks reçus par différentes méthodes ne coïncident pas toujours à l'intérieur d'une même fonction On. Dans ce cas, il est impossible de déterminer dans quelle fonction la méthode d'obtention du tick est pertinente et celle qui ne l'est pas. Terrible imprécision.


Cela semble se produire lorsque le verre lui-même est obsolète.

 

Essayez ça :

//+------------------------------------------------------------------+
//|                                                   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;
enum ENUM_BOOK_OR_TICK
{
        USE_BOOK,       // Use OnBookEvent
        USE_TICK        // Use OnTick
};

input ENUM_BOOK_OR_TICK Mode = USE_BOOK;
//+------------------------------------------------------------------+
//| 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 ( Mode != USE_BOOK || symbol != Symbol() ) return;
  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(__FUNCTION__, ": ",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(__FUNCTION__, ": ",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++;
        Print(__FUNCTION__, ": Pending order!");
      }
    }
  }
}

void OnTick()
{
   if ( Mode != USE_TICK ) return;
   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(__FUNCTION__, ": ", 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(__FUNCTION__, ": ", 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++;
        Print(__FUNCTION__, ": Pending order!");
      }
    }
  
}
//+------------------------------------------------------------------+

Même sansGetTickCount64() vous pouvez voir comment les fonctions fonctionnent

2020.01.31 17:01:56.363 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:01:57.294 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:50.159 Bid=1585.4 
2020.01.31 17:01:57.637 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:01:57.637 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:50.159 Bid=1585.4 
2020.01.31 17:01:57.690 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:01:57.690 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:50.159 Bid=1585.4 
2020.01.31 17:01:57.730 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:01:57.730 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:50.159 Bid=1585.4 
2020.01.31 17:01:58.293 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:01:58.294 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:50.159 Bid=1585.4 
2020.01.31 17:01:58.519 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:01:58.519 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:51.444 Bid=1585.4 
2020.01.31 17:01:58.519 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:51.444 Bid=1585.4 
2020.01.31 17:01:58.519 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:51.536 Bid=1585.4 
2020.01.31 17:01:58.519 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:52.107 Ask=1585.5 
2020.01.31 17:01:58.519 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:52.326 Ask=1585.4 
2020.01.31 17:01:59.674 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:51.536 Bid=1585.4 
2020.01.31 17:01:59.861 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:52.107 Ask=1585.5 
2020.01.31 17:02:00.530 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:52.326 Ask=1585.4 
2020.01.31 17:02:01.189 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:02:01.216 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:55.7 Ask=1585.5 
2020.01.31 17:02:01.492 Ticks_test (GOLD-3.20,H1)       OnBookEvent: Pending order!
2020.01.31 17:02:01.707 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:02:01.707 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:55.530 Ask=1585.4 
2020.01.31 17:02:01.967 Ticks_test (GOLD-3.20,H1)       OnBookEvent: Pending order!
2020.01.31 17:02:01.989 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:02:01.989 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:55.790 Bid=1585.4 
2020.01.31 17:02:02.287 Ticks_test (GOLD-3.20,H1)       OnBookEvent: Pending order!
2020.01.31 17:02:02.641 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:02:02.641 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:56.104 Ask=1585.5 
2020.01.31 17:02:02.888 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:02:03.050 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:02:03.050 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:56.691 Ask=1585.6 
2020.01.31 17:02:03.050 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:56.869 Bid=1585.6 
2020.01.31 17:02:03.376 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:56.869 Bid=1585.6 
2020.01.31 17:02:03.468 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:02:03.708 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:02:03.708 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:57.286 Ask=1585.5  Bid=1585.5 
2020.01.31 17:02:03.708 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:57.440 Ask=1585.6  Bid=1585.6 
2020.01.31 17:02:04.860 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:02:04.860 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:57.440 Ask=1585.6  Bid=1585.6 
Dossiers :
20200131.log  28 kb
Raison: