ナビゲータウィンドウの更新と、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 ではこのままでは使えないので要注意です。