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

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

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」設定方法

  1. Mac環境なら公式MT4のMac版を、Linux環境 (x86_64) ならばWineを導入したうえで公式MT4のWindows版を導入する
  2. VSCodeに拡張機能「compilemql4」を導入する
  3. 下記の自作スクリプトmetaeditor_wrapper.shを適当なpathに保存してchmod +xする
  4. VSCodeの設定にある [CompileMQL4 configuration] を次の内容にする (Include DirLog Dirを設定した場合の動作は現時点では想定していません)
    設置項目設定値
    Compile After SaveON
    Include Dir(カラ)
    Log Dir(カラ)
    Metaeditor Dir${HOME}/path/to/metaeditor_wrapper.sh
  5. 編集を行う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/
  6. 上記pathのMQL4ファイル (.mq4) を編集して保存すると自動でmetaeditor_wrapper.shmetaeditor.exeが呼び出されてコンパイルが行われる

今回は次の目的で、キモの部分をwrapperとしてbashスクリプトで記述し、VSCodeに行う設定自体はシンプルにすることを心掛けた。

  • pathに含まれるスペースなどのメタ文字のエスケープ処理が、VSCode→compilemql4→OSの流れの中でどう行われているかいまいち分からなかったので、勝手知ったるbashスクリプトでいい感じにしたい
  • MacとLinuxの環境の差をスクリプトのif-thenの条件分岐で吸収したい (スクリプトそのものとVSCode設定を2つのOS間で同期している環境でも問題ないように)

蛇足

MQL4プログラミングの環境はこうして整備しつつあるが、肝心のエキスパートアドバイザー (EA) の中身はまだ書いたことがなく未着手だ。先日購入した下記の書籍などを参考にコツコツ進めていくつもり……。

MQL4プログラミング入門 ゼロからはじめる自動取引システム

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

参考リンク