실시간 틱 - 페이지 14

 
Roman :

나는 거래 외환을 사용하지 않습니다.
CopyTick의 예에서 구조의 마지막 요소는 하나만 얻을 수 있으며 실제로는 가장 좋은 가격만 얻을 수 있습니다.

하나의 요소 를 결정했습니까?

문제의 사실은 내가 절대적으로 모든 틱을 받는다는 것입니다 (틱뿐만 아니라 주문서의 변경 사항도)

확인하다

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

그래서 우리는 그것을 알아 냈고 그것은 좋습니다.

온북에 비해 온틱의 장점을 한 가지 더 이야기하겠다고 약속했다. OnBuk은 배달이 보장된다는 사실 때문에 최소한 약간의 무거운 계산이 있으면(또는 신은 금지, 거래 작업 ) 이벤트의 상당히 큰 대기열이 누적될 수 있으며 이는 의미 가 없습니다. 이벤트와 관련된 정보를 포함합니다). 여기서 존엄성은 종종 발생하는 것처럼 불리하게 변합니다.

이 경우 OnTick은 계산 중에 수신된 이벤트를 건너뛰고 첫 번째 관련 이벤트에서 작동합니다. OnBuk 버전에서 대기열을 지우려면(쓸모 없는 이벤트 건너뛰기) 목발을 막아야 합니다.

 
Andrey Khatimlianskii :

그래서 우리는 그것을 알아 냈고 그것은 좋습니다.

온북에 비해 온틱의 장점을 한 가지 더 이야기하겠다고 약속했다. OnBuk은 배달이 보장된다는 사실 때문에 최소한 약간의 무거운 계산이 있으면(또는 신은 금지, 거래 작업 ) 이벤트의 상당히 큰 대기열이 누적될 수 있으며 이는 의미 가 없습니다. 이벤트와 관련된 정보를 포함합니다). 여기에서 존엄성은 종종 발생하듯이 불리하게 변합니다.

이 경우 OnTick은 단순히 계산 중에 수신된 이벤트를 건너뛰고 첫 번째 새로운 관련 이벤트에서 작동합니다. OnBuk 버전에서 대기열을 지우려면(쓸모 없는 이벤트 건너뛰기) 목발을 막아야 합니다.

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

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

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

또한 요청 및 입찰 볼륨이 필요합니다 ...

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

 
Roman :

나는 거래 외환을 사용하지 않습니다.
CopyTick의 예에서 구조의 마지막 요소는 하나만 얻을 수 있으며 실제로는 가장 좋은 가격만 얻을 수 있습니다.

위의 코드를 실행한 결과

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

:)

 2020.02 . 03 19 : 28 : 14.656 Ticks_test (GOLD- 3.20 ,M1)       OnTick : 2020.02 . 03 19 : 28 : 13.160 Bid= 1581.9 
2020.02 . 03 19 : 28 : 14.656 Ticks_test (GOLD- 3.20 ,M1)       SymbolInfoTick : 2020.02 . 03 19 : 28 : 13.160
2020.02 . 03 19 : 28 : 14.656 Ticks_test (GOLD- 3.20 ,M1)       SymbolInfoTick : 2020.02 . 03 19 : 28 : 13.160
2020.02 . 03 19 : 28 : 14.656 Ticks_test (GOLD- 3.20 ,M1)       OnBookEvent : 2020.02 . 03 19 : 28 : 13.160 Bid= 1581.9 

같은 틱이지만 SymbolInfoTick 이 호출되면 플래그가 없습니다. :)

추가됨

 if (tick.flags == 0 )
   {
     res = res + " ask = " + string (tick.ask) + "; bid = " + string (tick.bid);
   }

우리는 진드기를 얻었지만 누가 그것을 "스폰"했는지 모릅니다.

 2020.02 . 03 19 : 36 : 56.576 Ticks_test (GOLD- 3.20 ,M1)       OnTick : 2020.02 . 03 19 : 36 : 54.735 Bid= 1583 
2020.02 . 03 19 : 36 : 56.576 Ticks_test (GOLD- 3.20 ,M1)       SymbolInfoTick : 2020.02 . 03 19 : 36 : 55.61 ask = 1583.3 ; bid = 1583.0
2020.02 . 03 19 : 36 : 56.576 Ticks_test (GOLD- 3.20 ,M1)       SymbolInfoTick : 2020.02 . 03 19 : 36 : 55.61 ask = 1583.3 ; bid = 1583.0
2020.02 . 03 19 : 36 : 56.576 Ticks_test (GOLD- 3.20 ,M1)       OnBookEvent : 2020.02 . 03 19 : 36 : 54.735 Bid= 1583 

일반적으로 틱 시간은 어떻게 됩니까?

말도 안되는 소리입니다. 시간 19 : 36 : 54.735의 새 패키지에서 틱을 가져오고 SymbolInfoTick을 호출하여 900ms만큼 "앞으로" 틱을 얻습니다???

도움에서   SymbolInfoTick

[out]  Ссылка на структуру типа MqlTick , в которую будут помещены текущие цены и время последнего обновления цен .
 

아름다운 주제, 많은 흥미로운 것들, 감사합니다.

농담도, 농담도 하지 않고...

코드를 파괴하지 마십시오. 고려하겠습니다 ...

 
prostotrader :

일반적으로 틱 시간은 어떻게 됩니까?

말도 안되는 소리입니다. 시간 19 : 36 : 54.735의 새 패키지에서 틱을 가져오고 SymbolInfoTick을 호출하여 900ms만큼 "앞으로" 틱을 얻습니다???

도움에서

정말 이상합니다. Bid 값은 모든 사람에게 수렴되지만 SymbolInfoTick 시간은 다릅니다.

 
Roman :

정말 이상합니다. Bid 값은 모든 사람에게 수렴되지만 SymbolInfoTick 시간은 다릅니다.

터미널이 "원하는대로"시간을 조정하는 것 같습니다 :)

 2020.02 . 03 21 : 56 : 44.409 Ticks_test (GOLD- 3.20 ,M1)       OnTick : 2020.02 . 03 21 : 56 : 42.776 Sell Tick: Last= 1582.9 Volume= 2 
2020.02 . 03 21 : 56 : 48.122 Ticks_test (GOLD- 3.20 ,M1)       SymbolInfoTick : 2020.02 . 03 21 : 56 : 42.780 ask = 1583.1 ; bid = 1582.9
2020.02 . 03 21 : 56 : 48.122 Ticks_test (GOLD- 3.20 ,M1)       SymbolInfoTick : 2020.02 . 03 21 : 56 : 42.780 ask = 1583.1 ; bid = 1582.9
2020.02 . 03 21 : 56 : 48.122 Ticks_test (GOLD- 3.20 ,M1)       OnBookEvent : 2020.02 . 03 21 : 56 : 42.776 Sell Tick: Last= 1582.9 Volume= 2 

현지 시간 으로 거의 4초가 지났습니다!

이것은 확실히 될 수 없습니다!

그리고 여기 모든 것이 괜찮습니다.

 2020.02 . 03 21 : 57 : 02.294 Ticks_test (GOLD- 3.20 ,M1)       OnTick : 2020.02 . 03 21 : 57 : 00.671 Sell Tick: Last= 1582.9 Volume= 5 
2020.02 . 03 21 : 57 : 02.294 Ticks_test (GOLD- 3.20 ,M1)       SymbolInfoTick : 2020.02 . 03 21 : 57 : 00.671 Sell Tick: Last= 1582.9 Volume= 5 
2020.02 . 03 21 : 57 : 02.294 Ticks_test (GOLD- 3.20 ,M1)       SymbolInfoTick : 2020.02 . 03 21 : 57 : 00.671 Sell Tick: Last= 1582.9 Volume= 5 
2020.02 . 03 21 : 57 : 02.294 Ticks_test (GOLD- 3.20 ,M1)       OnBookEvent : 2020.02 . 03 21 : 57 : 00.671 Sell Tick: Last= 1582.9 Volume= 5 
 
prostotrader :

터미널이 "원하는대로"시간을 조정하는 것 같습니다 :)

현지 시간으로 거의 4초가 지났습니다!

이것은 확실히 될 수 없습니다!


로그에 따르면 OnTick은 OnBookEvent 보다 4초 빠르게 동일한 틱을 포착 했습니다 .

 1  2020.02 . 03 21 : 56 : 4 4 .409 Ticks_test (GOLD- 3.20 ,M1)       OnTick :            2020.02 . 03 21 : 56 : 42.776 Sell Tick: Last= 1582.9 Volume= 2 
   2020.02 . 03 21 : 56 : 48.122 Ticks_test (GOLD- 3.20 ,M1)       SymbolInfoTick :    2020.02 . 03 21 : 56 : 42.780 ask = 1583.1 ; bid = 1582.9
   2020.02 . 03 21 : 56 : 48.122 Ticks_test (GOLD- 3.20 ,M1)       SymbolInfoTick :    2020.02 . 03 21 : 56 : 42.780 ask = 1583.1 ; bid = 1582.9
2  2020.02 . 03 21 : 56 : 4 8 .122 Ticks_test (GOLD- 3.20 ,M1)       OnBookEvent :       2020.02 . 03 21 : 56 : 42.776 Sell Tick: Last= 1582.9 Volume= 2 
 
Yuriy Zaytsev :

로그에 따르면 OnTick은 OnBookEvent 보다 4초 빠르게 동일한 틱을 포착 했습니다 .

그것은 확실히 사실이 될 수 없습니다,

틱이 이미 터미널에 있기 때문에(즉, 새로운 틱 패키지가 이미 도착했습니다)

 
prostotrader :

그것은 확실히 사실이 될 수 없습니다,

틱이 이미 터미널에 있기 때문에(즉, 틱의 새 패키지가 이미 도착했습니다)

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

추신

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

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

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


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


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