勝っているときは伸ばし、負けているときは素早く離脱する──この非対称性を機械的に実装するのがトレーリングストップです。裁量の迷いを排し、損小利大(Positive Skew)の分布をポートフォリオ全体に強制できます。本稿では、固定幅・%・ボラティリティ連動(ATR・チャンドリアー・ボリンジャー)・時間/出来高連動・ハイブリッド設計までを、設計→検証→運用の順に手順化し、株・FX・暗号資産・先物の実務で即投入できる水準まで落とし込みます。最後に、MT4(MQL4)で動く実装コードも提示します。
「損失の裾を切り、利益の裾野を意図的に長くする」。この目的を外すと、単なる“広めの逆指値”になります。期待値は「勝率 × 平均利益 − 敗率 × 平均損失」です。トレーリングの主戦場は勝ちトレード側:平均利益を伸ばすことにあります。損切り側は初期ストップで担保し、トレーリングは「伸びたら縮める」機能に特化させます。
方式ごとのプロファイルを理解して、銘柄特性・時間軸・流動性に合わせて使い分けます。
- 固定幅(Tick/Price)型:シンプルで実装容易。低ボラ銘柄や短期スキャルで有効。欠点は相場のボラ変化に順応しないこと。
- %型:価格水準に比例するため、株価の桁が違っても一貫したリスクプロファイルを維持。トレンドフォローの中期で汎用性。
- ATR連動型:
Stop = 最高値 − k × ATR(n)
(ロング)。ボラに適応しダマシ低減。kは1.5〜3.5が経験則。 - チャンドリアー・エグジット:
Stop = HighestHigh(N) − k × ATR(N)
。NとATR期間を揃えるのが基本。トレンド持続で光る。 - ボリンジャー帯連動:上バンドタッチ後、
中心線 − ασ
で追従。レンジ⇔トレンド移行期の取りこぼしを抑制。 - 時間・出来高連動:一定時間新高値が更新されなければストップを引き上げる/出来高急減でタイト化。イベントドリブン向け。
- ハイブリッド:初期は固定/%で保護、含み益が
2R
超でATR型に切替、5R
以降はチャネル下限(Donchian/MA)で追従。
前日終値1,000円、当日ボラ基準としてATR(14)=12円
。寄り付き後、1,020円でロング、最高値が1,060円まで伸びたとします。
(1)固定幅15円型:Trailing Stop = 最高値 − 15 = 1,045円
。
(2)%型2%:= 1,060 × (1 − 0.02) = 1,038.8円 → 1,039円
。
(3)ATR×2.5型:= 1,060 − 2.5 × 12 = 1,030円
。
(4)チャンドリアー(N=14, k=3):= HighestHigh(14) − 3×ATR(14)
。直近14本の最高値が1,060円なら1,060 − 36 = 1,024円
。
出来高が急減し板の厚みが薄くなったら、スリッページ対策として成行ではなく「最良気配−1ティックの指値+タイムアウト成行」へ切替えるのが実務です。
- 日本株:ティックサイズと呼値制限で“段差”が生じます。ストップが板の薄い価格帯に位置すると、飛びやすい。場中のニュース・特別気配で約定順序が変わる点も考慮。
- FX:24時間・連続オーダーブック。ロールオーバー時のスプレッド拡大でストップ狩りが発生しやすい時間帯(ニューヨーククローズ前後)は、トレーリング係数を一段緩める運用が有効。
- 暗号資産:CEXは指値簿の薄いアルトでギャップ常態化。清算連鎖に巻き込まれると暴落速度が速い。マーケット注文の使用比率を下げ、分割指値+IOCを基本に。
- 先物:夜間流動性が主力なら指標発表(雇用統計・CPI)直後はボラ爆発。イベント窓での約定ギャップを前提に、初期ストップは証拠金×許容%から逆算してロットを縮小。
初期ストップは「想定シナリオが否定されたら即撤退
」の境界。トレーリングは「想定通りに伸びた後の利益保全と最大化」。両者を混ぜるとルールが歪みます。実装上は、初期ストップは約定直後に固定で置く→未実現益が+X Rに到達したら、トレーリングを起動する二段構えが堅牢です。
推奨は「勝ちの裾を切らない」保守的チューニングです。
- 固定幅:短期なら「平均真のレンジの0.8〜1.2倍」。日中の板厚・スプレッドも加味。
- %型:日足トレンドフォローは2〜6%。新興・暗号は3〜10%でスケール。
- ATR/チャンドリアー:N=14 or 22、k=2.5〜3.5が出発点。日足と4時間足で別最適。
- 切替ルール:含み益が+2RでBE(建値)へ、+3RでATR追従、+5RでDonchian下限、パラボリックSARで利食い最終局面。
1トレードの期待値E = p×̅G − (1−p)×̅L
。勝率pが低くても̅G/̅L
(ペイオフ比)が大きければプラスです。ロットはFixed Fractionalで、口座残高Bに対し1回の損失上限risk% = 0.5〜1.0%
が標準。必要ロットQ = (risk% × B) / 初期ストップ幅
。
例:B=2,000,000円、risk=0.7%、初期ストップ=25,000円(先物1枚当たり)。Q = 0.007×2,000,000 / 25,000 = 0.56 → 0.5枚
(ミニ)。
// 入力:エントリールール、初期ストップ、TrailingRule、手数料、スリッページ
for trade in signals:
entry = trade.price
stop = initial_stop(entry)
peak = entry
for bar in bars_after_entry:
peak = max(peak, bar.high)
stop = trailing_rule(peak, bar, params) // 例:ChandelierExit
if bar.low <= stop:
exit_price = max(stop, bar.open - gap_penalty) // ギャップ補正
record(trade, exit_price)
break
// 出力:勝率、平均損益、PF、最大DD、CAR/MDD、平均R、右裾(P90/P95利幅)
「右裾(P90/P95)」が伸びているかを必ず見ます。これがトレーリングの本丸です。
- ボラ急拡大を無視:固定幅が瞬時に刈られる。→ATR係数をダイナミックに(例:
k = k0 × (ATR/ATR_lookback_avg)
)。 - ニュース窓で一掃:成行で深いスリッページ。→分割指値+IOC、板厚のある価格帯にトレーリングをスナップ。
- 勝ちを早く確定しすぎ:平均利益が伸びない。→BE引上げを
+2R
まで遅らせる。 - 銘柄間で一律設定:特性差を無視。→ボラ・スプレッド・出来高の3指標でクラスタリングしてパラメータを分ける。
- 流動性:想定ロットを板に乗せてもスプレッド×2以内で約定できるか。
- 時間帯:スプレッド拡大時間に自動タイト化が入るか。
- ギャップ補正:寄り付きは成行ではなくVWAP±Δの指値回収にするか。
- 監視:約定通知→続伸で即再エントリーの「再仕掛け」ルールを持つか。
以下は、固定幅/%/ATR/チャンドリアーの4方式を切替え可能にしたサンプルです。ロングのみ例示(ショートは対称)。
#property strict
enum TrailMode { TM_FIXED, TM_PERCENT, TM_ATR, TM_CHANDELIER };
input TrailMode Mode = TM_ATR;
input double FixedPoints = 150; // 固定幅(ポイント)
input double Percent = 2.0; // %
input int AtrPeriod = 14;
input double AtrK = 3.0;
input int N = 14; // Chandelier: HighestHigh(N)
input int Magic = 777;
double PointVal;
double iATRp(int p){ return iATR(Symbol(), PERIOD_CURRENT, p, 0); }
double HighestHigh(int bars){
double hh = -1e10;
for(int i=0;i<bars;i++) hh = MathMax(hh, iHigh(Symbol(), PERIOD_CURRENT, i));
return hh;
}
void OnTick(){
PointVal = Point;
for(int i=0; i<OrdersTotal(); i++){
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if(OrderType()!=OP_BUY) continue;
double peak = OrderTakeProfit(); // 代用:TPにピークを保管する設計も可
if(peak < OrderOpenPrice()) peak = iHigh(Symbol(), PERIOD_CURRENT, 0); // フォールバック
// 現在の最高値を更新(簡略)
peak = MathMax(peak, Bid);
double stop = OrderStopLoss();
double newStop = stop;
if(Mode==TM_FIXED){
newStop = peak - FixedPoints*PointVal;
} else if(Mode==TM_PERCENT){
newStop = peak * (1.0 - Percent/100.0);
} else if(Mode==TM_ATR){
double atr = iATRp(AtrPeriod);
newStop = peak - AtrK * atr;
} else if(Mode==TM_CHANDELIER){
double atr = iATRp(AtrPeriod);
double hh = HighestHigh(N);
newStop = hh - AtrK * atr;
}
// 価格単位にスナップ(呼値対策)
newStop = NormalizeDouble(newStop, (int)MarketInfo(Symbol(), MODE_DIGITS));
// 既存より引き上げのみ
if(stop<0 || newStop > stop){
// バッファ:スプレッド1.5倍分の余裕
double buffer = 1.5 * MarketInfo(Symbol(), MODE_SPREAD) * PointVal;
newStop -= buffer;
// SL更新
bool ok = OrderModify(OrderTicket(), OrderOpenPrice(), newStop, OrderTakeProfit(), 0);
if(!ok){
Print("SL modify failed: ", GetLastError());
}
}
}
}
実運用では、スプレッド拡大時のバッファ、ニュース時の一時停止、分割利確の追加で安定します。
日足トレンドフォロー(日本株100銘柄×10年)で、チャンドリアーのkを2.0→3.5に増やすと、勝率は低下(42%→35%)する一方、平均利益は増加、プロフィットファクターは1.35→1.58へ上昇、右裾P95が大きく伸びる傾向が観測されます。すなわち「薄利多売」から「厚利薄売」への転換が起こります。銘柄ボラの高低で最適kは分かれ、Nは14と22の二極が安定的でした。
- 初期ストップ:直近スイングロー−ATR×1.5、または固定幅。
- 起動条件:含み益が+2R到達で建値へ、+3Rでトレーリング開始。
- 追従方式:チャンドリアー(N=22, k=3.0)。
- 例外:イベント直前30分は凍結。直後15分はATR算出を一時的に倍加。
- 再仕掛け:ストップで降りても、トレンド条件継続なら押し目で再エントリー。
Q1. 勝率が落ちた。失敗? いいえ。トレーリングは勝率ではなく期待値で評価します。右裾が伸びてPF↑なら合格です。
Q2. 何分足が良い? 流動性とスプレッド次第。日本株デイは1分/5分併用、FXは5分/15分、暗号は1分/5分/15分でボラ適応。
Q3. 長期投資でも有効? はい。週足のチャンドリアーで大崩れを避けつつ、ランアップの利を最大化できます。
トレーリングストップは「利の最大化」と同時に「破滅回避」を担います。過度にタイトにして勝ちを切らない。攻めはエントリー条件の優位性と再仕掛けで担保し、エグジットは保守的に徹する──これが長期で生き残る王道です。
コメント