개요
- 메타트레이더5 . EA 에서 외부 프로그램(=프로세스) 으로 실시간 데이터 송신 가능.
- 아래 이미지는 메타트레이더 (바이빗 MT5 )의 종목 챠트에 ea 배치하고 OnTick 시점에 ask, bid 등의 틱 정보를 외부 프로그램으로 실시간 송신 중.

- 아래 코드예는 64비트용으로 제작되었기 때문에 64비트인 메타트레이더5 에서만 정상 동작하며, 32비트인 MT4 에서는 정상 동작 안된다. 또한, 통신 상대방도 64비트 프로그램이어야 정상 통신 가능하다.
SendMessage, PostMessage , FindWindow
/* | |
MetaTrader5 language MQL5 | |
- Only for 64bit environment | |
file : CCy_IPC_WindowMessage_1.mqh | |
author : igotit . https://igotit.tistory.com | |
*/ | |
#define WM_USER 0x0400 // Windows Message User 정의 | |
#import "user32.dll" | |
long FindWindowW(string lpClassName,string lpWindowName); //HWND FindWindowW(LPCWSTR lpClassName,LPCWSTR lpWindowName); | |
long SendMessageW(long hWnd, int Msg, long wParam, long lParam); // LRESULT SendMessageW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); | |
long PostMessageW(long hWnd, int Msg, long wParam, long lParam); // LRESULT PostMessageW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); | |
#import | |
class CCy_WindowMessage | |
{ | |
private: | |
string m_NameWndTgt; // 대상윈도우 이름. | |
int m_Msg; // 예 : 사용자 메시지인 경우 WM_USER + 1 | |
public: | |
CCy_WindowMessage(string name_wnd_tgt, int msg = WM_USER+1) | |
:m_NameWndTgt(name_wnd_tgt), m_Msg(msg) | |
{} | |
~CCy_WindowMessage() {} | |
long FindWindow() | |
{ | |
long hwnd_tgt = FindWindowW(NULL,m_NameWndTgt); // 대상 윈도우 핸들 받기. | |
if(hwnd_tgt == 0){ | |
Print("[CCy_WindowMessage] Not Found Target Window Name = ", m_NameWndTgt); | |
} | |
return hwnd_tgt; | |
} | |
void SendMessage(long wparam, long lparam) | |
{ | |
long hwnd_tgt = FindWindow(); | |
if(hwnd_tgt == 0 ) return; | |
SendMessageW( | |
hwnd_tgt // long hwnd | |
, m_Msg // int msg | |
, wparam // long wparam | |
, lparam // long lparam | |
); | |
} | |
void PostMessage(long wparam, long lparam) | |
{ | |
long hwnd_tgt = FindWindow(); | |
if(hwnd_tgt == 0 ) return; | |
PostMessageW( | |
hwnd_tgt // long hwnd | |
, m_Msg // int msg | |
, wparam // long wparam | |
, lparam // long lparam | |
); | |
} | |
}; // class CCy_WindowMessage | |
생성자: CCy_WindowMessage(string name_wnd_tgt, int msg = WM_USER + 1) - 대상 윈도우 이름과 메시지 ID를 초기화.
FindWindow(): 대상 윈도우 핸들을 찾고, 실패 시 오류 메시지 출력.
SendMessage(long wparam, long lparam): SendMessageW 함수를 사용해 메시지 전송.
PostMessage(long wparam, long lparam): PostMessageW 함수를 사용해 비동기로 메시지 전송.
사용 방법
- 인스턴스 생성: CCy_WindowMessage msg("윈도우 이름", WM_USER + 1);
- 메시지 전송: msg.SendMessage(wParam, lParam);
- 비동기 메시지 전송: msg.PostMessage(wParam, lParam);
SendMessage with WM_COPYDATA
- 앞의 클래스 CCy_WindowMessage 의 SendMessage 호출하면서 WM_COPYDATA 송신.
/* | |
MetaTrader5 language MQL5 | |
- Only for 64bit environment | |
file : CCy_IPC_SendCopyData_1.mqh | |
author : igotit . https://igotit.tistory.com | |
*/ | |
#include "CCy_IPC_WindowMessage_1.mqh" | |
#define WM_COPYDATA 0x004A | |
/* 윈도우 API 에서의 COPYDATASTRUCT 정의 | |
typedef struct tagCOPYDATASTRUCT { | |
ULONG_PTR dwData; // 데이터 식별자 . 32bit 4byte, 64bit 8byte | |
DWORD cbData; // 데이터 크기 (바이트 단위) 4byte, 64bit 8byte | |
PVOID lpData; // 데이터 포인터 . 32bit 4byte, 64bit 8byte | |
} COPYDATASTRUCT, *PCOPYDATASTRUCT; | |
*/ | |
//중요. 아래 자료형은 상기 tagCOPYDATASTRUCT 멤버변수의 64비트 실행환경에서의 바이트 사이즈로 한것. | |
struct COPYDATASTRUCT | |
{ | |
long dwData; // 8byte . 데이터 식별 | |
long cbData; // 8byte . lpData 의 바이트 사이즈. 64비트에서 int 로 하면 절대 안됨. | |
long lpData; // 8byte . 데이터 포인터. | |
}; | |
#import "msvcrt.dll" | |
long memmove(COPYDATASTRUCT & dest,COPYDATASTRUCT & src, long n); // memmove 반환값은 dest 의 포인터. void *memmove(void *dest, const void *src, size_t n); | |
#import | |
class CCy_SendCopyData | |
{ | |
private: | |
CCy_WindowMessage m_CCyWindowMessage; // SendMessage 활용위함. | |
COPYDATASTRUCT m_CDS; | |
long m_pCDS; // m_CDS 의 포인터. | |
public: | |
CCy_SendCopyData(string name_wnd_tgt) | |
:m_CCyWindowMessage(name_wnd_tgt,WM_COPYDATA) | |
{ | |
// 주요개념 : m_CDS 의 포인터를 SendMessage 의 2번 lParam 에 m_CDS 포인터 전달해야하는데, | |
// mql5 에서는 구조체 포인터 받는 수단 제공 안되므로 memmove 함수 반환값이 1번 인자의 포인터임을 활용. | |
m_pCDS = memmove(m_CDS, m_CDS, 0); | |
} | |
~CCy_SendCopyData(){} | |
void SendMessage(long wparam,long cds_cwdata, int cds_cbdata, long cds_lpdata) | |
{ | |
m_CDS.dwData = cds_cwdata; // 데이터 식별용. 사용자가 임의 정의. | |
m_CDS.cbData = cds_cbdata; // 데이터 사이즈 m_CDS.lpData 로 전달하려는 데이터의 바이트 사이즈 | |
m_CDS.lpData = cds_lpdata; // 데이터 포인터 | |
m_CCyWindowMessage.SendMessage( | |
wparam //long wparam | |
,m_pCDS //long lparam | |
); | |
} | |
};//class CCy_SendCopyData |
상위정리
메타트레이더 5. 체계정리. 활용법/지식
MetaTrader 5 메타트레이더 5 , 메타에디터, MQL5 활용정보 체계정리. 본 글에서 주요 정리대상 정보 1. 메타트레이더 5 사용법.2. MQL5 언어 기반 "직접 코딩"하여 메타프레이더5에서 자동매매 달성
igotit.tistory.com
첫 등록 : 2024.09.06
최종 수정 : 2024.09.09
단축 주소 : https://igotit.tistory.com/5820
'트레이딩 > 메타트레이더 코딩' 카테고리의 다른 글
MT5 . 주문 체결 에러 . No Prices . TRADE_RETCODE_PRICE_OFF (=10021) (3) | 2024.10.10 |
---|---|
bybit MT5 통신 속도 확인 . AWS 일본 , 싱가포르 (1) | 2024.10.09 |
메타트레이더 5 . ONNX 모델 직접 지원 . (0) | 2024.08.29 |
MQL5 . 메타 시간을 UTC 로 변환하기 . 일광절약 시간제 (DST) 고려 (0) | 2024.08.28 |
MQL5 . 기본 자료형 바이트 크기 및 표준 자료형 대응표 (0) | 2024.08.28 |
댓글