MacOS + wine (wineskin) + MT5 環境下で、コマンドラインで mql5 をコンパイルする方法。
MetaEditor は使いづらいので nvim で編集していますが、コンパイルは MetaEditor を立ち上げておかねばならず、ちと面倒。
nvim公式サイトにもなかなか情報が見つけられないので、手探りしました。
Find the command that works
Prerequisites 前提条件
以下の条件下で行っています。
- MT5は、
wineskin
でMT5
という名称でインストール - EA ファイルは
~/Projects/EA/MyEA.mq5
- EA は MQL5 の標準オブジェクトを include (
Arrays\ArrayObj.mqh
) - EA は同階層以下の mqh ファイルを include
EA code
シンプルにこれだけ。
#include <Arrays\ArrayObj.mqh>
#include "functions.mqh"
#include "class/myclass.mqh"
int OnInit() {
return INIT_SUCCEEDED;
}
void OnTick() {}
C++Command args コマンド引数
wine
および MetaEditor64.exe
のコマンドライン引数などはこちら
Usage¸Ω:
MetaEditor64.exe /compile:"path" [/include:"path"] [/project] [/log] [/s]
/compile:"path" - soruce file, folder or project file path
/project - compile project file
/include:"path" - path to MQL4\MQL5 folder
/log - create compilation log file
/s - check a program syntax without compilation
C++my sample with wine:
wine <path_to_metaeditor_exe> \
/compile: <path_to_mql5_file> \
/include: <path_to_mql_folder> \
/log: <path_to_log_file>
PlaintextThe code that works 動作するコードはこれ
色々テストしたが、結論から言うと、コンパイルが正しく動作したコードはこちら:
This is the code that works:
wine ~/Applications/Wineskin/MT5.app/drive_c/Program\ Files/MT5/MetaEditor64.exe \
/compile:"Z:\Users\username\Projects\EA\MyEA.mq5" \
/log:"Z:\Users\username\Projects\EA\MyEA.log"
Bashターミナルで実行すると、何やらごにょごにょ表示されて終了。
0074:err:ntoskrnl:ZwLoadDriver failed to create driver L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\wineusb": c0000142
003c:fixme:service:scmdatabase_autostart_services Auto-start service L"wineusb" failed to start: 1114
009c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
009c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
009c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
009c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
00a8:fixme:keyboard:NtUserActivateKeyboardLayout Changing user locale is not supported
00d4:fixme:keyboard:NtUserActivateKeyboardLayout Changing user locale is not supported
0024:fixme:thread:get_thread_times not implemented on this platform
011c:fixme:kernelbase:AppPolicyGetThreadInitializationType FFFFFFFFFFFFFFFA, 0000000009DFFF50
0058:fixme:mountmgr:harddisk_ioctl returning zero-filled buffer for IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
0058:fixme:mountmgr:harddisk_ioctl Unsupported ioctl 74080 (device=7 access=1 func=20 method=0)
0058:fixme:mountmgr:query_property Faking StorageDeviceProperty data
0058:fixme:mountmgr:harddisk_ioctl Unsupported ioctl 2d0c10 (device=2d access=0 func=304 method=0)
0058:fixme:mountmgr:harddisk_ioctl returning zero-filled buffer for IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
0058:fixme:mountmgr:query_property Faking StorageDeviceProperty data
0058:fixme:mountmgr:harddisk_ioctl Unsupported ioctl 74080 (device=7 access=1 func=20 method=0)
0058:fixme:mountmgr:harddisk_ioctl Unsupported ioctl 2d0c10 (device=2d access=0 func=304 method=0)
0024:fixme:kernelbase:AppPolicyGetProcessTerminationMethod FFFFFFFFFFFFFFFA, 000000000041FEE0
PlaintextUSB や keyboard や HDD マウントのエラーのくだりは、コンパイルには特に問題にはならなかった模様。
生成されたログ MyEA.log
を確認すると、
Z:\Users\username\Projects\EA\MyEA.mq5 : information: compiling 'MyEA.mq5'
Z:\Users\username\Projects\EA\MyEA.mq5 : information: including Z:\Users\username\Applications\Wineskin\MT5.app\drive_c\Program Files\MT5\MQL5\Include\Arrays\ArrayObj.mqh
Z:\Users\username\Applications\Wineskin\MT5.app\drive_c\Program Files\MT5\MQL5\Include\Arrays\ArrayObj.mqh : information: including Z:\Users\username\Applications\Wineskin\MT5.app\drive_c\Program Files\MT5\MQL5\Include\Arrays\Array.mqh
Z:\Users\username\Applications\Wineskin\MT5.app\drive_c\Program Files\MT5\MQL5\Include\Arrays\Array.mqh : information: including Z:\Users\username\Applications\Wineskin\MT5.app\drive_c\Program Files\MT5\MQL5\Include\Object.mqh
Z:\Users\username\Applications\Wineskin\MT5.app\drive_c\Program Files\MT5\MQL5\Include\Object.mqh : information: including Z:\Users\username\Applications\Wineskin\MT5.app\drive_c\Program Files\MT5\MQL5\Include\StdLibErr.mqh
Z:\Users\username\Projects\EA\MyEA.mq5 : information: including Z:\Users\username\Projects\EA\MyEA\functions.mqh
Z:\Users\username\Projects\EA\MyEA.mq5 : information: including Z:\Users\username\Projects\EA\MyEA\class\myclass.mqh
(omitted)
: information: generating code
: information: generating code 50%
: information: generating code 100%
: information: code generated
Result: 0 errors, 0 warnings, 100 msec elapsed, cpu='X64 Regular'
Plaintextとなり、生成された MyEA.ex5
を MT5 で実行してみると正常に動作しました。This compiled EA works on MT5.
Notes for command
コマンドの注意点としては、
- パス区切り文字が MacOS (/)と Windows (\) で異なる
- wineskin上の実行ファイルへパスを渡す場合は
Z:\Users\username\...
のようにZ:
と\
で指定する - include はおそらく
MQL5
フォルダを渡すのだろうが、内部的にProgram Files
の 半角スペースでパスが切られてしまうので、どうがんばっても使用できず。 - log ファイルのパスは、
/log:"Z:\..."
だけでなく/log:"/Users/username/Projects/EA/MyEA.log"
のように MacOS 形式でも通りました。
このコマンドを nvim コマンドやキーマップに登録しておくと幸せになれるかも。
MetaEditorを起動しておかなくて良い、というPCリソース的・心理的なメリットが少しあるものの、エラー表示はこの log ファイルをいちいち開かないといけないのと配色されていないため見づらく、逆に不便かもしれない。
MakeFile & :make command ???
どこで読んだか、コンパイル結果やエラー箇所は quickfix に表示される、とあったが、wine 経由でできるんだろうか? あれは vim の :make コマンドと MakeFile ファイルを使用していたはず。
試しに、
- MakeFile に記述してみる –> 動作せず
- :set makeprg= に直接、先程の wine … コマンドを一行にまとめた上でセットし、:make で呼び出す –> エラー(どうがんばってもwineの引数が設定できないため)
- 先程の wine … コマンドを一旦 compile.sh に記述し、:set makeprg=./compile.sh として、:make –> 動作OK
だが、quickfix には USBやkeyboard なんちゃらのエラーの方が出てくるだけで、肝心のコンパイルエラー等は出てこない。かといって、log はごちゃついてるので、そのままでは quickfix に表示できない。
というわけで、MakeFile & :make 単体では難しそうだ。
これらを一発で実行してくれて、quickfix にエラー箇所も表示してくれる、そんな超便利な vim/nvim プラグインの登場を待つしかないか。
Making mql5-compiler plugin 作った
・・・と思ったら作れそう。あ、作れた。簡易的だけど。ChatGPTを駆使して。
下のように quickfix も表示できて、ジャンプまでできる。これは便利すぎる。
|| Result: 6 errors, 0 warnings
MyEA.mq5|109 col 1| Error 149: 'piyopiyo' - unexpected token, probably type is missing?
MyEA.mq5|111 col 1| Error 154: 'bool' - semicolon expected
MyEA.mq5|113 col 40| Error 256: 'account_login' - undeclared identifier
MyEA.mq5|114 col 4| Error 175: 'if' - expressions are not allowed on a global scope
MyEA.mq5|117 col 6| Error 175: 'else' - expressions are not allowed on a global scope
MyEA.mq5|121 col 1| Error 175: '}' - expressions are not allowed on a global scope
Plaintextそのうち github でプラグインとして公開するかも。I might publish this plugin on github.
include リスト、%の進捗を fugitive で表示できるとさらに良いな。
macOS だけじゃなく Windows にも対応しなくちゃ。
Published test plugin
プラグインのテスト版、とりあえず公開しました。
コメント