OnBookEvent

이 기능은 BookEvent 이벤트가 발생할 때 지표와 EA로 호출됩니다. Depth of Market 변화에 대처하기 위한 것입니다.

void  OnBookEvent(
   const string&  symbol         // 심볼
   );

매개변수

심볼

[in] BookEvent가 도착한 심볼의 이름

반환 값

값 반환이 없음

참고

모든 기호에 대한 BookEvent 이벤트를 받으려면 MarketBookAdd() 기능을 사용하여 구독하면 이 기호에 대한 이벤트를 받을 수 있습니다. 특정 기호에 대한 BookEvent 수신 신청을 취소하려면 MarketBookRelease() 기능을 호출.

BookEvent는 전체 차트 내에서 브로드캐스트됩니다. 즉, 차트의 애플리케이션이 MarketBookAdd 기능을 사용하여 BookEvent를 구독하는 경우 다른 모든 지표와 EA가 동일한 차트에서 시작되고 OnBookEvent() 처리기도 이 이벤트를 수신하게 됩니다. 따라서 OnBookEvent() 처리기에 전달된 심볼 이름을 심볼 매개변수로 분석해야 합니다.

동일한 차트에서 실행 중인 모든 애플리케이션에 대해 심볼별로 정렬된 별도의 BookEvent 카운터가 제공됩니다. 즉, 각 차트에 서로 다른 심볼에 대한 구독이 여러 개 있을 수 있으며 각 심볼에 대해 카운터가 제공됩니다. BookEvent를 구독 및 구독 취소하면 한 차트 내에서 지정된 심볼에 대한 구독 카운터가 변경됩니다. 즉, 동일한 심볼이지만 구독 카운터 값이 서로 다른 두 개의 BookEvent 인접 차트가 있을 수 있습니다.

초기 구독 카운터 값은 0입니다. 각 MarketBookAdd() 호출 시 차트에서 지정된 기호에 대한 구독 카운터 1씩 증가합니다(MarketBookAdd()의 차트 심볼 및 심볼은 일치하지 않아도 됨). MarketBookRelease()를 호출하면 차트에서 지정된 심볼에 대한 구독 카운터가 1만큼 줄어듭니다. 모든 기호에 대한 BookEvent 이벤트는 카운터가 0이 될 때까지 차트 내에서 브로드캐스트됩니다. 따라서 MarketBookAdd () 호출이 포함된 각 MQL5 프로그램은 각 작업이 끝날 때 MarketBookRelease ()를 사용하여 각 심볼에 대한 이벤트를 올바르게 구독 취소하는 것이 중요합니다. 이를 위해서는 전체 MQL5 프로그램 수명 동안 각 호출마다 MarketBookAdd()MarketBookRelease() 호출 횟수가 균등해야 합니다. 프로그램 내에서 플래그 또는 사용자 지정 구독 카운터를 사용하면 BookEvent 이벤트를 안전하게 작업할 수 있으며 동일한 차트 내의 타사 프로그램에서 이 이벤트를 가져오기 위한 구독을 사용하지 않도록 설정할 수 있습니다.

BookEvent 이벤트는 건너뛰지 않으며 이전 BookEvent 처리를 아직 완료하지 않은 경우에도 항상 대기열에 배치됩니다.

 

//+------------------------------------------------------------------+
//|                                           OnBookEvent_Sample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com/en/articles/2635"
#property version   "1.00"
#property description "OnBookEvent()를 사용하여 시장 수준 업데이트/교체율 측정 예"
#property description "코드는 다음 문서에서 가져왔습니다. https://www.mql5.com/en/articles/2635"
//--- 매개변수 입력
input ulong ExtCollectTime   =30;  // 테스트 시간(초)
input ulong ExtSkipFirstTicks=10;  // 시작할 때 건너뛴 틱 수
//--- BookEvent 이벤트 구독 플래그
bool book_subscribed=false;
//--- 시장 수준으로부터의 요청을 수락하기 위한 배열
MqlBookInfo  book[];
//+------------------------------------------------------------------+
//| 엑스퍼트 초기화 기능                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 시작 표시
   Comment(StringFormat("첫 %I64u 틱이 도착할 때까지 기다리는 중",ExtSkipFirstTicks));
   PrintFormat("첫 %I64u 틱이 도착할 때까지 기다리는 중",ExtSkipFirstTicks);
//--- 시장 수준 브로드캐스트 가능
   if(MarketBookAdd(_Symbol))
     {
      book_subscribed=true;
      PrintFormat("%s: MarketBookAdd(%s) 함수가 true 반환함",__FUNCTION__,_Symbol);
     }
   else
      PrintFormat("%s: MarketBookAdd(%s) 함수가 false 반환함! GetLastError()=%d",__FUNCTION__,_Symbol,GetLastError());
//--- 성공적인 초기화
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 초기화 해제 엑스퍼트                                              |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- 초기화 취소 이유 코드 표시
   Print(__FUNCTION__,": 초기화 해제 이유 코드 = ",reason);  
//--- 시장 수준 이벤트 가져오기를 위해 구독을 취소
   if(book_subscribed)
     {
      if(!MarketBookRelease(_Symbol))
         PrintFormat("%s: MarketBookRelease(%s)가 false 반환! GetLastError()=%d",_Symbol,GetLastError());
      else
         book_subscribed=false;
     }
//--- 
  }
//+------------------------------------------------------------------+
//| BookEvent 기능                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   static ulong starttime=0;             // 테스트 시작 시간
   static ulong tickcounter=0;           // 시장 수준 업데이트 카운터
//--- 직접 구독해야 시장 수준 이벤트를 진행할 수 있습니다
   if(!book_subscribed)
      return;
//--- 특정 기호에 대한 업데이트만의 수
   if(symbol!=_Symbol)
      return;
//--- 첫 번째 체크 표시를 건너 뛰고 대기열을 지우고 준비
   tickcounter++;
   if(tickcounter<ExtSkipFirstTicks)
      return;
//--- 시작 시간을 기억
   if(tickcounter==ExtSkipFirstTicks
      starttime=GetMicrosecondCount();
//--- 시장 수준 데이터를 요청
   MarketBookGet(symbol,book);
//--- 언제 멈추나요?  
   ulong endtime=GetMicrosecondCount()-starttime;
   ulong ticks  =1+tickcounter-ExtSkipFirstTicks;
// 테스트 시작 후 시간(마이크로초)이 얼마나 지났습니까?
   if(endtime>ExtCollectTime*1000*1000) 
     {
      PrintFormat("%I64u ticks for %.1f seconds: %.1f ticks/sec ",ticks,endtime/1000.0/1000.0,ticks*1000.0*1000.0/endtime);
      ExpertRemove();
      return;
     }
//--- 코멘트 필드에 카운터를 표시
   if(endtime>0)
      Comment(StringFormat("%I64u ticks for %.1f seconds: %.1f ticks/sec ",ticks,endtime/1000.0/1000.0,ticks*1000.0*1000.0/endtime));
  }

 

 

추가 참조

MarketBookAdd, MarketBookRelease, MarketBookGet, OnTrade, OnTradeTransaction, OnTick, 이벤트 핸들링 기능, 프로그램 작동, 클라이언트 터미널 이벤트