실시간 틱 - 페이지 11

 

Andrey Khatimlianskii , fxsaber

이렇게 해보자

내 코드에서 오류(있는 경우) 찾기

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

내 코드에서 오류(있는 경우) 찾기

댓글이 없는 시트는 보지도 않습니다. 나는 내 코드를 통해 결론을 내렸다. 인터넷에서 정리하는 것은 무리라고 생각합니다. 모두가 자신의 것으로 남습니다.

 
fxsaber :

댓글이 없는 시트는 보지도 않습니다. 나는 내 코드를 통해 결론을 내렸다. 인터넷에서 정리하는 것은 무리라고 생각합니다. 모두가 자신의 것으로 남습니다.

즉, 기능의 결과에 신경 쓰지 않습니까?

아, 네, 당신은 상인이 아니라 작가입니다. 죄송합니다. 잊어버렸습니다.

 
prostotrader :

즉, 기능의 결과에 신경 쓰지 않습니까?

중요한. 따라서 고문은 스스로 작성 하고 결론을 도출했습니다.

아, 네, 당신은 상인이 아니라 작가입니다. 죄송합니다. 잊어버렸습니다.

네, 저는 상인이 아니라 작가입니다.

 

글쎄, 남은 상대는 단 한 명뿐입니다 (있다면 물론 :) ) ...

우리는 결과를 기다리고 있습니다...

 
prostotrader :

글쎄, 남은 상대는 단 한 명뿐입니다 (있다면 물론 :) ) ...

우리는 결과를 기다리고 있습니다...

반대자들이 떠나는 이유는 그들이 틀렸기 때문이 아니라 당신에게서 자부심이 나오기 때문입니다.
 
Artyom Trishkin :
반대자들이 떠나는 이유는 그들이 틀렸기 때문이 아니라 당신에게서 자부심이 나오기 때문입니다.

Artem ( 공격 금지 )!

FOREX 사람들은 Exchange 주제 에 와서 "다리를 들어 올리다"고 증거없이 넘어집니다!

그리고 여기에 자부심이 있습니다 . 만약 제가 틀렸다면 - 저는 그것을 인정할 준비가 되어 있습니다!

그러나 논리적 추론과 내 자신의 경험에서

OnBookEvent()는 더 빠르고 단일 틱 또는 단일 DOM 변경을 놓치지 않습니다!

내 코드에서 오류(있는 경우)를 찾습니다.

내 코드의 로그에서 - 모든 것이 매우 명확하게 보입니다!

 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!

노란색으로 표시 - 같은 눈금 !

추가됨

15줄 의 복잡하지 않은 코드 를 이해하는 것이 자랑스러운 프로그래머들에게 정말 어렵습니까?

추가됨

댓글이 도움이 될까요?

 //+------------------------------------------------------------------+
//|                                                   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 ( 공격 금지 )!

FOREX 사람들은 Exchange 주제 에 와서 "다리를 들어 올리다"고 증거없이 넘어집니다!

그리고 여기에 자부심이 있습니다 . 만약 제가 틀렸다면 - 저는 그것을 인정할 준비가 되어 있습니다!

그러나 논리적인 추론과 내 자신의 경험에서

OnBookEvent()는 더 빠르고 단일 틱 또는 단일 DOM 변경을 놓치지 않습니다!

내 코드에서 오류(있는 경우)를 찾습니다.

내 코드의 로그에서 - 모든 것이 매우 명확하게 보입니다!

추가됨

15줄 의 복잡하지 않은 코드 를 이해하는 것이 자랑스러운 프로그래머들에게 정말 어렵습니까?

추가됨

댓글이 도움이 될까요?

관심이 없어요. 차이가 없다고 봅니다. 그러나 Andrei는 가장 좋은 방법을 보여주겠다고 약속했습니다. 사실, 그분은 당신에게 그것이 불가능하다는 것을 보여 주기 위해 조건을 설정하셨습니다.
 
Artyom Trishkin :
관심이 없어요. 차이가 없다고 봅니다. 그러나 Andrei는 가장 좋은 방법을 보여주겠다고 약속했습니다. 사실, 그분은 당신에게 그것이 불가능하다는 것을 보여 주기 위해 조건을 설정하셨습니다.

확인.

그러나 나는 단지 약간의 언급을 할 것입니다

OnTick()이 보류 중인 주문 을 처리하지 않는다는 사실

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

이미 주식 거래를 위해 이 기능을 휴지통에 병합해야 하는 이유입니다.

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

정보 및 거래라는 두 개의 독립적인 스트림인 COPY_TICKS_INFO 및 COPY_TICKS_ALL이 OnTick에 도착하여 사전 처리를 거칩니다.

이러한 스레드는 서로 동기화되지 않으므로 OnBookEvent 와 OnTick을 비교하면 TICKS_INFO를 가져와야 합니다.

OnBookEvent는 정의상 더 빨라야 합니다. 전처리를 하지 않습니다.

테스트로 누가 더 빠른지 확실하게 판별하는 것은 불가능합니다. 우리는 틱과 달리 오더북의 시장 시간을 모릅니다.

개발자에게 여러 번 요청했지만 ADD GLASS TIME! ! !


ps 속도 외에도 유리에는 OnTick에 비해 다른 장점이 있습니다.

이미 언급했듯이 OnTick 에서 최상의 Bid 및 Ask 가격을 얻는 것은 불가능합니다.

다른 기호의 데이터는 OnTick 에 오지 않으므로 Expert Advisors가 여러 도구를 분석하는 데 쓸모가 없습니다.