차트 이벤트 유형

사전 정의된 함수 OnChartEvent()를 사용하여 처리할 수 있는 이벤트 유형은 11가지 입니다. 커스텀 이벤트의 경우 65535 식별자가 CHARTEVENT_CUSTOM 에서 CHARTEVENT_CUSTOM_LAST 사이의 범위에서 제공됩니다. 커스텀 이벤트를 생성하려면 EventChartCustom() 함수를 사용해야 합니다.

ENUM_CHART_EVENT

ID

설명

CHARTEVENT_KEYDOWN

키 입력

CHARTEVENT_MOUSE_MOVE

마우스 이동, 마우스 클릭 (CHART_EVENT_MOUSE_MOVE=true 로 차트에 설정된 경우)

CHARTEVENT_MOUSE_WHEEL

마우스 휠을 누르거나 스크롤 (차트에 대해 CHART_EVENT_MOUSE_WHEEL=True 인 경우)

CHARTEVENT_OBJECT_CREATE

그래픽 객체 생성됨 (차트에 대해 CHART_EVENT_OBJECT_CREATE=true 가 설정된 경우)

CHARTEVENT_OBJECT_CHANGE

그래픽 객체 속성이 특성 대화상자를 통해 변경되었습니다

CHARTEVENT_OBJECT_DELETE

그래픽 객체 삭제됨 (CHART_EVENT_OBJECT_DELETE=true 가 차트에 대해 설정된 경우)

CHARTEVENT_CLICK

차트에 클릭

CHARTEVENT_OBJECT_CLICK

다음에 대해 클릭: 그래픽 객체

CHARTEVENT_OBJECT_DRAG

드래그 및 드롭: 그래픽 객체

CHARTEVENT_OBJECT_ENDEDIT

그래픽 객체 편집의 텍스트 편집 끝

CHARTEVENT_CHART_CHANGE

특성 대화상자를 통한 차트 크기 변경 또는 차트 속성 수정

CHARTEVENT_CUSTOM

커스텀 이벤트 범위의 초기 이벤트 수

CHARTEVENT_CUSTOM_LAST

커스텀 이벤트 범위에서 이벤트의 최종 번호

각 이벤트 유형에 대해 OnChartEvent() 함수의 입력 매개 변수에는 이 이벤트 처리에 필요한 한정된 값이 있습니다. 이 매개 변수를 통과하는 이벤트 및 값은 아래 표에 나열되어 있습니다.

Event

id 매개 변수 값

lparam 매개변수 값

dparam 매개변수 값

sparam 매개변수 값

키 입력 이벤트

CHARTEVENT_KEYDOWN

누른 키의 코드

반복 횟수(사용자가 키를 누른 결과로 키 입력이 반복되는 횟수)

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

마우스 이벤트 (차트에 대해 CHART_EVENT_MOUSE_MOVE=true 가 설정된 경우)

CHARTEVENT_MOUSE_MOVE

X 좌표

Y 좌표

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

마우스 휠 이벤트 (차트에 대해 CHART_EVENT_MOUSE_WHEEL=true 인 경우)

CHARTEVENT_MOUSE_WHEEL

마우스 포인터의 X 및 Y 좌표와 키 및 마우스 버튼의 상태 플래그. 다음을 참조하십시오: 아래 예제

마우스 휠 스크롤의 델타 값

그래픽 객체 생성 이벤트 (차트에 대해 CHART_EVENT_OBJECT_CREATE=true 로 설정된 경우)

CHARTEVENT_OBJECT_CREATE

생성된 그래픽 개체의 이름

속성 대화상자를 통한 객체 속성 변경 이벤트

CHARTEVENT_OBJECT_CHANGE

수정된 그래픽 개체의 이름

그래픽 객체 삭제 이벤트 (CHART_EVENT_OBJECT_DELETE=true 가 차트에 대해 설정된 경우)

CHARTEVENT_OBJECT_DELETE

삭제된 그래픽 개체의 이름

차트를 마우스로 클릭하는 이벤트

CHARTEVENT_CLICK

X 좌표

Y 좌표

차트에 속한 그래픽 개체를 마우스로 클릭하는 이벤트

CHARTEVENT_OBJECT_CLICK

X 좌표

Y 좌표

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

마우스를 사용하여 그래픽 개체를 드래그하는 이벤트

CHARTEVENT_OBJECT_DRAG

이동된 그래픽 개체의 이름

레이블 편집 그래픽 객체의 입력 상자에서 완료된 텍스트 편집 이벤트

CHARTEVENT_OBJECT_ENDEDIT

다음의 이름: 텍스트 편집이 완료된 LabelEdit 그래픽 객체

변경 이벤트 - 특성 대화상자를 통한 차트 크기 또는 차트 속성 수정에 대한

CHARTEVENT_CHART_CHANGE

N 넘버 이하의 유저 이벤트 ID

CHARTEVENT_CUSTOM+N

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

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

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

예제:

#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()
  {
//---
   Print("이름이 ",MQL5InfoString(MQL5_PROGRAM_NAME)," 인 expert가 실행 중입니다");
//--- 객체 생성 이벤트 활성화
   ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_CREATE,true);
//--- 객체 삭제 이벤트 활성화
   ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_DELETE,true);
//--- 차트 속성의 강제 업데이트로 이벤트 처리 준비 상태 보장
   ChartRedraw();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| ChartEvent 함수                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // 이벤트 식별자  
                  const long& lparam,   // long 형식의 이벤트 매개 변수
                  const double& dparam, // double 형식의 이벤트 매개 변수
                  const string& sparam  // string 형식의 이벤트 매개 변수
                  )
  {
//--- 차트에서 마우스 왼쪽 버튼을 눌렀습니다
   if(id==CHARTEVENT_CLICK)
     {
      Print("차트에서 마우스 클릭의 좌표는 다음과 같습니다: x = ",lparam,"  y = ",dparam);
    }
//--- 그래픽 객체를 마우스로 클릭했습니다
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      Print("다음 이름의 객체를 마우스로 클릭했습니다 '"+sparam+"'");
    }
//--- 키 눌림
   if(id==CHARTEVENT_KEYDOWN)
     {
      switch(lparam)
        {
         case KEY_NUMLOCK_LEFT:  Print("KEY_NUMLOCK_LEFT 이(가) 눌렸습니다");   break;
         case KEY_LEFT:          Print("KEY_LEFT 이(가) 눌렸습니다");           break;
         case KEY_NUMLOCK_UP:    Print("KEY_NUMLOCK_UP 이(가) 눌렸습니다");     break;
         case KEY_UP:            Print("KEY_UP 이(가) 눌렸습니다");             break;
         case KEY_NUMLOCK_RIGHT: Print("KEY_NUMLOCK_RIGHT 이(가) 눌렸습니다");  break;
         case KEY_RIGHT:         Print("KEY_RIGHT 이(가) 눌렸습니다");          break;
         case KEY_NUMLOCK_DOWN:  Print("KEY_NUMLOCK_DOWN 이(가) 눌렸습니다");   break;
         case KEY_DOWN:          Print("KEY_DOWN 이(가) 눌렸습니다");           break;
         case KEY_NUMPAD_5:      Print("KEY_NUMPAD_5 이(가) 눌렸습니다");       break;
         case KEY_NUMLOCK_5:     Print("KEY_NUMLOCK_5 이(가) 눌렸습니다");      break;
         default:                Print("목록에 없는 일부 키가 눌렸습니다");
        }
      ChartRedraw();
    }
//--- 개체가 삭제되었습니다
   if(id==CHARTEVENT_OBJECT_DELETE)
     {
      Print(" ",sparam," 의 이름의 객체가 삭제되었습니다");
    }
//--- 객체가 생성되었습니다
   if(id==CHARTEVENT_OBJECT_CREATE)
     {
      Print(" ",sparam," 의 이름의 객체가 생성되었습니다");
    }
//--- 객체가 이동되었거나 고정점 좌표가 변경되었습니다
   if(id==CHARTEVENT_OBJECT_DRAG)
     {
      Print("이름이 ",sparam," 인 객체의 고정점 좌표가 변경되었습니다");
    }
//--- 개체 편집의 텍스트가 변경되었습니다
   if(id==CHARTEVENT_OBJECT_ENDEDIT)
     {
      Print("이름이 ",sparam," 인 객체의 편집 필드에 있는 텍스트가 변경되었습니다");
    }
  }

CHARTEVENT_MOUSE_MOVE 이벤트의 경우 sparam 문자열 매개변수는 키보드 및 마우스 버튼의 상태에 대한 정보를 포함합니다:

Bit

설명

1

마우스 좌측 버튼 상태

2

마우스 우측 버튼 상태

3

SHIFT 버튼 상태

4

CTRL 버튼 상태

5

마우스 중간 버튼 상태

6

마우스 첫 여분 버튼 상태

7

마우스 둘째 여분 버튼 상태

예제:

//+------------------------------------------------------------------+
//| Expert 초기화 함수                                   |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- CHART_EVENT_MOUSE_MOVE 메시지 활성화
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1);
//--- 차트의 상황에 맞는 메뉴 사용 안 함(오른쪽)
   ChartSetInteger(0,CHART_CONTEXT_MENU,0);     
//--- 십자선 비활성화(가운데 버튼 사용)
   ChartSetInteger(0,CHART_CROSSHAIR_TOOL,0); 
//--- 차트 속성의 강제 업데이트로 이벤트 처리 준비 상태 보장
   ChartRedraw();
  }
//+------------------------------------------------------------------+
//| 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);
  }
//+------------------------------------------------------------------+
//| ChartEvent 함수                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_MOUSE_MOVE)
      Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam));
  }

CHARTEVENT_MOUSE_WHEEL 이벤트의 경우 파라미터 lparamdparam 에는 마우스 버튼, 커서 좌표 및 마우스 휠 스크롤 값의 CtrlShift 키 상태에 대한 정보가 포함됩니다.더 알아보고 싶으시다면 차트에서 이 Expert Advisor를 실행하고 마우스 휠을 스크롤한 상태에서 다른 버튼을 누르고 코드에 설명된 키를 누르십시오.

예제 - CHARTEVENT_MOUSE_WHEEL 이벤트 처리:

//+------------------------------------------------------------------+
//| Expert 초기화 함수                                   |
//+------------------------------------------------------------------+
init OnInit()
  {
//--- 마우스 휠 스크롤 메시지 사용
   ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,1);
//--- 차트 속성의 강제 업데이트를 통해 이벤트 처리 준비 상태 보장
   ChartRedraw();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| ChartEvent 함수                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &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에 도달하면 트리거됩니다
      //--- flag 처리
      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);
    }
  }
//+------------------------------------------------------------------+ /*
   결과 예제
   CHARTEVENT_MOUSE_WHEEL: Ctrl pressed: X=193, Y=445, delta=-120
   CHARTEVENT_MOUSE_WHEEL: Shift pressed: X=186, Y=446, delta=120
   CHARTEVENT_MOUSE_WHEEL:  X=178, Y=447, delta=-120
   CHARTEVENT_MOUSE_WHEEL:  X=231, Y=449, delta=120
   CHARTEVENT_MOUSE_WHEEL: MiddleButton pressed: X=231, Y=449, delta=120
   CHARTEVENT_MOUSE_WHEEL: LeftButton pressed: X=279, Y=320, delta=-120
   CHARTEVENT_MOUSE_WHEEL: RightButton pressed: X=253, Y=330, delta=120  */

더 보기

이벤트 핸들링 함수, 이벤트 작업