본문 바로가기
트레이딩/메타트레이더 코딩

MQL5. 외부 프로그램으로 실시간 데이터 송신 . SendMessage, PostMessage, WM_COPYDATA

by i.got.it 2024. 9. 6.

 

 

 

 

 

 

 

 

개요 

- 메타트레이더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


 



비트코인




암호화폐       외환/나스닥/골드         암호화폐/외환/나스닥/골드
     
현물 |선물 인버스 |선물 USDT       전략매니저(카피트레이딩)         프랍 트레이더 온라인 지원가능. MT4,MT5