Gerçek zamanlı keneler - sayfa 3

 
Aleksey Mavrin :

Dürüst olmak gerekirse, bu bağlantıda ECN hakkında okumam için tam olarak ne istediğini anlamadım, özellikle daha önce bilinmeyen bir şey)

İstedim? İstediğin buydu. )))

Forex ve borsa arasındaki farkı anlamıyorsunuz, o yüzden size bir link verdim.

Lütfen takas bölümünü forex ile kirletmeyin.

 
Sergey Chalyshev :

İstedim? İstediğin buydu. )))

Forex ve borsa arasındaki farkı anlamıyorsunuz, o yüzden size bir link verdim.

Lütfen takas bölümünü forex ile kirletmeyin.

Evet, insanların kendilerini açıkça ifade edebilmelerini çok isterim ama bu elde edilemez, elimizdekilerle yetiniyoruz.

Sen de bana ne yapacağımı söyleme, tamam mı? Ve muhtemelen sen de bir şey anlamıyorsun, öyle düşünmedin mi? En azından bağlantıyı neden paylaştığınızı alın)

Ve bir şey daha - Forex'ten ilk etapta burada bahsediliyor, benim tarafımdan değil, zaten başlamış bir tartışmaya giriyorum. Bu ilk.

2-x'te - borsa bölümünde farklı pazarların borsa ile karşılaştırmasını tartışmayı birisi yasakladı mı?

ve 3. - Kayakçılar ve snowboardcular arasındaki noktalama işaretlerini durduralım, yoksa sakıncası var mı?

 

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.

2. Geçmiş tiklerden çok daha fazla OnBookEvent olayı vardır, bu anlaşılabilir bir durumdur, çünkü tiklere ek olarak bu olay aynı zamanda sipariş defteri değişikliğini de işler.
Bu nedenle, gelen tüm keneler bu olay kullanılarak analiz edilebilir gibi görünebilir.
Ancak durum böyle değil, tüm işlemler sipariş defterinden geçmiyor.
Piyasa döviz emirleri camdan geçmeyebilir, ancak işlem akışına yansıtılır.
Bunun nedeni emir defterinin aslında gerekli şartlar sağlandığında gerçekleşmeyi bekleyen emirlerin defteri olmasıdır.

Örnek - Anlaşma OnEventBook işleyicisinden geçmedi (5 tik kadar).

MT5

Yine çözüm, ilk seçenekte olduğu gibi, tarihsel kenelerin analizidir.
Bu çözümün dezavantajı, test cihazında test etmenin imkansız olmasıdır. DOM değişiklik olayları, test cihazında oluşturulmaz.

3. Onay işaretindeki belgelenmemiş 8 bit hakkında cevap yoktu. Aynı soruyu başka bir forum başlığında da sormuştum.

Kendim için, verimlilikte bir düşüşe rağmen, tarih boyunca işlemlerin kasetini analiz etme yoluna çoktan karar verdim.
Bu, test cihazında algoritmayı test ederken güvenilir sonuçlar almanızı sağlar.

Fikirler ve tartışmalar için herkese teşekkürler.

 
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.

2. OnBookEvent Etkinlikleri demek.....
Ancak durum böyle değil, tüm işlemler sipariş defterinden geçmiyor.

Örnek - Anlaşma OnEventBook işleyicisinden geçmedi (5 tik kadar).

3. Onay işaretindeki belgelenmemiş 8 bit hakkında cevap yoktu. Aynı soruyu başka bir forum başlığında da sormuştum.


2. Kene seçici kodunuzu gönderin (Eminim yanlış bir şey yapıyorsunuzdur)

3. Baskıda EnumToString(bayraklar) yapın

 
prostotrader :

2. Kene seçici kodunuzu gönderin (Eminim yanlış bir şey yapıyorsunuzdur)

3. Baskıda EnumToString(bayraklar) yapın

Kod normal, minimum. OnBookEvent olayı, bilinen son onay işaretini alır ve .

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

Üçüncü noktada, onay bayrakları bir numaralandırma değildir, bu nedenle EnumToString işlevi onlar için geçerli değildir.

 
Vladimir Mikhailov :

Kod normal, minimum. OnBookEvent olayı, bilinen son onay işaretini alır ve yazdırır.

Üçüncü noktada, onay bayrakları bir numaralandırma değildir, bu nedenle EnumToString işlevi onlar için geçerli değildir.

1 kene kopyalıyorsunuz ve boşluk istemiyorsunuz :)

OnBookEvent(), sipariş defterindeki herhangi bir değişikliği tetikler, ancak zamanın bir noktasında

birkaç kene olabilir. Terminale bir kene gelmez, bir kene PAKETİ gelir.

Size tavsiye ettiğim göstergenin (Tüm işlemlerin kaydı) bir açıklaması var.

Rusça. Tembel olmayın, okuyun.

 
prostotrader :

1 kene kopyalıyorsunuz ve boşluk istemiyorsunuz :)

OnBookEvent(), sipariş defterindeki herhangi bir değişikliği tetikler, ancak zamanın bir noktasında

birkaç kene olabilir. Terminale bir kene değil, bir kene PAKETİ gelir.

Size tavsiye ettiğim göstergenin (Tüm işlemlerin kaydı) bir açıklaması var.

Rusça. Tembel olmayın, okuyun.

Birden fazla tik izlemek tarihe dönüşüyor.

 
Vladimir Mikhailov :

Birden fazla tik izlemek tarihe dönüşüyor.

Terminalin nasıl çalıştığını hiç anlamıyorsunuz.

Göstergedeki yorumları okuyun !!!

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

Katma

Yukarıdaki örnekte, tüm keneler "yakalanmaz", çünkü yeni gelen kene paketinde

önceki zamanla ilgili keneler olabilir.

"Tüm işlemlerin bandı" kodunu dikkatlice inceleyin (yorumlarla birlikte).

 

Gösterge kodunu anlamakta zorlanıyorsanız (veya çok tembelseniz), o zaman

tüm kenelerin uygun bir gerçek zamanlı kene toplayıcısı için daha basit koda bakın

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

tüm kenelerin uygun bir gerçek zamanlı kene toplayıcısı için daha basit koda bakın

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

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