http://www.520fx.com/forum.php?mod=viewthread&tid=40972&page=1&authorid=39167
MT4裡邊會有一些比較底層,不被寫入help的用法,這些用法在某些方面是至關重要的。
MT4窗口之間使用消息通訊機制,所以可以在EA,或者外部程序通過消息,來控制
MT4的一些行為,下邊就列出已經知道的一些用法。
#include
<WinUser32.mqh>
#define
MT4_WMCMD_PERIOD_D1
33134
#define
MT4_WMCMD_PERIOD_H4
33136
#define
MT4_WMCMD_PERIOD_M1
33137
#define
MT4_WMCMD_PERIOD_M5
33138
#define
MT4_WMCMD_PERIOD_M15
33139
#define
MT4_WMCMD_PERIOD_M30
33140
#define
MT4_WMCMD_PERIOD_W1
33141
#define MT4_WMCMD_MOVE_RIGHT 33197
#define
MT4_WMCMD_MOVE_LEFT 33198
PostMessageA(hwnd,
WM_COMMAND,MT4_WMCMD_MOVE_RIGH, 2);
//可以向左移動一個bar
PostMessageA(hwnd,MW_COMMAND,MT4_WMCMD_PERIOD_M5,0);//轉換為週期
>>>>>>>>>>>>>>>>>>>>
另外一些消息是通過 註冊一種MT4特有的消息類型,通訊
1 觸發EA的start函數運行一次
int
hwnd=WindowHandle(Symbol(), Period());
int MT4InternalMsg =
RegisterWindowMessageA("MetaTrader4_Internal_Message");
PostMessageA(hwnd,MT4InternalMsg,2,1);
2
讓圖表跳到某一個時間點
int hwnd=WindowHandle(Symbol(), Period());
int MT4InternalMsg
=
RegisterWindowMessageA("MetaTrader4_Internal_Message");
PostMessageA(hwnd,MT4InternalMsg,55,time1);
3
調用指標,腳本到圖表
#import "user32.dll"
int RegisterWindowMessageA(string
lpstring);
int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
//注意這個必須是在這裡,而且頭文件不能添加 #include <WinUser32.mqh>
#import
int
hwnd=WindowHandle(Symbol(), Period());
int MT4InternalMsg =
RegisterWindowMessageA("MetaTrader4_Internal_Message");
PostMessageA(hwnd,MT4InternalMsg,15,"ATR");
//調用指標"ATR"
PostMessageA(hwnd,MT4InternalMsg,16,"test");
//調用腳本"test"
當然還有以供參考,如下:
PostMessageA(hwnd,
MT4InternalMsg, 13, StandartIndicatorName);
PostMessageA(hwnd,
MT4InternalMsg, 14, EAName);
PostMessageA(hwnd, MT4InternalMsg, 15,
CustomIndicatorName);
PostMessageA(hwnd, MT4InternalMsg, 16, ScriptName);
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
因為使用消息機制,所以這些代碼是可以移植到外部程序實現,可以實現mt4和外部程序良好交互。
這些在mt4的官方論壇有介紹
MT4也可以執行外部程序。 比如在腳本裡執行 cmd.exe
程序如下
#import "Kernel32.dll"
int
WinExec(string,int);
#import
int start()
{
WinExec("CMD",0);
return(0);
}
就可以利用腳本打開 cmd命令行了。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void SendTickToChart() { |
int hwnd = WindowHandle(Symbol(), Period()); |
if (IsDllsAllowed()) { |
int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message"); |
PostMessageA(hwnd, msg, 2, 0); |
PostMessageA(hwnd, msg, 2, 1); |
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> |
//+------------------------------------------------------------------+
//| IncomingTick.mq4 |
//| Copyright c 2006, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright c 2006, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
#include <WinUser32.mqh>
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int start()
{
//----
int MT4InternalMsg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
int hWnd = WindowHandle(Symbol(),Period());
PostMessageA(hWnd,MT4InternalMsg,2,1);
//----
return(0);
}
//+------------------------------------------------------------------+
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
終於搞定了,是用腳本的,代碼如下:
refresh.mq4 |
//|
fw |
//|
clc
|
//+------------------------------------------------------------------+
#property
copyright "fw"
#property link "clc"
#include
<WinUser32.mqh>
//+------------------------------------------------------------------+
//|
script program start function
|
//+------------------------------------------------------------------+
int
start()
{
//----
while(IsStopped()==false)
{
static int hwnd = 0;
hwnd = WindowHandle(Symbol(), Period());
PostMessageA(hwnd,WM_COMMAND,33324,0);
Sleep(500);
}
//----
return(0);
}
//+------------------------------------------------------------------+
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
http://blog.csdn.net/yangmingxtx/article/details/8503060
>>>>>>>>>>>>> 20140107 update
1. 讓offline 可以畫面tick跳動是用
hwnd = WindowHandle(Symbol(), Period());
PostMessageA(hwnd,WM_COMMAND,33324,0);
2. 讓offline 可以使用EA正常工作是使用 (正常可以在start() 當中列印訊息,會印出來,不正常就印不出來,會只跑init() )
int MT4InternalMsg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
int hWnd = WindowHandle(Symbol(),Period());
PostMessageA(hWnd,MT4InternalMsg,2,1);
Script starts without a tick.
直接使用script是不用透過tick來處發產生資料
http://forum.mql4.com/25152
http://www.metatrader4.com/forum/2227
官方回答