본문 바로가기
트레이딩

MetaTrader. WM_COPYDATA

by i.got.it 2020. 8. 31.

 

개요 

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 송신 코드 정리됨. 

 

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

개요 - 메타트레이더5 언어 MQL5 에서 외부프로세스로 실시간 데이터 송신 가능.  - 아래 코드예는 64비트용으로 제작되었기 때문에 64비트인 메타트레이더5 에서만 정상 동작하며, 32비트인 MT4

igotit.tistory.com

 

 

 

 

연관

 

 

 

WM_COPYDATA.

개요 2개의 프로세스 사이에 SendMessage 함수로 메시지 송/수신과 동시에 구조체자료형 COPYDATASTRUCT 를 전송가능한 것. 즉 메시지 송신측에서 SendMessage 함수인자를 아래처럼 호출하면 HWND 에 해당

igotit.tistory.com

 

 

 

 


첫 등록 : 2020.08.31

최종 수정 : 2024.09.06

단축 주소 : https://igotit.tistory.com/2560


 

댓글



 

비트코인




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