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関数の実装
主な処理フロー:
機能有効チェック: EnableBreakevenLockがfalseの場合は何もせずreturn
現在価格取得: BUYの場合はBID、SELLの場合はASKを使用
同方向ポジション数カウント: USDJPYまたはUSDJPY.clで同じ方向のポジションを数える
2本以上チェック: 同方向ポジションが2本未満の場合はreturn
各ポジションの処理:
含み益計算(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);
}実装の特徴
安全性への配慮
SL悪化防止
BUY: 新SLは必ず >= entry_price、既存SL < entry_priceの場合のみ上げる
SELL: 新SLは必ず <= entry_price、既存SL > entry_priceの場合のみ下げる
ストップレベルチェック
SYMBOL_TRADE_STOPS_LEVELを確認
現在価格から最小距離を満たしていない場合はスキップ
重複処理防止
すでに建値以上/以下のSLが設定されているポジションはスキップ
ロギング
デバッグモード時の詳細ログ
同方向ポジション数
含み益不足の場合
すでにロック済みの場合
ストップレベル不足の場合
通常時のログ
建値ロック成功: 【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本目のみの場合
建値ロックが発動しないこと
2本目エントリー直後
1本目に一定以上の含み益がある場合、SLが建値+αに引き上がること
ログに「【BEロック】」メッセージが出ること
利益が少ない場合
MinProfitPipsForBE未満の場合、SLが動かないこと
Dynamic TP/SL実行後
建値より悪いSLに戻らないこと
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: 発注成功後の建値ロック呼び出し
注意事項
USDJPY専用
pip値は0.01で固定(USDJPY前提)
他の通貨ペアには要調整
マジックナンバー
TradingMagicNumberでフィルタ
他のEAのポジションには影響しない
シンボル名
USDJPYとUSDJPY.clの両方に対応
audit_performance / Aegis MQLとの整合
この建値ロックは「子イベント(管理イベント)」として扱う
OPEN評価には含めない設計
今後の拡張可能性
config.json連携
パラメータをconfig.jsonから読み込み可能に
通貨ペア別設定
pip値の自動計算
通貨ペアごとの閾値設定
ATR連動
MinProfitPipsForBEをATR倍率で指定
ボラティリティに応じた動的調整
段階的ロック
3本目で更にタイトにロック
含み益に応じた段階的SL移動
実装完了日時
2025年11月21日
