Tiki in tempo reale - pagina 10

 
prostotrader:

Investitore FfiR87ty (password di sola lettura)

Altro numero di conto

 
prostotrader:

Cosa vuol dire che non l'hai visto?

Cosa sono questi?

Queste sono zecche con gli stessi prezzi che in qualche modo sono entrate nella rivista (non avrebbero dovuto). Perché sono entrati - controllerò su Discover.

Non ci sono salti.

 
Andrey Khatimlianskii:

C'è solo un fan, e quello sei tu.

Lavoro con informazioni tecniche.

Il compito di analizzare il vetro in questo thread non era affatto il compito. I tick senza variazioni di prezzo non sono necessari per i termini del compito.

Capisco, considerate che avete vinto (solo sciocco andare avanti per l'ovvietà della situazione), ma per niente convincente!

Di nuovo, ognuno sceglie cosa fare e come farlo!

Buona fortuna!

 
Andrey Khatimlianskii:

Avete anche bisogno di un numero di conto.

Pratica


 
prostotrader:

Tu, non credo di proposito, prendi solo una spunta

Così, si perde tutto prima di quel tempo (0, cioè l'ora corrente)!

Nella mia implementazione, tutte le zecche sono prese in considerazione.

Iltuo codice non è adatto a questo tipo di test!

Tu, tra le altre cose, sei disattento:

        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 );

Senza di esso, l'EA otterrebbe sempre un tick ad ogni gestore di eventi, il che non è il caso.

 
prostotrader:

Vedo, considera che hai vinto (solo sciocco per andare avanti per l'ovvietà della situazione), ma non convincente a tutti!

Di nuovo, ognuno sceglie cosa fare e come farlo!

Buona fortuna!

Geniale!

Sei arrivato, non hai capito il problema, hai sventolato la tua bandiera FORTS, hai fuorviato sui gestori di eventi, e in risposta al fatto di essere stato dimostrato sbagliato, hai augurato fortuna e sei andato via.

E soprattutto non capite ancora dove sbagliate.


Buona fortuna anche a te!

 
prostotrader:

Pratica

Grazie, collegato.

I risultati sono simili, OnBOOK è spesso in ritardo rispetto a OnTick.


E in quale situazione OnTick può essere significativamente migliore (anche su FORTS! compreso, per te!), te lo mostrerò quando ammetterai di aver sbagliato.

 

A proposito, c'era un eccellente articolo di Vasiliy Sokolov sulla corretta raccolta delle zecche. Tratta in dettaglio il processo di sincronizzazione (che non ho, che a volte causa la stampa di tick identici):

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

Fig. 5. Tabella di tutte le transazioni con un esempio di transazioni identiche.

Vediamo immediatamente due gruppi di zecche assolutamente identiche. Sono contrassegnati da cornici rosse e hanno lo stesso tempo, volume, direzione e prezzo. Così, vediamo che è impossibile confrontare le singole zecche tra loro.

Ma è possibile confrontareun gruppo di zecche. Se due gruppi di tick sono uguali tra loro, possiamo concludere che questi tick e i successivi sono già stati analizzati durante il precedente aggiornamento del prezzo.

Пишем скальперский стакан цен на основе графической библиотеки CGraphic
Пишем скальперский стакан цен на основе графической библиотеки CGraphic
  • www.mql5.com
Именно с этой, улучшенной и дополненной версией мы и начнем работать, чтобы постепенно превратить ее в скальперский стакан цен. Краткий обзор графической библиотеки CPanel Созданию пользовательских интерфейсов в MQL5 посвящено много статей. Среди них особенно выделяется серия Анатолия Кажарского "Графические интерфейсы", после которой сложно...
 
Ho scritto un Expert Advisor di prova.
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__); // Распечатываем тики, полученные разными способами.
}


Il risultato è pessimo: in OnTick/OnBookEvent, i tick ricevuti da diversi metodi molto spesso non coincidono proprio dentro una funzione On. In questo caso, è impossibile determinare in quale funzione quale metodo per ottenere il tick è rilevante e quale no. Terribile vaghezza.


Sembra accadere quando il vetro stesso è obsoleto.

 

Prova questo:

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

Anche senzaGetTickCount64() puoi vedere come funzionano le funzioni

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 
File:
20200131.log  28 kb
Motivazione: