Gerçek zamanlı keneler - sayfa 11

 

Andrey Khatimlianskii , fxsaber

şöyle yapalım

Kodumdaki hatayı (varsa) bulun

 //+------------------------------------------------------------------+
//|                                                   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!" );
      }
    }
  
}
//+------------------------------------------------------------------+
Andrey Khatimlianskii
Andrey Khatimlianskii
  • www.mql5.com
Добавил тему Быстрый TimeHour/TimeMinute? Попытался ускорить TimeHour/TimeMinute, ни фига не получилось: void OnStart() {         ulong s1 = GetMicrosecondCount();         for ( datetime t = D'1990.01.01'; t Добавил тему Больше агентов — меньше скорость! WTF!? Наткнулся на интересного советника, использующего кастумный индикатор, подключенный...
 
prostotrader :

Kodumdaki hatayı (varsa) bulun

Yorum yapmadan sayfaya bile bakmayacağım. Kodum aracılığıyla bir sonuç çıkardım. İşleri internetten halletmenin mantıksız olduğunu düşünüyorum. Herkes kendiyle kalır.

 
fxsaber :

Yorum yapmadan sayfaya bile bakmayacağım. Sonuç, kodunuz aracılığıyla yapıldı. İşleri internetten halletmenin mantıksız olduğunu düşünüyorum. Herkes kendiyle kalır.

Yani fonksiyonların sonuçları umurunuzda değil mi?

Ah, evet, tüccar değilsin ama yazarsın, pardon unutmuşum.

 
prostotrader :

Yani fonksiyonların sonuçları umurunuzda değil mi?

önemli. Bu nedenle, danışman kendisi için sonuçlar yazdı ve çıkardı.

Ah, evet, tüccar değilsin ama yazarsın, pardon unutmuşum.

Evet, tüccar değilim, yazarım.

 

Eh, sadece bir rakip kaldı (varsa tabii ki :) ) ...

Sonucu bekliyoruz...

 
prostotrader :

Eh, sadece bir rakip kaldı (varsa tabii ki :) ) ...

Sonucu bekliyoruz...

Rakipler yanlış oldukları için değil, gurur senden geldiği için ayrılırlar.
 
Artyom Trishkin :
Rakipler yanlış oldukları için değil, gurur senden geldiği için ayrılırlar.

Artem (alınma yok )!

FOREX'liler Borsa konusuna gelirler, "bacaklarını kaldır", sonra kanıtsız yere düşerler!

Ve işte gurur , eğer yanılıyorsam - itiraf etmeye hazırım!

Ama mantıksal akıl yürütmeden ve kendi deneyimimden

OnBookEvent() daha hızlıdır ve tek bir tıklamayı veya tek bir DOM değişikliğini kaçırmaz!

Kodumdaki hatayı (varsa) bulun.

Kodumun günlüklerinden - her şey çok net bir şekilde görülebilir!

 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!

Sarı ile işaretlenmiş - aynı kene !

Katma

Siz, övülen programcılar için, karmaşık olmayan 15 satırlık kodu anlamak gerçekten zor mu?

Katma

Belki yorumlar yardımcı olur?

 //+------------------------------------------------------------------+
//|                                                   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[], l_tick;
ulong last_time, mem_cnt, tot_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 ()
{
  tot_cnt = 0 ;
   if (Mode == USE_BOOK) 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 (Mode == USE_BOOK)
  {
     Print ( "USE_BOOK ticks received: " , tot_cnt);
     if (is_book == true ) MarketBookRelease ( Symbol ());
  }
   else
  {
     Print ( "USE_TICK ticks received: " , tot_cnt);
  }  
}
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent ( const string &symbol)
{
   if ( Mode != USE_BOOK || symbol != Symbol () ) return ;
  tot_cnt++;
   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
  {
    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!" );                           //Изменения стакана (добавлен/удален отложенный ордер)
    }
  }
}
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick ()
{
   if ( Mode != USE_TICK ) return ;
  tot_cnt++;
   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]));
      }
      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);
      }
    }
     else
    {
       Print ( __FUNCTION__ , ": Pending order!" );                           //Изменения стакана (добавлен/удален отложенный ордер)
    }
  }
}
//+------------------------------------------------------------------+
 
prostotrader :

Artem (alınma yok )!

FOREX'liler Borsa konusuna gelirler, "bacaklarını kaldır", sonra kanıtsız yere düşerler!

Ve işte gurur , eğer yanılıyorsam - itiraf etmeye hazırım!

Ama mantıksal akıl yürütmeden ve kendi deneyimimden

OnBookEvent() daha hızlıdır ve tek bir tıklamayı veya tek bir DOM değişikliğini kaçırmaz!

Kodumdaki hatayı (varsa) bulun.

Kodumun günlüklerinden - her şey çok net bir şekilde görülebilir!

Katma

Siz, övülen programcılar için, karmaşık olmayan 15 satırlık kodu anlamak gerçekten zor mu?

Katma

Belki yorumlar yardımcı olur?

İlgilenmiyorum. Görüyorum ki hiçbir fark yok. Ama Andrei sana en iyi yolu göstereceğine söz verdi. Doğru, senin için imkansız olduğunu sana göstermek için şart koydu.
 
Artyom Trishkin :
İlgilenmiyorum. Görüyorum ki hiçbir fark yok. Ama Andrei sana en iyi yolu göstereceğine söz verdi. Doğru, senin için imkansız olduğunu sana göstermek için şart koydu.

TAMAM.

Ama sadece küçük bir açıklama söyleyeceğim

OnTick()'in bekleyen siparişleri işlemediği gerçeği

 2020.01 . 31 17 : 02 : 01.492 Ticks_test (GOLD- 3.20 ,H1)       OnBookEvent : Pending order!

zaten bu işlevi hisse senedi ticareti için çöp kutusuna birleştirmek için bir neden.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
 

COPY_TICKS_INFO ve COPY_TICKS_ALL olmak üzere iki bağımsız akışın, bilgi ve ticaret akışının OnTick'e ulaştığını ve ön işleme tabi tutulduğunu hatırlatmak isterim.

Bu diziler birbiriyle senkronize değildir, bu nedenle OnBookEvent'i OnTick ile karşılaştırırsanız, TICKS_INFO almanız gerekir .

OnBookEvent tanımı gereği daha hızlı olmalıdır . ön işleme tabi tutulmaz.

Testlerle kimin daha hızlı olduğunu güvenilir bir şekilde belirlemek imkansızdır. kenelerin aksine emir defterinin piyasa saatini bilmiyoruz.

Geliştiricilere defalarca sorulmasına rağmen, CAM SÜRESİ EKLE! ! !


ps hıza ek olarak, camın OnTick'e göre başka avantajları da vardır,

Daha önce de belirtildiği gibi, OnTick'te en iyi Teklif ve Satış fiyatını almak imkansızdır,

ve diğer sembollerden gelen veriler OnTick'e gelmez , birkaç enstrümanı analiz eden Uzman Danışmanlar için işe yaramaz.