MetaTrader 5のStrategy Testerで手動操作するための外部パネルを作った話
BackTestPanel は、MetaTrader 5 を使った自分の検証フローの中で感じていた、かなり具体的な不便さから生まれました。テストモード中に手動で売買を試したいのに、Strategy Tester には自分が必要としていたようなネイティブの手動売買フローがなく、テスト環境の中でリアルタイムに操作レイヤーを作るのも簡単ではありませんでした。
やりたかったこと自体はシンプルです。テストを走らせながら、買い、売り、個別決済、全決済を専用パネルから柔軟に試したかった。それなら MetaTrader 5 の外側で動くデスクトップパネルを作り、テスト環境とつなげればいいと考えました。

なぜ作ったのか
このプロジェクトは、プロダクトアイデアというより、自分の作業を楽にするための実用ツールとして始まりました。
インジケーターの挙動やエントリー、エグジットを検証するとき、最初から全部を自動売買に落とし込むとは限りません。まずは手動で仮説を試し、チャートの流れに合わせて判断し、どういう場面で戦略が機能するのかを観察したいことがあります。
ただ、MetaTrader 5 の Strategy Tester にはそのための制約があります。MQL5 の公式ドキュメントでは、visual mode であっても OnChartEvent 用の対話的な chart・mouse・keyboard event は生成されず、WebRequest() や socket などの標準ネットワーク機能も tester 内では実行されないと説明されています。だから最初から、その制約を前提にした構成にする必要がありました。
どういう構成にしたか
BackTestPanel は大きく 2 つのパーツに分かれています。
1 つ目は、Python と pywebview で作った Windows 向けデスクトップアプリです。フロントエンドは React で作っていて、127.0.0.1:47001 でローカル TCP サーバーを立ち上げ、現在のポジションを表示しながら売買コマンドを送ります。
2 つ目は、Strategy Tester 内で動く MQL5 の Expert Advisor、BridgeTcpClient です。この EA がローカルサーバーへ接続し、オープン中のポジション情報を送信しながら、buy、sell、close_position、close_all のようなテキストコマンドを受け取って実行します。
この分離によって、シミュレーションそのものは MetaTrader 5 に任せつつ、操作レイヤーだけを外に出すことができました。結果として、テスト中の手動操作がかなりやりやすくなりました。

今のパネルでできること
UI はできるだけ迷わない形にしたかったので、かなり直線的な構成にしています。
ロットのプリセットを持つ売買ブロック、BUY/SELL ボタン、現在のポジション一覧、個別決済、全決済をひとつのパネルにまとめました。長時間開きっぱなしになることも想定して、ライトテーマとダークテーマの切り替えも入れています。
フロントエンドは React、TypeScript、TanStack Query を使っています。デスクトップ側の Python とは pywebview の API bridge を通してつながっていて、ポジション情報は短い間隔で更新されます。コマンド送信に成功したときは、その直後に一覧を更新するようにしています。
デスクトップアプリの形を取りながら、中身の UI はモダンな Web 技術で組めるので、この構成はかなり扱いやすいと感じました。
実装で一番気を使ったところ
やはり一番難しかったのは、Strategy Tester との橋渡し部分です。
この環境では MQL5 の標準ネットワーク機能が使えないため、bridge 側では TCPClient.mqh を通して Windows の Winsock ライブラリ ws2_32.dll を使っています。これによって socket の作成、接続、送受信が可能になります。
そのため、テスト時には Allow DLL imports を有効にする必要があります。さらに重要なのは、この構成がローカル tester agent 向けだという点です。remote agent では DLL 呼び出しがセキュリティ上ブロックされます。これは小さな設定の話ではなく、構成上の前提なので、README と記事の両方で明確に触れておきたい部分でした。
作ってみて学んだこと
このプロジェクトを通して改めて感じたのは、トレードツールでは売買ロジックそのものより、その周辺環境のほうが難しいことがあるという点です。
プラットフォーム側に制限があると、課題は単に「UI を作る」「buy コマンドを送る」では終わりません。統合方法、通信プロトコル、アプリのライフサイクル、UI のフィードバック、OS レベルの制約まで考える必要があります。
Python でデスクトップ側を組み、React で UI を作り、MQL5 で tester 内の実行を担当し、TCP でそれぞれをつなぐ。この組み合わせは、別々の世界にある技術をひとつの目的のためにまとめる面白さがありました。
このプロジェクトが自分にとって意味があった理由
BackTestPanel は、シミュレーション中の手動操作を、もっと扱いやすく、もっと自分の検証フローに合わせて進めたいという実用的な課題を解決してくれました。
それと同時に、MetaTrader 5 の中だけで全部を完結させようとするのではなく、周辺に補助ツールを作る発想のほうが有効な場面もあると気づかせてくれました。プラットフォームの制限と正面から戦うより、外側に柔軟なレイヤーを作るほうがうまくいくこともあります。
プロジェクトのコード
プロジェクトは GitHub で公開しています: