English Deutsch
preview
Neuro-Structural Trading Engine (NSTE)(第I回):プロップファーム対応マルチ口座システムの構築方法

Neuro-Structural Trading Engine (NSTE)(第I回):プロップファーム対応マルチ口座システムの構築方法

MetaTrader 5トレーディングシステム |
30 0
James Johnstone Jardine
James Johnstone Jardine

はじめに

プロップファーム口座で暗号資産CFDを取引している方であれば、市場が取引開始前に一日を終わらせてしまう原因が3つあることをご存じでしょう。1つ目は、高いボラティリティを伴う1本のローソク足がATRベースのストップロスを一気に突き抜け、1日の損失上限を一気に使い切ってしまうことです。2つ目は、スクリプトが複数の口座を切り替える際に、気付かないうちに、何の警告もなく保有中のポジションを閉じてしまうことです。3つ目は、方向感のないレンジ相場で、小さな損失を何度も積み重ねて取引エッジを失ってしまうことです。本記事では、これら3つの問題を解決します。

本記事は、全19回で構成されるNeuro-Structural Trading Engineの第1回です。このシステムは、複数のプロップファーム口座でBTCUSDやETHUSDなどの暗号資産CFDを同時運用するために設計された、マルチ口座対応のアルゴリズム取引システムです。LSTMニューラルネットワーク、圧縮率を利用したマーケットレジーム判定、そして生物学から着想を得た適応型アルゴリズムを組み合わせ、統合された取引フレームワークを構築しています。

本記事は、ドローダウンルールに抵触することなく、複数のプロップファーム口座で自動売買戦略を運用するための信頼できる基盤を必要とするアルゴリズムトレーダーを対象としています。 記事を読み終える頃には、実用的なプロセスアーキテクチャ、固定ドルリスクの計算式、不利な相場を回避するためのノイズフィルター、そしてそのままコンパイルしてストラテジーテスターで検証できるエキスパートアドバイザー(EA)のスケルトンが手に入ります。

システムは、次の3つの原則を絶対条件として設計されています。

原則1:ストップロスは絶対に守る

すべての取引では、固定金額である1.00ドルのみをリスクにさらします。価格に対する割合ではありません。ATR倍率でもありません。固定されたドル金額です。ロットサイズを調整することで、ストップロスまでの距離が常にちょうど1.00ドルのリスクになるよう計算します。

計算式は以下のとおりです。

lot = MAX_LOSS_DOLLARS / (sl_distance_points * tick_value)

この方法により、ボラティリティの高い暗号資産市場でATRベースのストップロスが引き起こす500ドルを超えるような壊滅的損失を防ぐことができます。たとえば、ビットコインが数分で2,000ドル以上変動するような状況では、ATRベースのストップロスは1回の取引だけで1日の損失上限を超えてしまう可能性があります。固定ドルリスクを採用することで、市場のボラティリティに関係なく、損失はあらかじめ設定した金額を超えません。

原則2:1口座につき1スクリプト

MetaTrader 5のPython API(MetaTrader 5パッケージ)は実質的にシングルトンであり、mt5.login()を使用して口座を切り替えると、現在接続されているターミナル上のすべての保有ポジションが終了してしまいます。各プロップファーム口座は、それぞれ専用のPythonプロセスを実行し、それぞれ専用のMetaTrader 5ターミナルインスタンスへ接続します。このアーキテクチャは、苦い経験から生まれました。1つのスクリプトで複数のプロップファーム口座を管理しようとした結果、口座切り替え時に保有中のポジションが気付かないうちに決済されてしまったためです。

原則3:設定は一元化し、実行は分散する

すべての取引設定はMASTER_CONFIG.jsonに保存します。各スクリプトはconfig_loader.pyを通じて設定値を読み込みます。実行スクリプト内には、取引に関するハードコーディングされた設定値は一切存在しません。これにより、リスク設定が誤って変更されることを防止できます。6つものプロップファーム口座で実運用している状況で、誤った編集によってリスク設定が1.00ドルから10.00ドルへ変更されるような事態は避けなければなりません。


1口座につき1スクリプトのアーキテクチャ

各「BRAIN」スクリプトは、それぞれ独立したプロセスとして実行され、専用のMetaTrader 5ターミナルへ接続します。

// --- Architecture Diagram: One-Script-Per-Account ---

  +-------------------+     +-------------------+     +-------------------+
  | BRAIN_Account_A   |     | BRAIN_Account_B   |     | BRAIN_Account_C   |
  | Process 1         |     | Process 2         |     | Process 3         |
  +--------+----------+     +--------+----------+     +--------+----------+
           |                         |                         |
           v                         v                         v
  +-------------------+     +-------------------+     +-------------------+
  | MT5 Terminal 1    |     | MT5 Terminal 2    |     | MT5 Terminal 3    |
  +-------------------+     +-------------------+     +-------------------+

各BRAINスクリプトは、60秒ごとに以下の処理を実行します。

  1. MetaTrader 5ターミナルから1分足データ100本を取得します。
  2. RSI、MACD、ボリンジャーバンドなど8種類のテクニカル特徴量を計算します。
  3. 圧縮率解析によってマーケットレジームを判定します。
  4. 信頼度スコア付きのLSTM予測(BUY/SELL/HOLD)を取得します。
  5. シグナルがすべてのフィルターと信頼度閾値を満たした場合に取引を実行します。
  6. 保有ポジションを管理します(利益目標50%到達時の部分決済、ローリングストップロスなど)。
  7. 60秒待機し、同じサイクルを繰り返します。

以下の図は、システム全体のアーキテクチャを示しています。

口座ごとに1つのスクリプトを使用するアーキテクチャ

図1:  3つの独立したBRAINプロセスがそれぞれ専用のMetaTrader 5ターミナルインスタンスへ接続することで、完全なプロセス分離を実現する

このアーキテクチャは水平スケーリングに対応します。新しいプロップファーム口座を追加する場合は、新しいBRAINスクリプトと、新しいMetaTrader 5ターミナルインスタンスを1つ追加するだけです。既存のプロセスへ影響を与えることはありません。


LSTMニューラルネットワーク

予測エンジンの中核には、積み重ね構造のLSTM(長短期記憶)アーキテクチャを採用しています。LSTMは、系列データにおける長期的な依存関係を学習するために設計されたリカレントニューラルネットワーク(RNN)の一種であり、金融市場の時系列予測に適しています。

アーキテクチャの仕様は以下のとおりです。

  • 入力: 8個の特徴量×30タイムステップ=1回の予測あたり240入力
  • LSTMレイヤー1: 128個の隠れユニット、活性化関数はtanh
  • LSTMレイヤー2: 128個の隠れユニット、活性化関数はtanh
  • Dropout: 過学習を防ぐため、レイヤー間に40%のDropoutを適用
  • 出力: Softmax確率分布による3クラス(BUY、SELL、HOLD)

モデルは、ウォークフォワード法を用いてオフラインで学習され、.pthファイル(PyTorch形式)として出力されます。ライブ取引時の推論はCPU上で実行されます。これは、DirectML (AMD GPU)がLSTMのバックワードパスをカーネルレベルでサポートしていないためです。CPUによるフォワードパス推論は、1回あたり10ms未満で完了します。この処理速度は、60秒周期の取引ループにおいて十分以上の性能を提供します。

学習には、複数の目的をバランスよく最適化する6要素の適応度(fitness)関数を使用します。

  1. 勝率(サンプル数が少ない場合に対応するため、Beta(10,10)事前分布を用いたベイズ事後確率)
  2. プロフィットファクター(平均利益÷平均損失。1.5以上であることが条件)
  3. シャープレシオ(年率換算したリスク調整後リターン)
  4. 最大ドローダウンペナルティ(ドローダウンが制限値へ近づくにつれて指数関数的に増加)
  5. 取引回数(統計的な有意性を確保するため、最低30回の取引が必要)
  6. ウォークフォワード期間全体における一貫性スコア(特定期間への過学習を抑制)

Beta(10,10)事前分布の採用は非常に重要です。これを使用しない場合、例えば2回だけ取引を行い、その両方で勝利したモデルは100%の勝率を示してしまいます。Beta事前分布を適用することで、事後分布は50%へ引き寄せられます。そのため、勝率の推定値がベースラインから大きく乖離するためには、十分な数の観測データが必要になります。


圧縮ベースのマーケットレジーム判定

マーケットレジーム判定システムの中核となる考え方は、非常にシンプルです。

構造のあるデータは圧縮比が高くなります。ランダムなデータはほとんど圧縮されません。

価格変動にトレンドや平均回帰などの検出可能なパターンが存在する場合、圧縮アルゴリズムは繰り返し現れる特徴を見つけられるため、データはより小さなサイズへ圧縮されます。一方、価格変動がランダムノイズで構成される方向感のないレンジ相場では、利用できるパターンが存在しないため、圧縮率はほとんど向上しません。

アルゴリズムの実装は非常にシンプルです。

  1. 1分足チャートから最新100本の終値を取得します。
  2. Pythonのstruct.packを使用してバイト列へ変換します。
  3. zlibを最大圧縮レベル9で実行します。
  4. 「比率 = len(元のバイト数) / len(圧縮後のバイト数)」で圧縮率を計算します。

この圧縮率によって、現在の価格アクションにどの程度の構造性が存在するかを判断できます。

// --- Regime Classification Thresholds ---

  ratio >= 3.5  -> CLEAN regime    -> Market is structured, TRADE
  ratio >= 2.5  -> VOLATILE regime -> Moderate structure, HOLD
  ratio <  2.5  -> CHOPPY regime   -> Random noise, HOLD

3つのレジームと、それぞれの取引への影響を以下に示します。

圧縮ベースのレジーム検出

図2:圧縮ベースのマーケットレジーム判定。圧縮率の閾値によって分類される3つのレジーム(CLEAN、VOLATILE、CHOPPY)。取引を許可するのはCLEANレジームのみ

取引を実行するのは、CLEANレジームのときだけです。この単一のフィルタだけでも、レンジ相場で発生する多くの負け取引を排除できます。バックテストでは、圧縮フィルタを追加するだけで、すべてのレジームで取引した場合と比較して、システムの勝率がおよそ12ポイント向上しました。

このアプローチの最大の利点は、完全にモデル非依存であることです。インジケータやチャートパターン、あるいは特定の相場理論に依存しません。現在の価格データにトレード可能な構造が含まれているかどうかだけを測定し、その構造がどのような形であっても客観的に判断します。


固定ドルリスク管理

リスク管理システムは、1回の取引で1.00ドルを超える損失は決して許容しないという唯一の不変ルールを中心に設計されています。その他のすべての管理ロジックは、この制約を前提として構築されています。

1取引あたりのリスクパラメータ

  • 最大損失:1取引あたり1.00ドル(絶対上限)
  • 初期SL:0.60ドル(初期ストップロス幅)
  • ローリングSL:価格が有利な方向へ進むにつれて、ストップ距離を1.5倍ずつ縮小
  • 最終的なSL距離の上限:1.00ドル(ローリング調整後でも)
  • TP=SL距離の3倍(リスクリワード比1:3)

以下は、2段階利益確定メカニズムの動作を示しています。

2段階利益確定

図3:2段階利益確定。TP距離の50%に到達するとポジションの半分を決済し、ストップロスを建値へ移動する。残り半分はリスクゼロの状態で最終TPまで利益を追求する

動的テイクプロフィットシステム: 価格がTP距離の50%に到達すると、システムはポジションの半分を決済します。部分決済後、ストップロスは建値(エントリー価格)へ移動します。その結果、決済済みポジションから利益を確保すると同時に、残り半分は下方向のリスクを完全に排除した「フリーランナー」となり、さらなる利益を追求できます。この仕組みによって、すべての勝ち取引は2段階で利益を確保するプロセスへ変換されます。

プロップファームの安全制限

  • 1日の損失上限:口座残高の5%
  • 最大ドローダウン:エクイティ最高値から10%
  • 利益目標:口座残高の10%

これらの制限のいずれかに安全マージン内まで近づくと、BRAINはその口座での取引を完全に停止します。これにより、プロップファームのルールに違反することを防ぎ、口座失格や資金提供枠の喪失を回避できます。


特徴量エンジニアリングパイプライン

LSTMは、1分足のOHLCVデータから計算される8種類の特徴量を入力として受け取ります。それぞれの特徴量は、市場のマイクロストラクチャーにおける異なる側面を捉えるために選択されています。

特徴量 計算 目的
RSI(14) 相対力指数(14期間) 買われすぎ・売られすぎの検出
MACD EMA(12) - EMA(26) トレンド方向とモメンタムの把握
MACD Signal MACDラインのEMA(9) トレンド変化の確認
BB Upper SMA(20) + 2*標準偏差 ボラティリティの上限
BB Lower SMA(20) - 2*標準偏差 ボラティリティの下限
Momentum(10) Close - Close[10] 生の価格モメンタム
ROC(10) (Close-Close[10])/Close[10] 変化率
ATR(14) ATR、14期間 現在のボラティリティ測定

正規化には、Global Z-scoreを使用します。各特徴量からデータセット全体の平均値を減算し、その後、標準偏差で除算します。これにより、すべての特徴量が銘柄に依存しないスケールで扱えるようになります。正規化を行わない場合、数百ドル単位になることもあるBTCUSDのATR値が、0〜100の範囲で推移するRSIなどの特徴量よりも大きな影響を持ってしまいます。


MQL5での実装

MQL5側は取引の実行を担当します。一方、Python側はLSTMによる推論、マーケットレジーム判定、シグナル生成などのインテリジェンス部分を担当します。両者の通信は、Pythonが出力するJSONシグナルファイルを、チャート上で動作するMQL5のEAが読み込むことで実現します。

以下では、EAの主要な実装内容について説明します。完全なソースコードは本記事に添付してあり、ダウンロードできます。

入力パラメータとリスク設定

EAは、MASTER_CONFIG.jsonの設定内容に対応した入力パラメータから開始します。これにより、トレーダーはMetaTrader 5のインターフェース上から、リスク管理パラメータを直接調整できます。

input group "=== Core Risk Settings ==="
input double InpMaxLossDollars    = 1.00;  // Max Loss per Trade ($)
input double InpInitialSL         = 0.60;  // Initial SL ($)
input double InpTpMultiplier      = 3.0;   // TP = Nx SL Distance
input double InpRollingSLMult     = 1.5;   // Rolling SL Divider
input int    InpDynamicTpPct      = 50;    // Dynamic TP Trigger (%)
input bool   InpUseDynamicTp      = true;  // Enable Dynamic TP
input bool   InpUseRollingSL      = true;  // Enable Rolling SL
input double InpConfidenceThresh  = 0.70;  // Min Confidence to Trade

input group "=== Drawdown Limits ==="
input double InpDailyDDLimit      = 4.5;   // Daily DD Limit %
input double InpMaxDDLimit        = 9.0;   // Max DD Limit %

固定ドルリスクに基づくロットサイズ計算

リスク管理の中核となる計算式は、指定されたストップロス距離に対して、ちょうど1.00ドルのリスクとなるロットサイズを算出することです。これは、システム全体の中で最も重要な関数です。

// CalculateLotSize - determines exact lot size to risk InpMaxLossDollars
// symbol        - the trading instrument (e.g. "BTCUSD")
// slDistPoints  - stop loss distance in price points
// returns       - lot size clamped to broker min/max limits
double CalculateLotSize(string symbol, double slDistPoints)
{
   // Query broker for instrument specifications at runtime
   double tickVal  = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE);
   double tickSize = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE);
   double minLot   = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
   double maxLot   = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
   double lotStep  = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);

   if(tickVal <= 0 || slDistPoints <= 0)
      return minLot;

   // (tickVal / tickSize) = dollar value per one point of price movement
   // So: slDistPoints * (tickVal / tickSize) = total dollar loss per lot
   // Dividing maxLoss by that gives the lot size for exact risk control
   //
   // Example: BTCUSD, SL = 50 points, tickVal = $0.01, tickSize = 0.01
   //   valuePerPoint = 0.01 / 0.01 = $1.00 per point per lot
   //   dollarRisk    = 50 * 1.00 = $50.00 per lot
   //   lot           = 1.00 / 50.00 = 0.02 lots -> risks exactly $1.00
   double lot = InpMaxLossDollars
                / (slDistPoints * (tickVal / tickSize));

   // Round DOWN to nearest lot step (never round up to avoid exceeding risk)
   lot = MathFloor(lot / lotStep) * lotStep;

   // Clamp to broker min/max volume limits
   if(lot < minLot) lot = minLot;
   if(lot > maxLot) lot = maxLot;

   return lot;
}

この関数は、実行時にブローカーからティックバリューとティックサイズを取得し、あらゆる銘柄で正確なロットサイズを計算します。また、MathFloorによる切り捨て処理を行うことで、切り上げによって意図せずリスク許容額を超えてしまうことを防止します。

ドローダウン安全チェック

EAは、取引を実行する前に必ず、日次ドローダウンと最大ドローダウンの両方が、プロップファームの制限値以内であるかを確認します。

bool IsDrawdownSafe()
{
   double equity  = AccountInfoDouble(ACCOUNT_EQUITY);
   double balance = AccountInfoDouble(ACCOUNT_BALANCE);

   // Daily drawdown check
   double dailyDD = (g_dailyStartBalance - equity)
                    / g_dailyStartBalance * 100.0;
   if(dailyDD >= InpDailyDDLimit)
   {
      Print("DAILY DD LIMIT REACHED: ",
            DoubleToString(dailyDD, 2), "%");
      return false;
   }

   // Max drawdown check (from peak balance)
   if(balance > g_peakBalance)
      g_peakBalance = balance;

   double maxDD = (g_peakBalance - equity)
                  / g_peakBalance * 100.0;
   if(maxDD >= InpMaxDDLimit)
   {
      Print("MAX DD LIMIT REACHED: ",
            DoubleToString(maxDD, 2), "%");
      return false;
   }

   return true;
}

日次ドローダウンは、その日の取引開始時点の口座残高を基準として計算されます。一方、最大ドローダウンは、口座残高の過去最高値を基準として追跡されます。これらの制限のいずれかに達すると、関数はfalseを返し、各指標が再び許容範囲内に戻るまで、EAはすべての取引を停止します。

ポジション管理:部分決済とローリングストップロス

ManagePositions関数は、2段階利益確定システムを実装します。この関数は、このEAが保有するすべてのオープンポジション(マジックナンバーによって識別)を順番に処理し、動的テイクプロフィットおよびローリングストップロスのロジックを適用します。

void ManagePositions()
{
   for(int i = PositionsTotal() - 1; i >= 0; i--)
   {
      ulong ticket = PositionGetTicket(i);
      if(ticket <= 0) continue;
      if(PositionGetInteger(POSITION_MAGIC) != InpMagic)
         continue;

      double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
      double curPrice  = PositionGetDouble(POSITION_PRICE_CURRENT);
      double volume    = PositionGetDouble(POSITION_VOLUME);
      long   type      = PositionGetInteger(POSITION_TYPE);

      // Calculate profit distance from entry
      double profitDist = 0;
      if(type == POSITION_TYPE_BUY)
         profitDist = curPrice - openPrice;
      else
         profitDist = openPrice - curPrice;

      double slDist = g_tracks[idx].initialSLDist;
      double tpDist = slDist * InpTpMultiplier;

      // Stage 1: Partial close at 50% of TP distance
      if(InpUseDynamicTp && !g_tracks[idx].partialClosed)
      {
         double trigger = tpDist * InpDynamicTpPct / 100.0;
         if(profitDist >= trigger)
         {
            // --- Simplified logic (full implementation in attached EA) ---
            // 1. Close half the position via OrderSend(TRADE_ACTION_DEAL)
            // 2. Move SL to breakeven (entry price) via OrderSend(TRADE_ACTION_SLTP)
            // 3. Set partialClosed = true to prevent repeat execution
         }
      }

      // Stage 2: Rolling SL tightens as price moves favorably
      if(InpUseRollingSL && profitDist > 0)
      {
         double newSLDist = slDist / InpRollingSLMult;
         // --- Simplified logic (full implementation in attached EA) ---
         // Calculate new SL price, only modify if tighter than current SL
      }
   }
}

部分決済メカニズムは、プロップファーム取引において特に強力な機能です。テイクプロフィット目標の50%に到達した時点でポジションの半分を決済し、ストップロスを建値へ移動することで、この条件に到達したすべての勝ち取引は確定利益になります。残りの「フリーランナー」は、利益を失うリスクなしで、最終TP目標またはそれ以上の水準まで継続して利益を伸ばすことができます。


結果とパフォーマンスに関する考察

この基盤アーキテクチャは、2026年1月以降、複数のプロップファーム口座で実際に稼働しています。主なパフォーマンス特性は以下のとおりです。

  • 1取引あたりのリスク: 正確に1ドル、超過なし
  • 圧縮フィルタ: 約60〜70%の潜在的な取引を排除し、構造化された市場環境のみに集中
  • 部分決済到達率: 約40%の勝ち取引がTP50%到達条件を満たし、部分決済を実行
  • ドローダウン規則への準拠: すべての口座でプロップファームルール違反ゼロ
  • アーキテクチャの拡張性: 独立したプロセス分離により、6口座以上を同時運用

最も重要な指標は最後の「ルール違反ゼロ」です。プロップファーム取引では、利益性よりもまず生存することが重要です。ドローダウン制限への違反を継続的に回避できるシステムは、最終的にチャレンジを通過し、ファンディング口座を維持できます。一方で、より高い利益を生み出すシステムであっても、時折ルール違反を起こす場合、すべてを失う可能性があります。

完全なEAスケルトン

以下の最小構成のスケルトンでは、これまで説明したすべてのコンポーネントが、標準的なMetaTrader 5 EAライフサイクル内でどのように接続されるかを示します。完全な取引実行ロジックを含む実装は、添付された.mq5ファイルで提供されています。

//+------------------------------------------------------------------+
//| Article_01_EA.mq5                                                |
//| Neuro-Structural Trading Engine - Foundation                     |
//+------------------------------------------------------------------+
#property copyright "QuantumChildren Trading Systems"
#property version   "1.00"

input double InpMaxLossDollars = 1.00;  // Max Loss per Trade ($)
input double InpInitialSL      = 0.60;  // Initial SL ($)
input double InpTpMultiplier   = 3.0;   // TP = Nx SL Distance
input double InpDailyDDLimit   = 4.5;   // Daily DD Limit %
input double InpMaxDDLimit     = 9.0;   // Max DD Limit %
input int    InpMagic          = 212001;// Magic Number

double g_dailyStartBalance, g_peakBalance;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   g_dailyStartBalance = AccountInfoDouble(ACCOUNT_BALANCE);
   g_peakBalance = g_dailyStartBalance;
   Print("Foundation EA initialized. Balance: $",
         DoubleToString(g_dailyStartBalance, 2));
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert tick function - main trading loop                         |
//+------------------------------------------------------------------+
void OnTick()
{
   // Step 1: Safety check - are we within prop firm drawdown limits?
   if(!IsDrawdownSafe())
      return;

   // Step 2: Manage existing positions (partial close + rolling SL)
   ManagePositions();

   // Step 3: Generate or read trading signal
   //         (signal generation via indicators shown in attached EA)

   // Step 4: Calculate lot size for fixed dollar risk
   //         double lots = CalculateLotSize(_Symbol, slDistance);

   // Step 5: Execute trade if signal passes all validation
   //         (full execution logic in attached EA)
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Print("Foundation EA stopped. Reason: ", reason);
}

ストラテジーテスターでのテスト

添付されたEAをMetaTrader 5のストラテジーテスターでテストする手順は以下のとおりです。

  1. MetaEditorを開き(F4)、添付されたArticle_01_EA.mq5ファイルをコンパイルします(F7)。
  2. MetaTrader 5でストラテジーテスターパネルを開きます(Ctrl+R)。
  3. EAのドロップダウンメニューから、コンパイル済みのEAを選択します。
  4. 銘柄をBTCUSD、時間足をM1(1分足)に設定します。
  5. テストモデルを「リアルティックに基づいた全てのティック」に設定し、最大精度で実行します。
  6. テスト期間は、直近データを使用して最低1か月以上に設定します。
  7. 初期入金額は、使用するプロップファーム口座サイズに合わせて設定します(例:10万ドル)。
  8. [開始]をクリックしてバックテストを開始します。

実行前に、[設定]タブで以下の主要パラメータを確認してください。

パラメータ デフォルト 説明
InpMaxLossDollars 1.00 1取引あたりの最大ドルリスク
InpInitialSL 0.60 初期ストップロス距離(ドル)
InpTpMultiplier 3.0 SL距離に対するTP倍率
InpDailyDDLimit 4.5 日次ドローダウン停止閾値(%)
InpMaxDDLimit 9.0 最大ドローダウン停止閾値(%)

テスト完了後は、[結果]、[グラフ]、[レポート]タブを確認してください。エクイティカーブは、1取引あたり1.00ドルの固定リスク設定と整合した、制御されたドローダウンを示す必要があります。

テストレポート

図4:ストラテジーテスターレポート。BTCUSD M1でのバックテスト結果。取引統計、プロフィットファクター、ドローダウン指標を示す。

エクイティカーブ

図5:エクイティカーブ。バックテスト期間中の残高ラインとエクイティライン。1取引あたり1.00ドル固定リスクに基づいた、制御されたドローダウンを確認できる

使用方法
  1. 添付された.mq5ファイルをMetaEditorで開き、F7を押してコンパイルします。
  2. MetaTrader 5でナビゲーターを開き(Ctrl+N)、「Expert Advisors」内からEAを探し、BTCUSDまたはXAUUSDのM1チャートへドラッグします。
  3. EAプロパティ画面で、入力パラメータを自身の口座リスクルールに合わせて設定します。最低限、InpMaxLossDollars、InpDailyDDLimit、InpMaxDDLimitを確認してください。
  4. MetaTrader 5上部ツールバーの[アルゴリズム取引]ボタンをクリックし、アルゴリズム取引を有効化します。
  5. 別ターミナル上でPythonシグナルエンジンを起動し、EAがシグナルファイルを読み取れる状態にします。
  6. MetaTrader 5下部の[エキスパート]タブを監視し、取引実行ログおよびシグナル状態メッセージを確認します。

推奨時間足:M1(1分)。EAはPythonバックエンドによって60秒間隔で生成されるシグナルを読み取って動作します。



この記事で得られるもの

この記事を読むことで、すぐに利用可能な以下の具体的な成果物を手に入れることができます。

  1. プロセスアーキテクチャ図:プロップファーム口座ごとに専用のPythonスクリプトと専用のMetaTrader 5ターミナルを1つずつ割り当て、それぞれの間に共有状態を持たせない構成。
  2. 固定ドルロットサイズ計算関数(CalculateLotSize):任意のEAへ組み込むことで、銘柄のボラティリティに関係なく、1回の取引で指定したドル金額以上の損失が発生しないことを保証するロット計算機能。
  3. 圧縮ベースのレジームフィルタ:現在の市場に利用可能な構造が存在するかを測定する3行のロジック。これにより、レンジ相場で発生する負け取引の60〜70%を排除します。
  4. ドローダウン安全チェック (IsDrawdownSafe):すべての売買判断の前にこのチェックを実行し、プロップファームの日次ドローダウン制限および最大ドローダウン制限を超過しないことを必ず確認します。
  5. 2段階利益確定システム: 利益目標(TP)の50%到達時にポジションの一部を決済し、その後はローリング・ストップロスを適用します。これにより、利益を確定したうえで、残りのポジションをリスクフリーで伸ばすことができます。
  6. 完全なEAスケルトン:添付の.mq5ファイルをMetaEditorでコンパイルし、チャートへ適用すれば、すぐにストラテジーテスターで検証を開始できます。

以下は、影響を十分に理解せずに変更してはいけない5つのパラメータです。

  • InpMaxLossDollars:この値を大きくすると、1回の取引で許容される最大損失額が増加します。
  • InpDailyDDLimit:この値をプロップファームが定める実際の日次ドローダウン制限より大きく設定すると、口座が失格となる可能性があります。
  • InpMaxDDLimit:最大ドローダウン制限についても同様です。実際の制限値を超えて設定すると、口座が失格となる可能性があります。
  • InpTpMultiplier:2.0未満に設定すると、収益性を支えるリスクリワード比が損なわれます。
  • InpDynamicTpPct:この値を高く設定しすぎると、一部決済がほとんど実行されなくなり、「利益を確保する仕組み」が十分に機能しなくなります。

ストラテジーテスターでのテストにおける成功基準: バックテストでは、1回の取引で発生する損失額がInpMaxLossDollarsを超えないこと、日次ドローダウンがInpDailyDDLimitを一度も超過しないこと、そしてエクイティカーブが急激な垂直下落ではなく、管理された浅いドローダウンを示していることを確認できるはずです。


結論

本記事で構築した基盤は、本連載の以降の記事で発展させるための5つの中核機能で構成されています。

  1. 市場のボラティリティにかかわらず壊滅的な損失を防ぐ固定ドルリスク管理
  2. 圧縮率による明確な相場レジーム判定により、レンジ相場など収益性の低い局面を回避
  3. 信頼度スコア付きの方向性予測を行うLSTMニューラルネットワーク
  4. 一部決済とローリングストップロスを組み合わせた二段階の利益確定機構
  5. あらゆる売買判断に組み込まれたプロップファーム向けドローダウン保護機能

本システムは、6口座以上のプロップファーム口座で同時に稼働することを前提として設計されており、各口座は専用プロセスと独立したMetaTrader 5ターミナル上で動作します。また、すべての口座は集中管理された設定を共有するため、実行スクリプトへリスクパラメータをハードコーディングする必要はありません。

次回の記事では、シグナル生成と注文執行の間に配置される6段階の量子フィルタ「Jardine's Gate」を紹介します。このフィルタでは、売買シグナルが6つの独立した検証ゲートをすべて通過した場合にのみ発注が許可されるため、取引品質が大幅に向上しました。

本記事で解説したすべての機能を実装した完全なEAのソースコードを添付しています。MetaEditor 5でそのままコンパイルでき、任意のチャートへ適用してストラテジーテスターで検証できます。


MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/21372

添付されたファイル |
Article_01_EA.mq5 (9.35 KB)
ラリー・ウィリアムズの『市場の秘密』(第12回):相場環境に基づくスマッシュデー反転トレード ラリー・ウィリアムズの『市場の秘密』(第12回):相場環境に基づくスマッシュデー反転トレード
体系化されたコンテキストの中で、ラリー・ウィリアムズのスマッシュデー反転パターンをMQL5で自動化する方法を解説します。限定された有効期間内でセットアップを検証し、Supertrendを用いた曜日フィルタを備え、エントリーはレベル突破時またはバー確定時のいずれにも対応するエキスパートアドバイザー(EA)を実装します。エントリー方式としては、レベル突破時の即時エントリー、またはローソク足確定後のエントリーに対応しています。また、同時保有ポジション数を1つに制限し、リスクベースまたは固定ロットによるポジションサイジングをサポートします。さらに、段階的な開発手順、バックテスト方法、再現可能な設定も併せて提示します。
MQL5でのスイング極値とプルバック(第1回):マルチタイムフレームインジケータの開発 MQL5でのスイング極値とプルバック(第1回):マルチタイムフレームインジケータの開発
Swing Extremes and Pullbacksインジケータを自動化します。このインジケータは、下位足(LTF)生の値動きを、市場の意図を構造化して示すマップへと変換します。リアルタイムでスイングハイ・スイングロー・調整フェーズを正確に検出し、マイクロストラクチャーの変化をプログラムによって追跡することで、完全な反転が形成される前に潜在的な転換ポイントを予測します。これにより、市場ノイズを実用的なシグナルへ変換し、より精度の高い意思決定を可能にします。
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
初心者からエキスパートへ:イントラデイ戦略の自動化 初心者からエキスパートへ:イントラデイ戦略の自動化
EMA-50リテストの考え方を、日中取引向けの動作ベースのエキスパートアドバイザー(EA)へ変換します。この研究では、トレンドバイアス、EMAとの相互作用(EMAを貫き、所定の側で引ける動き)、反応の確認、オプションのフィルタを体系化し、それらをモジュール化された関数と安全なリソース管理を意識したハンドル運用を使用してMQL5で実装します。ストラテジーテスターでのビジュアルテストにより、シグナルの正確性を確認します。その結果、裁量判断による反発手法をコード化するための明確なテンプレートが完成します。