見出し画像

YenPulse ダブルシグナル・建値ロック機能の追加実装 AIを使ったSL移動

同方向のシグナルが連続して出た場合、既存のポジションの損失リスクをゼロに近づけるため、含み益が一定以上乗っているポジションのストップロスを建値付近に自動で引き上げる機能です。

これにより、最初のポジションは「損しない状態」に固定され、追加のシグナルで積極的に乗せる戦略を安全に実行できます。

同方向ポジション数が 2本以上になった瞬間に実行
既存ポジションをすべてループする
含み益が MinProfitPipsForBE(例: 10pips)以上あるものだけロック
そのポジの SL を
BUY → entry_price +1pips
SELL → entry_price -1pips
に引き上げる

仕様書

実際の挙動例

→ 結果:
#1#3 の SL が建値+1pip に引き上がる
#2 は「まだ育ってない子」なのでロックされない。

実装内容

1. main.mq5への追加

1.1 入力パラメータの追加

mql5

input group "=== 同方向2本目建値ロック設定 ==="
input bool      EnableBreakevenLock = true;         // 建値ロック機能を有効化
input double    MinProfitPipsForBE = 10.0;          // 建値ロック最小利益(pips)
input double    SLOffsetPips = 1.0;                 // 建値からのオフセット(pips)
  • EnableBreakevenLock: 建値ロック機能の有効/無効を切り替え(デフォルト: true)

  • MinProfitPipsForBE: 建値ロックを実行する最小含み益(デフォルト: 10.0 pips)

  • SLOffsetPips: 建値からのオフセット(微益確保)(デフォルト: 1.0 pips)

1.2 関数プロトタイプの追加

mql5

// 建値ロック関連関数
void LockExistingPositionsToBreakeven(string symbol, ENUM_POSITION_TYPE direction);

1.3 LockExistingPositionsToBreakeven関数の実装

主な処理フロー:

  1. 機能有効チェック: EnableBreakevenLockがfalseの場合は何もせずreturn

  2. 現在価格取得: BUYの場合はBID、SELLの場合はASKを使用

  3. 同方向ポジション数カウント: USDJPYまたはUSDJPY.clで同じ方向のポジションを数える

  4. 2本以上チェック: 同方向ポジションが2本未満の場合はreturn

  5. 各ポジションの処理:

    • 含み益計算(pips換算)

    • 最小利益チェック(MinProfitPipsForBE)

    • 既存SLチェック(すでに建値以上なら処理スキップ)

    • 新SL計算(建値+SLOffsetPips)

    • ストップレベルチェック

    • SL変更実行

2. AutoOrder.mqhへの修正

2.1 外部関数宣言の追加

mql5

// 建値ロック関数(main.mq5で定義)
void LockExistingPositionsToBreakeven(string symbol, ENUM_POSITION_TYPE direction);

2.2 発注成功後の呼び出し

OnAutoOrderTimer()関数内の発注処理部分を修正:

mql5

// ■ 8) 発注
if(PlaceOrder(signal))
{
    // 発注成功 → 建値ロック機能を実行
    // (同方向2本目の場合、既存ポジションを建値にロックする)
    ENUM_POSITION_TYPE posType = (signal.direction == "BUY") ? POSITION_TYPE_BUY : POSITION_TYPE_SELL;
    LockExistingPositionsToBreakeven(_Symbol, posType);
}

実装の特徴

安全性への配慮

  1. SL悪化防止

    • BUY: 新SLは必ず >= entry_price、既存SL < entry_priceの場合のみ上げる

    • SELL: 新SLは必ず <= entry_price、既存SL > entry_priceの場合のみ下げる

  2. ストップレベルチェック

    • SYMBOL_TRADE_STOPS_LEVELを確認

    • 現在価格から最小距離を満たしていない場合はスキップ

  3. 重複処理防止

    • すでに建値以上/以下のSLが設定されているポジションはスキップ

ロギング

  1. デバッグモード時の詳細ログ

    • 同方向ポジション数

    • 含み益不足の場合

    • すでにロック済みの場合

    • ストップレベル不足の場合

  2. 通常時のログ

    • 建値ロック成功: 【BEロック】ticket=xxxxx SL 154.123 → 154.133 (profit=12.3 pips)

    • 建値ロック失敗: 【BEロック失敗】ticket=xxxxx error=10016

動作フロー

1. 新規ポジション発注(PlaceOrder)
   ↓
2. 発注成功
   ↓
3. LockExistingPositionsToBreakeven呼び出し
   ↓
4. 同方向ポジション数をカウント
   ↓
5. 2本以上なら各ポジションをチェック
   ↓
6. 含み益がMinProfitPipsForBE以上なら建値ロック実行

Python側への影響

影響なし(仕様通り)

  • Python側のdynamic_tpslは既に「現在SLがエントリーより有利な位置にある場合、それを悪化させない」ロジックを実装済み

  • EA側で一度建値ロックしたSLは、Python側の再計算で「深くされる」ことはない

テスト観点

実装後、以下を確認してください:

  1. 同方向1本目のみの場合

    • 建値ロックが発動しないこと

  2. 2本目エントリー直後

    • 1本目に一定以上の含み益がある場合、SLが建値+αに引き上がること

    • ログに「【BEロック】」メッセージが出ること

  3. 利益が少ない場合

    • MinProfitPipsForBE未満の場合、SLが動かないこと

  4. Dynamic TP/SL実行後

    • 建値より悪いSLに戻らないこと

  5. audit_performance

    • exit_reasonに「SL」などが入るが、親OPEN評価ロジックが壊れていないこと

設定推奨値

保守的設定(リスク重視)

EnableBreakevenLock = true
MinProfitPipsForBE = 15.0  // 15pips以上の含み益で建値ロック
SLOffsetPips = 2.0         // 建値+2pips(スプレッド対策)

標準設定(バランス型)

EnableBreakevenLock = true
MinProfitPipsForBE = 10.0  // 10pips以上の含み益で建値ロック
SLOffsetPips = 1.0         // 建値+1pips

アグレッシブ設定(機会重視)

EnableBreakevenLock = true
MinProfitPipsForBE = 8.0   // 8pips以上の含み益で建値ロック
SLOffsetPips = 0.5         // 建値+0.5pips

ファイル一覧

  • main.mq5: 建値ロック機能の実装

  • AutoOrder.mqh: 発注成功後の建値ロック呼び出し

注意事項

  1. USDJPY専用

    • pip値は0.01で固定(USDJPY前提)

    • 他の通貨ペアには要調整

  2. マジックナンバー

    • TradingMagicNumberでフィルタ

    • 他のEAのポジションには影響しない

  3. シンボル名

    • USDJPYとUSDJPY.clの両方に対応

  4. audit_performance / Aegis MQLとの整合

    • この建値ロックは「子イベント(管理イベント)」として扱う

    • OPEN評価には含めない設計

今後の拡張可能性

  1. config.json連携

    • パラメータをconfig.jsonから読み込み可能に

  2. 通貨ペア別設定

    • pip値の自動計算

    • 通貨ペアごとの閾値設定

  3. ATR連動

    • MinProfitPipsForBEをATR倍率で指定

    • ボラティリティに応じた動的調整

  4. 段階的ロック

    • 3本目で更にタイトにロック

    • 含み益に応じた段階的SL移動

実装完了日時

2025年11月21日

いいなと思ったら応援しよう!