Tiki in tempo reale - pagina 3

 
Aleksey Mavrin:

Sinceramente non ho capito cosa volevi che leggessi in questo link sull'ECN, soprattutto qualcosa che non si sapeva prima)

Davvero? Eri tu che volevi qualcosa. )))

Non capisci la differenza tra il mercato Forex e lo scambio, quindi ti ho dato il link.

Si prega di non riempire la sezione di scambio con il forex.

 
Sergey Chalyshev:

Lo volevo? Eri tu quello che voleva qualcosa. )))

Non capisci la differenza tra forex e scambio, quindi ti ho dato il link.

Si prega di non riempire la sezione di scambio con il forex.

Sì, mi piacerebbe molto che le persone fossero in grado di comunicare chiaramente, ma è irraggiungibile, quindi dobbiamo accontentarci di quello che abbiamo.

E anche tu potresti non capire qualcosa, ci hai pensato? Prendi per esempio il motivo per cui hai postato il link)

E un'altra cosa - non sono io quello che ha menzionato Forex in primo luogo, sto intervenendo in una discussione che è già iniziata. Prima di tutto.

B 2 - Qualcuno ha proibito una discussione nella sezione scambi per confrontare i diversi mercati con il mercato azionario?

E 3 - Smettiamo di punteggiare ala sciatori vs gli snowboarder, o sei contrario?

 

Un piccolo riassunto con esperimenti sull'analisi dei tic.

1. il gestore OnTick salta un numero significativo di tick.
Quindi, se si vuole analizzare una striscia di scambi attraverso un tick in entrata, non ha senso.
Con questo approccio, i risultati dell'algoritmo nel tester e i risultati del trading reale saranno diversi.

In alternativa, puoi analizzare la striscia di transazioni per un periodo selezionato o una certa quantità di ultime transazioni ottenendo i tick della storia usando le funzioni CopyTicks() o CopyTicksRange().
In questo caso, i risultati del test dell'algoritmo nel tester e i risultati del commercio reale sono gli stessi.
Gli svantaggi sono prestazioni inferiori dell'algoritmo.

2. Il numero di eventi sull'OnBookEvent è molto più grande del numero di tick storici, il che è comprensibile, perché oltre ai tick questo evento elabora il cambiamento dei tick.
Così può sembrare che tutti i tick in arrivo possano essere analizzati usando questo evento.
Tuttavia, questo non è il caso, non tutti i trade passano attraverso i tick.
Gli ordini di mercato potrebbero non passare attraverso il cursore, ma si rifletteranno nel feed delle negoziazioni.
La ragione di questo è che il cursore del mercato è in realtà un libro di ordini, che sono in attesa di esecuzione se le condizioni richieste sono soddisfatte.

Esempio - Un trade non è passato attraverso il gestore OnEventBook (che è di 5 tick).

MT5

Di nuovo la soluzione, come nella prima variante, è l'analisi dei tick storici.
Il minus di questa soluzione è l'impossibilità di testare nel tester. Non vengono generati eventi di cambiamento del tick nel tester.

3. Gli 8 bit non documentati nel flag di tick non hanno mai avuto risposta. Ho fatto la stessa domanda in un altro thread del forum.

Ho già deciso il modo di analizzare l'alimentazione dei mestieri - attraverso la storia, anche se con una produttività ridotta.
Questo mi permette di ottenere risultati affidabili quando si testa l'algoritmo nel tester.

Grazie a tutti per le idee e le discussioni.

 
Vladimir Mikhailov:

Un piccolo riassunto con esperimenti sull'analisi dei tic.

1. Il gestore OnTick salta un numero significativo di tick.
Quindi, se si vuole analizzare una striscia di scambi attraverso un tick in entrata, non ha senso.
Con questo approccio, i risultati dell'algoritmo nel tester e i risultati del trading reale saranno diversi.

In alternativa, puoi analizzare la striscia di transazioni per un periodo selezionato o una certa quantità di ultime transazioni ottenendo i tick della storia usando le funzioni CopyTicks() o CopyTicksRange().
In questo caso, i risultati del test dell'algoritmo nel tester e i risultati del commercio reale sono gli stessi.
Gli svantaggi sono prestazioni inferiori dell'algoritmo.

2. Gli eventi di OnBookEvent sono significativi.....
Ma questo non è vero, non tutti gli affari passano attraverso il libro.

Esempio - Un trade non è passato attraverso il gestore OnEventBook (e sono ben 5 tick).

3. Gli 8 bit non documentati nel flag di tick non hanno mai avuto risposta. Ho fatto la stessa domanda in un altro thread del forum.


2. Per favore, pubblica il tuo codice di tick builder (sono sicuro che stai facendo qualcosa di sbagliato).

3. Nella stampante, fate l'EnumToString(flags)

 
prostotrader:

2. Pubblica il codice del tuo costruttore di tick (sono sicuro che stai facendo qualcosa di sbagliato)

3. Nella stampante fare EnumToString(flags)

Il codice è il solito, minimo. L'OnBookEvent ottiene l'ultimo tick conosciuto e lo stampa.

//+------------------------------------------------------------------+
//|                                               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));
      }  
  }
//+------------------------------------------------------------------+

Sul terzo punto - le bandiere di spunta non sono un'enumerazione, quindi la funzione EnumToString non è applicabile a loro.

 
Vladimir Mikhailov:

Il codice è il solito, minimo. L'evento OnBookEvent ottiene l'ultimo tick conosciuto e lo stampa.

Sul terzo punto - le bandiere di spunta non sono un'enumerazione, quindi la funzione EnumToString non è applicabile a loro.

Si copia 1 tick e si vuole non avere salti:)

OnBookEvent() è innescato da qualsiasi cambiamento nel tick, ma a un certo punto

ci possono essere diverse zecche. Il terminale non riceve una zecca, ma un PACCHETTO di zecche.

L'indicatore che ho raccomandato (Tape of all deals) ha una descrizione

in russo. Non essere pigro, leggilo.

 
prostotrader:

Copi 1 tick e non vuoi salti:)

OnBookEvent() è innescato da qualsiasi cambiamento del bicchiere, ma a un certo punto

ci possono essere diverse zecche. Il terminale non riceve una zecca, ma un PACCHETTO di zecche.

L'indicatore che ho raccomandato (Tape of all deals) ha una descrizione

in russo. Non siate pigri a leggerlo.

Guardare più di un tick è un'inversione della storia.

 
Vladimir Mikhailov:

Guardare più di una zecca è un appello alla storia.

Lei non capisce affatto come funziona il terminale.

Leggete i commenti nell'indicatore!!!

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

Aggiunto

Nell'esempio sopra, non tutte le zecche sono "catturate" come il pacchetto di zecche appena arrivato

può contenere zecche con un tempo precedente.

Studiate attentamente il codice "Ribbon of all trades" (è con commenti).

 

Se trovate difficile (o pigro) capire il codice dell'indicatore, allora

vedere il codice più semplice di un vero raccoglitore in tempo reale di tutti i tick

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

vedere un codice più semplice per un corretto raccoglitore in tempo reale di tutti i tick

Perché raccoglierli "in tempo reale" se CopyTicks viene usato comunque?

Puoi copiare le zecche alla giusta profondità in qualsiasi momento tu voglia.

Motivazione: