【結論】
MT5で「SLを35pipsにしたつもりなのに挙動がおかしい」系は、
だいたい次のどれか(複合も多い)で説明できます。
────────────────────────
【原因として多い順】
1) pips と point(最小値幅)の換算ミス
・MT5/MQL5は基本「point」で価格差を扱います。
・通貨ペアが 5桁(例: EURUSD 1.12345) / 3桁(例: USDJPY 123.456) の場合、
1pip = 10point になりやすいです。
→ 35pipsのつもりで「35」だけ入れると、35point (=3.5pips相当)になってズレます。
※ゴールドや指数は「1pip相当」が銘柄ごとに違うので、さらにズレやすいです。
2) Buy/Sellで基準価格(Bid/Ask)を混同
・Buyの約定はAsk、Sellの約定はBidが基準。
・SLが刺さる判定はBid/Ask側で動くので、スプレッド分のズレが出ます。
→ 「チャート上はまだ到達してないのにSL」や「思ったより遠い/近い」が起きます。
3) ブローカー制限(StopsLevel / FreezeLevel)
・現在価格から近すぎるSL/TPは置けない・変更できない場合があります。
→ 注文や変更が失敗して「SLが入ってない/おかしい値になる」ことがあります。
※この場合は、注文結果(retcode)を見れば分かります。
4) SL設定のタイミング(約定前に計算してる/約定価格を反映してない)
・成行→約定→その約定価格を基準にSL計算→付与、が基本です。
→ 約定前の価格でSLを作ると、約定価格との差でズレます。
5) 価格の桁数/丸め(NormalizeDouble)不足
・銘柄の桁数に合わない価格を入れると拒否されることがあります。
→ SL設定が失敗・反映されない原因になります。
6) テスター設定(Open prices only 等)で判定が変に見える
・ストラテジーテスターのモデル次第で、SLの発動タイミングが変わって見えることがあります。
→ まず「Every tick(できれば実ティック)」で検証すると切り分けが早いです。
────────────────────────
【知恵袋での回答としてのまとめ(短く)】
「35pips」のつもりでも、MT5はpoint基準なので換算ミスが多いです。
またBuy/SellのBid/Ask基準とスプレッド、StopsLevel(最小ストップ距離)制限で
SLが置けない/想定と違って見えることもよくあります。
注文・変更の返り値(retcode)と銘柄のDigits/Point、換算式を確認すると原因が特定できます。
────────────────────────
【手順:簡易チェック(これだけ順にやればOK)】
(1) 銘柄の _Digits と _Point を確認
(2) 35pips → 何pointかを正しく換算(5桁/3桁なら「×10」になりがち)
(3) BuyはAsk基準、SellはBid基準でSL価格を作れているか確認
(4) StopsLevel/FreezeLevel を確認し、制限以上に離して置く
(5) SL価格は NormalizeDouble(price, _Digits) で丸める
(6) 注文/変更の結果(retcode)を必ずログに出す
(7) テスターは「Every tick(可能なら実ティック)」で再検証
(ここまでやれば、ほぼ原因に当たります)