single.php

VSCodeの拡張機能を使わずにmq4/mp5ファイルをコンパイルする手順

FXで自動取引するプログラムを作ってみようと思い立ち、MT4のMetaEditorを使ってカスタムインディケータを編集していましたが、慣れたVisual Studio Codeでも編集とコンパイルが出来るようになったので備忘録的に投稿します。

専用の拡張機能もある

MT4で実行される「カスタムインディケータ」や「エキスパートアドバイザ」などを編集するには「MetaEditor」を使います。

高機能なエディターなんですが、普段使いで「Visual Studio Code」を使っていると使い慣れたエディターで編集したくなります。

エディターなので、編集したいファイルを開けば簡単です。

もう1つの「MetaEditor」の役割として編集したコードをプログラムとして使えるようにする「コンパイル」作業があります。

Visual Studio Codeの拡張機能には、既にコンパイルを実行できる[compilemql4]があります。

この記事では、PowerShellやJson形式のファイルを操作する必要があるので面倒な場合には拡張機能を使った方が手っ取り早いです。

MetaTraderでコンパイル

ネット上の記事を検索していくと、.mq4/.mq5 ファイルをコンパイルするには[mql.exe]を利用することになっていますが、現在はダウンロードが出来ませんでした。

で、MetaTrader5 のページで見つけた「他のIDEとの統合」に現在は[metatrader.exe]を次のよう引数付きで実行することでコンパイル可能という記載がありました。

"C:\Program Files\TradingPlatform\metaeditor64.exe" /compile:"C:\Program Files\TradingPlatform\MQL5\Scripts\myscript.mq5"

実際に使っている[metatrader.exe]をコマンドプロンプトで次のコマンドを実行してみたところ

metaeditor.exe /?

使い方を案内してくれました。

私の使っているMTのバージョンは4なので、コマンドラインで実行してヘルプが表示されれば、[mql.exe]を使わずに外部ツールからコンパイルを実行できそうです。

PowerShellからコンパイル操作

VSCodeには、PowerShellなどで編集中のファイルに操作を自動化する機能があるので[metatrader.exe]をコマンド操作できれば、コンパイル作業を追加できます。

具体的には次のような形で、PowerShellでコンパイル層ができました。

1. [ファイル|新規作成]メニューを選択します。

2. 表示された[MQL ウィザード]画面の一覧で[カスタムインディケータ]を選択して[次へ]をクリックします。

#引数を取得
Param($SourceFile)

Clear-Host
$LogFile = $SourceFile + ".log"

#ターミナルにログの内容を表示
$DisplayFileName = Split-Path $SourceFile -Leaf
Write-Host "コンパイル中...: $DisplayFileName"

#引数を受け渡してコンパイルを依頼
Start-Process -FilePath "C:\Program Files (x86)\...\metaeditor.exe" -ArgumentList "/compile:$SourceFile", "/log:$LogFile", "/inc:C:\Users\<account_name>\AppData\Roaming\MetaQuotes\Terminal\...\MQL4" -Wait

#(-waitで処理が終わってから続行)

#ログファイルの内容を取得
$Log = Get-Content -Path $LogFile | Where-Object {$_ -ne ""} | Select-Object -Skip 1

#操作内容を色分け
$WhichColor = "Red"
$Log | ForEach-Object { if ($_.Contains("0 errors, 0 warnings")) { $WhichColor="Green" } }


$Log | ForEach-Object {
    if (-Not $_.Contains("information:")) {
          Write-Host $_ -ForegroundColor $WhichColor
    }
}

#ログファイルを削除
Remove-Item $LogFile

ここまでの作業で、PowerShellでMQLファイルをコンパイルするための[.ps1]ファイルの作成できました。

[ビルド タスク]の作成

作成した[.ps1]をビルド時に実行するためのタスクを追加していきます。

具体的には次のような操作で行います。

1. ワークスペースを開いている状態で[コマンド パレット]を選択して一覧から[コマンドの表示と実行]を選択します(または[Ctrl + Shift + P])。

2. 表示されたプロンプト([>])に “tasks” を入力して表示された一覧から[タスク:タスクの構成]を選択します。

3. 表示された一覧から[テンプレートから tasks.json を生成]を選択します。

4. 表示された一覧から[Others]を選択します。

5.[ワークスペース]フォルダー内に[.vscode]フォルダーが追加されます。

6. フォルダー内の[tasks.json]を選択します。

7. [tasks.json]の内容が表示されます。

8.[`コンパイル]をクリックします。

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "compile-mql",
            "type": "shell",
            "command": "<ワークスペースの場所>\\compile-mql.ps1 ${file}",
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": false,
                "panel": "shared",
                "showReuseMessage": false
            },
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

ここまでの作業で、ビルド時にPowerShellファイルを実行する構成が出来ました。

ビルドタスクでコンパイルを実行

作成した[タスク]を[ビルド タスク]で実行します。

具体的には、次の手順で編集中のファイルのコンパイルが実行されます。

1. [ターミナル|ビルド タスクの実行]メニューを選択します。

2.[ターミナル]画面に実行内容が表示されます。

3. 編集中のファイルと同じフォルダーに、[.ex4]などのファイルが作成されていればコンパイルが成功しています。

次に、コンパイル時に警告が出るように、コードの内容を変更してみます。

Comment(TimeToString(time[0], TIME_SECONDS) + " -- " + DoubleToString(close[0]));
↓
Comment(time[0] + " -- " + close[0]);

同様に[ターミナル|ビルド タスクの実行]操作をするとターミナルに警告・エラーの結果が表示されコンパイルが中止されます。

また、ターミナルに表示された警告・エラー表示を[Ctrl]キーを押しながらクリックすると

編集中のファイルの該当部分が表示できます。

ここまでの作業で[metatrader.exe]を利用してVSCodeからコンパイルをすることが出来ました。

まとめ

今回は、外貨取引(FX)で利用できる自動売買プラットフォームの[MT4]で動作するプログラムを[Visual Studio Code]からコンパイルする手順を紹介しました。

PowerShellを実行する ps1 や tasks.json を編集する必要がありますが、拡張機能などサードパーティ製のプラグインを利用せずに、.mq4/.mq5 形式のファイルをVSCodeからコンパイル操作が可能です。

VSCodeの拡張機能を利用せずに、.mq4/.mq5 形式ファイルをコンパイルしたい人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です