本策略是一个结合了移动平均线交叉和相对强弱指数(RSI)的量化交易系统,同时集成了追踪止损功能。该策略采用9周期和21周期两条移动平均线作为主要趋势判断指标,配合RSI指标进行交易信号的确认,并通过动态追踪止损来保护盈利和控制风险。策略设计充分考虑了市场趋势、动量和风险管理三个维度,形成了一个完整的交易体系。
策略的核心逻辑基于以下几个关键要素: 1. 趋势识别: 通过快速(9周期)和慢速(21周期)移动平均线的交叉来识别市场趋势的变化。当快线上穿慢线且RSI大于55时,产生做多信号;当快线下穿慢线且RSI小于45时,产生做空信号。 2. 信号确认: 使用RSI作为信号过滤器,通过设定RSI阈值来提高交易信号的可靠性。 3. 风险控制: 采用1%的追踪止损,动态调整止损位置以保护盈利。同时设置基于RSI的获利了结条件,当RSI超过80或低于22时分别平仓多头和空头头寸。 4. 止损机制: 结合固定止损和追踪止损,当价格突破入场点位的预设百分比或触及追踪止损线时,自动平仓出场。
该策略通过结合技术分析中的经典指标,构建了一个兼具趋势跟踪和动量特征的交易系统。其核心优势在于多维度的信号确认机制和完善的风险管理体系。通过持续优化和改进,该策略有望在不同市场环境下保持稳定的表现。建议交易者在实盘使用前,进行充分的回测验证,并根据具体交易品种的特性调整参数设置。
/*backtest
start: 2019-12-23 08:00:00
end: 2024-11-27 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("ojha's Intraday MA Crossover + RSI Strategy with Trailing Stop", overlay=true)
// Define Moving Averages
fastLength = 9
slowLength = 21
fastMA = ta.sma(close, fastLength)
slowMA = ta.sma(close, slowLength)
// Define RSI
rsiPeriod = 14
rsiValue = ta.rsi(close, rsiPeriod)
// Define Conditions for Long and Short
longCondition = ta.crossover(fastMA, slowMA) and rsiValue > 55
shortCondition = ta.crossunder(fastMA, slowMA) and rsiValue < 45
// Define the trailing stop distance (e.g., 1% trailing stop)
trailingStopPercent = 1.0
// Variables to store the entry candle high and low
var float longEntryLow = na
var float shortEntryHigh = na
// Variables for trailing stop levels
var float longTrailingStop = na
var float shortTrailingStop = na
// Exit conditions
exitLongCondition = rsiValue > 80
exitShortCondition = rsiValue < 22
// Stop-loss conditions (price drops below long entry candle low * 1% or exceeds short entry candle high * 1%)
longStopLoss = longEntryLow > 0 and close < longEntryLow * 0.99
shortStopLoss = shortEntryHigh > 0 and close > shortEntryHigh * 1.01
// Execute Buy Order and store the entry candle low for long stop-loss
if (longCondition)
strategy.entry("Long", strategy.long)
longEntryLow := low // Store the low of the candle where long entry happened
longTrailingStop := close * (1 - trailingStopPercent / 100) // Initialize trailing stop at entry
// Execute Sell Order and store the entry candle high for short stop-loss
if (shortCondition)
strategy.entry("Short", strategy.short)
shortEntryHigh := high // Store the high of the candle where short entry happened
shortTrailingStop := close * (1 + trailingStopPercent / 100) // Initialize trailing stop at entry
// Update trailing stop for long position
if (strategy.opentrades > 0 and strategy.position_size > 0)
longTrailingStop := math.max(longTrailingStop, close * (1 - trailingStopPercent / 100)) // Update trailing stop as price moves up
// Update trailing stop for short position
if (strategy.opentrades > 0 and strategy.position_size < 0)
shortTrailingStop := math.min(shortTrailingStop, close * (1 + trailingStopPercent / 100)) // Update trailing stop as price moves down
// Exit Buy Position when RSI is above 80, Stop-Loss triggers, or trailing stop is hit
if (exitLongCondition or longStopLoss or close < longTrailingStop)
strategy.close("Long")
longEntryLow := na // Reset the entry low after the long position is closed
longTrailingStop := na // Reset the trailing stop
// Exit Sell Position when RSI is below 22, Stop-Loss triggers, or trailing stop is hit
if (exitShortCondition or shortStopLoss or close > shortTrailingStop)
strategy.close("Short")
shortEntryHigh := na // Reset the entry high after the short position is closed
shortTrailingStop := na // Reset the trailing stop
// Plot Moving Averages on the Chart
plot(fastMA, color=color.green, title="9-period MA")
plot(slowMA, color=color.red, title="21-period MA")
// Plot RSI on a separate panel
rsiPlot = plot(rsiValue, color=color.blue, title="RSI")
hline(50, "RSI 50", color=color.gray)
hline(80, "RSI 80", color=color.red)
hline(22, "RSI 22", color=color.green)
// Plot Trailing Stop for Visualization
plot(longTrailingStop, title="Long Trailing Stop", color=color.red, linewidth=1, style=plot.style_line)
plot(shortTrailingStop, title="Short Trailing Stop", color=color.green, linewidth=1, style=plot.style_line)