This strategy identifies short-term bottoms by detecting outstanding volume in a downtrend, and takes long positions during oversold conditions. It is an aggressive short-term trading strategy.
When the volume exceeds 2 standard deviations above the SMA-based average volume, it is considered outstanding volume. Meanwhile, RSI below 30 indicates oversold status. When both conditions are met, it is judged as a short-term bottom and long position is taken immediately. The position will be closed after a certain period of time (e.g. 10 bars).
So the logic of this strategy is simple:
The advantages of this strategy include:
In summary, this strategy takes advantage of volume breakouts to catch trend reversals, while strictly controlling risks. It is a reliable aggressive long strategy.
The main risks of this strategy include:
To address these risks, optimization can be done in the following aspects:
This strategy can be further optimized in the following aspects:
By introducing more advanced techniques, significant improvement can be achieved on stability, alpha and Sharpe ratio.
In summary, this is a very simple, straightforward and logical short-term breakout strategy. By properly leveraging volume to detect trend reversals, and strictly controlling risks, solid performance can be achieved. But risks of false signals and parameter robustness exist. These can be addressed incrementally by introducing more advanced techniques to further improve the strategy.
/*backtest start: 2024-01-10 00:00:00 end: 2024-01-17 00:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © footlz //@version=4 strategy("Bottom catch strategy", overlay=true) v_len = input(20, title="Volume SMA Length") mult = input(2) rsi_len = input(20, title="RSI Length") oversold = input(30, title="Oversold") close_time = input(10, title="Close After") v = volume basis = sma(v, v_len) dev = mult * stdev(v, v_len) upper_volume = basis + dev rsi = rsi(close, rsi_len) long = v > upper_volume and rsi < oversold strategy.entry("Long", true, when=long) passed_time = 0.0 if strategy.position_size != 0 passed_time := 1 else passed_time := 0 if strategy.position_size != 0 and strategy.position_size[1] != 0 passed_time := passed_time[1] + 1 if passed_time >= close_time strategy.close_all() // If want to enable plot, change overlay=false. v_color = close >= close[1] ? color.new(#3eb370, 0) : color.new(#e9546b, 0) // plot(v, title="volume", color=v_color, style=plot.style_columns) // plot(upper_volume, title="Threshold", color=color.aqua)