恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

VimでMQL5をコンパイルする

参考にした記事

この記事では、下記リンクの記事に記載されているPowerShellスクリプトを使わせていただいています。

How to Code & Compile MQL5 in Visual Studio - A Complete Guide - Other - 13 July 2018 - Traders' Blogs


この記事を書いた理由

基本的には上記「参考にした記事」の通りにやればコンパイルはできるのですが、私なりに「こうしたい」と思う部分もありました。
そこで少しだけ変更したのですが、PoweShellを知らない上、Vimの関数を書いたことがなかったので、軽微な作業の割に少し時間がかかりました。

そういった過去を思い出したので、記事として残しておくことにしました。

手順1:PoweShellスクリプトを用意

MetaEditorの実行ファイルを呼び出して「.mq5」ファイルをコンパイルするためのファイルを用意します。 コードは以下のとおりです。これを「Compile-mql5.ps1」というファイル名で保存します。

# 参考にした記事
#    https://www.mql5.com/en/blogs/post/719548
#    上記の記事に掲載されているコードを一部変更して使わせていただいています。


# gets the File To Compile as an external parameter... Defaults to a Test file...
# 次の行において環境に応じて変わる部分は「〇〇〇」となっています。
Param( $FileToCompile = "C:\Users\〇〇〇\AppData\Roaming\MetaQuotes\Terminal\〇〇〇\MQL5\Experts\Test.mq5")

# cleans the terminal screen and sets the log file name...
Clear-Host
$LogFile = $FileToCompile + ".log"

# before continue check if the Compile File has any spaces in it...
if ($FileToCompile.Contains(" ")) {
    "";"";
    Write-Host "ERROR!  Impossible to Compile! Your Filename or Path contains SPACES!" -ForegroundColor Red;
    "";
    Write-Host $FileToCompile -ForegroundColor Red;
    "";"";
    return;
}

# 【備考1】元のコードでは、ここにMT5を終了させるためのコードがありました。

#fires up the Metaeditor compiler...
# 次の行において環境に応じて変わる部分は「〇〇〇」となっています。
& "C:\Program Files\〇〇〇\metaeditor64.exe" /compile:"$FileToCompile" /log:"$LogFile" /inc:"C:\Users\〇〇〇\AppData\Roaming\MetaQuotes\Terminal\〇〇〇\MQL5" | Out-Null

#get some clean real state and tells the user what is being compiled (just the file name, no path)...
""

#【前行について】
# 元のコードではコンソール出力時に5行の空行を入れていました
# "";"";"";"";""    ← 元のコード
# しかし、1行の空行で良いと感じたので、"" だけにしました

$JustTheFileName = Split-Path $FileToCompile -Leaf
Write-Host "Compiling (as MQL5).....: $JustTheFileName"
""

#reads the log file. Eliminates the blank lines. Skip the first line because it is useless.
$Log = Get-Content -Path $LogFile | Where-Object {$_ -ne ""} | Select-Object -Skip 1

#Green color for successful Compilation. Otherwise (error/warning), Red!
$WhichColor = "Red"
$Log | ForEach-Object { if ($_.Contains("0 errors, 0 warnings")) { $WhichColor="Green" } }

#runs through all the log lines...
$Log | ForEach-Object {
     #ignores the ": information: error generating code" line when ME was successful
     if (-Not $_.Contains("information:")) {
           #common log line... just print it...
           Write-Host $_ -ForegroundColor $WhichColor
     }
}

# 【備考2】元のコードでは、ここにMT5を起動させるためのコードがありました。

# 以下の行は元のコードにありませんでしたが、logファイルを削除するために追加しました。
# (logファイルを残しておきたい場合、以下の行を記述する必要はありません。)
Remove-Item -Path $LogFile

上記コードでは削除してありますが(「備考 1」と「備考 2」という箇所)、元々これらの箇所には、MT5を終了するコードと起動するコードが書かれていました。

MT5を終了するコード

# first of all, kill MT Terminal (if running)... otherwise it will not see the new compiled version of the code...
Get-Process -Name terminal64 -ErrorAction SilentlyContinue | Where-Object {$_.Id -gt 0} | Stop-Process

MT5を起動するコード

# get the MT Terminal back if all went well...
if ( $WhichColor -eq "Green") { & "C:\Program Files\〇〇〇\terminal64.exe" }


私の想像ですが、MT5を終了しコンパイル後に再起動する目的は、コンパイル後の実行ファイル(インディケーター等)をチャートに反映させることだと思います。

MetaEditorを使ってファイルをコンパイルすると、コンパイル後の実行ファイルをチャートに反映させてくれます(恐らくMetaEditorからMT5にシグナルを送っているのだと思います)。しかし、上記コードではそれができません。そこで、MT5を終了し、コンパイル後に再起動することで同じ目的を達成しようとしているのだと思います。

それはそれで便利なのですが、私は再起動に時間がかかることが嫌でした。そこで、ファイルをチャートから手動で削除して、再びチャートに追加しています。勿論これも手間ですから、良い方法ではありません。ただ、「MT5を再起動する」と「ファイルをチャートに入れ直す」をどちらも試してみた結果、こちらの方が私にとって違和感が少なかったというだけのことです。


手順2:Vimの設定ファイルを修正

Vimの設定ファイル(_vimrc)に、PowerShell上で「Compile-mql5.ps1」を実行する関数を記述します。

以下の関数は、ユーザー「neko」の「ドキュメント」フォルダの中に「vim」フォルダがあり、そこに「Compile-mql5.ps1」を置いてあるという想定です。Vimの関数について知識が無いので、ネットを見つつ「こんな感じかしら?」と書いています。どこか間違っていたら教えてください。)

function CompileMQL()
    setlocal shell=\"C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe\"
                   \ shellcmdflag=-c
                   \ shellquote=\"
                   \ shellxquote=
    if expand("%:e") == "mq5"
        w
        bo terminal ++rows=12
                  \ ++shell C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe
                  \ -ExecutionPolicy RemoteSigned
                  \ -File C:\Users\neko\Documents\vim\Compile-mql5.ps1 %
    else
        echo "This file is not mq5."
    endif
endfunction

内容は単純で、ファイルの拡張子がmq5ならコンパイルを実行し、そうでない場合は「This file is not mq5.」と表示します。

7行目にある

w

は無くても良いのですが、ファイルを編集した後、上書き保存を忘れてしまうことが時々あるので、念のため記述してあります。

コンパイルする

コンパイルするには、コンパイルしたい「.mq5」ファイルをVimで開いている状態でCompileMQL関数を実行します。

:call CompileMQL()


ただ、これも少し手間なので、Vimの設定ファイルに次の記述をして、普段余り使うことのない「F9」キーに割り当てています。

nnoremap <F9> :call CompileMQL()<CR>


コンパイルを実行すると、Vimの下部にウィンドウが開いて結果を表示します。

コンパイル時にエラー等が無ければ、次のように表示されます。
ちなみに、「Result」の「R」に付いている枠は、vimのカーソルです。

何らかのエラー等がある場合は、エラー等の内容が赤字で表示されます。