Trend Following Buy Dip Sell Peak Strategy

Author: ChaoZhang, Date: 2023-10-24 13:54:18



This strategy implements automated trend following trading by calculating Bollinger Bands to identify dips and peaks and using long-term and short-term moving averages to determine the overall trend direction. The core idea is to buy dips and sell peaks according to the prevailing trend.

Strategy Logic

The key components of the strategy are:

  1. Calculate Bollinger Bands with upper and lower bands based on close price and standard deviation.

  2. Determine long-term and short-term trend using 300-period and 20-period SMA.

  3. Generate buy signal when close breaks below lower band while long SMA is above and short SMA turns up.

  4. Generate sell signal when close breaks above upper band while long SMA is below and short SMA turns down.

  5. Use OCO orders to set stop loss and take profit.

With this design, the strategy can automatically identify dip buying and peak selling opportunities along the major trend direction.

Advantage Analysis

The advantages of this strategy include:

  1. Automated trend detection without manual judgment.

  2. Systematically capture dips for buying opportunities.

  3. Systematically identify peak selling opportunities for profit taking.

  4. Effective risk control using stop loss and take profit.

  5. Filter out invalid signals to improve win rate.

  6. Flexible trend following by position adjustment.

  7. Clear logic and easy to understand and optimize.

Risk Analysis

The main risks to consider:

  1. Inappropriate security selection could fail the trend tracking.

  2. Improper parameter tuning may cause overtrading or missed trades.

  3. Trend reversal from sudden events may lead to larger losses.

  4. Stop loss too tight may cause excessive stops.

  5. Insufficient liquidity may prevent full execution.

  6. Overfitting with insufficient backtesting period.

The solutions include: select liquid stocks with clear trends; optimize parameters; watch out for news; relax stop loss; evaluate real trading volume; expand backtest period.

Optimization Directions

Some ways to optimize the strategy:

  1. Optimize parameters like Bollinger period, standard deviation multiplier and moving average periods.

  2. Add stop loss methods like trailing stop or moving average stop to better control risks.

  3. Incorporate position sizing based on key levels to improve capital utilization efficiency.

  4. Add volume filter to avoid invalid breakouts with low volume.

  5. Add relative strength indicator to determine buy/sell bias.

  6. Introduce machine learning for automatic parameter tuning and strategy evaluation.

  7. Combine with other strategies to create multi-strategy portfolio for greater robustness.

These optimizations can further enhance the strategy’s performance and stability.


The strategy offers a clear and understandable approach to systematically buy dips and sell peaks along the trend. With proper risk control, it has good profit potential. Further improvements can be made via parameter tuning, stop loss modification, position sizing, etc. The strategy serves as a solid foundation for automated trend following trading.

start: 2023-09-23 00:00:00
end: 2023-10-23 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]

strategy("Buy Dip Sell Rip Strategy", overlay=true)
source = close
length = input(15, minval=1)
mult = input(1.25, minval=0.001, maxval=50)
longMAPeriod = input(300, minval=5)
shortMAPeriod = input(20, minval=5)

basis = sma(source, length)
longMA = sma(source, longMAPeriod)
prevLongMA = sma(close[1],longMAPeriod)
shortMA = sma(source, shortMAPeriod)
dev = mult * stdev(source, length)

upper = basis + dev
lower = basis - dev

buyEntry = crossover(source, lower)
sellEntry = crossunder(source, upper)

if (source > lower and source[1] < lower)
    if (longMA < source  and shortMA>source)
        strategy.entry("BBandLE", strategy.long, stop=lower, oca_name="BollingerBands",  comment="BBandLE")

if (source > upper and source[1] < upper)
    if (longMA > source  and shortMA < source)
        strategy.entry("BBandSE", strategy.short, stop=upper, oca_name="BollingerBands",  comment="BBandSE")

//plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)