PR DMM FX 新規口座開設 + 取引で 最大30万円キャッシュバック 詳細 ▶

投稿者: DO-MO

  • ドローダウン15%で全停止する Guardian モジュールの設計と実装

    [ 広告 / PR ]
    🔰 この記事のポイント (初心者向け)

    はじめての方も読めるよう、専門用語はカンタンな言葉に言い換えながら解説します。「なんとなく聞いたことある」レベルの知識で大丈夫です。

    📖 この記事で出てくる用語
    • EA = Expert Advisor。MT4/MT5上で動く自動売買プログラム
    • ドローダウン = 資産の最大下落幅(リスク指標)
    ドローダウン15%で全停止する Guardian モジュールの設計と実装
    イメージ画像
    🛡️

    リスク管理モジュール設計

    📢 広告 (PR) を含む場合があります

    ドローダウン15%で全停止する Guardian モジュールの設計と実装

    最終更新: 2026-05-05

    著者
    海堂 慎
    金融データアナリスト・元クオンツ
    リスク管理を最優先にした EA 設計を継続。

    EAが暴走しても損失を限定するための「最終防衛ライン」。15%という数字の根拠と、実際にPython/MQL5でどう実装するかをサンプルコード付きで共有します。

    なぜ「15%」なのか

    個人の心理的耐性、Kelly基準の保守的下限、業界の慣行 (大手CTAの多くがMDD 20%以下を目標) から、15%は実務的な妥協点として広く使われています。Kelly基準で計算する勝率55%/RR 1.5の戦略の最適fは約16%、その半分のHalf Kellyを取ると8%リスク。連敗を考慮するとMDDは15-25%の範囲に収まります。

    Guardian モジュールが守るもの

    1. 残高ピーク比 -X% で全エントリー停止
    2. 日次損失 -Y% で当日停止
    3. 週次損失 -Z% でリカバリーモード (ロット半減)
    4. システム異常 (API応答なし等) で安全側に倒す

    Python 実装サンプル

    import json, datetime as dt
    from pathlib import Path
    
    STATE_FILE = Path("guardian_state.json")
    DD_THRESHOLD = 0.15        # 残高ピーク比 -15%
    DAILY_THRESHOLD = 0.03     # 日次 -3%
    WEEKLY_THRESHOLD = 0.05    # 週次 -5%
    
    class Guardian:
        def __init__(self, current_balance):
            self.state = self._load()
            self.balance = current_balance
            self.state.setdefault("peak", current_balance)
            if current_balance > self.state["peak"]:
                self.state["peak"] = current_balance
    
        def _load(self):
            if STATE_FILE.exists():
                return json.loads(STATE_FILE.read_text(encoding="utf-8"))
            return {}
    
        def save(self):
            STATE_FILE.write_text(json.dumps(self.state, ensure_ascii=False, indent=2), encoding="utf-8")
    
        def can_open(self):
            peak = self.state["peak"]
            dd = (peak - self.balance) / peak
            if dd >= DD_THRESHOLD:
                return False, f"DD {dd:.1%} ≥ {DD_THRESHOLD:.0%}"
            # 日次/週次のチェックは省略 (同様のロジック)
            return True, "OK"
    
    g = Guardian(current_balance=985_000)
    ok, reason = g.can_open()
    print(ok, reason)
    g.save()
    

    MQL5 実装のポイント

    MQL5では AccountInfoDouble(ACCOUNT_BALANCE) で残高、HistorySelect で過去のディール一覧を取得できます。ピーク残高はファイルに保存して再起動後も保持。

    double g_peak = 0;
    
    void CheckGuardian() {
        double balance = AccountInfoDouble(ACCOUNT_BALANCE);
        if (balance > g_peak) g_peak = balance;
        double dd = (g_peak - balance) / g_peak;
        if (dd >= 0.15) {
            ExpertRemove();   // EA停止
            Print("Guardian発動: DD=", dd*100, "%");
        }
    }
    

    停止後の再開条件 (重要)

    Guardian発動後、感情で再開すると同じ事を繰り返します。再開条件を事前に文章化することを強く推奨します。例:

    • 原因の特定: 戦略劣化 / バグ / 市場構造変化のどれか
    • 対応の実装: コード/パラメータ修正済み
    • OOS再検証: 直近1ヶ月のデータでバックテスト → 想定範囲内
    • 初期ロット: 通常の1/4で1週間運用 → 問題なければ段階増額

    運用の現実

    私の運用では、Guardianが過去2年で2回発動しました。1回は単純なバグ (ロット計算の小数点ズレ)、もう1回は市場構造変化 (低ボラ環境への戦略不適合)。どちらも事後分析で気づいたもので、Guardianがなければ被害は3倍以上だったと思います。

    まとめ

    Guardianは「使う日のためだけに毎日動かす保険」です。使わない日が9割以上ですが、使う日に資金の半分を守ります。実装コストは数時間、効果は計り知れません。

    参考にした情報源

    免責: 本記事は情報提供のみを目的としており、投資勧誘・投資助言ではありません。当サイト管理人は金融商品取引業の登録を行っておらず、個別具体的な投資判断についての助言は行えません。FX/暗号資産は元本毀損のリスクがあります。最終判断はご自身の責任でお願いします。
    PR · DMM FX 公式

    国内口座数 No.1 — DMM FX

    業界最狭水準スプレッド + スマホアプリ高評価 + 最短当日取引開始
    新規口座開設で 最大 300,000円 キャッシュバック中

    ▶ DMM FX 公式サイトで詳細

    ※本サイトはアフィリエイトプログラムにより収益を得ています。投資はご自身の判断・責任で。

  • Pythonで MT5 の発注APIを実装する — Windows VPS で動かすまでの手順

    [ 広告 / PR ]
    🔰 この記事のポイント (初心者向け)

    はじめての方も読めるよう、専門用語はカンタンな言葉に言い換えながら解説します。「なんとなく聞いたことある」レベルの知識で大丈夫です。

    📖 この記事で出てくる用語
    • EA = Expert Advisor。MT4/MT5上で動く自動売買プログラム
    • MT5 = MetaTrader 5。世界標準のFXトレードソフト
    • VPS = Virtual Private Server。レンタルできる仮想サーバー(24時間稼働用)
    Pythonで MT5 の発注APIを実装する — Windows VPS で動かすまでの手順
    イメージ画像
    🐍

    Python × MT5 実装

    📢 広告 (PR) を含む場合があります

    Pythonで MT5 の発注APIを実装する — Windows VPS で動かすまでの手順

    最終更新: 2026-05-05

    著者
    Naoki Hashimoto
    クラウドアーキテクト
    AWS/GCP の SAA/PCA 取得済。複数のFXブローカーで Python EA を運用中。

    MT5のPythonライブラリ MetaTrader5 を使うと、Pythonから直接ポジション操作ができます。Windows VPS上で安定稼働させるまでのつまずきポイントを実コードと共に共有します。

    動作環境

    • OS: Windows Server 2022 (ConoHa for Windows VPS の 2GB プラン)
    • Python: 3.12.x (公式インストーラから .msi)
    • MT5: ブローカー指定の最新ビルド
    • ライブラリ: MetaTrader5==5.0.45

    セットアップ手順

    # PowerShell で実行
    py -3.12 -m venv venv
    .\venv\Scripts\activate
    pip install MetaTrader5 pandas numpy
    
    # MT5 GUI で「ツール → オプション → エキスパートアドバイザー」
    # 「アルゴリズム取引を許可する」「DLLの使用を許可する」 ✓
    

    最小の発注コード

    import MetaTrader5 as mt5
    
    if not mt5.initialize():
        raise SystemExit(f"init失敗: {mt5.last_error()}")
    
    symbol = "EURUSD"
    info = mt5.symbol_info(symbol)
    price = mt5.symbol_info_tick(symbol).ask
    
    req = {
        "action": mt5.TRADE_ACTION_DEAL,
        "symbol": symbol,
        "volume": 0.01,
        "type": mt5.ORDER_TYPE_BUY,
        "price": price,
        "sl": price - 0.0030,   # 30 pips SL
        "tp": price + 0.0050,   # 50 pips TP
        "deviation": 10,
        "magic": 20260505,
        "comment": "py-test",
        "type_time": mt5.ORDER_TIME_GTC,
        "type_filling": mt5.ORDER_FILLING_IOC,
    }
    
    result = mt5.order_send(req)
    print(result)
    mt5.shutdown()
    

    つまずきポイント 5つ

    1. type_filling の選択

    ブローカーごとに対応する filling mode が違います。FOK のみ対応の業者で IOC を送ると retcode=10030 で弾かれます。
    info.filling_mode をビット演算で確認し、対応する値を選んでください。

    2. ポジションのモード (Hedging vs Netting)

    口座が Hedging なら 1 銘柄に複数ポジション可、Netting なら自動で相殺。Pythonからは mt5.account_info().margin_mode で判定できます。

    3. SL/TPの最小距離

    ブローカーは「現在価格から最低N pips離さないとSL/TPを置けない」というルールを持ちます (SYMBOL_TRADE_STOPS_LEVEL)。
    スキャル系で短SLを使う場合は、ここで弾かれて発注失敗になりがち。事前に info.trade_stops_level をチェックします。

    4. VPSの再起動でMT5が落ちる

    Windows Update の自動再起動でMT5が止まると、Pythonスクリプトも気付かず空回ります。
    タスクスケジューラの「ログオン時」トリガーで MT5 と Python の両方を自動起動。さらに Python 側でも 60秒に 1回 mt5.terminal_info() で接続生存確認を実装。

    5. 多重発注の防止

    初心者が引っかかりやすいのが、ループ毎にエントリーしてしまうバグ。Magic Number 単位で既存ポジションをチェックし、既にあればスキップする実装が必須です。

    def has_open(symbol, magic):
        pos = mt5.positions_get(symbol=symbol) or []
        return any(p.magic == magic for p in pos)
    

    本番投入前のチェックリスト

    • ☐ デモ口座で1週間連続稼働 (週末を含む) で異常なし
    • ☐ Windows Update 設定でアクティブ時間が EA 動作時間と被らない
    • ☐ Magic Number で識別、複数 EA を共存できる
    • ☐ ロガー (file + stdout) を実装、24時間分のログを保持
    • ☐ 実弾は最初は 0.01 lot で 1〜2 週間

    まとめ

    Python + MT5 は MQL5 を書かずに高速プロトタイピングできるのが最大の強みです。バックテストは MT5 標準のストラテジーテスターほど厳密でない部分もあるため、検証は MQL5 で、本番運用は Python で、と使い分けると効率が良いと感じています。

    参考にした情報源

    免責: 本記事は情報提供のみを目的としており、投資勧誘・投資助言ではありません。当サイト管理人は金融商品取引業の登録を行っておらず、個別具体的な投資判断についての助言は行えません。FX/暗号資産は元本毀損のリスクがあります。最終判断はご自身の責任でお願いします。
    PR · DMM FX 公式

    国内口座数 No.1 — DMM FX

    業界最狭水準スプレッド + スマホアプリ高評価 + 最短当日取引開始
    新規口座開設で 最大 300,000円 キャッシュバック中

    ▶ DMM FX 公式サイトで詳細

    ※本サイトはアフィリエイトプログラムにより収益を得ています。投資はご自身の判断・責任で。