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