Gerçek zamanlı keneler - sayfa 15

 
Yuriy Zaytsev :

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

Keneler zaten terminaldedir, yani zaten ağ üzerinden aktarılmıştır.

Kamu malı içindeki kodu onun yerine koyun

 if ( SymbolInfoTick ( Symbol (), s_tick) == true )
  {
     Print (" SymbolInfoTick : ",GetTickDescription(s_tick));
  }

Ve kendin gör

 
prostotrader :

Keneler zaten terminaldedir, yani zaten ağ üzerinden aktarılmıştır.

Kamu malı içindeki kodu onun yerine koyun

Ve kendin gör

Teşekkürler deneyeceğim, konuyu uzun zamandır takip ediyorum, daha çok araştırmacı olarak ilgileniyorum.

4 saniye boyunca bu kod lagul?

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

Buna benzemiyor

Kodda OnTick görmüyorum

 

Bu kod gibi görünüyor

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

Zamanımı koda ekledim.

OnTick() öğesinin ateşlendiği zamanı hatırlıyorum ( t_time = GetMicrosecondCount (); )

Sonra her işlev yürütülürken zaman alıyorum

   t_time = GetMicrosecondCount ();
//  if(symbol != Symbol()) return;
   //tot_cnt++;
   if ( SymbolInfoTick ( Symbol (), s_tick) == true )
  {
    func_time = GetMicrosecondCount ();
     Print ( "SymbolInfoTick: time = " , string (func_time - t_time), " mcs " , GetTickDescription(s_tick));
  }
   double a_ask, a_bid, a_last;
   if ( SymbolInfoDouble ( Symbol (), SYMBOL_ASK , a_ask) == true )
  {
    func_time = GetMicrosecondCount ();
     Print ( "SymbolInfoDouble: time = " , string (func_time - t_time), " mcs " , "ask = " , a_ask);
  }
   if ( SymbolInfoDouble ( Symbol (), SYMBOL_BID , a_bid) == true )
  {
    func_time = GetMicrosecondCount ();
     Print ( "SymbolInfoDouble: time = " , string (func_time - t_time), " mcs " , "bid = " , a_bid);
  }
   if ( SymbolInfoDouble ( Symbol (), SYMBOL_LAST , a_last) == true )
  {
    func_time = GetMicrosecondCount ();
     Print ( "SymbolInfoDouble: time = " , string (func_time - t_time), " mcs " , "last = " , a_last);
  }
   if (is_first == true )
  {
    result = CopyTicks ( Symbol (), ticks, COPY_TICKS_ALL , last_time, 0 ); //копируем все вновь пришедшие тики от последнего известного времени
     if (result > 0 )
    {
      func_time = GetMicrosecondCount ();
      t_cnt = 0 ;
       for ( int i= 0 ; i<result; i++)
      {
         if (ticks[i].time_msc == ticks[ 0 ].time_msc) t_cnt++;             //Считаем кол-во тиков с одинаковым временем
         Print ( __FUNCTION__ , ": time = " , string (func_time - t_time), " mcs " , GetTickDescription(ticks[i]));

Sonuç

 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 

Yani, her bir işlevin yürütme süresi 50 mikrosaniyeden azdır !

4 saniye nereden gelebilir?

Görünüşe göre iki danışman bir terminalde çalıştı ve terminalin zamanı yok

Tüm bilgileri tek bir günlükte "birleştirir", böylece yerel saati uygun gördüğü şekilde ayarlar.

 
prostotrader :

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.

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

Prensipte, doğrudan ticaret operasyonları çağrısını OnBook'tan kaldırmak mümkündür. OnBook'ta sadece bir işlem gerçekleştirme ihtiyacı için bir bayrak oluşturmanız yeterlidir, bayrağın kendisi başka bir yerde işlenir. Onlar. bir olay yaratacak olan, ancak OnBook prosedüründen çıktıktan sonra, oluşturulan bayrak tarafından işlemin kendisini başka bir prosedürde başlatın ve ardından OnBook kodunun kendisi ağır işlemlerden uzak kalacaktır. Bununla birlikte, siparişler eşzamansız olarak açılırsa ve delicesine büyük bir koşul işleme yoksa, bunun önemli gecikmelere neden olması olası değildir.

 
prostotrader :

Zamanımı koda ekledim.

OnTick() öğesinin ateşlendiği zamanı hatırlıyorum ( t_time = GetMicrosecondCount (); )

Sonra her işlev yürütülürken zaman alıyorum

Sonuç

Yani, her bir işlevin yürütme süresi 50 mikrosaniyeden azdır !

4 saniye nereden gelebilir?

Görünüşe göre iki danışman bir terminalde çalıştı ve terminalin zamanı yok

Tüm bilgileri tek bir günlükte "birleştirir", böylece yerel saati uygun gördüğü şekilde ayarlar.

Belki doğru, böyle çılgın bir gecikme pek gerçek değil.


1 - MQ kendisi karar verdiğinde FLUSH çalıştı!

2 - Sabit diskle yoğun çalışma nedeniyle diske yazmanın teknik gecikmesi


Belki de yerel makinenizde zaten bir tür yazma kuyruğu var - bu oldukça gerçek, diske birkaç terabaytlık yedekleme döküldüğünde deneyim kazandım

Sadece şunları tahmin edebilirim:

örneğin, şu anda microsoft office'i paralel olarak kuruyorsanız - pencereleri güncelleyin ve İnternet'ten bir tür film kaydedin, yerelde bulunan MS SQL ile yoğun bir şekilde çalışın,

birkaç yedekleme yapın, bir düzine 4 torrente ve yoğun bir şekilde diske yazan iki veya üç düzine programa sahip olun.

Yani disk ile yoğun bir çalışma yapıldıysa logun diske yazılmasında gecikme olmuş olma ihtimali oldukça yüksek onu söylemek istiyorum.

 
Yuriy Zaytsev :

Belki doğru, böyle çılgın bir gecikme pek gerçek değil.


1 - MQ kendisi karar verdiğinde FLUSH çalıştı!

2 - Sabit diskle yoğun çalışma nedeniyle diske yazmanın teknik gecikmesi


Belki de yerel makinenizde zaten bir tür yazma kuyruğu var - bu oldukça gerçek, diske birkaç terabaytlık yedekleme döküldüğünde deneyim kazandım

Sadece şunları varsayabilirim:

örneğin, şu anda microsoft office'i paralel olarak kuruyorsanız - pencereleri güncelleyin ve İnternet'ten bir tür film kaydedin, yerelde bulunan MS SQL ile yoğun bir şekilde çalışın,

birkaç yedekleme yapın, bir düzine 4 torrente ve yoğun bir şekilde diske yazan iki veya üç düzine programa sahip olun.

Yani disk ile yoğun bir çalışma yapılmışsa logun diske yazılmasında gecikme olması oldukça muhtemel olduğunu söylemek istiyorum.

Diske bağlı olması olası değildir, MT, günlüğü önbelleğine yazarken zaten zamanı ayarlar. Terminalin genel olarak 4 saniye boyunca düşündüğü buydu, RAM ve CPU'dan ziyade genel sistem yükü ile ilgili olabilir.
 
prostotrader :

Zamanımı koda ekledim.

OnTick() öğesinin ateşlendiği zamanı hatırlıyorum ( t_time = GetMicrosecondCount (); )

Sonra her işlev yürütülürken zaman alıyorum

Sonuç

Yani, her bir işlevin yürütme süresi 50 mikrosaniyeden azdır !

4 saniye nereden gelebilir?

Görünüşe göre iki danışman bir terminalde çalıştı ve terminalin zamanı yok

Tüm bilgileri tek bir günlükte "birleştirir", böylece yerel saati uygun gördüğü şekilde ayarlar.

bu arada - günlüğe yazarken günah işlememek için - kodda oluşturduğunuz diziye yerel saati ekleyebilirsiniz - aşağıda

Ardından günlük, terminalin günlüğü diske atmaya karar verdiği zaman ile kene veya OnBook olayının geldiğiyerel saat arasında açık bir farka sahip olacaktır.

Ve araştırma açısından daha doğru olacaktır.

 //+------------------------------------------------------------------+ 
//| возвращает строковое описание тика                               | 
//+------------------------------------------------------------------+ 
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; 
  } 
 
Aleksey Mavrin :
Diske bağlı olması olası değildir , günlük önbelleğe yazılırken MT zamanı zaten ayarlanmıştır . Terminalin genel olarak 4 saniye boyunca düşündüğü buydu, RAM ve CPU'dan ziyade genel sistem yükü ile ilgili olabilir.

BUNDAN EMİN MİSİN ?


4 saniye???? , hayır! Gerçekten işlemcinin 4 saniye askıda kaldığını mı yoksa belleğin 4 saniyeliğine ayrılıp serbest bırakıldığını mı düşünüyorsunuz? Şaka mı yapıyorsun.

Büyük ihtimalle disk yazma sırasıdır.

Disk aygıtı bellek ve işlemciden daha yavaştır.

Ve sonra flush() , C dilinde böyle bir komut var, muhtemelen biliyorsunuzdur, uygun ve rahat olduğunda yürütülür ve daha sık disk yükleme ile ilişkili bir gecikme ile yürütülebilir.

Arabellekleri diske boşaltmanız gerektiğinde çağrılır.