//+------------------------------------------------------------------+
//| 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_RIGHT: Print("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);
}
|