
双均線交差トレンド追跡戦略は,技術分析と総合的なリスク管理を組み合わせた定量化取引システムである.この戦略の核心は,急速なシンプル移動平均 ((Fast SMA) と遅いシンプル移動平均 ((Slow SMA) の交差信号を利用して,市場トレンドの変化を認識し,複数のリスク制御機構によって資金の安全を確保する.この戦略は,Pine Scriptプラットフォームで実装され,複数の取引品種のトレンド追跡取引に適用される.
この戦略は2つのSMAの間の相互作用に基づいて取引決定を行います.
信号生成メカニズム:
タイムコントロールを実行: 戦略は,K線の閉盤時にすべての取引決定を実行し,前向きな偏差を避け,反測結果の信頼性と真実性を確保する.
資金管理システム:
多層のリスク管理:
この戦略は,均線交差でトレンドをキャプチャし,取引の安全性と持続性を確保するために,包括的なリスク管理措置を使用します.
トレンド認識の強力な仕組み:
資金管理の精度:
複数のレベルのリスク保護:
取引実行の時間順の制御:
process_orders_on_close=trueパラメータは,実際の取引環境に合わせて注文処理を保証します.適応した追跡・止損システム:
トレンド認識の遅れ:
固定パラメータの適応性問題:
ストップダメージの起動時刻を追跡する:
資金管理のリスク:
テクノロジーの限界:
信号生成機構の最適化:
リスク管理システムの強化:
入学最適化:
フォローアップと評価の枠組み:
技術の進歩:
双均線交叉トレンド追跡戦略は,クラシックな技術分析方法と現代的なリスク管理理念を組み合わせた完全な取引システムである.その核心的な優点は,簡潔で明確なトレンド識別機構と多層のリスク制御システムであり,特に,精密な資金管理と高度なトラッキングストップ・メカニズムは,戦略に良好なリスク調整報酬の可能性を提供します.
しかし,この戦略は,移動平均に固有の遅滞性やパラメータの適応性などの課題にも直面している.適応パラメータの導入,信号フィルタリングの強化,リスク管理システムの改善により,戦略の性能がさらに向上する見込みがある.
全体として,これは,中長期のトレンド追跡システムの基礎として適した,構造的で論理的に明確な量化戦略の枠組みであり,特に傾向が顕著な市場に適用されます. 取引者にとって,リスク管理理念を理解して掌握することは,戦略のパラメータを単純に複製するよりも重要であり,この戦略の最も価値のある部分です.
/*backtest
start: 2025-06-04 00:00:00
end: 2025-06-11 00:00:00
period: 5m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy(title="Dual SMA Crossover Strategy", overlay=true, calc_on_every_tick=false, process_orders_on_close=true)
// --- Inputs ---
// SMA Lengths
fast_length = input.int(24, title="Fast SMA Length", minval=1)
slow_length = input.int(48, title="Slow SMA Length", minval=1)
// Risk Management
risk_per_trade_percent = input.float(2.0, title="Risk Per Trade (%)", minval=0.1, maxval=10.0, step=0.1) // % of equity to risk per trade
stop_loss_percent = input.float(0.8, title="Stop Loss (%)", minval=0.1, step=0.1) // % from entry price
risk_reward_ratio = input.float(2.0, title="Risk-Reward Ratio", minval=0.5, step=0.1) // 2.0 = 2R, 3.0 = 3R etc.
// Advanced Trailing Stop Loss
trailing_start_percent = input.float(1.0, title="Trailing Stop Start (%)", minval=0.1, step=0.1) // % profit to activate TSL
trailing_stop_percent = input.float(0.5, title="Trailing Stop Trail (%)", minval=0.1, step=0.1) // % to trail by once activated
// --- Calculations ---
// Calculate SMAs
fast_sma = ta.sma(close, fast_length)
slow_sma = ta.sma(close, slow_length)
// Plot SMAs on chart
plot(fast_sma, color=color.blue, title="Fast SMA")
plot(slow_sma, color=color.red, title="Slow SMA")
// Crossover conditions (calculated on previous bar to prevent look-ahead bias)
long_condition = ta.crossover(fast_sma[1], slow_sma[1])
short_condition = ta.crossunder(fast_sma[1], slow_sma[1])
// --- Money Management and Position Sizing ---
// Calculate account equity and risk amount
account_equity = strategy.initial_capital + strategy.netprofit
risk_amount = account_equity * (risk_per_trade_percent / 100)
// Calculate Stop Loss price based on entry and SL percentage
var float long_stop_price = na
var float short_stop_price = na
var float long_take_profit_price = na
var float short_take_profit_price = na
// --- Trailing Stop Loss Variables ---
var float trailing_long_activated_price = na // Price at which TSL is activated for long
var float trailing_short_activated_price = na // Price at which TSL is activated for short
var float current_trailing_stop_long = na
var float current_trailing_stop_short = na
var bool is_long_trailing_active = false
var bool is_short_trailing_active = false
// --- Strategy Entry and Exit Orders ---
if long_condition
// Reset TSL variables for a new entry
trailing_long_activated_price := na
current_trailing_stop_long := na
is_long_trailing_active := false
// Calculate SL, TP for long entry
long_stop_price := close * (1 - stop_loss_percent / 100) // SL below entry
long_take_profit_price := close * (1 + (stop_loss_percent * risk_reward_ratio) / 100) // TP above entry based on RRR
// Calculate position size for long entry
price_change_per_unit = close * (stop_loss_percent / 100)
if price_change_per_unit > 0
long_quantity = risk_amount / price_change_per_unit
strategy.entry("Long", strategy.long, qty=long_quantity, comment="Buy Signal")
else
strategy.entry("Long", strategy.long, comment="Buy Signal (Risk calculation skipped)") // Fallback if SL is 0 or negative
if short_condition
// Reset TSL variables for a new entry
trailing_short_activated_price := na
current_trailing_stop_short := na
is_short_trailing_active := false
// Calculate SL, TP for short entry
short_stop_price := close * (1 + stop_loss_percent / 100) // SL above entry
short_take_profit_price := close * (1 - (stop_loss_percent * risk_reward_ratio) / 100) // TP below entry based on RRR
// Calculate position size for short entry
price_change_per_unit = close * (stop_loss_percent / 100)
if price_change_per_unit > 0
short_quantity = risk_amount / price_change_per_unit
strategy.entry("Short", strategy.short, qty=short_quantity, comment="Sell Signal")
else
strategy.entry("Short", strategy.short, comment="Sell Signal (Risk calculation skipped)") // Fallback if SL is 0 or negative
// --- Stop Loss, Take Profit, Trailing Stop Logic ---
// Long position management
if strategy.position_size > 0 // We are in a long position
entry_price = strategy.opentrades.entry_price(0)
current_profit_percent = ((close - entry_price) / entry_price) * 100
// Initial SL and TP set at entry
strategy.exit("Exit Long", from_entry="Long", stop=long_stop_price, limit=long_take_profit_price, comment="TP/SL Long")
// Check for Trailing Stop activation
if not is_long_trailing_active and current_profit_percent >= trailing_start_percent
is_long_trailing_active := true
// Set initial trailing stop when activated
trailing_long_activated_price := high // Or close, depending on preference
current_trailing_stop_long := high * (1 - trailing_stop_percent / 100)
// If trailing stop is active, update it
if is_long_trailing_active
// Only move the trailing stop up (for long positions)
potential_new_stop = high * (1 - trailing_stop_percent / 100)
current_trailing_stop_long := math.max(current_trailing_stop_long, potential_new_stop)
// Ensure trailing stop is not below the initial long_stop_price
// This prevents the trailing stop from being less protective than the initial SL if the price drops after activation.
current_trailing_stop_long := math.max(current_trailing_stop_long, long_stop_price)
strategy.exit("Trailing Exit Long", from_entry="Long", stop=current_trailing_stop_long, comment="Trailing SL Long")
// Short position management
if strategy.position_size < 0 // We are in a short position
entry_price = strategy.opentrades.entry_price(0)
current_profit_percent = ((entry_price - close) / entry_price) * 100
// Initial SL and TP set at entry
strategy.exit("Exit Short", from_entry="Short", stop=short_stop_price, limit=short_take_profit_price, comment="TP/SL Short")
// Check for Trailing Stop activation
if not is_short_trailing_active and current_profit_percent >= trailing_start_percent
is_short_trailing_active := true
// Set initial trailing stop when activated
trailing_short_activated_price := low // Or close, depending on preference
current_trailing_stop_short := low * (1 + trailing_stop_percent / 100)
// If trailing stop is active, update it
if is_short_trailing_active
// Only move the trailing stop down (for short positions)
potential_new_stop = low * (1 + trailing_stop_percent / 100)
current_trailing_stop_short := math.min(current_trailing_stop_short, potential_new_stop)
// Ensure trailing stop is not above the initial short_stop_price
current_trailing_stop_short := math.min(current_trailing_stop_short, short_stop_price)
strategy.exit("Trailing Exit Short", from_entry="Short", stop=current_trailing_stop_short, comment="Trailing SL Short")
// Plot background color to indicate active position (optional)
bgcolor(strategy.position_size > 0 ? color.new(color.green, 90) : na, title="Long Position Background")
bgcolor(strategy.position_size < 0 ? color.new(color.red, 90) : na, title="Short Position Background")