Dual Smoothed Stochastic Bressert Strategy

Author: ChaoZhang, Date: 2024-02-05 15:57:37



The Dual Smoothed Stochastic Bressert strategy is designed by William Blau. It attempts to combine moving average methods with oscillator principles.

The strategy generates trading signals by calculating a series of dual smoothed stochastic indices. Specifically, it first calculates the smoothed stochastic index of prices, and then applies a smooth average to this stochastic index again to obtain the “dual smoothed stochastic index”. When the trigger line crosses the dual smoothed stochastic index, buy or sell signals are generated.


  1. Calculate the PDS period smoothed stochastic index xPreCalc of prices
  2. Apply an EMAlen exponential moving average to xPreCalc to obtain xDSS, i.e., the “dual smoothed stochastic index”
  3. Calculate the trigger line xTrigger, which is another EMA line of xDSS
  4. Generate trading signals:
    • Go long when xTrigger is below xDSS and below the oversold line
    • Go short when xTrigger is above xDSS and above the overbought line
  5. Plot the curves of dual smoothed stochastic index xDSS and trigger line xTrigger


The strategy combines the trend following capability of moving averages and the overbought/oversold identification capability of stochastic indices. The main advantages are:

  1. Dual smoothing filters false signals and improves stability
  2. Trigger line generates trading signals and avoids frequent trading
  3. Customizable parameters adapt to different market conditions
  4. Intuitive graphics for easy grasping and validation of the strategy


The Dual Smoothed Stochastic Bressert Strategy also has some risks:

  1. More false signals of Bressert indicator in low volatile markets
  2. Dual smoothing may cause signal lag, missing price turning points
  3. Improper parameter settings may fail to identify price swings
  4. Trading risk still exists


  1. Optimize parameters to improve accuracy
  2. Filter signals with other indicators
  3. Use position sizing to hedge risks


The strategy can also be optimized in the following aspects:

  1. Adjust the cycle parameters of the dual smoothed index to optimize the smoothing effect
  2. Add stop loss mechanisms to control single loss
  3. Add trend judgment indicators to avoid reverse operation
  4. Use position sizing to maximize profit space


The Dual Smoothed Stochastic Bressert Strategy combines the advantages of moving averages and stochastic indices for identifying overbought/oversold points and following trends. Setting up dual smoothing and trigger lines can effectively filter out noisy signals. However, parameter optimization and risk control are still needed to obtain steady gains in live trading.

start: 2024-01-05 00:00:00
end: 2024-02-04 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]

//  Copyright by HPotter v1.0 05/04/2017
// Double Smoothed Stochastics (DSS) is designed by William Blaw. 
// It attempts to combine moving average methods with oscillator principles. 
// You can change long to short in the Input Settings
// Please, use it only for learning or paper trading. Do not for real trading.
strategy(title="DSS Bressert (Double Smoothed Stochastic)", shorttitle="DSS Bressert")
PDS = input(10, minval=1)
EMAlen = input(9, minval=1)
TriggerLen = input(5, minval=1)
Overbought = input(80, minval=1)
Oversold = input(20, minval=1)
reverse = input(false, title="Trade reverse")
hline(Overbought, color=green, linestyle=line)
hline(Oversold, color=red, linestyle=line)
xPreCalc = ema(stoch(close, high, low, PDS), EMAlen)
xDSS = ema(stoch(xPreCalc, xPreCalc, xPreCalc, PDS), EMAlen)
//xDSS = stoch(xPreCalc, xPreCalc, xPreCalc, PDS)
xTrigger = ema(xDSS, TriggerLen)
pos = iff(xTrigger < xDSS and xTrigger < Oversold, -1,
	     iff(xTrigger > xDSS and xTrigger > Overbought, 1, nz(pos[1], 0))) 
possig = iff(reverse and pos == 1, -1,
          iff(reverse and pos == -1, 1, pos))	   
if (possig == 1) 
    strategy.entry("Long", strategy.long)
if (possig == -1)
    strategy.entry("Short", strategy.short)	   	    
barcolor(possig == -1 ? red: possig == 1 ? green : blue )
plot(xDSS, color=blue, title="DSS")
plot(xTrigger, color=red, title="Trigger")