Gerçek zamanlı keneler - sayfa 4

 
Vladimir Mikhailov :

Kene analizi deneylerinin bazı özeti.

1. OnTick işleyicisi önemli sayıda onay işaretini kaçırır.
Bu nedenle, gelen kene üzerinden anlaşmalar kasetini analiz etmek istiyorsanız, bunun bir anlamı yoktur.
Bu yaklaşımla, test cihazındaki algoritmanın sonuçları ile gerçek ticaret sonuçları farklı olacaktır.

Alternatif olarak, CopyTicks() veya CopyTicksRange() işlevlerini kullanarak geçmiş işaretler elde ederek, seçili bir dönem veya belirli sayıda son anlaşma için anlaşmalar bandını analiz edebilirsiniz.
Bu durumda, test cihazında algoritmayı test etmenin sonuçları ile gerçek ticaret sonuçları aynıdır.
Eksilerden, algoritmanın performansında bir azalma.

Evet, tiki EA atlayabilir. Bu nedenle, bir gösterge veya CopyTicks.

Performans düşüşü ne olacak? Yalnızca gerekli segmenti (son başarılı veri alımından bu yana görünen) kopyalayın.

 
Andrey Khatimlianskii :

CopyTicks hala kullanılıyorsa neden onları "gerçek zamanlı olarak" toplasınlar?

İstediğiniz zaman keneleri istediğiniz derinliğe kopyalayabilirsiniz.

Andrew, lütfen konu başlığını oku.

Katma

CopyTicks() ile gerekli derinliğe ulaşamazsınız, ancak sadece 2000 tik!

 
prostotrader :

Andrew, lütfen konu başlığını oku.

Ya görev başlangıçta yanlış ayarlanmışsa?

Gerçek zamanlı kene analizi mümkündür, ancak boşlukları önlemek için bir gösterge veya CopyTicks kullanmanız gerekir.


basit tüccar :

CopyTicks() ile gerekli derinliğe ulaşamazsınız, ancak sadece 2000 tik!

Böyle bir sınırlama yoktur, belgelerden bir örneğe bakın:

Пример вывода
Si- 12.16 : received 11048387 ticks in 4937 ms
Last tick time = 2016.09 . 26 18 : 32 : 59.775 
First tick time = 2015.06 . 18 09 : 45 : 01.000 
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
  • www.mql5.com
[in]  Количество запрашиваемых тиков. Если параметры from и count не указаны, то в массив ticks_array[] будут записаны все доступные последние тики, но не более 2000. Первый вызов CopyTicks() инициирует синхронизацию базы тиков, хранящихся на жёстком диске по данному символу. Если тиков в локальной базе не хватает, то недостающие тики...
 
Andrey Khatimlianskii :

Ya görev başlangıçta yanlış ayarlanmışsa?

Gerçek zamanlı tik analizi mümkündür, ancak boşlukları önlemek için bir gösterge veya CopyTicks kullanmanız gerekir.


Böyle bir sınırlama yoktur, belgelerden bir örneğe bakın:

1. Mutlaka bir gösterge değil!

Sertifikayı kastediyorsanız, nerede yazıldığı

Uzman Danışmanlarda ve komut dosyalarında, CopyTicks() işlevi bir sonuç için 45 saniyeye kadar bekleyebilir....

Sonra sonuna kadar okursanız, diyor ki:

Düzenleme hızı : terminal, hızlı erişim için önbellekte her sembol için son 4096 tik'i saklar ( çalışan camlı semboller için - 65536 tik), bu veri talepleri en hızlı şekilde tamamlanır.

OnBookEvent() olayı, terminale yeni bir onay paketi geldiğinde tetiklenir, bu nedenle

ve EA'dan keneler toplayabilirsiniz. Bir örnek alın ve kontrol edin.

 //+------------------------------------------------------------------+
//|                                                   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 ());
   
  }
void PrintResult( const int cnt)
{
   if (cnt > 0 )
  {
     for ( int i= 0 ; i<cnt; 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);
    }
  }
}  
//+------------------------------------------------------------------+
//| 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 )
       {
         PrintResult(result);
         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:" );
          PrintResult(result);
          mem_time = last_time;
          last_time = ticks[ 0 ].time_msc + 1 ;
        }
      }
    }
 }
//+------------------------------------------------------------------+


2. Böyle bir sınırlama var, kendiniz kontrol edin ( CopyTicksRange() 'ın herhangi bir sınırlaması yoktur)


 
prostotrader :

1. Mutlaka bir gösterge değil!

OnBookEvent() olayı, terminale yeni bir onay paketi geldiğinde tetiklenir, bu nedenle

ve EA'dan keneler toplayabilirsiniz. Bir örnek alın ve kontrol edin.

OnBookEvent, kenelerin kaçırılmayacağını garanti etmez. Ağır hesaplamalar olacaksa, OnTick'tekiyle aynı atlama olacaktır.

Ayrıca CopyTicks aracılığıyla gerekli tik derinliğini nereye kopyalayacağınız önemli değildir.


basit tüccar :

2. Böyle bir sınırlama var, kendiniz kontrol edin

Sadece yardımda doğrudan belirtilen 0, 0 parametreleri içindir:

Если параметры from и count не указаны, то в массив ticks_array[] будут записаны все доступные последние тики, но не более 2000 .
 
Andrey Khatimlianskii :

OnBookEvent, kenelerin kaçırılmayacağını garanti etmez.

tekrarlıyorum

OnBookEvent(), yeni bir onay paketinin geldiğinin garantisini verir!

Yardımdan:

Düzenleme hızı : terminal, hızlı erişim için önbellekte her sembol için son 4096 tik'i saklar ( çalışan camlı semboller için - 65536 tik), bu veri talepleri en hızlı şekilde tamamlanır .

Teklifi sonlandır ----

OnBookEvent işe yaramadıysa, MT5'teki tüm ticaret (değişim) çöp kutusuna atılabilir!

Yeni bir onay paketi geldi - OnBookEvent %100 çalıştı ve kaç onayın geldiği CopyTicks() tarafından gösterilecek,

veriler zaten önbellekte saklanıyor ve bunlara erişim en hızlısı !

Bu nedenle, hem göstergede hem de danışmanda ( sipariş defteri çalışırken ) gerçek zamanlı bir onay toplayıcı uygulamak mümkündür.

Katma

Yukarıdaki kodu alın ve tartışmak yerine kontrol edin ...

 

Kene toplayıcı kodunda prensip doğru ama uygulama hataları var düzelteceğim

ve biraz sonra yayınlayın.

Katma

Danışmandan gerçek zamanlı olarak tüm kenelerin toplayıcısı

eğlence

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

Kene toplayıcının nasıl çalıştığını karşılaştırmak için, onu aynı anda tüm işlemlerin bir Bandına dönüştürebilirsiniz.

(iki yerde COPY_TICKS_ALL yerine COPY_TICKS_TRADE ile) ve ticaret akışıyla karşılaştırın,

aletin camına yerleştirilmiştir.

Enstrüman çok sıvıysa, baskılar uzun bir gecikmeyle gelebilir

 
prostotrader :
  if ((ticks[i].flags& TICK_FLAG_ASK )== TICK_FLAG_ASK ) { Print ( "Tick is " , "TICK_FLAG_ASK" , " Tick time: " , ticks[i].time, "." , string (t_msc));} else
           if ((ticks[i].flags& TICK_FLAG_BID ) == TICK_FLAG_BID ) { Print ( "Tick is " , "TICK_FLAG_BID" , " Tick time: " , ticks[i].time,   "." , string (t_msc));} else
           if ((ticks[i].flags& TICK_FLAG_BUY )== TICK_FLAG_BUY ) { Print ( "Tick is " , "TICK_FLAG_BUY" , " Tick time: " , ticks[i].time,   "." , string (t_msc));} else
           if ((ticks[i].flags& TICK_FLAG_LAST )== TICK_FLAG_LAST ) { Print ( "Tick is " , "TICK_FLAG_LAST" , " Tick time: " , ticks[i].time,   "." , string (t_msc));} else
           if ((ticks[i].flags& TICK_FLAG_SELL )== TICK_FLAG_SELL ) { Print ( "Tick is " , "TICK_FLAG_SELL" , " Tick time: " , ticks[i].time,   "." , string (t_msc));} else
           if ((ticks[i].flags& TICK_FLAG_VOLUME )== TICK_FLAG_VOLUME ) { Print ( "Tick is " , "TICK_FLAG_VOLUME" , " Tick time: " , ticks[i].time,   "." , string (t_msc));} else

Kenelerin aynı anda birden fazla bayrağı olamaz mı?

 
prostotrader :

tekrarlıyorum

OnBookEvent(), yeni bir onay paketinin geldiğinin garantisini verir !


Ancak bu, TÜM OnBookEvent olaylarını işleme alacağınızın garantisi olduğu anlamına mı geliyor?