布林带下叉RSI回调交易策略Trading-Strategy-of-Short-Selling-When-Bollinger-Band-Crosses-Below-Price-with-RSI-Callback
ChaoZhang · PineScript · Mean Reversion · 2023-12-26 12:08:44
Context terms
Overview
This strategy utilizes Bollinger Bands to determine if price has entered the overbought area and combines RSI indicator to identify callback opportunities. It goes short when a death cross is formed in the overbought area and stops out when price rises back above the Bollinger Upper Band.
Advantages
Advantages of this strategy:
- Bollinger Bands determine overbought/oversold levels accurately, improving trade success rate
- RSI filters out false breakout signals, avoiding unnecessary losses
- High risk to reward ratio obtained by effectively controlling risk
Risks
Risks in this strategy:
- Price may continue going up after breaking above Upper Band, leading to further losses
- Failure of timely RSI pullback results in loss amplification
- Unidirectional short position leaves no room for trading in consolidation
Risks can be minimized by:
- Adjusting stop loss properly for timely stop out
- Adding indicators to confirm RSI callback
- Using moving averages to determine consolidation
Optimization
This strategy can be improved on:
- Optimizing Bollinger parameters for more assets
- Fine tuning RSI parameters for better signals
- Adding more indicators to pinpoint trend reversal points
- Incorporating long trade logic
- Implement dynamic stop loss based on volatility
Summary
In summary, this is a typical overbought quick short scalping strategy. It capitalizes on Bollinger Bands for trade entries and RSI to filter signals. Risk is managed through prudent stop loss placement. Further enhancements can come from parameter tuning, adding indicators, expanding trade logic etc. [/trans]
Other
The strategy is based on the following principles:
- When close price crosses above Bollinger Upper Band, it indicates the asset has entered overbought territory and a callback is likely
- RSI indicator effectively determines overbought/oversold levels. RSI > 70 is considered overbought
- Go short when close price crosses below Upper Band
- Close position when RSI pulls back from overbought zone or stop loss is triggered
Parameters
| Parameters | Default | Description |
|---|---|---|
| v_input_1 | true | Show Date Range |
| v_input_int_1 | 20 | length |
| v_input_2_close | 0 | Source: close |
| v_input_float_1 | 2 | StdDev |
| v_input_int_2 | false | Offset |
| v_input_float_2 | 3 | Trail Long Loss (%) |
| v_input_float_3 | 3 | Trail Short Loss (%) |
Source code (72 lines)
/*backtest
start: 2023-11-01 00:00:00
end: 2023-11-30 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Coinrule
strategy("Bollinger Band Below Price with RSI",
overlay=true,
initial_capital=1000,
process_orders_on_close=true,
default_qty_type=strategy.percent_of_equity,
default_qty_value=70,
commission_type=strategy.commission.percent,
commission_value=0.1)
showDate = input(defval=true, title='Show Date Range')
timePeriod = time >= timestamp(syminfo.timezone, 2022, 1, 1, 0, 0)
notInTrade = strategy.position_size <= 0
//Bollinger Bands Indicator
length = input.int(20, minval=1)
src = input(close, title="Source")
mult = input.float(2.0, minval=0.001, maxval=50, title="StdDev")
basis = ta.sma(src, length)
dev = mult * ta.stdev(src, length)
upper = basis + dev
lower = basis - dev
offset = input.int(0, "Offset", minval = -500, maxval = 500)
plot(basis, "Basis", color=#FF6D00, offset = offset)
p1 = plot(upper, "Upper", color=#2962FF, offset = offset)
p2 = plot(lower, "Lower", color=#2962FF, offset = offset)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))
// RSI inputs and calculations
lengthRSI = 14
RSI = ta.rsi(close, lengthRSI)
// Configure trail stop level with input options
longTrailPerc = input.float(title='Trail Long Loss (%)', minval=0.0, step=0.1, defval=3) * 0.01
shortTrailPerc = input.float(title='Trail Short Loss (%)', minval=0.0, step=0.1, defval=3) * 0.01
// Determine trail stop loss prices
//longStopPrice = 0.0
shortStopPrice = 0.0
//longStopPrice := if strategy.position_size > 0
//stopValue = close * (1 - longTrailPerc)
//math.max(stopValue, longStopPrice[1])
//else
//0
shortStopPrice := if strategy.position_size < 0
stopValue = close * (1 + shortTrailPerc)
math.min(stopValue, shortStopPrice[1])
else
999999
//Entry and Exit
strategy.entry(id="short", direction=strategy.short, when=ta.crossover(close, upper) and RSI < 70 and timePeriod and notInTrade)
if (ta.crossover(upper, close) and RSI > 70 and timePeriod)
strategy.exit(id='close', limit = shortStopPrice)