실시간 틱 - 페이지 15

 
Yuriy Zaytsev :

그런데 로그를 보니 4초 차이로 같은 틱이 왔다.

추신

나는 그 문구를 별로 좋아하지 않습니다. "그럴 수 없다"는 생각은 무엇이든 될 수 있다는 사실에 오랫동안 익숙해져 왔습니다.

그건 그렇고, 아마도 이것은 주제와 거리가 멀지 만 한 번 지구가 둥글다는 진술에 대한 응답으로 그들은 또한 같은 것에 대해 말했습니다 - "이것은 불가능합니다."

일반적으로 나는 확인할 때까지 항상 의심하고 나서 다시 확인하고 다른 사람이 여러 번 다시 확인하는 것이 좋습니다.


귀하의 코드는 확실히 엉망이 아닙니다. 로그를 형성하고 데이터를 처리하는 코드는 무엇입니까? 그리고 나서 4초의 차이가 나타납니다.

틱은 이미 터미널에 있습니다. 즉, 네트워크를 통해 이미 전송되었습니다.

공개 도메인의 코드를 대체하십시오.

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

그리고 직접 확인하세요

 
prostotrader :

틱은 이미 터미널에 있습니다. 즉, 네트워크를 통해 이미 전송되었습니다.

공개 도메인의 코드를 대체하십시오.

그리고 직접 확인하세요

감사합니다, 노력하겠습니다. 저는 오랫동안 주제를 따라왔고, 연구원으로서 더 관심이 있습니다.

이 코드는 4초 동안 지연됩니까?

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

이건 아닌거같은데

코드에 OnTick이 표시되지 않습니다.

 

이것이 코드인 것 같다.

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

코드에 내 시간을 추가했습니다.

OnTick()이 실행된 시간을 기억합니다( t_time = GetMicrosecondCount (); )

그런 다음 각 기능이 실행될 때마다 시간이 걸립니다.

   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]));

결과

 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 

즉, 각 기능의 실행 시간은 50마이크로초 미만 입니다!

4초는 어디에서 올 수 있습니까?

두 명의 고문이 하나의 터미널에서 일한 것으로 보이며 터미널에는 단순히 시간이 없습니다

모든 정보를 하나의 로그로 "병합" 하여 현지 시간 을 적절하게 설정합니다.

 
prostotrader :

거래 작업에서 저는 개인적으로 비동기식 주문을 사용합니다.

사실은 (당신이 거래소에서 거래하는 것에 대해 진지한 경우) 주문서의 모든 변경 사항이 필요합니다.

그리고 이 이벤트는 빠르면 빠를수록 좋습니다.

나는 나 자신을 위해 OnBook에 대한 대안을 보지 못합니다.

원칙적으로 OnBook에서 거래 작업 의 직접 호출을 언로드하는 것이 가능합니다. OnBook에서는 작업을 수행하는 데 필요한 플래그만 생성하면 되며 플래그 자체는 다른 위치에서 처리됩니다. 저것들. 이벤트를 생성할 생성된 플래그에 의해 다른 프로시저에서 작업 자체를 시작하지만 OnBook 프로시저를 종료한 후 OnBook 코드 자체는 무거운 작업에서 자유로울 것입니다. 그러나 주문이 비동기식으로 열리고 엄청나게 큰 조건 처리가 없다면 이로 인해 상당한 지연이 발생하지 않을 것입니다.

 
prostotrader :

코드에 내 시간을 추가했습니다.

OnTick()이 실행된 시간을 기억합니다( t_time = GetMicrosecondCount (); )

그런 다음 각 기능이 실행될 때마다 시간이 걸립니다.

결과

즉, 각 기능의 실행 시간은 50마이크로초 미만 입니다!

4초는 어디에서 올 수 있습니까?

두 명의 고문이 하나의 터미널에서 일한 것으로 보이며 터미널에는 단순히 시간이 없습니다

모든 정보를 하나의 로그로 "병합" 하여 현지 시간 을 적절하게 설정합니다.

아마도 사실일 것입니다. 그러한 거친 지연은 그다지 현실적이지 않습니다.


1 - MQ가 스스로 결정했을 때 FLUSH가 작동했습니다!

2 - 하드 디스크에 대한 집중적인 작업과 관련된 디스크 쓰기의 기술적 지연


아마도 어떤 종류의 쓰기 대기열이 이미 로컬 시스템에 있을 것입니다. 이는 매우 현실적입니다. 몇 테라바이트의 백업이 디스크에 쏟아진 경험이 있습니다.

다음과 같은 가정만 할 수 있습니다.

예를 들어 지금 이 순간에 마이크로소프트 오피스를 병렬로 설치한다면 - 윈도우를 업데이트하고 인터넷에서 어떤 종류의 영화를 녹화하고 로컬에 있는 MS SQL로 집중적으로 작업하십시오.

몇 개의 백업을 만들고, 4개의 토렌트를 가지고 있으며, 디스크에 집중적으로 쓰는 2~34개의 프로그램을 더 가지고 있습니다.

즉, 디스크에 집중적인 작업이 있었다면 디스크에 로그를 쓰는 데 지연이 있었을 가능성이 큽니다.

 
Yuriy Zaytsev :

아마도 사실일 것입니다. 그러한 거친 지연은 그다지 현실적이지 않습니다.


1 - MQ가 스스로 결정했을 때 FLUSH가 작동했습니다!

2 - 하드 디스크에 대한 집중적인 작업과 관련된 디스크 쓰기의 기술적 지연


아마도 어떤 종류의 쓰기 대기열이 이미 로컬 시스템에 있을 것입니다. 이는 매우 현실적입니다. 몇 테라바이트의 백업이 디스크에 쏟아진 경험이 있습니다.

다음과 같은 가정만 할 수 있습니다.

예를 들어 지금 이 순간에 마이크로소프트 오피스를 병렬로 설치한다면 - 윈도우를 업데이트하고 인터넷에서 어떤 종류의 영화를 녹화하고 로컬에 있는 MS SQL로 집중적으로 작업하십시오.

몇 개의 백업을 만들고, 4개의 토렌트를 가지고 있으며, 디스크에 집중적으로 쓰는 2~34개의 프로그램을 더 가지고 있습니다.

즉, 디스크에 집중적인 작업이 있었다면 디스크에 로그를 쓰는 데 지연이 있었을 가능성이 큽니다.

디스크와 연결되었을 가능성은 거의 없으며 MT는 로그를 캐시에 쓸 때 이미 시간을 설정합니다. 일반적으로 단말이 4초 동안 생각한 것은 RAM과 CPU보다는 전체 시스템 부하와 관련이 있을 수 있습니다.
 
prostotrader :

코드에 내 시간을 추가했습니다.

OnTick()이 실행된 시간을 기억합니다( t_time = GetMicrosecondCount (); )

그런 다음 각 기능이 실행될 때마다 시간이 걸립니다.

결과

즉, 각 기능의 실행 시간은 50마이크로초 미만 입니다!

4초는 어디에서 올 수 있습니까?

두 명의 고문이 하나의 터미널에서 일한 것으로 보이며 터미널에는 단순히 시간이 없습니다

모든 정보를 하나의 로그로 "병합" 하여 현지 시간 을 적절하게 설정합니다.

그건 그렇고 - 로그에 쓸 때 죄를 짓지 않기 위해 - 아래 코드에서 형성하는 배열에 현지 시간을 추가할 수 있습니다.

그러면 로그는 터미널이 로그를 디스크에 덤프하도록 설계한 시간과 틱 또는 OnBook 이벤트가 도착한 현지 시간 사이에 명확한 차이가 있습니다.

그리고 그것은 연구의 관점에서 더 정확할 것입니다.

 //+------------------------------------------------------------------+ 
//| возвращает строковое описание тика                               | 
//+------------------------------------------------------------------+ 
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 :
디스크와 연결되어 있을 가능성은 거의 없으며 캐시에 로그를 쓸 때 MT 시간이 이미 설정되어 있습니다. 일반적으로 단말이 4초 동안 생각한 것은 RAM과 CPU보다는 전체 시스템 부하와 관련이 있을 수 있습니다.

당신은 그것에 대해 확신합니까?


4초???? , 노노! 프로세서가 4초 동안 정지했거나 메모리가 4초 동안 할당 및 해제되었다고 생각하십니까? 농담하는거야?

디스크 쓰기 대기열일 가능성이 큽니다.

디스크 장치는 메모리 및 프로세서보다 느립니다.

그런 다음 flush() , C 언어에 그러한 명령이 있습니다. 아마도 그것이 편리하고 편안할 때 실행되고 디스크 로딩과 관련된 약간의 지연으로 더 자주 실행될 수 있다는 것을 알고 있을 것입니다.

버퍼를 디스크로 플러시해야 할 때 호출됩니다.

사유: