这是一个基于SuperTrend指标、指数移动平均线(EMA)和平均真实波幅(ATR)的趋势跟踪策略。该策略通过多重技术指标的配合使用,结合初始止损和移动止损,实现了对市场趋势的动态跟踪和风险控制。策略的核心在于通过SuperTrend指标捕捉趋势方向的变化,同时利用EMA进行趋势确认,并设置双重止损机制保护盈利。
策略运作基于以下几个核心组件: 1. SuperTrend指标用于识别趋势方向的变化,该指标基于ATR周期为16,因子为3.02进行计算 2. 49周期的EMA作为趋势过滤器,用于确认趋势方向 3. 初始止损设置为50点,为每笔交易提供基础保护 4. 移动止损在盈利达到70点后激活,动态跟踪价格变化
当SuperTrend方向向下转变且收盘价位于EMA之上时,系统在没有持仓的情况下发出做多信号。相反,当SuperTrend方向向上转变且收盘价位于EMA之下时,系统发出做空信号。
这是一个结合了多重技术指标和风险控制机制的完整交易策略。通过SuperTrend指标捕捉趋势,EMA确认方向,配合双重止损机制,实现了较好的风险收益比。策略的优化空间主要在于参数动态调整、市场环境判断和风险管理系统的完善。在实际应用中,建议进行充分的历史数据回测,并根据具体交易品种的特性调整参数。
/*backtest
start: 2024-01-17 00:00:00
end: 2025-01-15 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/
//@version=5
strategy(" nifty supertrend triton", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// Input parameters
atrPeriod = input.int(16, "ATR Length", step=1)
factor = input.float(3.02, "Factor", step=0.01)
maPeriod = input.int(49, "Moving Average Period", step=1)
trailPoints = input.int(70, "Trailing Points", step=1) // Points after which trailing stop activates
initialStopLossPoints = input.int(50, "Initial Stop Loss Points", step=1) // Initial stop loss of 50 points
// Calculate Supertrend
[_, direction] = ta.supertrend(factor, atrPeriod)
// Calculate EMA
ema = ta.ema(close, maPeriod)
// Variables to track stop loss levels
var float trailStop = na
var float entryPrice = na
var float initialStopLoss = na // To track the initial stop loss
// Generate buy and sell signals
if ta.change(direction) < 0 and close > ema
if strategy.position_size == 0 // Only open a new long position if no current position
strategy.entry("Buy", strategy.long)
entryPrice := close // Record the entry price for the long position
initialStopLoss := entryPrice - initialStopLossPoints // Set initial stop loss for long position
trailStop := na // Reset trailing stop for long
if ta.change(direction) > 0 and close < ema
if strategy.position_size == 0 // Only open a new short position if no current position
strategy.entry("Sell", strategy.short)
entryPrice := close // Record the entry price for the short position
initialStopLoss := entryPrice + initialStopLossPoints // Set initial stop loss for short position
trailStop := na // Reset trailing stop for short
// Apply initial stop loss for long positions
if (strategy.position_size > 0) // Check if in a long position
if close <= initialStopLoss // If the price drops to or below the initial stop loss
strategy.close("Buy", "Initial Stop Loss Hit") // Exit the long position
// Apply trailing stop logic for long positions
if (strategy.position_size > 0) // Check if in a long position
if (close - entryPrice >= trailPoints) // If the price has moved up by the threshold
trailStop := na(trailStop) ? close - trailPoints : math.max(trailStop, close - trailPoints) // Adjust trailing stop upwards
if not na(trailStop) and close < trailStop // If the price drops below the trailing stop
strategy.close("Buy", "Trailing Stop Hit") // Exit the long position
// Apply initial stop loss for short positions
if (strategy.position_size < 0) // Check if in a short position
if close >= initialStopLoss // If the price rises to or above the initial stop loss
strategy.close("Sell", "Initial Stop Loss Hit") // Exit the short position
// Apply trailing stop logic for short positions
if (strategy.position_size < 0) // Check if in a short position
if (entryPrice - close >= trailPoints) // If the price has moved down by the threshold
trailStop := na(trailStop) ? close + trailPoints : math.min(trailStop, close + trailPoints) // Adjust trailing stop downwards
if not na(trailStop) and close > trailStop // If the price rises above the trailing stop
strategy.close("Sell", "Trailing Stop Hit") // Exit the short position