MetaTrader 4: MQL4プログラミングに便利なVSCode機能拡張「compilemql4」をMac/Linux対応させる方法

MQL4の開発環境もVSCodeで
為替取引所ごとに配布されている「MetaTrader 4 (MT4)」には、パソコン用としてはWindows版のほかにMac版がある。Mac版をダウンロードして試したところ、実行ファイルの実体はWindowsバイナリで、Wineを介して動作させるように上手にパッケージされていた。ちなみに詳細は省くが、手元のLinux (x86_64) 環境においても、Wineを使ってWindows版のMT4を動作させることができた。
一方、MT4のエキスパートアドバイザー (EA) を記述するMQL4ファイルの編集は、私の常用環境でもあるMacとLinuxではどのように行えるかというと、原則的にはWindows版と同じでMT4付属のMetaEditorで編集を行えばよい。だがやはり、開発環境としては鉄板のVisual Studio Code (VSCode) を使いたい。そこでVSCodeからMetaEditorを内部起動してMQL4ファイルをコンパイルする、下記の「compilemql4」というVSCode拡張機能が、Mac環境とLinux環境でも使えるかどうかを試行錯誤した。
結論から述べると、compilemql4によるVSCode内からのMQL4コンパイル機能は、MacでもLinuxでも利用可能だ。設定方法は次の通り。
Mac/Linux両対応の「CompileMQL4」設定方法
- Mac環境なら公式MT4のMac版を、Linux環境 (x86_64) ならばWineを導入したうえで公式MT4のWindows版を導入する
- VSCodeに拡張機能「compilemql4」を導入する
- 下記の自作スクリプト
metaeditor_wrapper.sh
を適当なpathに保存してchmod +x
する - VSCodeの設定にある [CompileMQL4 configuration] を次の内容にする (
Include Dir
とLog Dir
を設定した場合の動作は現時点では想定していません)設置項目 設定値 Compile After Save ON Include Dir (カラ) Log Dir (カラ) Metaeditor Dir ${HOME}/path/to/metaeditor_wrapper.sh
- 編集を行うMQL4ファイルの保存場所としては、各OSにて次のpathがデフォルトのようだ
環境 MQL4ファイルの保存Path Mac ${HOME}/Library/Application Support/MetaTrader 4/Bottles/metatrader64/drive_c/Program Files (x86)/MetaTrader 4/MQL4/Experts/
Linux ${HOME}/.wine/drive_c/Program Files (x86)/XMTrading MT4/MQL4/Experts/
- 上記pathのMQL4ファイル (.mq4) を編集して保存すると自動で
metaeditor_wrapper.sh
→metaeditor.exe
が呼び出されてコンパイルが行われる
今回は次の目的で、キモの部分をwrapperとしてbashスクリプトで記述し、VSCodeに行う設定自体はシンプルにすることを心掛けた。
- pathに含まれるスペースなどのメタ文字のエスケープ処理が、VSCode→compilemql4→OSの流れの中でどう行われているかいまいち分からなかったので、勝手知ったるbashスクリプトでいい感じにしたい
- MacとLinuxの環境の差をスクリプトのif-thenの条件分岐で吸収したい (スクリプトそのものとVSCode設定を2つのOS間で同期している環境でも問題ないように)
蛇足
MQL4プログラミングの環境はこうして整備しつつあるが、肝心のエキスパートアドバイザー (EA) の中身はまだ書いたことがなく未着手だ。先日購入した下記の書籍などを参考にコツコツ進めていくつもり……。

MQL4プログラミング入門 ゼロからはじめる自動取引システム
木村 聡 (著)
ソースファイル
metaeditor_wrapper.sh
#!/bin/bash # metaeditor_wrapper.sh (Ver.20230114) # metaeditor.exeの起動にWineを使っている環境用 # 動作確認したVSCodeの [CompileMQL4 configuration] # - Compile After Save: ON # - Include Dir: (カラ) # - Log Dir: (カラ) # - Metaeditor Dir: ${HOME}/path/to/metaeditor_wrapper.sh ARG_COMPILE="$1" ARG_LOG="$2" FLAG_OK=0 if [ "$(uname)" == 'Darwin' ]; then OS='Mac' elif [ "$(expr substr $(uname -s) 1 5)" == 'Linux' ]; then OS='Linux' else OS='unknown' fi if [ ${OS} = 'Mac' ]; then PATH_WINE='/Applications/MetaTrader 4.app/Contents/SharedSupport/metatrader4/MetaTrader 4/wine' PATH_METAEDITOR="${HOME}/Library/Application Support/MetaTrader 4/Bottles/metatrader64/drive_c/Program Files (x86)/MetaTrader 4/metaeditor.exe" FLAG_OK=1 elif [ ${OS} = 'Linux' ]; then PATH_WINE='/usr/bin/wine' PATH_METAEDITOR="${HOME}/.wine/drive_c/Program Files (x86)/XMTrading MT4/metaeditor.exe" FLAG_OK=1 fi if [ ${FLAG_OK} -eq 1 ]; then VALUE_COMPILE=$(echo "${ARG_COMPILE}" | awk -F':' '{print $2}') VALUE_LOG=$(echo "${ARG_LOG}" | awk -F':' '{print $2}') FILE_COMPILE=$(basename "${VALUE_COMPILE}") DIR_COMPILE="${VALUE_COMPILE%/*}" FILE_LOG=$(basename "${VALUE_LOG}") DIR_LOG="${VALUE_LOG%/*}" cd "${DIR_COMPILE}" "${PATH_WINE}" "${PATH_METAEDITOR}" /compile:"${FILE_COMPILE}" /log:"${FILE_LOG}" fi