English Русский 中文 Español Deutsch Português
preview
自動売買ロボット向けリスクマネージャー(第1回):EA向けリスク管理用インクルードファイル

自動売買ロボット向けリスクマネージャー(第1回):EA向けリスク管理用インクルードファイル

MetaTrader 5トレーディングシステム |
16 9
Yevgeniy Koshtenko
Yevgeniy Koshtenko

遅かれ早かれ、すべてのトレーダーは厳しい現実に直面します。トレードで成功するかどうかを決めるのは、必ずしもエントリーポイントを見つける能力ではなく、資金を守る能力なのです。統計は厳しいもので、効果的なリスク管理ができていないために、90%を超えるトレーダーが資金を失っていると言われています。今回は、MetaTrader 5向けのプロフェッショナルなリスク管理システムをどのように構築できるのかを見ていきます。このシステムによって、非常にアグレッシブな戦略であっても、比較的安全な収益獲得ツールへと変えることが可能になります。


リスク管理システムが重要な理由

まず、トレーダーが損失を出す典型的な原因について、一般的な観察やトレーダーとの仕事を通じた経験をもとに見ていきましょう。

私の経験では、口座資金を大きく失う原因のかなりの部分が、1日の許容リスクを超えてしまうことにあります。トレーダーは、最初は落ち着いてその日の取引を始めることが多いです。しかし、最初のトレードで損失が出ると、感情が入り始めます。興奮したり、損失を取り戻そうとしたりして、最終的には1日で口座資金に大きなダメージを与えてしまうことがあります。

もう一つよくある損失原因は、ドローダウンが徐々に蓄積しているにもかかわらず、適切に管理されないことです。トレーダーは、毎日少しずつ損失を出しながらも、「明日取り戻せばいい」と自分に言い聞かせることがあります。しかし、最終的には口座残高が少しずつ、確実にゼロへ近づいてしまいます。

また、多くのトレーダーは心理的な問題にも直面します。リスク管理のルールを知っていて、ストップロスやポジションサイズの重要性も理解しているにもかかわらず、実際にトレードを行う場面では、その知識を必ずしも実践できないのです。

もちろん、通信障害や、ブローカー/プラットフォーム側の不具合など、技術的な問題によって損失が発生することもあります。しかし、全体として見ると、こうした問題が損失原因に占める割合は比較的小さいと考えられます。

経験上、十分に考えられたリスク管理システムを持たないトレーディング口座は、短期間で運用が終わってしまう傾向があります。

ほとんどすべての初心者トレーダーが陥る、典型的な心理的トラップが3つあります。最初のトラップは、利益が続いた後の高揚感です。市場で何度か連続して利益を上げると、「自分は市場を理解した」「市場の秘密を解き明かした」という感覚に陥ることがあります。心の中で、「今は利益が出ている。もっとリスクを取っても大丈夫だ」と考え始め、ロットを増やしたり、ストップロスを無視したり、同時に保有するポジション数を増やしたりします。その結果は予測できます。数週間かけて積み上げた利益を、わずか1日で失ってしまうことがあります。

2つ目のトラップは、相場が反転することを期待してポジションを持ち続けることです。ポジションの含み損がさらに拡大し、画面上の赤い数字がどんどん大きくなっていきます。それでもトレーダーはポジションを手放しません。「もうすぐ反転する」「これは単なる調整だ」「市場は永遠に下落し続けることはない」。何千人ものトレーダーが、このような言葉を自分に言い聞かせます。そして最終的に、マージンコールによってトレードを続けられなくなることがあります。

3つ目の、そして最も危険なトラップは、自分自身のルールを無視することです。トレーダーは、自分のトレードシステムを作り、明確なエントリー・決済ルールを設定し、リスク上限も決めます。しかし、ある時点で、「一度くらいルールを破っても大丈夫だろう」という考えが浮かびます。そして、ストップロスを解除したり、最大ロット数を超えたり、トレンドに逆らったポジションを取ったりするようになります。これは避けがたい破綻への道です。トレーダー自身も、そのことを十分に理解しているにもかかわらず、自分を止められなくなってしまうことがあります。


技術的な解決策:Enhanced Risk Manager

こうした問題を長年観察してきた経験から、私はMetaTrader 5向けの汎用的なリスク管理システムを作成することにしました。基本的な考え方は、リスク管理を可能な限り自動化し、人間の感情や判断による影響を排除することです。このシステムはインクルードファイルとして実装されているため、既存のトレード戦略に大幅なコード変更を加えることなく、簡単に組み込むことができます。

システムのアーキテクチャは、モジュール性と拡張性を重視して設計されています。それぞれのコンポーネントが担当する管理領域を持ちながら、すべてのモジュールは相互に密接に統合されています。EnhancedRiskManager.mqh ファイルには、リスク管理のための一連の機能を備えたメインクラスが実装されています。

#property copyright "Copyright 2025, Evgeniy Koshtenko"
#property link      "https://www.mql5.com/ja/users/koshtenko"
#property version   "2.0"
#property description "Enhanced Risk Manager with Visual Panel"

#include <Trade\Trade.mqh>

このシステムは、保守的な運用モードからアグレッシブな運用モードまで、さまざまな運用モードに対応しています。これにより、トレーダーは、自身の経験、預け入れている資金の規模、そしてドローダウンに耐えられる心理的な準備状況に応じて、適切なリスクレベルを選択できます。各モードには、それぞれあらかじめ設定されたパラメータが用意されています。これらのパラメータは、数千件の実際のトレーディング口座を分析した結果に基づいて最適化されています。

enum ENUM_TRADING_MODE {
    MODE_CONSERVATIVE,   // Conservative mode
    MODE_MODERATE,       // Moderate mode  
    MODE_AGGRESSIVE,     // Aggressive mode
    MODE_CUSTOM          // Custom mode
};

保守的モードは、初心者のトレーダーや、高い収益よりも安定性を重視するトレーダー向けに設計されています。このモードでは、1日の最大ドローダウンを2%、全体のドローダウンを6%以下に制限し、1回のトレードあたりのリスクをわずか1%に設定しています。これらのパラメータによって、口座資金を大きく失ってしまうリスクをほぼ排除し、トレーダーが市場について学び、適応していくための時間を確保できます。

中程度のモードは、経験豊富なトレーダーにとってのバランスの取れた選択肢です。1日のドローダウンは最大5%、全体のドローダウンは10%まで許容され、1回のトレードあたりのリスクは2%に引き上げられています。これらのパラメータによって、期待できる収益性と資金の安全性のバランスを取ることができます。多くのプロのトレーダーが、これに近い設定で運用しています。

アグレッシブモードは、高い利益を得るためにリスクを取ることを受け入れられるトレーダー向けに設計されています。1日のドローダウンは最大10%、全体のドローダウンは20%、1回のトレードあたりのリスクは3%まで設定されています。これらのパラメータで運用するには、強い精神力と豊富な経験が必要です。しかし、適切に使用すれば、大きな収益を生み出す可能性があります。

私は特に、リスク計算システムに注意を払いました。ドローダウンを評価する方法にはいくつかのアプローチがあり、それぞれにメリットとデメリットがあります。一部のトレーダーは、残高(Balance)のみを基準にドローダウンを計算し、含み益や含み損を無視する方法を好みます。一方、有効証拠金(Equity)のみに注目する方法もあります。この方法では、より実際の口座状況に近い評価ができます。さらに、両方を組み合わせた方法もあります。この場合、2つの計算方法のうち、より厳しい結果となる方を採用してリスクを計算します。

enum ENUM_RISK_CALC_TYPE {
    RISK_CALC_BALANCE_ONLY,   // Calculation based solely on balance
    RISK_CALC_EQUITY_ONLY,    // Calculation based solely on equity
    RISK_CALC_COMBINED,       // Combined calculation
    RISK_CALC_ADAPTIVE        // Adaptive calculation
};

アダプティブ・ドローダウン計算は、私が独自に開発した機能です。このシステムでは、現在の状況に応じて、使用する計算方法を自動的に選択します。損失を抱えたポジションがオープンになっている場合は、実際の損失を考慮するため、有効証拠金を基準に計算します。一方、ポジションが利益を出している場合、またはオープンポジションがない場合は、残高を使用します。このアプローチにより、危険な状況では最大限の保護を確保し、状況が良好な場合には適度な自由度を維持できます。

システムの中核となるのが、CEnhancedRiskManagerクラスです。このクラスは、リスク管理のあらゆる側面を完全に制御します。開始時の残高、現在のドローダウン、オープン中のトレード数、タイムスタンプなど、さまざまな情報を保持します。このクラスは完全に自己完結型となるように設計されています。そのため、一度初期化すれば、外部からの追加管理を必要としません。


CEnhancedRiskManagerメインクラスのアーキテクチャ

このクラスは、オブジェクト指向プログラミング(OOP)原則に基づいて実装されており、各コンポーネントの役割が明確に分担されています。

class CEnhancedRiskManager {
private:
    // Main parameters
    ENUM_TRADING_MODE    m_tradingMode;
    ENUM_RISK_CALC_TYPE  m_riskCalcType;
    double               m_startingBalance;
    double               m_dailyStartBalance;
    double               m_dailyStartEquity;
    double               m_weeklyStartBalance;
    double               m_weeklyStartEquity;
    
    // Risk limits (in %)
    double               m_maxDailyLoss;      
    double               m_maxTotalLoss;      
    double               m_maxWeeklyLoss;     
    double               m_maxTradeRisk;      
    double               m_trailingStopPercent;

クラスのコンストラクタは、選択されたトレードモードに応じて、すべてのパラメータを自動的に設定します。これにより、トレーダーが数十個もの設定項目を手動で入力する必要がなくなり、設定ミスが発生する可能性も抑えられます。すべての値は、成功しているトレード戦略の分析や、著名なトレーダーによる推奨事項をもとに、慎重に選定されています。

システムの初期化は、Initialize()メソッドを1回呼び出すだけで実行できます。このメソッドは、実行環境を包括的にチェックし、すべての内部変数を設定するとともに、視覚的なダッシュボードを作成します。また、過去にシステムを使用したことがある場合は、保存されている状態も読み込みます。特に重視されているのが、エラー処理です。何らかの問題が発生した場合、トレーダーには何が問題なのかを明確に示すメッセージが表示されます。

bool CEnhancedRiskManager::Initialize(double startBalance = 0) {
    // Define the starting balance
    if (startBalance <= 0) {
        m_startingBalance = AccountInfoDouble(ACCOUNT_BALANCE);
    } else {
        m_startingBalance = startBalance;
    }

    // Check validity
    if (m_startingBalance <= 0) {
        Print("❌ RISK MANAGER: Invalid starting balance");
        return false;
    }

メインのリスク検証ループは、ティックが発生するたびに実行されます。すべてのパラメータを継続的にチェックし、各種指標を更新し、違反状況を分析します。そして必要に応じて、取引を停止したり、危険なポジションを決済したりします。これらの処理はすべて一瞬のうちにおこなわれるため、システムに目立った負荷をかけることはありません。

特に興味深いのが警告システムです。単に上限に達した時点で取引をブロックするのではなく、危険ゾーンに近づいていることをトレーダーに事前に警告します。1日のドローダウン上限の80%に達すると黄色の警告が表示され、90%に達するとオレンジ色に変わります。上限を超えた場合は取引が完全に停止され、保有中のすべてのポジションが自動的に決済されます。

安全なポジション新規建て機能では、すべてのチェックが1つのシンプルな関数に統合されています。トレーダー自身がリスクについて細かく心配する必要はありません。OpenPosition()メソッドを呼び出すだけで、システムが自動的にすべての上限値をチェックし、許容可能なポジションサイズを計算し、安全と判断された場合にのみ取引を実行します。

このシステムの重要な機能の1つが、ターミナルを再起動した際の状態保持です。重要なデータは、各口座ごとに固有の接頭辞を付けたMetaTraderのグローバル変数に保存されます。そのため、コンピュータを再起動した場合やEAを更新した場合でも、システムは、その日に何件の取引が行われたか、現在のドローダウンがどの程度なのか、また何らかの上限値に違反しているかどうかを正確に把握できます。

// In the EA: check before opening
if(!RiskManager.CanOpenPosition(lotSize, Symbol())) {
    return false; // Block a dangerous operation
}


実用例:マーチンゲールを制御する

このシステムの実際の能力を検証するため、極端なテストを実行することにしました。テスト対象には、最も危険な部類に入る戦略、マーチンゲールを用いたアグレッシブなグリッドを選びました。これは、負けトレードが発生するたびに、次のポジションのサイズを増やしていく戦略です。理論上は、1回の利益トレードによって、それまでのすべての損失を取り戻すことができます。しかし実際には、これは口座資金を失うことにつながりやすい、非常に危険な方法です。

テスト用に作成したAggressiveGridEAは、まさに「致命的な戦略」の特徴をすべて備えていました。倍率1.5のマーチンゲールを採用しており、グリッドの各ポジションは、直前のポジションより1.5倍大きなロットで建てられます。グリッド間隔はわずか200ポイントに設定されているため、新しいポジションが頻繁に追加されます。EAは最大8ポジションを同時に保有できます。さらに、ドローダウンが1.5%を超えると、ロットを2倍にするアグレッシブなリカバリーモードが有効になります。そして何より危険なのが、ストップロスが一切設定されていないことです。

リスク管理システムなしでこの設定を運用すると、100%の確率で口座資金を失う結果になります。これは誇張ではありません。9年間のデータを使ってEAをテストしたところ、Risk Managerなしでは、口座が1週間以上存続することは一度もありませんでした。

このEAをリスク管理システムに統合する作業は、驚くほど簡単でした。EAの重要な部分に数行のコードを追加するだけです。現在では、ポジションを建てる前に、EAがRisk Managerに取引の許可を求めるようになっています。システムがそのトレードをリスクが高すぎると判断した場合、そのポジションは建てられません。


テスト結果

テスト結果は予想を大きく上回るものでした。リスク管理システムなしの場合、口座の平均寿命はわずか3.2日でした。最大ドローダウンは100%に達し、口座資金は完全に失われました。すべてのテストがマージンコールで終了しました。

一方、Enhanced Risk Managerを導入すると、状況は劇的に変化しました。9年間のテスト期間を通じて、口座は収益性を維持しました。最大の日次ドローダウンは4.8%で、設定された上限の5%をわずかに下回りました。最大総合ドローダウンは9.7%で、危険水準として設定した10%を超えませんでした。そして最も驚くべき点は、9年間の最終利益が127%に達したことです。

では、この「怪物」のような戦略を、システムはどのように制御したのでしょうか。第一に、危険なポジションの新規建てを防止しました。グリッドポジションのサイズが1トレードあたり2%という上限に近づくと、システムがそのポジションの新規建てをブロックします。これにより、損失が際限なく拡大していくことを防ぎました。

第二に、クリティカルなドローダウンが発生した場合の自動決済です。日次ドローダウンが4.5%に達すると、システムはすべてのポジションを強制的に決済します。これにより、クリティカルレベルである5%に達する前に一定の余裕を残すことができます。その結果、取引を完全に停止する事態を避け、翌日に再び回復を図る機会を残すことができます。

第三に、アグレッシブなリカバリー動作を制限しました。損失発生時にポジションを2倍にする機能は、全体的なリスク上限の範囲内でのみ動作します。総リスクが危険水準に近づくと、この機能は自動的に無効化されます。

そして最後に、利益を保護します。日次利益が3%に達すると、特別なトレーリングストップ機構が作動し、その後の反落によって利益の一部が失われることを防ぎます。これにより、ボラティリティの高い日でも利益を確保することが可能になります。

比較のため、同じEAを、この頼れるRisk Managerなしでテストした結果がこちらです。


保護機能の実際の動作

このシステムは、すべての保護レベルが有効に機能することを示しました。

  • 危険なポジションの新規建て防止:1トレードあたりのリスクが上限の2%に近づくと、システムが自動的に新しいグリッドレベルのオープンをブロックし、損失の拡大を防止します。
  • クリティカルなドローダウン発生時の自動決済:日次ドローダウンが4.5%に達すると、システムがすべてのポジションを強制的に決済し、上限である5%に達するまでの小さな余裕を残します。
  • アグレッシブなリカバリーの制御:損失発生時にポジションを2倍にする機能は、全体的なリスク制限によって制御され、壊滅的な損失を防ぎます。
  • 日次利益のトレーリングストップ:利益が3%に達すると保護機能が作動し、反落が発生した場合にも利益の一部を確保します。


実践テストから得られた結論

アグレッシブなグリッドEAを使ったテストによって、最も極端な条件下でもEnhanced Risk Managerが有効に機能することが示されました。このシステムは壊滅的な損失を防いだだけでなく、厳格なリスク管理の範囲内で戦略を利益の出る状態に維持することも可能にしました。

特に重要なのは、クリティカルな状況においてトレーダーの介入を必要とせず、システムが完全に自動で動作する点です。これは特にグリッド戦略において重要です。グリッド戦略では、ストレスのかかる状況になると、人間の感情によって誤った判断をしてしまうことが少なくないからです。

テスト結果は、Enhanced Risk Managerによって、非常にアグレッシブなトレード戦略であっても制御できることを示しています。


結論

今回開発したEnhanced Risk Managerは、トレードにおけるリスク管理の問題に対する包括的なソリューションです。リスク管理を完全に自動化することで、人為的な要因や感情的な判断を排除します。最も危険性の高い戦略の一つであるマーチンゲールグリッドを使った実践テストでも、極端な条件下においてシステムが機能することが示されました。

プロのトレードは、プロのリスク管理から始まります。どれほど優れたエントリー戦略を持っていても、適切なリスク管理がなければ、遅かれ早かれ口座資金を失う可能性があります。Enhanced Risk Managerは、日常的なリスク管理業務を担うことで、トレーダーが市場分析や意思決定に集中できるようにします。

このシステムは一般公開されており、誰でも自分のトレードに利用できます。コードには詳細なコメントが付けられているため、ロジックを理解しやすく、必要に応じて自分の用途に合わせて変更することも可能です。まずは保守的なモードから始め、経験を積みながら徐々にリスクを引き上げていくことを推奨します。利益を急ぐことよりも、資本を守ることのほうが重要であることを忘れないでください。

MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/18918

添付されたファイル |
最後のコメント | ディスカッションに移動 (9)
Aleksander Gladkov
Aleksander Gladkov | 12 8月 2025 において 06:37
Борис Ворона #:
私もコンパイルが通らず、124行目で止まってしまいます: 123 // トレードオブジェクトのマジックナンバーの設定
124 g_RiskManager.m_trade.SetExpertMagicNumber(InpMagicNumber);
クラス定義ファイル EnhancedPropRiskManager.mqh において、「CTrade m_trade;」という行を private セクションから public セクションに移動してください:
Борис Ворона
Борис Ворона | 12 8月 2025 において 09:50
ありがとうございます。これでコンパイルできるようになりました。ただ、レスポンシブ版はコンパイルできません。
Aleksander Gladkov
Aleksander Gladkov | 5 9月 2025 において 09:39

マーチンゲール法を採用した稼働中のアドバイザーにリスクマネージャーを適用しました

リスクマネージャーを使用しない場合の2025年のテスト結果は以下の通りです:

一方、リスクマネージャーを最適に設定した場合は以下の通りです:

ご覧の通り、最大ドローダウンは半分になり、利益は4倍になりました。

Jorge Vazquez Suarez
Jorge Vazquez Suarez | 29 8月 2026 において 06:08

アルゴリズム取引において私が極めて重要だと考える点は、戦略の質と引き受けるリスクの量を明確に区別することです。

高い収益性だけでは、それを達成するためにシステムが預託金に対する高い負担を維持したり、大きなドローダウンに耐えたりする必要がある場合、その意味は比較的薄いと言えます。

私の場合、まずドローダウン、最大エクスポージャー、執行の安定性、そして様々な市場条件におけるシステムの挙動といったパラメータを評価することを優先しています。

また、リスク管理ルールをシステムロジックそのものの中に組み込み、単に好調な局面が続いているという理由だけでエクスポージャーを増やさないようにすることも重要だと考えています。

長期的には、アルゴリズムがどれだけの利益を上げられるかを分析することと同じくらい、どれだけの損失を許容できるかを管理することも 重要だと考えています。

Maxim Kuznetsov
Maxim Kuznetsov | 30 8月 2026 において 14:06
Aleksander Gladkov #:

マーチンゲール法を採用した稼働中のアドバイザーにリスクマネージャーを適用した

リスクマネージャーを使用しない場合の2025年のテスト結果は以下の通りです:

一方、リスクマネージャーを最適に設定した場合の結果はこちらです:

ご覧の通り、最大ドローダウンは半分になり、利益は4倍になりました。

エクイティに対する相対的なドローダウンも縮小し、妥当な範囲内に収まるようになりました。

以前は50%を超えていましたが(現実的には確実に資金が底をつき、ストップアウトに至る水準です)、現在は約20%となり、少なくともセント単位で試してみる価値が出てきました。

取引回数が3分の1に減少したのは少し不思議です。多すぎますし、本来あるべき姿ではありません。

PS/マーチンゲール法の実験を行っていたにもかかわらず。マーチンゲール法は、その定義上、それ自体が純粋なマネーマネジメントの手法です。 この結果は何を物語っているのでしょうか?主に、マーチンゲール戦略を十分に練り上げられていないことを示しています。リスクの取りすぎや、逆に不足している部分があるようです… ;-)
明らかに改善の余地があります。

量子リザバコンピューティング(QRC)回路の実装 量子リザバコンピューティング(QRC)回路の実装
量子コンピューティングを利用した、取引における機械学習への革新的なアプローチです。本記事では、市場の動きをリアルタイムで予測するため、継続的な再学習を行う適応型QRCシステムの実装例について説明します。
グレーモデルによるトレーディング予測 グレーモデルによるトレーディング予測
本記事では、金融時系列の予測におけるグレーモデル(Grey Model)の応用について解説します。まず、グレーモデルの基本的な仕組みを確認し、金融時系列への具体的な適用方法について説明します。また、トレーディングでこれらのモデルを利用する場合のメリットと限界についても考察します。
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
初級から中級まで:ファイル内データへのランダムアクセス(I) 初級から中級まで:ファイル内データへのランダムアクセス(I)
本日の記事では、初めてファイル内容へのランダムアクセスを取り上げます。これは、ファイルに保存されている情報の書き込みと読み込みの両方に当てはまります。ただし、このテーマはあまりにも広範囲にわたるため、一つの記事ですべてを扱うことはできません。そこで、ここではランダムアクセスについての基本的な紹介にとどめます。