개요
MQL5 에서 윈도우 api 인 SendMessage 호출하면서 WM_COPYDATA 형식의 데이터 송신 가능.
mql5 의 SendMessage 코드예
- mql5 포럼에서 복사해옴.
///// 메타트레이더 에서 WM_COPYDATA SendMessage 예
#property strict
#define WM_COPYDATA 0x004A
#define INFO 0x01
#define FindWindow FindWindowW
#define SendMessage SendMessageW
struct Copydatastruct
{
int dwData;
int cbData;
int lpData;
};
struct Infostruct
{
MqlTick tick;
/* whatever else
info here
*/
};
#import "user32.dll"
int FindWindow(string&, int);
int SendMessage(int, int, int, Copydatastruct&);
#import "msvcrt.dll"
int memcpy(Copydatastruct&, Copydatastruct&, int);
int memcpy(Infostruct&, Infostruct&, int);
#import
Infostruct info;
Copydatastruct copy;
string sDispatch = "mywindow";
int hwDispatch = 0;
void OnTick()
{
hwDispatch = FindWindow(sDispatch, NULL);
if(hwDispatch) {
copy.dwData = INFO; // i.e. function
copy.cbData = sizeof(info); // bytes to copy
copy.lpData = memcpy(info, info, 0); // pointer to data to be copied
SymbolInfoTick(Symbol(), info.tick);
SendMessage(hwDispatch, WM_COPYDATA, NULL, copy);
}
}
/// 상기 SendMesssage 를 수신하는 다른 프로그램측의 코드예
switch (windowmessage) {
case WM_COPYDATA:
{
COPYDATASTRUCT *copy = (COPYDATASTRUCT*) lParam;
switch(copy->dwData) {
case INFO:
{
Infostruct info;
memcpy(&info, copy->lpData, copy->cbData); // copy over data for further processing
// i.e. do something with data
break;
}
// other cases ...
}
break;
}
// other cases
}
상기 포럼에서 가져온 코드는 FindWindow 관련 오류 있는 상태임.
FindWindowW 함수의 첫인자를 int, 2번인자를 문자열로 해야함. 아래 정상 작동하는 코드로 정리함.
#define WM_COPYDATA 0x004A
struct CopyDataStruct
{
int dwData;
int cbData;
long lpData;
};
#import "user32.dll"
int FindWindowW(int, string&);
int SendMessageW(int, int, int, CopyDataStruct&);
#import "msvcrt.dll"
long memcpy(CySTMeta_SeriesCandle&, CySTMeta_SeriesCandle&, int);
#import
CopyDataStruct my_cds;
// 구조체 CySTMeta_SeriesCandle cystmeta_SeriesCandle; 에 데이터 확보된 상태에서 WM_COPDATA 로 송신.
void SendMessage_WMCOPYDATA()
{
string window_title_tgt = "CyFinSystem::Connect-1";
int h_wnd_tgt = FindWindowW(NULL, window_title_tgt); //
if(h_wnd_tgt == 0) {
Print("no window");
return ; // no window handle
}
Print("find window");
my_cds.dwData = 4; // data type
my_cds.cbData = sizeof(cystmeta_SeriesCandle);
my_cds.lpData = memcpy(cystmeta_SeriesCandle,cystmeta_SeriesCandle,0); // memcpy for getting pointer.
SendMessageW(h_wnd_tgt, WM_COPYDATA, NULL, my_cds);
Print("SendMessage Completed");
}
/// 상기코드로 MQl5 에서 컴파일도 되고 실행도 되나 상대방 윈도우에서 수신안됨.
/// 아래 처럼 일부 수정해봐도 상대방 윈도우에서 여전히 수신 안됨.
// 2020.10.21. 이후 필수 요구되면 다시 검토.
#define WM_COPYDATA 0x004A
struct CopyDataStruct
{
int dwData;
int cbData;
long lpData;
};
#import "user32.dll"
long FindWindowW(string&, string&);
int SendMessageW(long, uint, long, CopyDataStruct&);
#import "msvcrt.dll"
long memcpy(CySTMeta_SeriesCandle&, CySTMeta_SeriesCandle&, int);
#import
CopyDataStruct my_cds;
// 구조체 CySTMeta_SeriesCandle cystmeta_SeriesCandle; 에 캔들 확보된 상태에서 WM_COPDATA 로 송신.
void SendMessage_WMCOPYDATA()
{
string window_title_tgt = "CyFinSystem::Connect-1";
string window_classname_tgt; // don't define
long h_wnd_tgt = FindWindowW(window_classname_tgt, window_title_tgt); //
if(h_wnd_tgt == 0) {
Print("no window");
return ; // no window handle
}
Print("find window");
my_cds.dwData = 4; // data type
my_cds.cbData = sizeof(CySTMeta_SeriesCandle);
my_cds.lpData = memcpy(cystmeta_SeriesCandle,cystmeta_SeriesCandle,0); // memcpy for getting pointer.
SendMessageW(h_wnd_tgt, WM_COPYDATA, ChartGetInteger(0,CHART_WINDOW_HANDLE), my_cds);
Print("SendMessage Completed" + my_cds.lpData);
}
오류없이 완전하게 작동하는 WM_COPYDAT 송신 코드 정리됨.
연관
첫 등록 : 2020.08.31
최종 수정 : 2024.09.06
단축 주소 : https://igotit.tistory.com/2560
'트레이딩' 카테고리의 다른 글
메타트레이더. 커스텀 심볼 추가. (4) | 2020.10.17 |
---|---|
Financial data vendor. 금융 데이터 공급자. (0) | 2020.10.07 |
제프레이 우드리프. 헤지펀드 QIM 설립자. 시스템트레이딩. (0) | 2020.08.17 |
마틴게일 매매법. 추세매매비교. 안정, 성공적인 수익위한 필수조건. (32) | 2020.07.09 |
제임스사이먼스. 르네상스 테크놀러지 설립자. 시스템트레이딩. (0) | 2020.06.22 |
댓글