ナビゲータウィンドウの更新と、MT4の再起動をショートカットで。
今日は、AutoHotKeyにナビゲータウィンドウの更新と、MT4の再起動をさせるショートカットキー割当てをします。
複数のMT4 を使用していると、あるMT4 の indicators フォルダに .mq4 をコピー後、ダブルクリックして MetaEditor を起動させても、別のMT4 のMetaEditor が立ち上がってしまい、その状態でCompile してもナビゲータウィンドウに 新しいインジケータが表示されない..というトラブルがよく起こります。
その場合、対象としているMT4 のMetaEditor を起動してコンパイルするか、MT4 自体を再起動させるしか方法がありません。
どちらも大した手間ではないのですが、忘れないうちに紹介しておきます。
以下のコードは、「Win + R」でナビゲータウィンドウのリロード、「Win + B」で MT4 の再起動をします。
#r:: Msg := DllCall("RegisterWindowMessage", Str,"MetaTrader4_Internal_Message", Int) count :=1 Loop,1280{ PostMessage, Msg,0x303D,0xC000+count count :=count+1 } ;MsgBox,Refresh done return #b:: WinGet, pid,PID,A FullPath :=GetModuleFileNameEx(pid) WinClose , A ;Process, Close,%pid% Run,%FullPath% return
GetModuleFileNameEx() を.ahkファイル内で定義していない場合は、以下を追加します。
GetModuleFileNameEx(ProcessID) ; modified version of shimanov's function { ; #define PROCESS_VM_READ (0x0010) ; #define PROCESS_QUERY_INFORMATION (0x0400) hProcess := DllCall( "OpenProcess", "UInt", 0x10|0x400, "Int", False, "UInt", ProcessID) if (ErrorLevel or hProcess = 0) Return FileNameSize := 260 VarSetCapacity(ModuleFileName, FileNameSize, 0) CallResult := DllCall("Psapi.dll\GetModuleFileNameExA", "UInt", hProcess, "UInt", 0, "Str", ModuleFileName, "UInt", FileNameSize) DllCall("CloseHandle", hProcess) Return ModuleFileName }
MT4の再起動は、以前に紹介した experts フォルダを開くテクニックの応用ですが、ナビゲータウィンドウのリロードは、ちょっと怪しいコードになっています。
MetaEditor でコンパイルをすると、ある1つのウィンドウメッセージがMetaTraderに送られて、その結果、ナビウィンドウが再読込みされるのですが、ウィンドウメッセージのパラメータに何を指定すれば良いのかが分からないのです。(汗
PostMessage, Msg,0x303D,0xC000+count
の 0xC000+count という部分が不明な部分で、この値は MT4 のインストール先によって変わってしまうようで、AutoHotKeyでは正しい値が分かりません。
そこで、Loop,1280{ .. } で、それっぽい値 ( 0xC000 〜 0xC500 )を絨毯爆撃させています。普通のアプリなら無関係なメッセージを送られても無視されるだけなので、たぶん問題ないと思いますが、この範囲外の値で更新されているMT4 ではこのままでは使えないので要注意です。