Gerçek zamanlı keneler - sayfa 19

 
Yuriy Zaytsev :

bir seçenek olarak, Symbol()'ün zaman yediği korkularını ortadan kaldırmak için, ardından her iki işleyicinin de aynı şekilde "yemesine" izin verin.

Symbol() işlevini önceden tanımlanmış bir _Symbol değişkeniyle değiştirebilirsiniz.

 

Symbol() 'ün bununla hiçbir ilgisi yok. Günlükte doğru zaman görüntülenir.

Olay kuyruğunda veya SymbolInfo işlevlerinde gecikme.

Ne hakkında konuşuyordum.


Bu nedenle, bir bardağa ihtiyacınız varsa, OnBook'ta çalışıyoruz. Gerekirse, OnTick'te çalışırız (sıralar ve ekstra çağrılar olmadan).

Her iki yöntem için de güncel kene geçmişini almanın en hızlı yolunu bulmaya devam ediyor.

Bence yalnızca son onay işareti gerekiyorsa, SymbolInfo daha iyidir. Boşluksuz bir geçmişe ihtiyacınız varsa, yalnızca CopyTicks.

 
Andrey Khatimlianskii :

Symbol()'ün bununla hiçbir ilgisi yok. Günlükte doğru zaman görüntülenir.

Olay kuyruğunda veya SymbolInfo işlevlerinde gecikme .

Ne hakkında konuşuyordum.

Simbol'un çok yemek yiyemediğine katılıyorum, ancak biraz katkı sağlayabilir ve testin saflığı için herhangi bir zorluktan önce zaman ayırmanız gerekir.

Sıraya gelince - böyle bir an ilgileniyorum - OnBuk ideal koşullar altında aynı OnTik'in ne kadar gerisinde kalabilir. Onlar. abonelik yalnızca bu Sembol için olduğunda, terminal başka hiçbir şey vb. ile yüklenmez ve buna neyin sebep olduğu.

Şimdiye kadar, konunun sadece kuyrukta olduğu konusunda hemfikir olamıyorum, çünkü. işleyiciler hiçbir şey yapmazsa, 5-6 OnBooks kuyruğu Karakter kontrol işleminden daha fazlasını tüketmemelidir.

Tüm kontrolleri kaldırmak ve aynı zamanda aynı tik için OnTick ve OnBuk arasında ne olduğuna bakmak gerekir.

 void OnBookEvent ( const string &symbol)
{
ul=GetMicrosecondCount();  
   Print ( __FUNCTION__ , "; Time: " , ul, " mcs" );
}
void OnTick ()
{
ul=GetMicrosecondCount();  
   Print ( __FUNCTION__ , "; Time: " , ul, " mcs" );
}
//+--

yukarı: Doymak bilmez Baskı'nın temiz bir kontrole izin vermediği anlaşıldı, çünkü. baskı nedeniyle kuyruk uzun olacak)

Oolong dizisine bir baskı olmadan zaman ayırmak ve ardından her 5 dakikada bir, her şeyi Prints'e, daha sonra koda göndermek gerekir.

 

Başlamak için kodu kontrol etmek istedim

 //---
bool is_book;
enum ENUM_BOOK_OR_TICK
{
        USE_BOOK,       // Use OnBookEvent
        USE_TICK         // Use OnTick
};
input ENUM_BOOK_OR_TICK Mode = USE_BOOK;
input int    SecForPrint =   120 ;
ulong TimeArrayBook[ 65536 ];
ulong TimeArrayTick[ 65536 ];
ushort curBook,curTick;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
{
   curBook= 0 ;
   curTick= 0 ; 
   ArrayInitialize (TimeArrayBook, INT_MAX );
   ArrayInitialize (TimeArrayTick, INT_MAX );
   if (Mode == USE_BOOK) is_book = MarketBookAdd ( Symbol ());
   if ( EventSetTimer (SecForPrint)) 
   return ( INIT_SUCCEEDED );
   else return ( INIT_FAILED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
   if (Mode == USE_BOOK)
  {
     if (is_book == true ) MarketBookRelease ( Symbol ());
  }  
}
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent ( const string &symbol)
{
  TimeArrayBook[curBook++]= GetMicrosecondCount ();
}
void OnTick ()
{
  TimeArrayTick[curTick++]= GetMicrosecondCount ();
}
//+------------------------------------------------------------------+
void OnTimer ()
  {  
   int total= MathMax (curBook,curTick);
   int i= 0 ,k= 0 ;
   while (i<total)
     {
       while (i<total && TimeArrayBook[i]<TimeArrayTick[k])
        {
           Print ( "Book " ,TimeArrayBook[i++]);
        }    
       if (k<curTick- 1 )
        {
         Print ( "Tick " ,TimeArrayTick[k++]);
        }       
        i++;
     }
     if (curTick> 0 ) Print ( "Tick " ,TimeArrayTick[curTick- 1 ], " last" );
     curBook= 0 ;
     curTick= 0 ;
  }
//---

Ama nedense açıcının demo hesabını açamıyorum. Muhtemelen çalışma dışı zaman, yoksa hala sıkıntılar var mı?



Ardından, olayın bir kenesinden tam olarak karşılaştırmak için kodu tamamlayın.

 
Aleksey Mavrin :

Başlamak için kodu kontrol etmek istedim

Ama nedense açıcının demo hesabını açamıyorum. Muhtemelen çalışma dışı zaman, yoksa hala sıkıntılar var mı?



Ardından, olayın bir kenesinden tam olarak karşılaştırmak için kodu tamamlayın.

Kendi web sitesinde açmanız gerekiyor. Daha sonra kodu postaya gönderirler.

 
Andrey Khatimlianskii :


Bence yalnızca son onay işareti gerekiyorsa, SymbolInfo daha iyidir. Boşluksuz bir geçmişe ihtiyacınız varsa, yalnızca CopyTicks.

Gerçek şu ki, Vadeli Piyasa (FORTS) "yüksek likit" enstrümanlarda bile çok zayıf,

yani , doğru fiyata çok sınırlı sayıda sözleşme satın alabilirsiniz, bu nedenle yalnızca fiyata değil,

ancak bu fiyata sözleşmelerin hacmi çok önemlidir .


Ve SymbolInfo bu fiyatın hacmini vermiyor.

Bu bağlamda, tüm sipariş defterinin hem fiyatlarını hem de hacmini veren MarketBookGet () kullanmanız gerekir.

Ve MarketBookGet() , sipariş defteri değişikliklerini almak için yalnızca MarketBookAdd ile birlikte kullanılabilir

OnBookEvent'te. Elbette bir bardak (MarketBookAdd) ekleyebilir ve OnTck()'ten MarketBookGet() 'i kullanabilirsiniz,

ancak daha sonra emir defterindeki diğer değişiklikler atlanır ( bekleyen emirler en iyi fiyattan değildir)

Doğru, "sarhoş olabilirsin" ve gelen kenelerden bir bardak oluşturabilirsin, ama gerekli mi?

Katma

Ve OnTck() tetiklendiğinde geçmişten onaylar alabileceğimize katılmıyorum.

OnTck() tetiklendiğinde, son tik zamanını hatırlayarak, tikler alabiliriz

gerçek zamanlı olarak yeni bir onay(lar) geldi - OnTck() işe yaradı, hemen saydık, yani bu geçmiş değil .

 
Andrey Khatimlianskii :

Her iki yöntem için de güncel kene geçmişini almanın en hızlı yolunu bulmaya devam ediyor.


OnTick() ile OnBook ile aynı veya biraz daha hızlı alıyorum (OnBook ile büyük gecikmeler olmasına rağmen)

Burada işlevlerin yürütme hızını test ettim ( mikrosaniye )

 2020.02 . 04 13 : 09 : 13.101 Ticks_test (GOLD- 3.20 ,M1)       SymbolInfoTick : time = 2 mcs 2020.02 . 04 13 : 09 : 10.720 Bid= 1573.1 
2020.02 . 04 13 : 09 : 13.101 Ticks_test (GOLD- 3.20 ,M1)       SymbolInfoDouble : time = 28 mcs ask = 1573.3
2020.02 . 04 13 : 09 : 13.101 Ticks_test (GOLD- 3.20 ,M1)       SymbolInfoDouble : time = 33 mcs bid = 1573.1
2020.02 . 04 13 : 09 : 13.101 Ticks_test (GOLD- 3.20 ,M1)       SymbolInfoDouble : time = 36 mcs last = 1573.4
2020.02 . 04 13 : 09 : 13.101 Ticks_test (GOLD- 3.20 ,M1)       OnTick : time = 41 mcs 2020.02 . 04 13 : 09 : 10.720 Bid= 1573.1 
2020.02 . 04 13 : 09 : 13.101 Ticks_test (GOLD- 3.20 ,M1)       OnTick : time = 41 mcs 2020.02 . 04 13 : 09 : 00.328 Ask= 1573.3 
OnTick - имеется ввиду CopyTicks из OnTick

En hızlı SymbolInfoTick , ancak bu fonksiyonda kene içine hacim konmaz!

Referans

tick

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

Yani, yalnızca zaman ve fiyat , ancak hacim yok :(

 

Borsa enstrümanları için (özellikle FORTS için) sadece fiyat önemli değildir,

ama yine de bu fiyata sözleşmelerin hacmi !

 

OnTick() ile bir bardak almaya çalıştım - büyük gecikmeler "gözle" açıkça görülebilir !

 //+------------------------------------------------------------------+
//|                                                   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;
MqlBookInfo BookInfo[];
int book_cnt;
struct MARKET_DATA
{
   double ask;
   long    ask_vol;
   double bid;
   long    bid_vol;
   double prev_ask;
   long    prev_ask_vol;
   double next_bid;
   long    next_bid_vol; 
};
MARKET_DATA m_data;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
{
  is_book = MarketBookAdd ( Symbol ());
   if (is_book == false )
  {
     Alert ( "No add book!" );
     return ( INIT_FAILED );
  }
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
   if (is_book == true ) MarketBookRelease ( Symbol ());
}
//+------------------------------------------------------------------+
//| Expert OnTick function                                           |
//+------------------------------------------------------------------+
bool GetBook( const string a_symb, int &cnt)
{
  cnt = 0 ;
   if ( MarketBookGet (a_symb, BookInfo) == true ) //getBook )
  {
    m_data.ask = 0 ;
    m_data.ask_vol = 0 ;
    m_data.prev_ask = 0 ;
    m_data.prev_ask_vol = 0 ;
    m_data.bid = 0 ;
    m_data.bid_vol = 0 ;
    m_data.next_bid = 0 ;
    m_data.next_bid_vol = 0 ;
    cnt = ArraySize (BookInfo);
     if (cnt > 0 )
    {
       for ( int i = 0 ; i < cnt; i++)
      {
         if (BookInfo[i].type == BOOK_TYPE_BUY ) //Стакан агрегирован, т.е от наибольшего Sell к наименьшему Buy
        {
           if ((i + 1 ) <= (cnt- 1 ))
          {
            m_data.ask = BookInfo[i- 1 ].price;
            m_data.ask_vol = BookInfo[i- 1 ].volume;
            m_data.prev_ask = BookInfo[i- 2 ].price;
            m_data.prev_ask_vol = BookInfo[i- 2 ].volume;
            m_data.bid = BookInfo[i].price;
            m_data.bid_vol = BookInfo[i].volume;
            m_data.next_bid = BookInfo[i+ 1 ].price;
            m_data.next_bid_vol = BookInfo[i+ 1 ].volume;
             break ;
          } else break ;
        }
      }
       return ( true );
    }
  }
   return ( false );
}  
//+------------------------------------------------------------------+
//| Expert OnTick function                                           |
//+------------------------------------------------------------------+
void OnTick ()
{
   if (GetBook( Symbol (), book_cnt) == true )
  {
     if (book_cnt >= 4 )
    {
       Print ( "Prev Sell: ask = " , m_data.prev_ask, " volume = " ,m_data.prev_ask_vol); 
       Print ( "Sell: ask = " , m_data.ask, " volume = " ,m_data.ask_vol);
       Print ( "Buy: bid = " , m_data.bid, " volume = " ,m_data.bid_vol);
       Print ( "Next Buy: bid = " , m_data.next_bid, " volume = " ,m_data.next_bid_vol);
    }  
  }
}
//+------------------------------------------------------------------+
 

Ne yapıyorsun?

Daha önce esnaf ve seviye 2'nin sırasıyla farklı veri abonelikleri olduğunu yazmıştım, bunlar farklı olay işleyicileri.
Bu nedenle, esnafın OnTick'ten ve çetelerin OnBook'tan çağrılması gerekir .
Ve OnBook etkinliklerinden esnaf ve OnTick'ten çeteler aramaya çalışıyorsunuz. Aynı zamanda OnBuk'un ticaret için daha hızlı olacağını düşünmek.
Daha hızlı olmayacak, bana öyle geliyor ki, her biri kendi veri akışı için tasarlanmış iki olay işleyiciyi karşılaştırmak bir yanılsama.
Bunların hepsinin deney olduğunu anlıyorum, ancak iki veri akışının (işlemler ve seviye2) geldiği mantığını anlamadan, bu OnTik ve OnBuk işlemcilerde sonsuz bir şekilde kafanız karışacak.

Neden: