トレーリングストップとは何か
価格が有利に進むほどストップ位置を段階的に切り上げ(ロングの場合)、不利に動いたら即時に損切りを発動する仕組みです。利確目標を置かなくても、トレンドの続く限り利益を伸ばし、トレンドが止まった時点で市場が自動的にあなたをポジションから“降ろす”イメージです。
固定幅 vs 変動幅(ボラ基準)
- 固定幅型:常に一定ピップス/一定%で追随。単純だが、相場の“荒さ”を無視するため過剰損切り/過剰ホールドが起きやすい。
- ボラ基準型:平均的な値動きの大きさ(ATR等)に比例して追随幅が自動調整。資産曲線の滑らかさと再現性が増す。
設計のコア:R倍数と初期ストップ
すべての判断は「初期リスク(R)」から逆算します。Rはエントリー価格と初期ストップの差です。Rを決めればロットも資金管理も自動的に決まります。
ロット計算(FXの例)
口座資金1,000,000円、1トレードの許容リスク1%(=10,000円)、初期ストップ幅=40pips、USD/JPYの1pips価値=100円のとき、許容pips価値×ロット=10,000円 ⇒ ロット=10,000÷(40×100)=2.5万通貨です。
ブレークイーブン(建値)移動の条件
含み益が1R(=初期ストップ幅分)進んだら、ストップを建値まで切り上げるのが基本です。これで「リスクはすでにゼロ」という状態を素早く作れます。
代表的なトレーリング手法
1) 固定幅トレール
価格から一定距離(例:30pips)を常に維持します。ボラ変化に弱いので、初心者は最初の学習用に限定するのがおすすめです。
2) ATRトレール
ATR(Average True Range)を使い、ストップ=価格 − k × ATR(n)
(ロング)で追随します。n=14
、k=2.5〜3.5
が出発点です。
3) チャンデリア・エグジット
ロングでは一定期間の最高値からk × ATR
を差し引いた値にストップを置きます。ストップ=最高値(22) − 3×ATR(22)
など。トレンドフォローと相性が抜群です。
4) 段階式トレール(ステップ)
10pips進むごとにストップを10pips切り上げる等の階段式。板の歪みや指値の癖が強い銘柄で有効な場面があります。
5) 移動平均追随
EMA20やSMA50の終値割れで手仕舞い。裁量寄りですが、ルール化すれば自動化可能です。
実務ルール:これだけでブレない
- 初期ストップは必ず置く(ATRベースが無難)。
- 1R到達で建値へ(損失ゼロ化)。
- 2R到達でトレールを広げる/縮める(相場の荒さに応じてkを±0.5調整)。
- ストップは絶対に広げない(下げるのはOK、戻すのはNG)。
- 銘柄/通貨ペアごとに最適kを別管理(一律運用はしない)。
数値シミュレーション:3つの典型シナリオ
A. 素直なトレンド
USD/JPYを145.00ロング、初期ストップ144.60(40pips)。ATR(14)=0.35円、k=3.0。価格が146.40まで進行(+140pips=3.5R)。ストップは最高値−3×ATR ≒ 146.40 − 1.05 = 145.35
。結果、押しで刈られても+35pips(0.9R)を確保。
B. 乱高下(ノイズ大)
ATRが拡大すればトレールも緩むため、刈られにくい反面、戻りで利益返却が増えます。kを+0.5して「伸ばすときは大きく」を優先。
C. ギャップダウン
現物株や先物の寄り付きギャップでストップ滑りは不可避です。成行型のストップを前提に、スリッページを想定したリスク設計(1トレードの許容損失を通常の0.7倍に)で吸収します。
バックテスト設計の勘所
- 評価指標:勝率、平均損益(R)、プロフィットファクター、最大ドローダウン、MARレシオ(CAGR/MaxDD)、期待値
E=WinRate×AvgWin − (1−WinRate)×AvgLoss
。 - 期間分割:インサンプル/アウトサンプルのウォークフォワード。ATR窓やkは都度再最適化。
- ロバスト性:k±0.5、期間±20%の微調整でも成績が崩れないかを確認。
- モンテカルロ:順序シャッフルによる資産曲線の分散を把握。破綻確率(Risk of Ruin)を推定。
MQL4による自動化(EA)
以下のEAは、固定/ATR/チャンデリアの3方式に対応し、建値移動とステップ改定を備えています。裁量エントリーでも、別EAのエントリーでも、出口だけ機械化できます。
//+------------------------------------------------------------------+
//| Simple ATR/Chandelier Trailing Stop EA (for MT4) |
//| Works for one symbol; apply per chart. |
//+------------------------------------------------------------------+
#property strict
input int Magic = 240914;
input int Method = 1; // 0: Fixed, 1: ATR, 2: Chandelier
input double FixedPips = 30;
input int ATRPeriod = 14;
input double ATRmult = 3.0;
input bool UseBreakEven = true;
input double BreakEvenRR = 1.0; // move SL to BE at +1R
input double TrailStepPips = 5.0; // modify only if moved >= step
input int Slippage = 2;
double PointPips() { return (Digits==3 || Digits==5) ? Point*10 : Point; }
double PipsToPrice(double pips){ return pips*PointPips(); }
bool ModifySL(int ticket, double newSL){
if(!OrderSelect(ticket, SELECT_BY_TICKET)) return false;
double op = OrderOpenPrice();
double tp = OrderTakeProfit();
int type = OrderType();
double sl = OrderStopLoss();
// ensure SL only tightens (never widen)
if(type==OP_BUY && newSL>sl){
return OrderModify(ticket, op, NormalizeDouble(newSL, Digits), tp, 0, clrNONE);
}
if(type==OP_SELL && (sl==0 || newSL<sl)){
return OrderModify(ticket, op, NormalizeDouble(newSL, Digits), tp, 0, clrNONE);
}
return false;
}
void OnTick(){
for(int i=OrdersTotal()-1; i>=0; i--){
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol()!=_Symbol || OrderMagicNumber()!=Magic) continue;
int type = OrderType();
double price = (type==OP_BUY) ? Bid : Ask;
double sl = OrderStopLoss();
double risk = MathAbs(OrderOpenPrice()-sl); // initial risk approx
// Break-even logic
if(UseBreakEven && sl>0 && risk>0){
double move = (type==OP_BUY) ? (price-OrderOpenPrice()) : (OrderOpenPrice()-price);
if(move >= risk*BreakEvenRR){
double be = OrderOpenPrice();
if(type==OP_BUY && (sl==0 || be>sl)) ModifySL(OrderTicket(), be);
if(type==OP_SELL && (sl==0 || be<sl)) ModifySL(OrderTicket(), be);
}
}
// Compute candidate trailing SL
double newSL = sl;
if(Method==0){ // Fixed
if(type==OP_BUY) newSL = price - PipsToPrice(FixedPips);
else newSL = price + PipsToPrice(FixedPips);
}else if(Method==1){ // ATR
double atr = iATR(_Symbol, PERIOD_CURRENT, ATRPeriod, 0);
if(type==OP_BUY) newSL = price - ATRmult*atr;
else newSL = price + ATRmult*atr;
}else if(Method==2){ // Chandelier (HH/LL)
int lookback = MathMax(ATRPeriod, 22);
double atr = iATR(_Symbol, PERIOD_CURRENT, ATRPeriod, 0);
double hh = iHigh(_Symbol, PERIOD_CURRENT, iHighest(_Symbol, PERIOD_CURRENT, MODE_HIGH, lookback, 0));
double ll = iLow(_Symbol, PERIOD_CURRENT, iLowest(_Symbol, PERIOD_CURRENT, MODE_LOW, lookback, 0));
if(type==OP_BUY) newSL = hh - ATRmult*atr;
else newSL = ll + ATRmult*atr;
}
// Update only if moved at least TrailStepPips
if(sl==0){
ModifySL(OrderTicket(), newSL);
}else{
if(type==OP_BUY && newSL - sl >= PipsToPrice(TrailStepPips)) ModifySL(OrderTicket(), newSL);
if(type==OP_SELL && sl - newSL >= PipsToPrice(TrailStepPips)) ModifySL(OrderTicket(), newSL);
}
}
}
使い方:対象チャートに適用し、Method
とATRmult
、TrailStepPips
を調整します。既存ポジションにも追随ストップを適用します。必ずデモ口座で作動確認をしてから本番運用してください。
TradingView用 補助スクリプト
視覚的検証には以下のPine Scriptが便利です。売買は別ロジックでも、出口の妥当性検証に活用できます。
//@version=5
indicator("ATR Trailing Stop (Chandelier-like)", overlay=true)
atrLen = input.int(22)
k = input.float(3.0, step=0.1)
atr = ta.atr(atrLen)
hh = ta.highest(high, atrLen)
ll = ta.lowest(low, atrLen)
longStop = hh - k*atr
shortStop = ll + k*atr
plot(longStop, style=plot.style_linebr)
plot(shortStop, style=plot.style_linebr)
資金管理と破綻確率
勝率40%、平均勝ち=2.0R、平均負け=1.0Rなら期待値はE=0.4×2 − 0.6×1 = 0.2R
です。1トレードのリスクを1%に固定すれば、理論的には長期で増えます。資金曲線の乱高下を抑えるには、同時ポジション数の上限と相関の低い銘柄分散を徹底します。
よくある失敗と対策
- 建値移動が早すぎる:1R未満で建値に上げると“タッチで終了”が増えます。まずは1R厳守。
- ストップを広げる:ルール破りの王道。広げると期待値が崩れます。
- 複数手法を同時に混ぜる:日によって固定幅→ATRなど。検証不可能になります。一本化してください。
- ボラ拡大を無視:指標発表前後はATRが急拡大。kを上げるか、新規エントリーを停止します。
運用チェックリスト
- 初期ストップはATR基準で設定したか。
- 建値移動は1R達成後のみ実施しているか。
- トレール方式(固定/ATR/チャンデリア)は一貫しているか。
- 同時保有の相関は低いか(銘柄分散)。
- 週次でkと期間のロバスト性チェックをしているか。
まとめ:出口を決めれば、感情は静まる
トレーリングストップは、ルール化しやすく、再現性が高い出口です。最初はATR×3のチャンデリアから始め、1Rで建値、2R以降はkを微調整。これだけで「大負けを避けて、勝ちを伸ばす」ポートフォリオ運用の基盤ができます。
コメント