FXで自動取引するプログラムを作ってみようと思い立ち、MT4で利用するmq4/mq5形式のファイルをVisual Studio Codeでコンパイルする手順を改良したので備忘録的に投稿します。
以前までの作成手順は、別記事をご覧ください。
拡張子でコンパイル有無を判定
VSCodeのビルドタスク機能で、PowerShellスクリプトを実行する形でコンパイルを実現しているので、エディターでアクティブなタブが対象のファイルになります。
そのため、拡張子で判定してコンパイルできるファイルを限定します。
コードの冒頭部分に拡張子を確認して処理の可否を判断する部分を追加しました。
Param($srcFile)
$fileName = Split-Path $srcFile -Leaf
$ext_ = [System.IO.Path]::GetExtension($srcFile);
if ($ext_ -ne ".mq4" -and $ext_ -ne ".mq5") {
Write-Host "コンパイルできない拡張子です: $fileName"
return
}
例えば、PowerShellスクリプトのファイルに対してビルドタスク機能を実行すると、次のようなメッセージがターミナルに表示されます。
無用なコンパイル作業を減らすことができました。
コンパイル結果でテキスト文字色を変更
コンパイル時の警告とエラーの数を取得して、ターミナルに表示する文字色を変更します。
コードの後半部分にエラーと警告の数をログから取得する変更を加えます。
#ログファイルの最後の行を取得
$status_ = Get-Content -Tail 1 $logFile
#スペースで文字列を分割
$arrStatus = $status_ -Split(" ")
#エラーの数を取得
$errCount = [int]$arrStatus[1]
#警告の数を取得
$warCount = [int]$arrStatus[3]
#エラーと警告の数に応じてテキスト色を変更
$textColor = "Red"
$log_ | ForEach-Object { if ($errCount -eq 0 -and $warCount -eq 0) { $textColor="Green" } }
$log_ | ForEach-Object { if ($errCount -eq 0 -and $warCount -gt 0) { $textColor="Yellow" } }
$log_ | ForEach-Object {
if (-Not $_.Contains("information:")) {
Write-Host $_ -ForegroundColor $textColor
}
エラーと警告の数が共に0の場合は緑。
警告のみの数が1以上の場合は黄色。
エラーと警告が1以上の場合は赤色で表示されます。
テキストの色で、コンパイルの結果が簡単に見分けられるようになりました。
デバッグ実行のためにMetaEditorを起動
ビルドタスクを利用してVSCodeでコンパイル作業は可能になりましたがには、デバッグ作業などMetaTraderで実行させるには、MetaEditorを起動する必要があります。
そのため、コンパイル結果がエラーなしの場合に、PowerShellからMetaTraderを起動する部分を追加しました。
if ( $textColor -eq "Green") { & "C:\Program Files (x86)\Rakuten MetaTrader 4\metaeditor.exe" }
ここまでの作業で、VSCodeからコンパイルして成功した場合は、MetaTraderを起動する自動化作業が可能です。
修整したPowerShellスクリプトの全体は、こんな感じになります。
Param($srcFile)
$fileName = Split-Path $srcFile -Leaf
$ext_ = [System.IO.Path]::GetExtension($srcFile);
if ($ext_ -ne ".mq4" -and $ext_ -ne ".mq5") {
Write-Host "コンパイルできない拡張子です: $fileName"
return
}
Clear-Host
$logFile = $srcFile + ".log"
Write-Host "コンパイル中...: $fileName"
Start-Process -FilePath "C:\Program Files (x86)\Rakuten MetaTrader 4\metaeditor.exe" -ArgumentList "/compile:$srcFile", "/log:$logFile", "/inc:C:\Users\t_nak\AppData\Roaming\MetaQuotes\Terminal\A84B568DA10F82FE5A8FF6A859153D6F\MQL4" -Wait
$log_ = Get-Content -Path $logFile | Where-Object {$_ -ne ""} | Select-Object -Skip 1
$status_ = Get-Content -Tail 1 $logFile
$arrStatus = $status_ -Split(" ")
$errCount = [int]$arrStatus[1]
$warCount = [int]$arrStatus[3]
$textColor = "Red"
$log_ | ForEach-Object { if ($errCount -eq 0 -and $warCount -eq 0) { $textColor="Green" } }
$log_ | ForEach-Object { if ($errCount -eq 0 -and $warCount -gt 0) { $textColor="Yellow" } }
$log_ | ForEach-Object {
if (-Not $_.Contains("information:")) {
Write-Host $_ -ForegroundColor $textColor
}
}
if ( $textColor -eq "Green") { & "<メタトレーダーの場所>\metaeditor.exe" }
Remove-Item $logFile
まとめ
今回は、外貨取引(FX)で利用できる自動売買プラットフォームの[MT4]で動作するプログラムを[Visual Studio Code]からコンパイルする手順を紹介しました。
PowerShellを実行する ps1 や tasks.json を編集する必要がありますが、拡張機能などサードパーティ製のプラグインを利用せずに、.mq4/.mq5 形式のファイルをVSCodeからコンパイル操作が可能です。
また、コンパイル後に作成されるログファイルからエラーや警告を取得してターミナルに結果を表示したり、コンパイル後にデバッグするためのMetaEditorを起動するなどの改良を加えてみました。
VSCodeの拡張機能を利用せずに、.mq4/.mq5 形式ファイルをコンパイルしたい人の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。