차트 이벤트 유형

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

ENUM_CHART_EVENT

ID

설명

CHARTEVENT_KEYUP

키 놓기

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

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

 

CHARTEVENT_KEYUP 이벤트

CHARTEVENT_KEYUP 이벤트는 차트 창에 입력 포커스가 있는 동안 사용자가 키를 놓으면 발생합니다. 이 이벤트는 키를 누르면 생성되는 현재 CHARTEVENT_KEYDOW을 보완합니다. 두 이벤트를 모두 사용하면 키가 눌리고 놓이는 시점을 정확하게 판단할 수 있습니다. 이는 대화형 컨트롤이 있는 사용자 인터페이스와 도구를 만들 때 유용합니다.

void OnChartEvent(const int id,
                      const long &lparam,
                      const double &dparam,
                      const string &sparam)
  {
    if(id == CHARTEVENT_KEYUP)
      {
        int key = (int)lparam;
        ::Print("Key released: "TranslateKey(key));
      }
  } 

lparam (KeyCode)와 유사한 내용이 포함되어 있는데 이는 CHARTEVENT_KEYDOW 이벤트와 유사합니다. 이 TranslateKey() 함수를 사용하여 키의 텍스트 표현을 얻습니다.

 

Handling dead keys

소위 "데드 키"를 처리하는 것이 지원됩니다. 데드 키는 문자를 즉시 입력하지 않지만 다음에 입력되는 문자의 모양을 바꾸는 키입니다. 예를 들어 그리스어 레이아웃에서는 키 ;는 모음(ά, έ, ύ 등)에 강세를 두는 데 사용됩니다.

이제 이러한 키는 다음을 사용하여 추적할 수 있습니다. 추적은TranslateKey() 함수 를 사용해 기능하며 이 함수는 CHARTEVENT_KEYDOWN 그리고>CHARTEVENT_KEYUP 핸들러에 있습니다. 이를 통해 다국어 레이아웃에서 복잡한 키 조합을 눌렀다 놓는 것을 정확하게 감지할 수 있습니다.

void OnChartEvent(const int id,
                      const long &lparam,
                      const double &dparam,
                      const string &sparam)
  {
    if(id == CHARTEVENT_KEYDOWN)
      {
        int key = (int)lparam;
        string text = TranslateKey(key);
        ::Print("Pressed: "text);
      }
    if(id == CHARTEVENT_KEYUP)
      {
        int key = (int)lparam;
        string text = TranslateKey(key);
        ::Print("Released: "text);
      }
  }

사용자 정의 텍스트 필드, 단축키 시스템 및 국제 키보드 레이아웃을 구현하는 인터페이스를 구현할 때 데드 키를 처리하는 것이 유용합니다.

 

OnChartEvent 함수 입력

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

Event

id 매개 변수 값

lparam 매개변수 값

dparam 매개변수 값

sparam 매개변수 값

키 릴리스 이벤트

CHARTEVENT_KEYUP

릴리즈된 키 코드

이벤트 반복 횟수는 항상 1입니다.

제어자 키의 상태를 설명하는 비트 마스크 문자열 값. WM_KEYUP message를 확인하세요

Keypress 이벤트

CHARTEVENT_KEYDOWN

누른 키 코드

키가 눌려 있는 동안 이벤트 반복 횟수

제어자 키의 상태를 설명하는 비트 마스크 문자열 값. WM_KEYDOWN message를 확인하세요

마우스 이벤트 (차트에 대해 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  */

더 보기

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