エントリーしたあとに「どこで手仕舞うか」を高い再現性で決められるかどうかで、トレード成績は大きく変わります。トレーリングストップ(以下TS)は、価格が有利に進んだ分だけ損切りラインを自動的に追随させる仕組みで、利益確定を欲張りすぎての全戻しや、含み益からの損失化を回避しやすくします。本稿は、初心者の方でも明日から導入できる実務レベルの内容に絞り、%固定・ATR・構造(直近高安)・VWAP連動の4系統を、数式・設計・検証・実装まで一気通貫で解説します。
1. トレーリングストップの基礎概念
TSは「有利方向にだけ損切り(ストップ)を近づけ、不利方向には緩めない」ルールです。これにより、損失の下限を時間とともに切り上げ(ショートなら切り下げ)つつ、上振れの可能性を残します。比喩的には、利益の上には天井をつくらず、損失の下には床をつくるイメージです。
1.1 用語の整理
- 初期ストップ(IS):エントリー直後の損切り位置。
- 移動幅(距離)d:価格が有利に進んだとみなす閾値。%、pips、ATR倍数などで表現します。
- 更新トリガー:dに達したときにストップをどこへ移動するかの規則(例:高値−d、前回ストップ+ステップ等)。
- 非後退性:価格が戻ってもストップは元に戻さない性質。
2. 4系統のトレーリング設計と数式
2.1 %固定型(最もシンプル)
ロングのとき、最高値 H_t に対して d = p% を差し引いた位置をストップにします。式は次の通りです:
Stop_t = max(Stop_{t-1}, H_t × (1 - p))
ショートでは逆に最安値 L_t に対して H_t を L_t × (1 + p) に置き換えます。%固定は相場のボラティリティが変化してもルールが不変で、バックテストが容易です。
2.2 ATR型(ボラ調整)
ATR(Average True Range)を用い、d = k × ATR_t として可変の距離にします。ロング:
Stop_t = max(Stop_{t-1}, H_t - k × ATR_t)
ATR型は相場の荒さに自動調整され、レンジでもトレンドでも一定の合理性を保ちます。kは1.5〜3.0が一般的な初期探索範囲です。
2.3 構造型(直近高安/スイングポイント)
価格構造(直近の押し安値/戻り高値)を用いて更新します。ロングでは直近の押し安値を常にストップ位置に更新し続けます。式では表しにくいですが、人間の視覚認知と相場構造を直結できるのが利点です。トレンドフォローと相性が良い一方、ノイズで「スイング定義」が曖昧だと過度にタイトになります。
2.4 VWAP連動型(機関投資家の基準に同期)
日中の機関投資家が参照しやすいVWAP(出来高加重平均価格)を基準に、Stop_t = max(Stop_{t-1}, VWAP_t – m × σ_{VWAP}) のように設定します。σはVWAPからの乖離標準偏差や、VWAP帯(バンド)の幅で近似します。大口の執行バイアスに同調しやすく、不意のノイズに強い設計が可能です。
3. 初期ストップ(IS)の決め方
TSはISの良し悪しでリスクリワード全体が決まります。推奨手順:
- ボラ基準:IS = エントリー価格 − 1.5×ATR(ロング)。
- 構造基準:IS = 直近の押し安値少し下(ロング)。
- 複合:上のうち広い方を採用し、ノイズでの刈り取りを回避。
4. リスクリワード設計と期待値の数式
1回のトレードで初期リスクR(= エントリーとISの距離)を取り、TSで利を伸ばします。勝率W、平均勝ち幅G、平均負け幅L(いずれもR倍表記)のとき、期待値Eは
E = W × G − (1 − W) × L
TSはGを引き上げる役割を担い、最悪でもL≦1(R以内)に収めます。E > 0 を満たすように、W、G、LをTSパラメータと併せて最適化します。
5. 具体シナリオ(株・FX・クリプト)
5.1 株(日本株・デイトレ)%固定×構造
例:銘柄Aを1,000円でロング、IS=直近押し安値の995円(R=5円)。TSはp=1%(10円)で設定。高値が1,040円に到達すると、Stopは1,029〜1,030円付近へ前進。引け前に1,032円で反落しStopにかかって利確、+32円、G=6.4R。全戻しを回避できています。
5.2 FX(USD/JPY・スイング)ATR型
例:ロング105.00、ATR(14)=0.45円、k=2.0 ⇒ d=0.90円。最高値が106.80に伸びた時点でStopは105.90付近まで追随。その後106.10で反落し決済、+1.10円、G=約2.44R。為替特有の時間帯ボラをATRで吸収します。
5.3 クリプト(BTCUSDT・日足)VWAP連動
例:ロング70,000、日次VWAP=71,200、σ=800、m=1.5 ⇒ VWAP帯下限=70,000。伸長後にVWAPが72,000へ、σ=900に拡大すると帯下限は70,650まで上昇。Stopもこれに追随し、深い押しでの利確漏れを減らします。
6. 実装:MQL4(EA、初心者向けシンプル版)
以下は%固定とATR型を切替できる最小構成のEA例です。既存ポジションに対してTSだけを適用するユーティリティとして使えます。
//+------------------------------------------------------------------+
//| Trailing Stop Utility (Percent/ATR) for MT4 |
//| Simple, beginner-friendly |
//+------------------------------------------------------------------+
#property strict
extern bool UseATR = true;
extern double Percent = 1.0; // % trailing (e.g., 1.0 = 1%)
extern int ATRPeriod = 14;
extern double ATRMult = 2.0; // k in d = k * ATR
extern int Magic = 0;
extern int Slippage = 3;
double Pip() { return (Digits == 3 || Digits == 5) ? 0.001 : 0.01; }
double GetATR(int period) {
double atr=0;
for(int i=0;i<period;i++){
double tr = MathMax(High[i]-Low[i], MathMax(MathAbs(High[i]-Close[i+1]), MathAbs(Low[i]-Close[i+1])));
atr += tr;
}
return atr/period;
}
int start(){
double atr = UseATR ? GetATR(ATRPeriod) : 0;
for(int i=0;i<OrdersTotal();i++){
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(Magic>0 && OrderMagicNumber()!=Magic) continue;
if(OrderSymbol()!=Symbol()) continue;
if(OrderType()==OP_BUY){
double highest = iHigh(Symbol(), PERIOD_CURRENT, iHighest(Symbol(), PERIOD_CURRENT, MODE_HIGH, 100, 0));
double d = UseATR ? ATRMult*atr : highest * (Percent/100.0);
double newSL = UseATR ? highest - d : highest - d; // same line for clarity
newSL = NormalizeDouble(newSL, Digits);
if(newSL > OrderStopLoss() && newSL < Bid){
OrderModify(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit(), 0, clrAqua);
}
}
if(OrderType()==OP_SELL){
double lowest = iLow(Symbol(), PERIOD_CURRENT, iLowest(Symbol(), PERIOD_CURRENT, MODE_LOW, 100, 0));
double d = UseATR ? ATRMult*atr : lowest * (Percent/100.0);
double newSL = UseATR ? lowest + d : lowest + d;
newSL = NormalizeDouble(newSL, Digits);
if(newSL < OrderStopLoss() || OrderStopLoss()==0){
if(newSL > Ask) newSL = Ask + 3*Pip(); // safety
OrderModify(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit(), 0, clrTomato);
}
}
}
return(0);
}
//+------------------------------------------------------------------+
注意点:highest/lowestの取得窓(ここでは直近100本)は戦略に合わせて調整します。ISは別途エントリー時に設定しておき、本EAは前進のみ行います。
6.1 Pine Script(補足・学習用、v5)
//@version=5
indicator("Trailing Stop — Percent/ATR", overlay=true)
useATR = input.bool(true, "Use ATR")
pct = input.float(1.0, "Percent", step=0.1) / 100.0
k = input.float(2.0, "ATR Multiplier", step=0.1)
atr = ta.atr(14)
var float stop = na
longCond = ta.crossover(ta.sma(close, 5), ta.sma(close, 20))
if (longCond)
stop := useATR ? high - k*atr : high*(1 - pct)
else
if not na(stop)
stop := math.max(stop, (useATR ? high - k*atr : high*(1 - pct)))
plot(stop, "Trailing Stop", linewidth=2)
7. パラメータ探索と検証プロトコル
- 期間分割:学習期間(in-sample)と検証期間(out-of-sample)を分けます。
- グリッド探索:%=0.5〜3.0、ATR倍数=1.0〜3.5、構造のスイング幅=3〜10本など。
- 評価指標:勝率、平均利幅、最大ドローダウン、SQN、カースケード(連敗/連勝)分布。
- 頑健性:前処理(フィルタ)を変えても上位パラメータが崩れないか確認します(例:時間帯、出来高、ボラ期)。
8. よくある失敗と回避策
- タイトすぎる:%やkを小さくしすぎるとノイズで刈られます。ISとTSの両方をボラ基準へ。
- 更新頻度が高すぎ:ティックごと更新はスリッページを増やします。バー確定で更新、または最小ステップ幅を設けます。
- 中途半端な利確:TSと別に固定利確(Rマルチプル利確)を併設すると、相性が悪い組み合わせがあります。検証で適合を確認します。
9. 実践チェックリスト
- ISはボラと構造の広い方。
- TSの方式(%/ATR/構造/VWAP)を資産特性に合わせて選択。
- 更新はバー確定、最小ステップ設定。
- バックテストは分割検証+頑健性チェック。
- 資金管理:1トレードのリスクは口座の0.5〜2%目安。
10. まとめ
トレーリングストップは、勝ちを伸ばし負けを限定するための最小限にして最強のメカニズムです。%・ATR・構造・VWAPの4系統を、銘柄や時間軸で使い分け、再現性のある出口ルールを手に入れてください。本稿のコードと手順をそのままベースラインにし、各自の戦略へチューニングしていくことをおすすめします。
コメント