Gerçek zamanlı keneler - sayfa 14

 
Roman :

Ben işlem forex kullanmıyorum.
CopyTick'ten alınan örnekte, yapının yalnızca son bir öğesini, aslında yalnızca en iyi fiyatları alırsınız.

Neden tek bir unsura karar verdin?

İşin aslı, kesinlikle tüm onayları alıyorum (ve sadece onayları değil, aynı zamanda sipariş defterindeki değişiklikleri de)

Kontrol etmek

 //+------------------------------------------------------------------+
//|                                                   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!" );                           //Изменения стакана (добавлен/удален отложенный ордер)
    }
  }
}
//+------------------------------------------------------------------+
 

Bu yüzden anladık ve bu güzel.

OnBuk'a kıyasla OnTik'in bir avantajını daha anlatacağına söz verdi. Tam olarak OnBuk'un teslim edilmesinin garanti edilmesi nedeniyle, en azından biraz ağır hesaplamaları varsa (veya Tanrı korusun, ticaret işlemleri ), o zaman oldukça büyük bir olay sırası birikebilir, bu da hiçbir anlam ifade etmez (bunlar değil). olayla ilgili bilgileri içerir). Burada haysiyet, çoğu zaman olduğu gibi bir dezavantaja dönüşür.

Bu durumda OnTick, hesaplamalar sırasında alınan olayları atlayacak ve ilk yeni, ilgili olan üzerinde çalışacaktır. OnBuk'lu versiyonda, sırayı temizlemek (işe yaramaz olayları atlamak) için koltuk değneklerinizi korumanız gerekir.

 
Andrey Khatimlianskii :

Bu yüzden anladık ve bu güzel.

OnBuk'a kıyasla OnTik'in bir avantajını daha anlatacağına söz verdi. Tam olarak OnBuk'un teslim edilmesinin garanti edilmesi nedeniyle, en azından biraz ağır hesaplamaları varsa (veya Tanrı korusun, ticaret işlemleri ), o zaman oldukça büyük bir olay sırası birikebilir, bu da hiçbir anlam ifade etmez (bunlar değil). olayla ilgili bilgileri içerir). Burada haysiyet, çoğu zaman olduğu gibi bir dezavantaja dönüşür.

Bu durumda OnTick, hesaplamalar sırasında alınan olayları atlayacak ve ilk yeni, ilgili olan üzerinde çalışacaktır. OnBuk'lu versiyonda, sırayı temizlemek (işe yaramaz olayları atlamak) için koltuk değneklerinizi korumanız gerekir.

Alım satım işlemlerinde kişisel olarak asenkron emirler kullanıyorum.

Gerçek şu ki (Borsa'da işlem yapma konusunda ciddiyseniz), o zaman emir defterindeki tüm değişikliklere ihtiyacınız var,

Ve bu olay ne kadar erken gelirse o kadar iyi.

Ayrıca, talep ve teklif hacimlerine ihtiyaç vardır...

Ben kendim için OnBook'a bir alternatif görmüyorum

 
Roman :

Ben işlem forex kullanmıyorum.
CopyTick'ten alınan örnekte, yapının yalnızca son bir öğesini, aslında yalnızca en iyi fiyatları alırsınız.

Yukarıdaki kodu koştum, ortaya çıktı

 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 

Aynı tık, ancak SymbolInfoTick çağrıldığında bayrak yok :)

Katma

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

Bir kene alıyoruz, ancak onu kimin "yumurtladığını" bilmiyoruz

 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 

Genel olarak, kene zamanı ile ne olur?

Bu biraz saçmalık. 19 : 36 : 54.735 saatinde yeni paketten tik alıyoruz ve SymbolInfoTick'i arayarak 900 ms ile "ileri" tik alıyoruz???

yardımdan   SembolBilgiTick

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

Güzel konu, çok ilginç şeyler, teşekkürler arkadaşlar.

Şaka ve şaka yok...

Sadece kodu yıkmayın, dikkate alacağım ...

 
prostotrader :

Genel olarak, kene zamanı ile ne olur?

Bu biraz saçmalık. 19 : 36 : 54.735 saatinde yeni paketten tik alıyoruz ve SymbolInfoTick'i arayarak 900 ms ile "ileri" tik alıyoruz???

yardımdan

Bu gerçekten garip, Teklif değeri herkes için birleşiyor, ancak SymbolInfoTick zamanı farklı.

 
Roman :

Bu gerçekten garip, Teklif değeri herkes için birleşiyor, ancak SymbolInfoTick zamanı farklı.

Terminal zamanı "istediği gibi" ayarlıyor gibi görünüyor :)

 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 

Yerel saate göre neredeyse 4 saniye geçti!

Bu kesinlikle olamaz!

Ve burada her şey yolunda

 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 :

Görünüşe göre terminal zamanı "istediği gibi" ayarlıyor :)

Yerel saate göre neredeyse 4 saniye geçti!

Bu kesinlikle olamaz!


Günlüğe göre, OnTick aynı keneyi OnBookEvent'ten 4 saniye daha hızlı yakaladı

 1  2020.02 . 03 21 : 56 : 4 4 .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 : 4 8 .122 Ticks_test (GOLD- 3.20 ,M1)       OnBookEvent :       2020.02 . 03 21 : 56 : 42.776 Sell Tick: Last= 1582.9 Volume= 2 
 
Yuriy Zaytsev :

Günlüğe göre, OnTick aynı keneyi OnBookEvent'ten 4 saniye daha hızlı yakaladı

Kesinlikle doğru olamaz,

çünkü keneler zaten terminalde (yani yeni kene paketi zaten geldi)

 
prostotrader :

Kesinlikle doğru olamaz,

çünkü keneler zaten terminalde (yani yeni kene paketi zaten geldi)

Ama kütüğe bakıyorum ve kütüğe göre aynı tik 4 saniye farkla geldi.

ps

İfadeyi pek sevmiyorum - “olamaz” düşüncesi, uzun zamandır her şeyin olabileceği gerçeğine alışkınım.

Bu arada, belki bu konudan uzaktır, ancak bir kez, dünyanın yuvarlak olduğu ifadesine cevaben, aynı şey hakkında da dediler - "bu olamaz."

Genel olarak, kontrol edene kadar her zaman şüphe duyarım, sonra tekrar kontrol edeceğim ve tercihen bir başkası birkaç kez tekrar kontrol edecektir.


Kodunuz kesinlikle karışmıyor - günlüğü oluşturan, verileri işleyen nedir? ve sonra 4 saniye fark çıkıyor


bu kod 4 saniye farkla mucizeler mi verdi?


 //+------------------------------------------------------------------+
//|                                                   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!" );                           //Изменения стакана (добавлен/удален отложенный ордер)
    }
  }
}
//+------------------------------------------------------------------+