该策略是一个结合了成交量、价格动量和多重止盈止损的智能交易系统。它通过监控成交量异常波动、价格涨幅和动量指标的组合来识别潜在的交易机会,并使用分层的止盈止损管理来优化风险收益比。
该策略基于三个核心交易信号:1)成交量突破 - 当前成交量超过过去20个周期平均成交量的2倍;2)价格上涨 - 近期价格涨幅超过设定阈值;3)动量确认 - RSI大于55且价格位于50周期均线之上。当这三个条件同时满足时,系统会发出做多信号。策略采用三重止盈(15%、25%、35%)和三重止损(-2%、-5%、-10%)来管理持仓,每个价位平仓的仓位比例也可以灵活设置。
这是一个综合了多个技术分析要素的成熟交易策略。通过严格的信号筛选和灵活的仓位管理,在把握趋势性机会的同时也很好地控制了风险。虽然仍有优化空间,但整体设计合理,值得在实盘中验证和使用。
/*backtest
start: 2024-11-11 00:00:00
end: 2024-12-10 08:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Volume Spike & Momentum Strategy with Alerts", overlay=true)
// Inputs for customization
priceGainPercent = input.float(5, title="Minimum Price Gain (%)", minval=1)
volumeLookback = input.int(20, title="Volume Lookback Period (Bars)", minval=1)
momentumSmaLength = input.int(50, title="SMA Length for Momentum (Bars)", minval=1)
rsiThreshold = input.float(55, title="RSI Threshold for Momentum", minval=1)
// Take Profit percentages
tp1Percent = input.float(15, title="Take Profit 1 (%)", minval=1)
tp2Percent = input.float(25, title="Take Profit 2 (%)", minval=1)
tp3Percent = input.float(35, title="Take Profit 3 (%)", minval=1)
// Percentage of position to close at each take-profit
tp1ClosePercent = input.float(30, title="Close % at TP1", minval=1, maxval=100)
tp2ClosePercent = input.float(40, title="Close % at TP2", minval=1, maxval=100)
tp3ClosePercent = input.float(30, title="Close % at TP3", minval=1, maxval=100)
// Stop-loss percentages
sl1Percent = input.float(2, title="Stop Loss 1 (%)", minval=0.1)
sl2Percent = input.float(5, title="Stop Loss 2 (%)", minval=0.1)
sl3Percent = input.float(10, title="Stop Loss 3 (%)", minval=0.1)
// Percentage of position to close at each stop-loss
sl1ClosePercent = input.float(30, title="Close % at SL1", minval=1, maxval=100)
sl2ClosePercent = input.float(40, title="Close % at SL2", minval=1, maxval=100)
sl3ClosePercent = input.float(30, title="Close % at SL3", minval=1, maxval=100)
// Detect volume spikes
avgVolume = ta.sma(volume, volumeLookback) // Average volume over the last X bars (customizable)
volumeSpike = volume > avgVolume * 2 // Spike in volume if current volume is 2x the average
// Detect price gain over the recent period (e.g., 5-10% gain over the last X bars)
priceChangePercent = (close - ta.lowest(close, 5)) / ta.lowest(close, 5) * 100
priceGainCondition = priceChangePercent >= priceGainPercent
// Check for overall momentum using an SMA and RSI
longTermSma = ta.sma(close, momentumSmaLength)
rsi = ta.rsi(close, 14)
momentumCondition = close > longTermSma and rsi >= rsiThreshold
// Store the entry price on a new trade
var float entryPrice = na
if (strategy.opentrades == 0 and (volumeSpike and priceGainCondition and momentumCondition))
entryPrice := close // Capture the entry price on a new trade
// Calculate take-profit levels based on the entry price
tp1Price = entryPrice * (1 + tp1Percent / 100)
tp2Price = entryPrice * (1 + tp2Percent / 100)
tp3Price = entryPrice * (1 + tp3Percent / 100)
// Calculate stop-loss levels based on the entry price
sl1Price = entryPrice * (1 - sl1Percent / 100)
sl2Price = entryPrice * (1 - sl2Percent / 100)
sl3Price = entryPrice * (1 - sl3Percent / 100)
// Exit conditions for multiple take-profits
tp1Condition = high >= tp1Price // Exit partial if price hits take-profit 1
tp2Condition = high >= tp2Price // Exit partial if price hits take-profit 2
tp3Condition = high >= tp3Price // Exit full if price hits take-profit 3
// Exit conditions for multiple stop-losses
sl1Condition = low <= sl1Price // Exit partial if price hits stop-loss 1
sl2Condition = low <= sl2Price // Exit partial if price hits stop-loss 2
sl3Condition = low <= sl3Price // Exit full if price hits stop-loss 3
// Buy Condition: When volume spike, price gain, and momentum conditions are met
if (volumeSpike and priceGainCondition and momentumCondition)
strategy.entry("Buy", strategy.long)
// Alerts for conditions
alertcondition(volumeSpike and priceGainCondition and momentumCondition, title="Entry Alert", message="Entry conditions met: Volume spike, price gain, and momentum detected!")
alertcondition(tp1Condition, title="Take Profit 1", message="Take Profit 1 hit!")
alertcondition(tp2Condition, title="Take Profit 2", message="Take Profit 2 hit!")
alertcondition(tp3Condition, title="Take Profit 3", message="Take Profit 3 hit!")
alertcondition(sl1Condition, title="Stop Loss 1", message="Stop Loss 1 hit!")
alertcondition(sl2Condition, title="Stop Loss 2", message="Stop Loss 2 hit!")
alertcondition(sl3Condition, title="Stop Loss 3", message="Stop Loss 3 hit!")
// Exit conditions: Multiple take-profits and stop-losses
if (tp1Condition)
strategy.exit("Take Profit 1", "Buy", limit=tp1Price, qty_percent=tp1ClosePercent)
if (tp2Condition)
strategy.exit("Take Profit 2", "Buy", limit=tp2Price, qty_percent=tp2ClosePercent)
if (tp3Condition)
strategy.exit("Take Profit 3", "Buy", limit=tp3Price, qty_percent=tp3ClosePercent)
// Stop-loss exits
if (sl1Condition)
strategy.exit("Stop Loss 1", "Buy", stop=sl1Price, qty_percent=sl1ClosePercent)
if (sl2Condition)
strategy.exit("Stop Loss 2", "Buy", stop=sl2Price, qty_percent=sl2ClosePercent)
if (sl3Condition)
strategy.exit("Stop Loss 3", "Buy", stop=sl3Price, qty_percent=sl3ClosePercent)
// Plotting take-profit and stop-loss levels on the chart
plot(tp1Price, color=color.green, style=plot.style_linebr, title="TP1 Level")
plot(tp2Price, color=color.green, style=plot.style_linebr, title="TP2 Level")
plot(tp3Price, color=color.green, style=plot.style_linebr, title="TP3 Level")
plot(sl1Price, color=color.red, style=plot.style_linebr, title="SL1 Level")
plot(sl2Price, color=color.red, style=plot.style_linebr, title="SL2 Level")
plot(sl3Price, color=color.red, style=plot.style_linebr, title="SL3 Level")