• MQL4とPython/CatBoostによるハイブリッドFX自動売買システムの構築記録

    1. MQL4の限界とハイブリッドアプローチの設計思想

    MetaTrader 4 (MT4) と MQL4言語は、自動売買システム(EA)開発において依然として強力なプラットフォームです。しかし、複雑な数値計算や統計分析、機械学習モデルの実装には言語的な制約とパフォーマンス上の課題が伴います。

    この課題を解決するため、MQL4 EAとPython製AIサーバーを連携させるハイブリッドシステムを構築することです。設計思想の核心は、各プラットフォームの長所を活かす役割分担にあります。

    • MQL4 EA: 高速な注文執行と、リアルタイムでの基本的なテクニカル指標の計算に特化。
    • Python AIサーバー: 計算負荷の高い特徴量エンジニアリング、機械学習モデルの学習と推論に特化。

    このアーキテクチャにより、伝統的なEAの取引執行能力と、現代的な機械学習の高度な分析能力の融合を目指しました。

    2. システム全体のアーキテクチャとデータフロー

    システムは、MT4クライアント上で稼働するMQL4 EAと、Dockerコンテナとして稼働するPython製AIサーバーの2つの主要コンポーネントで構成されます。両者はHTTPリクエストを介して通信します。

    %%{init:{'theme':'dark'}}%%
    graph TD
        A["MT4 Client: code_v3_00.mq4"] -- 1.Entry Signal Detected--> B{"Signal Context"}
        B -- 2.HTTP POST Request --> C["Python Server (Uvicorn/FastAPI)"]
        C -- 3.Preprocessing --> D["Feature Engineering"]
        D -- 4.Predict --> E["CatBoost Model"]
        E -- 5.Prediction Result (entry,skip) --> C
        C -- 6.HTTP Response --> A
        A -- 7.Execute Order (if entry) --> F["Broker Server"]

    このフローにより、EAは取引の最終判断をAIサーバーに委ね、よりデータ駆動型のエントリーフィルタリングを実現します。

    3. MQL4 EA側の技術的実装 (code_v3_00.mq4)

    EA側の開発では、安定したシグナル生成と、実運用に耐えうる堅牢な注文執行ロジックの実装に重点を置きました。

    • 取引ロジック
      • 基本戦略として、モメンタム指標による順張りを採用。
      • エントリーフィルターとしてATR (Average True Range) を導入し、ボラティリティが一定水準に満たない相場での無駄なエントリーを抑制。
    • リスク管理機能
      • 口座残高と許容損失率に基づきロットを自動計算する動的ロット管理
      • ボラティリティに応じて損切り幅を調整するATR連動ストップロス
      • 利益最大化のため、トレンド発生時に利益確定目標を自動解除するトレンド継続モード
    • 注文執行の堅牢化
      • 開発過程で注文エラー(ERR_INVALID_PRICE (129)ERR_OFF_QUOTES (136))が頻発したため、その対策を実装しました。
      • OrderSendの直前にRefreshRates()を呼び出し、価格情報の鮮度を保証することで、エラー129を大幅に削減。
      • ERR_OFF_QUOTES (136)を検知した場合、即座に失敗とせず、数秒待機してから注文を再試行するリトライロジックを導入。

    4. Python 機械学習パイプライン

    AIモデルの開発は、データ収集から本番モデルの生成まで、再現性のあるパイプラインとして構築しました。

    • データ収集 (code_v3_00_Logger.mq4)
      • AIフィルターを介さずに、EAの基本ロジックが生成した全エントリーシグナルとその後の損益結果をCSVとして出力する専用EAを作成。これにより、バイアスのない学習データを効率的に生成します。
    • 特徴量エンジニアリング (catboost_training.py)
      • 収集した生データに対し、Pandasを用いてテクニカル指標を計算。当初83種類の特徴量を生成しました。
      • モデル性能向上のため、単純な指標だけでなく、市場の長期記憶性を測るハースト指数を導入。15分足のトレンド/レンジ判定を目的とし、ウィンドウサイズは240本(2.5日分)に設定。これにより、ATRが捉える「値動きの大きさ」とは異なる、「値動きの性質」という新たな次元の情報をモデルに与えました。
      • SelectKBest(K best法)を用いて特徴量選択を行い、最終的に42個の最も情報量の多い特徴量に絞り込み、過学習のリスクを低減しました。
    • モデル選定と学習 (evaluate_and_tune.py)
      • モデルには、決定木ベースの勾配ブースティングであるCatBoostを採用。カテゴリカル変数の扱いに長け、ハイパーパラメータへの依存度が比較的低い点が選定理由です。
      • 評価指標にはAUC (Area Under the Curve) を採用。ハイパーパラメータ最適化にはOptunaを用い、AUCが最大化されるパラメータの探索を自動化しました。
      • 開発中、AUCが0.7の壁を超えることが課題となりました。対策として、不均衡データに対処するscale_pos_weightパラメータを最適化対象に加えるなどのチューニングを行いました。

    5. AIサーバーのデプロイ

    • APIサーバー (prediction_server.py)
      • WebフレームワークにはFastAPI、本番環境での実行には高性能なASGIサーバーであるUvicornを採用。
      • 学習済みモデルと特徴量スケーラー(StandardScaler)をjoblibファイルからロードし、EAからのリクエストに対してリアルタイムで予測を返すAPIエンドポイントを実装
    • コンテナ化 (Dockerfile)
      • Pythonの実行環境(ライブラリのバージョン等)の差異による問題をなくすため、Dockerを用いてサーバーアプリケーションをコンテナ化しました。
      • 開発上の課題として、MT4のWebRequest機能が標準でポート80/443に制限されている点がありました。これを解決するため、DockerfileとUvicornの起動設定を変更し、コンテナがポート80でリクエストを待機するように構成しました。

    6. 課題

    現在、まだ目標としているAUC 0.7~0.8という水準には達していない。
    最高で0.6346257248170175という低い水準になっている。EA自体は勝率が10年で87.3%、プロフィットファクターが1.52と高い数字を出せているが、リアルでの運用では初めて2週間でドローダウン2%まで来てしまっている。エントリー箇所を確認すると、FXでのトレンド相場とレンジ相場、ランダムウォーク相場のパターンでの違いが理解が出来ていないようでした。
    今後の課題としてハースト指数などをカテゴリパラメータに加えて検証してみます。