该策略的原始思路来源于 TradingView 用户 mohanee。策略使用 RSI 背离(RSI Divergence) 作为入场信号,并在 RSI 到达相反区域时寻找平仓机会。该剥头皮交易策略可以轻松通过 WunderTrading 实现自动化交易。
重要提示!
该策略不包含 Stop Loss(止损) 或 Trailing Stop(追踪止损) 设置。
该策略属于 逆势交易(Counter-Trend Entry) 策略。
新增了回测周期输入参数,允许您按月评估策略表现。
策略设置
适用市场:LTC-PERP(15分钟周期)
Input | Value |
Period | 15 |
RSI Period | 7 |
RSI Source | 15 |
Pivot Lookback Right | 3 |
Pivot Lookback Left | 4 |
Long Take Profit at RSI level | 77 |
Short Take Profit at RSI level | 19 |
Max of Lookback Range | 19 |
Min of Lookback Range | 6 |
Plot Bullish | True (active) |
Plot Hidden Bullish | True (active) |
Plot Bearish | True (active) |
Plot Hidden Bullish | False (not active) |
修订版策略脚本代码
您可以复制以下代码并粘贴到 TradingView 中使用。
//Updated by: WunderTrading
//Original Idea by: mohanee
//@version=5
strategy('RSI Divergence', shorttitle='RSI-DIV', overlay=false, pyramiding=2, commission_type=strategy.commission.percent, commission_value=0.07, default_qty_type=strategy.percent_of_equity, default_qty_value=100, currency=currency.USD)
ribbon_period = input.int(15, 'Period', step=1)
leadLine1 = ta.ema(close, ribbon_period)
leadLine2 = ta.sma(close, ribbon_period)
// p1 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1)
// p2 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1)
// fill(p1, p2, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)
len = input.int(title='RSI Period', minval=1, defval=7)
src = input(title='RSI Source', defval=close)
lbR = input(title='Pivot Lookback Right', defval=3)
lbL = input(title='Pivot Lookback Left', defval=4)
takeProfitRSILevel_long = input.int(title='Long Take Profit at RSI Level', minval=60, defval=77)
takeProfitRSILevel_short = input.int(title='Short Take Profit at RSI Level', maxval=30, defval=19)
rangeUpper = input(title='Max of Lookback Range', defval=19)
rangeLower = input(title='Min of Lookback Range', defval=6)
plotBull = input(title='Plot Bullish', defval=true)
plotHiddenBull = input(title='Plot Hidden Bullish', defval=true)
plotBear = input(title='Plot Bearish', defval=true)
plotHiddenBear = input(title='Plot Hidden Bearish', defval=false)
bearColor = color.purple
bullColor = color.green
hiddenBullColor = color.new(color.green, 80)
hiddenBearColor = color.new(color.red, 80)
textColor = color.white
noneColor = color.new(color.white, 100)
osc = ta.rsi(src, len)
plot(osc, title='RSI', linewidth=2, color=color.new(#8D1699, 0))
hline(50, title='Middle Line', linestyle=hline.style_dotted)
obLevel = hline(70, title='Overbought', linestyle=hline.style_dotted)
osLevel = hline(30, title='Oversold', linestyle=hline.style_dotted)
fill(obLevel, osLevel, title='Background', color=color.new(#9915FF, 90))
plFound = na(ta.pivotlow(osc, lbL, lbR)) ? false : true
phFound = na(ta.pivothigh(osc, lbL, lbR)) ? false : true
_inRange(cond) =>
bars = ta.barssince(cond == true)
rangeLower <= bars and bars <= rangeUpper
//------------------------------------------------------------------------
// Regular Bullish
// Osc: Higher Low
oscHL = osc[lbR] > ta.valuewhen(plFound, osc[lbR], 1) and _inRange(plFound[1])
// Price: Lower Low
priceLL = low[lbR] < ta.valuewhen(plFound, low[lbR], 1)
bullCond = plotBull and priceLL and oscHL and plFound
plot(plFound ? osc[lbR] : na, offset=-lbR, title='Regular Bullish', linewidth=2, color=bullCond ? bullColor : noneColor, transp=0)
plotshape(bullCond ? osc[lbR] : na, offset=-lbR, title='Regular Bullish Label', text=' Bull ', style=shape.labelup, location=location.absolute, color=color.new(bullColor, 0), textcolor=color.new(textColor, 0))
//------------------------------------------------------------------------------
// Hidden Bullish
// Osc: Lower Low
oscLL = osc[lbR] < ta.valuewhen(plFound, osc[lbR], 1) and _inRange(plFound[1])
// Price: Higher Low
priceHL = low[lbR] > ta.valuewhen(plFound, low[lbR], 1)
hiddenBullCond = plotHiddenBull and priceHL and oscLL and plFound
plot(plFound ? osc[lbR] : na, offset=-lbR, title='Hidden Bullish', linewidth=2, color=hiddenBullCond ? hiddenBullColor : noneColor, transp=0)
plotshape(hiddenBullCond ? osc[lbR] : na, offset=-lbR, title='Hidden Bullish Label', text=' H Bull ', style=shape.labelup, location=location.absolute, color=color.new(bullColor, 0), textcolor=color.new(textColor, 0))
//------------------------------------------------------------------------
// Regular Bearish
// Osc: Lower High
oscLH = osc[lbR] < ta.valuewhen(phFound, osc[lbR], 1) and _inRange(phFound[1])
// Price: Higher High
priceHH = high[lbR] > ta.valuewhen(phFound, high[lbR], 1)
bearCond = plotBear and priceHH and oscLH and phFound
plot(phFound ? osc[lbR] : na, offset=-lbR, title='Regular Bearish', linewidth=2, color=bearCond ? bearColor : noneColor, transp=0)
plotshape(bearCond ? osc[lbR] : na, offset=-lbR, title='Regular Bearish Label', text=' Bear ', style=shape.labeldown, location=location.absolute, color=color.new(bearColor, 0), textcolor=color.new(textColor, 0))
//------------------------------------------------------------------------------
// Hidden Bearish
// Osc: Higher High
oscHH = osc[lbR] > ta.valuewhen(phFound, osc[lbR], 1) and _inRange(phFound[1])
// Price: Lower High
priceLH = high[lbR] < ta.valuewhen(phFound, high[lbR], 1)
hiddenBearCond = plotHiddenBear and priceLH and oscHH and phFound
plot(phFound ? osc[lbR] : na, offset=-lbR, title='Hidden Bearish', linewidth=2, color=hiddenBearCond ? hiddenBearColor : noneColor, transp=0)
plotshape(hiddenBearCond ? osc[lbR] : na, offset=-lbR, title='Hidden Bearish Label', text=' H Bear ', style=shape.labeldown, location=location.absolute, color=color.new(bearColor, 0), textcolor=color.new(textColor, 0))
/// Strategy Conditions
entry_long = if leadLine2 < leadLine1
hiddenBullCond
else
bullCond
entry_price_long = ta.valuewhen(entry_long, close, 0)
exit_long = ta.crossover(osc, takeProfitRSILevel_long) // or bearCond
///// SHORT ////
entry_short = if leadLine2 > leadLine1
hiddenBearCond
else
bearCond
entry_price_short = ta.valuewhen(entry_short, close, 0)
exit_short = ta.crossunder(osc, takeProfitRSILevel_short) // or bullCond
///// BACKTEST PERIOD ///////
testStartYear = input(2019, 'Backtest Start Year')
testStartMonth = input(1, 'Backtest Start Month')
testStartDay = input(1, 'Backtest Start Day')
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)
testStopYear = input(9999, 'Backtest Stop Year')
testStopMonth = input(12, 'Backtest Stop Month')
testStopDay = input(31, 'Backtest Stop Day')
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)
testPeriod() =>
time >= testPeriodStart and time <= testPeriodStop ? true : false
if testPeriod()
if strategy.position_size == 0 or strategy.position_size > 0
strategy.entry(id='long', direction=strategy.long, when=entry_long, comment='Enter Long Comment')
strategy.close(id='long', when=exit_long, comment='Exit Long Comment')
if strategy.position_size == 0 or strategy.position_size < 0
strategy.entry(id='short', direction=strategy.short, when=entry_short, comment='Enter Short Comment')
strategy.close(id='short', when=exit_short, comment='Exit Short Comment')

