Tiki in tempo reale - pagina 5

 
Aleksey Mavrin:

Le zecche non possono avere più di una bandiera alla volta?

Hai ragione, l'ho fatto.

//+------------------------------------------------------------------+
//|                                                   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++;
      }
    }
  }
}
//+------------------------------------------------------------------+
Ho mostrato il principio del raccoglitore di tutte le zecche e potete usare questo codice come volete (estraendo tutte le bandiere)
 
Aleksey Mavrin:

Ma questo significa che c'è la garanzia di gestire TUTTI gli eventi OnBookEvent?

Significa

 
prostotrader:

Ripetere

OnBookEvent() è esattamente il tipo di garanzia che un nuovo lotto di zecche è arrivato!

Hai un tick di azioni.

OnTick significa esattamente che un tick è arrivato, e si può ottenere l'intero pacchetto con CopyTicks.

Inoltre, è possibile ottenerli da qualsiasi luogo (anche da un evento grafico). OnBookEvent ha il suo scopo e non dovete punzecchiarlo dove volete o non volete.


prostotrader:

Da riferimento:

Tasso di emissione: Il terminale memorizza per ogni carattere 4096 ultimi tick nella cache per un accesso rapido (per i carattericon lo stack in esecuzione, 65536 tick), le query a questi dati sonole più veloci.

Fine della citazione----

Se non ne avete mai abbastanza di 4K last ticks, allora abbonatevi pure allo stack. Ma non riesco a immaginare dove questo sarebbe necessario (a parte la prima corsa).

 
prostotrader:

Significa

Sì, e non c'è bisogno di raccogliere una coda di questi eventi ed elaborarli tutti se si vuole solo una cronologia di tick.

 
Andrey Khatimlianskii:

Hai un tick di azioni.

OnTick significa esattamente che un tick è arrivato e si può ottenere l'intero pacchetto con CopyTicks.

Per di più, puoi ottenerli da qualsiasi luogo (anche da un evento grafico). OnBookEvent ha il suo scopo e non dovete punzecchiarlo dove volete o non volete.


Se non avete abbastanza 4K ultimo tick, poi naturalmente sottoscrivere il tumblr. Ma non riesco a immaginare dove potrebbe essere necessario (a parte la prima corsa).

Andrew!

L'argomento si chiamava "zecche in tempo reale".

Non c'è bisogno di sottolineare 100 volte che i tick possono essere ricevuti dall'evento OnTick() su un timer o altro.

 
prostotrader:

Andrei!

L'argomento si chiamava "Ticchettii in tempo reale".

Non c'è bisogno di sottolineare 100 volte che si possono ottenere i tick dall'evento OnTick() su un timer o altro.

Esattamente! E OnBookEvent ha la stessa rilevanza per l'argomento di OnTimer

 
Andrey Khatimlianskii:

Esattamente! E OnBookEvent ha a che fare con l'argomento tanto quanto OnTimer

Eseguire quest'anno su uno strumento azionario

//+------------------------------------------------------------------+
//|                                                   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:

Lancia quest'anno su uno strumento azionario

Grazie, so come funziona.

Immaginate per un attimo che ci possa essere un approccio al trading diverso dal vostro.

 
Andrey Khatimlianskii:

Grazie, so come funziona.

Immaginate per un attimo che ci possa essere un approccio al trading diverso dal vostro.

Andrei(con tutto il rispetto).

Perché stai "scherzando"?

O non conosci la differenza tra l'ottenere in tempo reale e l'ottenere dalla storia?

E cosa ha a che fare questo con l'altro approccio al trading?

Ognuno commercia e scrive robot come meglio crede!

Aggiunto da

Non ti piace la mia versione di ottenere le zecche in tempo reale?

Allora pubblica la tua versione!

Allora vediamo un approccio diverso...

 
prostotrader:

Andrei(con tutto il rispetto)

Perché stai "scherzando"?

O non conosci la differenza tra l'averla in tempo reale o l'averla dalla storia?

E cosa ha a che fare questo con l'altro approccio al trading?

Ognuno commercia e scrive robot come meglio crede!

Aggiunto da

Non ti piace la mia versione di ottenere le zecche in tempo reale?

Allora pubblica la tua versione!

Allora vediamo un approccio diverso...

Sostituisci OnBookEvent con OnTick nel tuo codice e confronta il risultato.