Tiki in tempo reale - pagina 14

 
Roman:

Non uso il forex di negoziazione.
Tu, nell'esempio diCopyTick, ottieni solo un ultimo elemento della struttura, infatti solo i prezzi migliori.

Cosa le fa pensare che si tratti di un solo oggetto?

Questo è il punto, mi vengono assolutamente tutte le zecche (e non solo le zecche, ma anche i cambiamenti nella tazza)

Controllare

//+------------------------------------------------------------------+
//|                                                   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[], s_tick;
ulong last_time, mem_cnt, tot_cnt;
bool is_first;
int t_cnt, result;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  tot_cnt = 0;
  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);
  } 
  ArraySetAsSeries(ticks, true);  
  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.bid):""); 
   } 
   else 
   { 
     res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); 
     res = res + (bid_tick?StringFormat(" Bid=%G ",tick.bid):""); 
     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 OnBookEvent(const string &symbol)
{
  if(symbol != Symbol()) return;
  tot_cnt++;
  if(SymbolInfoTick(Symbol(), s_tick) == true)
  {
    Print("SymbolInfoTick: ",GetTickDescription(s_tick));
  }
  if(is_first == true)
  {
    result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //копируем все вновь пришедшие тики от последнего известного времени
    if(result > 0)
    {
      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]));
      }
    //  l_tick = ticks[0];
      is_first = false;
      last_time = ulong(ticks[0].time_msc);                             //Запоминаем время последнего тика
    } 
  }
  else
  {
    if(SymbolInfoTick(Symbol(), s_tick) == true)
    {
      Print("SymbolInfoTick: ",GetTickDescription(s_tick));
    }
    result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //забираем тики из последнего (посчитанного пакета тикив и считываем тики из нового пакета)
    if(result > 0)
    {
     // l_tick = ticks[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);
      }
      else
      {
        Print(__FUNCTION__, ": Pending order!");                          //Изменения стакана (добавлен/удален отложенный ордер)
      }
    }
    else
    {
      Print(__FUNCTION__, ": Pending order!");                          //Изменения стакана (добавлен/удален отложенный ордер)
    }
  }
}
//+------------------------------------------------------------------+
 

Ecco, questo è buono.

Ho promesso di parlarvi di un altro vantaggio di OnTick, rispetto a OnBook. È perché OnBook è garantito per essere consegnato, se ha anche solo un po' di calcoli pesanti (o, Dio non voglia, scambi), può accumulare una coda piuttosto grande di eventi che non hanno senso(non contengono informazioni relative agli eventi). È qui che il vantaggio si trasforma in svantaggio, come spesso accade.

OnTick in questo caso salterà semplicemente gli eventi che sono arrivati al momento del calcolo, e si attiverà sul primo nuovo, rilevante. Nella variante OnBook, per liberare la coda (saltare eventi inutili), devi fare le tue stampelle.

 
Andrey Khatimlianskii:

Ecco, questo è buono.

Ho promesso di parlarvi di un altro vantaggio di OnTick, rispetto a OnBook. È perché OnBook è garantito per essere consegnato, se ha anche solo un po' di calcoli pesanti (o, Dio non voglia, scambi), può accumulare una coda piuttosto grande di eventi che non hanno senso(non contengono informazioni relative agli eventi). È qui che il vantaggio si trasforma in svantaggio, come spesso accade.

OnTick in questo caso salterà semplicemente gli eventi che sono arrivati al momento del calcolo, e si attiverà sul primo nuovo, rilevante. Nella variante di OnBook, per liberare la coda (saltare gli eventi inutili), devi fare le tue stampelle.

Personalmente, uso gli ordini asincroni nelle operazioni di trading.

Il fatto è che (se fai seriamente trading in borsa), hai bisogno di tutti i cambiamenti del mercato,

e prima arriva questo evento, meglio è.

Inoltre, hai bisogno di volumi di domanda e offerta...

Io, per quanto mi riguarda, non vedo alternative a OnBook

 
Roman:

Non uso il forex commerciale.
Siottiene solo un ultimo elemento della struttura nell'esempio diCopyTick, infatti solo i prezzi migliori.

Eseguendo il codice di cui sopra, si scopre che

 if(SymbolInfoTick(Symbol(), s_tick) == true)
  {
    Print("SymbolInfoTick: ",GetTickDescription(s_tick));
  }
s_tick.flags = 0

:)

2020.02.03 19:28:14.656 Ticks_test (GOLD-3.20,M1)       OnTick: 2020.02.03 19:28:13.160 Bid=1581.9 
2020.02.03 19:28:14.656 Ticks_test (GOLD-3.20,M1)       SymbolInfoTick: 2020.02.03 19:28:13.160
2020.02.03 19:28:14.656 Ticks_test (GOLD-3.20,M1)       SymbolInfoTick: 2020.02.03 19:28:13.160
2020.02.03 19:28:14.656 Ticks_test (GOLD-3.20,M1)       OnBookEvent: 2020.02.03 19:28:13.160 Bid=1581.9 

Stesso tick e quando si chiamaSymbolInfoTick- nessuna bandiera :)

Aggiunto

if(tick.flags == 0)
   {
     res = res + " ask = " + string(tick.ask) + "; bid = " + string(tick.bid);
   }

Abbiamo una zecca ma non sappiamo chi l'ha "creata".

2020.02.03 19:36:56.576 Ticks_test (GOLD-3.20,M1)       OnTick: 2020.02.03 19:36:54.735 Bid=1583 
2020.02.03 19:36:56.576 Ticks_test (GOLD-3.20,M1)       SymbolInfoTick: 2020.02.03 19:36:55.61 ask = 1583.3; bid = 1583.0
2020.02.03 19:36:56.576 Ticks_test (GOLD-3.20,M1)       SymbolInfoTick: 2020.02.03 19:36:55.61 ask = 1583.3; bid = 1583.0
2020.02.03 19:36:56.576 Ticks_test (GOLD-3.20,M1)       OnBookEvent: 2020.02.03 19:36:54.735 Bid=1583 

Cosa succede con i tempi di tick?

Sembra assurdo. Riceviamo i tick dal nuovo pacchetto con il tempo19:36:54.735, maSymbolInfoTick ha ottenuto il tick "avanti" di 900 ms.

Dalla guida diSymbolInfoTick

[out]  Ссылка на структуру типа MqlTick, в которую будут помещены текущие цены и время последнего обновления цен.
 

Bellissimo argomento, molte cose interessanti, grazie ragazzi.

Niente scherzi e niente battute...

Basta che non distrugga il codice, lo prenderò in considerazione...

 
prostotrader:

Cosa succede con il tempo che ticchetta?

È assurdo. Prendiamo i tick dal nuovo pacchetto con il tempo19:36:54.735, ma chiamandoSymbolInfoTick otteniamo un tick "avanti" di 900ms??

Da Riferimento

Davvero strano, il valore di Bid è lo stesso per tutti, ma il tempo di SymbolInfoTick è diverso.

 
Roman:

Davvero strano, il valore Bid è lo stesso per tutti, ma il tempo SymbolInfoTick è diverso.

Sembra che il terminale organizzi il tempo "come vuole" :)

2020.02.03 21:56:44.409 Ticks_test (GOLD-3.20,M1)       OnTick: 2020.02.03 21:56:42.776 Sell Tick: Last=1582.9 Volume=2 
2020.02.03 21:56:48.122 Ticks_test (GOLD-3.20,M1)       SymbolInfoTick: 2020.02.03 21:56:42.780 ask = 1583.1; bid = 1582.9
2020.02.03 21:56:48.122 Ticks_test (GOLD-3.20,M1)       SymbolInfoTick: 2020.02.03 21:56:42.780 ask = 1583.1; bid = 1582.9
2020.02.03 21:56:48.122 Ticks_test (GOLD-3.20,M1)       OnBookEvent: 2020.02.03 21:56:42.776 Sell Tick: Last=1582.9 Volume=2 

Sono passati quasi 4 secondi dall'ora locale!

Questo sicuramente non può essere!

E qui tutto è normale.

2020.02.03 21:57:02.294 Ticks_test (GOLD-3.20,M1)       OnTick: 2020.02.03 21:57:00.671 Sell Tick: Last=1582.9 Volume=5 
2020.02.03 21:57:02.294 Ticks_test (GOLD-3.20,M1)       SymbolInfoTick: 2020.02.03 21:57:00.671 Sell Tick: Last=1582.9 Volume=5 
2020.02.03 21:57:02.294 Ticks_test (GOLD-3.20,M1)       SymbolInfoTick: 2020.02.03 21:57:00.671 Sell Tick: Last=1582.9 Volume=5 
2020.02.03 21:57:02.294 Ticks_test (GOLD-3.20,M1)       OnBookEvent: 2020.02.03 21:57:00.671 Sell Tick: Last=1582.9 Volume=5 
 
prostotrader:

Sembra che il terminale si stia cronometrando da solo "a suo piacimento" :)

Sono passati quasi 4 secondi dall'ora locale!

Non può essere giusto!


Il log mostra che OnTick ha catturato lo stesso tick 4 secondi più velocemente di OnBookEvent

1  2020.02.03 21:56:44.409 Ticks_test (GOLD-3.20,M1)       OnTick:            2020.02.03 21:56:42.776 Sell Tick: Last=1582.9 Volume=2 
   2020.02.03 21:56:48.122 Ticks_test (GOLD-3.20,M1)       SymbolInfoTick:    2020.02.03 21:56:42.780 ask = 1583.1; bid = 1582.9
   2020.02.03 21:56:48.122 Ticks_test (GOLD-3.20,M1)       SymbolInfoTick:    2020.02.03 21:56:42.780 ask = 1583.1; bid = 1582.9
2  2020.02.03 21:56:48.122 Ticks_test (GOLD-3.20,M1)       OnBookEvent:       2020.02.03 21:56:42.776 Sell Tick: Last=1582.9 Volume=2 
 
Yuriy Zaytsev:

Secondo il log risulta che OnTick ha catturato lo stesso tick più velocemente di 4 secondi rispetto a OnBookEvent

Questo non può assolutamente essere il caso nella realtà,

perché le zecche sono già nel terminale (cioè un nuovo pacchetto di zecche è già arrivato)

 
prostotrader:

Questo non può assolutamente essere il caso nella realtà,

perché le zecche sono già nel terminale (cioè un nuovo pacchetto di zecche è già arrivato)

Ma guardo il log, e il log uno e lo stesso tick con una differenza di 4 secondi è venuto.

p.s.

Non mi piace molto la frase "non può essere", mi sono abituato al fatto che tutto può succedere.

A proposito, forse è lontano dal tema, ma una volta sull'affermazione che la terra è rotonda, anche, ha detto qualcosa come questo - "non può essere.

In generale, sono sempre in dubbio finché non controllo e poi ricontrollo, e preferibilmente qualcun altro ricontrolla più volte.


Sei sicuro che il tuo codice non stia facendo casino - che forma il log, elabora i dati?


questo codice ha prodotto miracoli con una differenza di 4 secondi?


//+------------------------------------------------------------------+
//|                                                   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[], s_tick;
ulong last_time, mem_cnt, tot_cnt;
bool is_first;
int t_cnt, result;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  tot_cnt = 0;
  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);
  } 
  ArraySetAsSeries(ticks, true);  
  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.bid):""); 
   } 
   else 
   { 
     res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); 
     res = res + (bid_tick?StringFormat(" Bid=%G ",tick.bid):""); 
     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 OnBookEvent(const string &symbol)
{
  if(symbol != Symbol()) return;
  tot_cnt++;
  if(SymbolInfoTick(Symbol(), s_tick) == true)
  {
    Print("SymbolInfoTick: ",GetTickDescription(s_tick));
  }
  if(is_first == true)
  {
    result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //копируем все вновь пришедшие тики от последнего известного времени
    if(result > 0)
    {
      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]));
      }
    //  l_tick = ticks[0];
      is_first = false;
      last_time = ulong(ticks[0].time_msc);                             //Запоминаем время последнего тика
    } 
  }
  else
  {
    if(SymbolInfoTick(Symbol(), s_tick) == true)
    {
      Print("SymbolInfoTick: ",GetTickDescription(s_tick));
    }
    result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //забираем тики из последнего (посчитанного пакета тикив и считываем тики из нового пакета)
    if(result > 0)
    {
     // l_tick = ticks[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);
      }
      else
      {
        Print(__FUNCTION__, ": Pending order!");                          //Изменения стакана (добавлен/удален отложенный ордер)
      }
    }
    else
    {
      Print(__FUNCTION__, ": Pending order!");                          //Изменения стакана (добавлен/удален отложенный ордер)
    }
  }
}
//+------------------------------------------------------------------+