OnChartEvent

이 함수는 ChartEvent 이벤트가 발생할 때 지표와 EA로 호출됩니다. 이 함수는 사용자 또는 MQL5 프로그램에 의해 수행된 차트 변경 사항을 처리하기 위한 것입니다.

void  OnChartEvent()
   const int       id,       // 이벤트 ID 
   const long&     lparam,   // long 타입 이벤트 파라미터
   const double&   dparam,   // double 타입 이벤트 파라미터
   const string&   sparam    // string 타입 이벤트 파라미터
   );

Parameters

id

[in]  Event ID from the ENUM_CHART_EVENT 열거값.

lparam

[in] long 타입 이벤트 파라미터

dparam

[in] double 타입 이벤트 파라미터

sparam

[in] string 타입 이벤트 파라미터

반환 값

반환값 없음

참고

사전 정의된 OnChartEvent() 함수를 사용하여 처리할 수 있는 이벤트 유형에는 11가지가 있습니다. 커스텀 이벤트를 위해 CHARTEVENT_CUSTOM 에서부터 CHARTEVENT_CUSTOM_LAST 까지 65535개 ID가 제공됩니다. 커스텀 이벤트를 생성하려면 EventChartCustom() 함수를 사용하십시오.

ENUM_CHART_EVENT 열거값의 간단한 이벤트 설명:

  • CHARTEVENT_KEYDOWN — 차트 창이 포커스에 있을 때 키보드의 키를 누름;
  • CHARTEVENT_MOUSE_MOVE — 마우스 및 마우스 버튼 클릭 이동 (CHART_EVENT_MOUSE_MOVE가 차트에서 참인 경우);
  • CHARTEVENT_OBJECT_CREATE — 그래픽 개체 생성 (CHART_EVENT_OBJECT_CREATE가 차트에서 참인 경우);
  • CHARTEVENT_OBJECT_CHANGE — 속성 대화 상자를 통해 개체 속성 변경;
  • CHARTEVENT_OBJECT_DELETE — 그래픽 개체 삭제 (CHART_EVENT_OBJECT_DELETE가 차트에서 참인 경우);
  • CHARTEVENT_CLICK — 차트에서 클릭;
  • CHARTEVENT_OBJECT_CLICK — 차트에 속하는 그래픽 개체를 마우스 클릭;
  • CHARTEVENT_OBJECT_DRAG — 마우스를 사용하여 그래픽 개체 끌기;
  • CHARTEVENT_OBJECT_ENDEDIT — 그래픽 개체의 편집 입력 상자에서 텍스트 편집 완료 (OBJ_EDIT);
  • CHARTEVENT_CHART_CHANGE — 차트 변경;
  • CHARTEVENT_CUSTOM+n — 사용자 지정 이벤트 ID (여기서 n은 0 ~ 65535 범위). CHARTEVENT_CUSTOM_LAST 에는 마지막으로 허용된 커스텀 이벤트 ID(CHARTEVENT_CUSTOM+65535)가 포함되어 있습니다.

모든 MQL5 programs은 어플리케이션의 메인 스레드 이외의 스레드에서 작동합니다. 메인 어플리케이션 스레드는 모든 Windows 시스템 메시지를 처리하고, 그 결과 자체 어플리케이션에 대한 Windows 메시지를 생성합니다. 예를 들어, 차트(WM_MOUSE_MOVE event)에서 마우스를 이동하면 응용 프로그램 창의 후속 렌더링을 위한 여러 시스템 메시지가 생성되며 차트에서 시작된 experts 및 지표에 내부 메시지가 전송됩니다. EA 또는 지표가 마우스 이동 이벤트를 이미 수신한 상태에서 주 애플리케이션 스레드가 아직 WM_PAINT 시스템 메시지를 처리하지 않은(따라서 수정된 차트를 렌더링하지 않은) 상황이 발생할 수 있습니다. 이 경우 차트 속성 CHART_FIRST_VISIBLE_BAR은 차트를 렌더링한 후에만 변경됩니다.

각 이벤트 유형에 대해 OnChartEvent() 함수의 입력에는 해당 이벤트를 처리하는 데 필요한 특정 값이 포함됩니다. 표에는 파라미터를 통해 전달된 이벤트와 값이 나와 있습니다.

Event

'id' 파라미터 값

'lparam' 파라미터 값

'dparam' 파라미터 값

'sparam' 파라미터 값

Keystroke event

CHARTEVENT_KEYDOWN

pressed button code

키를 누른 상태로 유지하는 동안 생성된 키 누름 횟수

키보드 키의 상태를 설명하는 비트 마스크의 문자열 값

마우스 이벤트 (CHART_EVENT_MOUSE_MOVE가 차트에서 참인 경우)

CHARTEVENT_MOUSE_MOVE

X 좌표

Y 좌표

마우스 키의 상태를 설명하는 비트 마스크의 문자열 값

마우스 휠 이벤트 (CHART_EVENT_MOUSE_WHEEL가 차트에서 참인 경우)

CHARTEVENT_MOUSE_WHEEL

커서의 키와 마우스 버튼, X 및 Y 좌표에 대한 플래그. 다음 예제의 설명을 보십시오

마우스 휠 스크롤의 델타 값

그래픽 개체 생성 (CHART_EVENT_OBJECT_CREATE가 차트에서 참인 경우)

CHARTEVENT_OBJECT_CREATE

생성된 그래픽 개체의 이름

속성 대화 상자를 통해 개체 속성 변경

CHARTEVENT_OBJECT_CHANGE

변경된 그래픽 개체의 이름

그래픽 개체 제거 (CHART_EVENT_OBJECT_DELETE가 차트에서 참인 경우)

CHARTEVENT_OBJECT_DELETE

제거된 그래픽 개체의 이름

차트에서 마우스 클릭

CHARTEVENT_CLICK

X 좌표

Y 좌표

그래픽 개체에 마우스 클릭

CHARTEVENT_OBJECT_CLICK

X 좌표

Y 좌표

이벤트가 발생한 그래픽 개체의 이름

마우스를 사용하여 그래픽 개체 이동

CHARTEVENT_OBJECT_DRAG

이동된 그래픽 개체의 이름

"입력 필드" 그래픽 객체 입력 상자에서 텍스트 편집 완료

CHARTEVENT_OBJECT_ENDEDIT

텍스트 편집이 완료된 "입력 필드" 그래픽 개체의 이름

속성 대화창을 통해 차트 크기 조정 또는 차트 속성 수정

CHARTEVENT_CHART_CHANGE

커스텀 이벤트(N 번호)

CHARTEVENT_CUSTOM+N

EventChartCustom() 함수에 의해 정의된 값

EventChartCustom() 함수에 의해 정의된 값

EventChartCustom() 함수에 의해 정의된 값

샘플 차트 이벤트 리스너:

//+------------------------------------------------------------------+
//|                                          OnChartEvent_Sample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property description "샘플 차트 이벤트 리스너 및 커스텀 이벤트 생성기"
//--- 서비스 키 ID
#define KEY_NUMPAD_5       12
#define KEY_LEFT           37
#define KEY_UP             38
#define KEY_RIGHT          39
#define KEY_DOWN           40
#define KEY_NUMLOCK_DOWN   98
#define KEY_NUMLOCK_LEFT  100
#define KEY_NUMLOCK_5     101
#define KEY_NUMLOCK_RIGHT 102
#define KEY_NUMLOCK_UP    104
//+------------------------------------------------------------------+
//| Expert 초기화 함수                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- CHARTEVENT_CUSTOM 상수 값 표시
   Print("CHARTEVENT_CUSTOM=",CHARTEVENT_CUSTOM);
//---
   Print("Launched the EA ",MQLInfoString(MQL5_PROGRAM_NAME));
//--- 수신한 차트 개체의 생성 이벤트의 플래그를 설정
   ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_CREATE,true);
//--- 수신한 차트 개체의 제거 이벤트의 플래그를 설정
   ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_DELETE,true);
//--- 마우스 휠 스크롤 메시지 실행
   ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,1);
//--- 차트 속성 강제 업데이트로 이벤트 처리 준비 상태 보장
   ChartRedraw();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert 틱 함수                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 커스텀 이벤트 생성을 위한 틱 카운터
   static int tick_counter=0;
//--- 누적 틱을 이 값으로 나눔
   int simple_number=113;
//--- 
   tick_counter++;
//--- 체크 카운터가 simple_number의 배수인 경우 커스텀 이벤트 전송
   if(tick_counter%simple_number==0)
     {
      //--- 커스텀 이벤트 ID를 0에서부터 65535까지 내에서 생성
      ushort custom_event_id=ushort(tick_counter%65535);
      //---  매개 변수를 채우는 커스텀 이벤트 전송
      EventChartCustom(ChartID(),custom_event_id,tick_counter,SymbolInfoDouble(Symbol(),SYMBOL_BID),__FUNCTION__);
      //--- 예제 결과 분석을 위해 로그에 추가
      Print(__FUNCTION__,": Sent a custom event ID=",custom_event_id);
     }
//---     
  }
//+------------------------------------------------------------------+
//| ChartEvent 함수                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- 키 입력
   if(id==CHARTEVENT_KEYDOWN)
     {
      switch((int)lparam)
        {
         case KEY_NUMLOCK_LEFT:  Print("Pressed KEY_NUMLOCK_LEFT");   break;
         case KEY_LEFT:          Print("Pressed KEY_LEFT");           break;
         case KEY_NUMLOCK_UP:    Print("Pressed KEY_NUMLOCK_UP");     break;
         case KEY_UP:            Print("Pressed KEY_UP");             break;
         case KEY_NUMLOCK_RIGHTPrint("Pressed KEY_NUMLOCK_RIGHT");  break;
         case KEY_RIGHT:         Print("Pressed KEY_RIGHT");          break;
         case KEY_NUMLOCK_DOWN:  Print("Pressed KEY_NUMLOCK_DOWN");   break;
         case KEY_DOWN:          Print("Pressed KEY_DOWN");           break;
         case KEY_NUMPAD_5:      Print("Pressed KEY_NUMPAD_5");       break;
         case KEY_NUMLOCK_5:     Print("Pressed KEY_NUMLOCK_5");      break;
         default:                Print("목록에 없는 키를 누름");
        }
     }
//--- 차트에서 좌클릭
   if(id==CHARTEVENT_CLICK)
      Print("차트에서 마우스 클릭 좌표: x = ",lparam,"  y = ",dparam);
//--- 그래픽 개체 클릭
   if(id==CHARTEVENT_OBJECT_CLICK)
      Print("이름이 지정된 개체의 마우스 버튼 클릭 '"+sparam+"'");
//--- 개체 제거
   if(id==CHARTEVENT_OBJECT_DELETE)
      Print("다음으로 이름이 지명된 개체 제거 ",sparam);
//--- 생성된 개체
   if(id==CHARTEVENT_OBJECT_CREATE)
      Print("다음으로 이름이 지명된 개체 생성 ",sparam);
//--- 변경된 개체
   if(id==CHARTEVENT_OBJECT_CHANGE)
      Print("다음으로 이름이 지명된 개체 변경 ",sparam);
//--- 객체가 이동했거나 앵커 포인트 좌표가 변경됨
   if(id==CHARTEVENT_OBJECT_DRAG)
      Print("다음으로 이름이 지정된 개체의 앵커 포인트 변경 ",sparam);
//--- Edit(편집) 그래픽 개체의 입력 필드에서 텍스트 변경
   if(id==CHARTEVENT_OBJECT_ENDEDIT)
      Print("편집 개체에서 텍스트가 변경됨 ",sparam,"  id=",id);
//--- 마우스 이동 이벤트
   if(id==CHARTEVENT_MOUSE_MOVE)
      Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam));
   if(id==CHARTEVENT_MOUSE_WHEEL)
     {
      //--- 이 이벤트에 대한 마우스 버튼 및 휠 상태 고려
      int flg_keys = (int)(lparam>>32);          // Ctrl 및 Shift 키와 마우스 버튼의 상태 플래그
      int x_cursor = (int)(short)lparam;         // 마우스 휠 이벤트가 발생한 위치의 X 좌표
      int y_cursor = (int)(short)(lparam>>16);   // 마우스 휠 이벤트가 발생한 위치의 Y 좌표
      int delta    = (int)dparam;                // 마우스 스크롤의 총 값이 +120 또는 -120에 도달하면 트리거합니다.
      //--- 플래그 처리
      string str_keys="";
      if((flg_keys&0x0001)!=0)
         str_keys+="LMOUSE ";
      if((flg_keys&0x0002)!=0)
         str_keys+="RMOUSE ";
      if((flg_keys&0x0004)!=0)
         str_keys+="SHIFT ";
      if((flg_keys&0x0008)!=0)
         str_keys+="CTRL ";
      if((flg_keys&0x0010)!=0)
         str_keys+="MMOUSE ";
      if((flg_keys&0x0020)!=0)
         str_keys+="X1MOUSE ";
      if((flg_keys&0x0040)!=0)
         str_keys+="X2MOUSE ";
 
      if(str_keys!="")
         str_keys=", keys='"+StringSubstr(str_keys,0,StringLen(str_keys)-1)+"'";
      PrintFormat("%s: X=%d, Y=%d, delta=%d%s",EnumToString(CHARTEVENT_MOUSE_WHEEL),x_cursor,y_cursor,delta,str_keys);
     }
//--- 속성 대화 상자 창을 사용하여 차트 크기 조정 또는 차트 속성 수정 이벤트
   if(id==CHARTEVENT_CHART_CHANGE)
      Print("차트 크기 또는 속성 변경");
//--- 커스텀 이벤트
   if(id>CHARTEVENT_CUSTOM)
      PrintFormat("Custom event ID=%d, lparam=%d, dparam=%G, sparam=%s",id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+
//| MouseState                                                       |
//+------------------------------------------------------------------+
string MouseState(uint state)
  {
   string res;
   res+="\nML: "   +(((state& 1)== 1)?"DN":"UP");   // mouse left
   res+="\nMR: "   +(((state& 2)== 2)?"DN":"UP");   // mouse right 
   res+="\nMM: "   +(((state&16)==16)?"DN":"UP");   // mouse middle
   res+="\nMX: "   +(((state&32)==32)?"DN":"UP");   // mouse first X key
   res+="\nMY: "   +(((state&64)==64)?"DN":"UP");   // mouse second X key
   res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP");   // shift key
   res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP");   // control key
   return(res);
  }

더 보기

EventChartCustom, Types of chart events, Event handling functions, Program running, Client terminal events