The Supertrend Advance Strategy is an optimized and upgraded version based on the classic Supertrend indicator. It combines price action, volatility, and multiple technical indicators to improve signal quality, reduce noise, and more accurately capture changes in market trends.
The core of the Supertrend Advance Strategy is the Supertrend line. It is calculated based on the average true range and price momentum to determine potential trend direction and inflection points. When the price is above the Supertrend line, it indicates an uptrend. Conversely, when below the line, it signals a downtrend.
Unlike the traditional Supertrend indicator which primarily considers closing price and ATR, the Advance strategy also incorporates dimensions like trading volume, momentum oscillators, and even fundamental data to validate the reliability of signals. This multidimensional approach ensures the generated signals are more reliable and less prone to market noise.
The main advantages of the Supertrend Advance Strategy include:
More accurate trend identification and false breakout filtering. By waiting for confirmation from multiple indicators, the strategy greatly improves accuracy.
Reduced noise interference. The combination of filters screens out excessive unimportant market data, making judgments clearer.
Enhanced risk management. Clear trade signals facilitate planning stop losses and take profits more effectively.
Versatility. Apart from identifying trends, the strategy can also combine with other technical tools to create comprehensive trading systems.
The Supertrend Advance Strategy also has the following major risks:
Parameter setting risks. Incorrect parameter combinations may render the strategy ineffective or trigger too many false signals.
Trend misjudgment risks. No strategy can completely avoid the risk of judgment errors. When trends unexpectedly change, losses may be incurred.
Over-optimization risks. When parameters are over-fitted to historical data, the strategy may fail to adapt to changing market conditions.
Trading cost risks. As trade frequency increases, costs like commissions and slippage also rise significantly.
Corresponding solutions:
Optimize parameter settings and regularly backtest robustness.
Set stop loss and take profit to limit per trade loss.
Avoid over-optimization to maintain generalization capability.
Calculate risk/reward of signals and manage trading costs.
The Supertrend Advance Strategy can be optimized in the following aspects:
Adjust parameters based on different markets to better fit their characteristics. For instance, reduce cycle lengths for volatile markets.
Add adaptive filtering mechanisms to auto tune indicators or disable filters in certain market states.
Explore machine learning methods to dynamically optimize parameters using neural networks.
Incorporate sentiment data and news analytics to improve performance using unstructured data.
Add position sizing capability to increase returns when win rate is very high.
By introducing multiple filters and confirmation indicators, the Supertrend Advance Strategy optimizes the classic Supertrend indicator to judge trends more precisely and improve signal quality. Compared to single indicators, this multidimensional strategy provides more robust, comprehensive and efficient trading solutions. However, risks like improper parameter tuning and judgment errors should also be guarded against by adopting appropriate risk control measures. With further optimizations and integration with other tools, the Supertrend Advance Strategy has immense application potential.
/*backtest start: 2023-12-31 00:00:00 end: 2024-01-07 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © JS_TechTrading //@version=5 strategy("Supertrend advance", overlay=true,default_qty_type =strategy.percent_of_equity,default_qty_value = 1,process_orders_on_close = false) // group string//// var string group_text000="Choose Strategy" var string group_text0="Supertrend Settings" var string group_text0000="Ema Settings" var string group_text00="Rsi Settings" var string group_text1="Backtest Period" var string group_text2="Trade Direction" var string group_text3="Quantity Settings" var string group_text4="Sl/Tp Settings" var string group_text5="Enable/Disable Condition Filter" var string group_macd="Macd Set" var group_cci="Cci Set" var string group_text6="Choose Sl/Tp" var string group_text7="Percentage Sl/Tp" var string group_text9="Atr SL/Tp" var string group_text8='Swing Hl & Supertrend Sl/Tp' // filter enable and disbale on_ma =input.bool(true,"Ema Condition On/Off",group=group_text5,inline = "CL") en_rsi = input.bool(true,"Rsi Condition On/Off",group = group_text5,inline = "CL") en_macd=input.bool(true,title ="Enable Macd Condition",group =group_text5,inline = "CS") en_cci=input.bool(true,title ="Enable/Disable CCi Filter",group =group_text5,inline = "CS") //////////////////// option_ch=input.string('Pullback',title = "Type Of Stratgey",options =['Pullback','Simple'],group = "Choose Strategy Type") // option for stop loss and take profit option_ts=input.string("Percentage","Chosse Type Of Sl/tp",["Percentage","Supertrend","Swinghl","Atr"],group=group_text6) //atr period input supertrend atrPeriod = input(10, "ATR Length",group = group_text0) factor = input.float(3.0, "Factor", step = 0.01,group=group_text0) [supertrend, direction] = ta.supertrend(factor, atrPeriod) bodyMiddle = plot((open + close) / 2, display=display.none) upTrend = plot(direction < 0 ? supertrend : na, "Up Trend", color = color.green, style=plot.style_linebr) downTrend = plot(direction < 0? na : supertrend, "Down Trend", color = color.red, style=plot.style_linebr) fill(bodyMiddle, upTrend, color.new(color.green, 90), fillgaps=false) fill(bodyMiddle, downTrend, color.new(color.red, 90), fillgaps=false) long=direction < 0 ? supertrend : na short=direction < 0? na : supertrend longpos=false shortpos=false longpos :=long?true :short?false:longpos[1] shortpos:=short?true:long?false:shortpos[1] fin_pullbuy= (ta.crossunder(low[1],long) and long and high>high[1]) fin_pullsell=(ta.crossover(high[1],short) and short and low<low[1]) //Ema 1 ma_len= input.int(200, minval=1, title="Ema Length",group = group_text0000) ma_src = input.source(close, title="Ema Source",group = group_text0000) ma_out = ta.ema(ma_src, ma_len) ma_buy=on_ma?close>ma_out?true:false:true ma_sell=on_ma?close<ma_out?true:false:true // rsi indicator and condition // Get user input rsiSource = input(title='RSI Source', defval=close,group = group_text00) rsiLength = input(title='RSI Length', defval=14,group = group_text00) rsiOverbought = input(title='RSI BUY Level', defval=50,group = group_text00) rsiOversold = input(title='RSI SELL Level', defval=50,group = group_text00) // Get RSI value rsiValue = ta.rsi(rsiSource, rsiLength) rsi_buy=en_rsi?rsiValue>=rsiOverbought ?true:false:true rsi_sell=en_rsi?rsiValue<=rsiOversold?true:false:true // Getting inputs macd fast_length = input(title="Fast Length", defval=12,group =group_macd) slow_length = input(title="Slow Length", defval=26,group =group_macd) macd_src = input(title="Source", defval=close,group =group_macd) signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 50, defval = 9,group =group_macd) [macdLine, signalLine, histLine] = ta.macd(macd_src, fast_length ,slow_length,signal_length) buy_macd=en_macd?macdLine>0?true:false:true sell_macd=en_macd?macdLine<0?true:false:true // CCI indicator length_cci = input.int(20, minval=1,group = group_cci) src_cci = input(hlc3, title="Source",group = group_cci) cci_gr=input.int(200,title = "CCi > Input",group = group_cci,tooltip ="CCi iS Greater thn 100 buy") cci_ls=input.int(-200,title = "CCi < -Input",group = group_cci,tooltip ="CCi iS Less thn -100 Sell") ma = ta.sma(src_cci, length_cci) cci = (src_cci - ma) / (0.015 * ta.dev(src_cci, length_cci)) //cci buy and sell buy_cci=en_cci?cci>cci_gr?true:false:true sell_cci=en_cci?cci<cci_ls?true:false:true // final condition buy_cond=option_ch=='Simple'?long and not(longpos[1]) and rsi_buy and ma_buy and buy_macd and buy_cci:option_ch=='Pullback'?fin_pullbuy and rsi_buy and ma_buy and buy_macd and buy_cci:na sell_cond=option_ch=='Simple'?short and not(shortpos[1]) and rsi_sell and ma_sell and sell_macd and sell_cci:option_ch=='Pullback'?fin_pullsell and rsi_sell and ma_sell and sell_macd and sell_cci:na //backtest engine start = input(timestamp('2005-01-01'), title='Start calculations from',group=group_text1) end=input(timestamp('2045-03-01'), title='End calculations',group=group_text1) time_cond = true // Make input option to configure trade direction tradeDirection = input.string(title='Trade Direction', options=['Long', 'Short', 'Both'], defval='Both',group = group_text2) // Translate input into trading conditions longOK = (tradeDirection == "Long") or (tradeDirection == "Both") shortOK = (tradeDirection == "Short") or (tradeDirection == "Both") // quantity qty_new=input.float(1.0,step =0.10,title ="Quantity",group =group_text3) // supertrend and swing high and low tpnewf = input.float(title="take profit swinghl||supertrend ", step=0.1, defval=1.5, group=group_text8) hiLen = input.int(title='Highest High Lookback', defval=6, minval=2, group=group_text8) loLen = input.int(title='Lowest Low Lookback', defval=6, minval=2, group=group_text8) globl = option_ts=="Swinghl"? nz(ta.lowest(low, loLen),low[1]):option_ts=="Supertrend"?nz(supertrend,low[1]):na globl2=option_ts=="Swinghl"? nz(ta.highest(high, hiLen),high[1]) :option_ts=="Supertrend"?nz(supertrend,high[1]):na var store = float(na) var store2=float(na) // strategy start if buy_cond and longOK and time_cond and strategy.position_size==0 strategy.entry("enter long",direction = strategy.long,qty =qty_new) store:=globl if sell_cond and shortOK and time_cond and strategy.position_size==0 strategy.entry("enter short",direction =strategy.short,qty =qty_new) store2:=globl2 //stop loss and take profit enable_trail=input.bool(false,"Enable Trail",group =group_text7) stopPer = input.float(1.0,step=0.10,title='Stop Loss %',group=group_text7)* 0.01 takePer = input.float(2.0,step=0.10, title='Take Profit %',group=group_text7)* 0.01 //TRAILING STOP CODE trailStop = input.float(title='Trailing Stop (%)', minval=0.0, step=0.1, defval=1,group=group_text7) * 0.01 longStopPrice = 0.0 shortStopPrice = 0.0 longStopPrice := if strategy.position_size > 0 stopValue = close * (1 - trailStop) math.max(stopValue, longStopPrice[1]) else 0 shortStopPrice := if strategy.position_size < 0 stopValue = close * (1 + trailStop) math.min(stopValue, shortStopPrice[1]) else 999999 // Determine where you've entered and in what direction longStop = 0.0 shortStop =0.0 shortTake =0.0 longTake = 0.0 if (option_ts=="Percentage" ) // Determine where you've entered and in what direction longStop := strategy.position_avg_price * (1 - stopPer) shortStop := strategy.position_avg_price * (1 + stopPer) shortTake := strategy.position_avg_price * (1 - takePer) longTake := strategy.position_avg_price * (1 + takePer) if enable_trail and (option_ts=="Percentage" ) longStop := longStopPrice shortStop := shortStopPrice //single take profit exit position if strategy.position_size > 0 and option_ts=="Percentage" strategy.exit(id='Close Long',from_entry = "enter long", stop=longStop, limit=longTake) if strategy.position_size < 0 and option_ts=="Percentage" strategy.exit(id='Close Short',from_entry = "enter short", stop=shortStop, limit=shortTake) //PLOT FIXED SLTP LINE plot(strategy.position_size > 0 and option_ts=="Percentage" ? longStop : na, style=plot.style_linebr, color=enable_trail?na:color.new(#c0ff52, 0), linewidth=1, title='Long Fixed SL') plot(strategy.position_size < 0 and option_ts=="Percentage"? shortStop : na, style=plot.style_linebr, color=enable_trail?na:color.new(#5269ff, 0), linewidth=1, title='Short Fixed SL') plot(strategy.position_size > 0 and option_ts=="Percentage"? longTake : na, style=plot.style_linebr, color=color.new(#5e6192, 0), linewidth=1, title='Long Take Profit') plot(strategy.position_size < 0 and option_ts=="Percentage"? shortTake : na, style=plot.style_linebr, color=color.new(#dcb53d, 0), linewidth=1, title='Short Take Profit') //PLOT TSL LINES plot(series=strategy.position_size > 0 and option_ts=="Percentage" and enable_trail ? longStopPrice : na, color=color.new(color.red, 0), style=plot.style_linebr, linewidth=1, title='Long Trail Stop', offset=1) plot(series=strategy.position_size < 0 and option_ts=="Percentage" and enable_trail ? shortStopPrice : na, color=color.new(color.red, 0), style=plot.style_linebr, linewidth=1, title='Short Trail Stop', offset=1) // swing high and low //take profit takeProfit_buy = strategy.position_avg_price - ((store - strategy.position_avg_price) * tpnewf) takeProfit_sell = strategy.position_avg_price - ((store2 - strategy.position_avg_price) * tpnewf) // Submit stops based on highest high and lowest low if strategy.position_size >= 0 and (option_ts=="Swinghl" or option_ts=="Supertrend") strategy.exit(id='XL HH',from_entry = "enter long", stop=store,limit=takeProfit_buy,comment ="Long Exit") if strategy.position_size <= 0 and (option_ts=="Swinghl" or option_ts=="Supertrend") strategy.exit(id='XS LL',from_entry = "enter short", stop=store2,limit=takeProfit_sell,comment = "Short Exit") // plot take profit plot(series=strategy.position_size < 0 and (option_ts=="Swinghl" or option_ts=="Supertrend")? takeProfit_sell : na, style=plot.style_circles, color=color.orange, linewidth=1, title="take profit sell") plot(series=strategy.position_size > 0 and (option_ts=="Swinghl" or option_ts=="Supertrend")? takeProfit_buy: na, style=plot.style_circles, color=color.blue, linewidth=1, title="take profit buy") // Plot stop Loss for visual confirmation plot(series=strategy.position_size > 0 and (option_ts=="Swinghl" or option_ts=="Supertrend")? store : na, style=plot.style_circles, color=color.new(color.green, 0), linewidth=1, title='Lowest Low Stop') plot(series=strategy.position_size < 0 and (option_ts=="Swinghl" or option_ts=="Supertrend")? store2 : na, style=plot.style_circles, color=color.new(color.red, 0), linewidth=1, title='Highest High Stop') // atr enable_atrtrail=input.bool(false,"Enable Atr Trail",group = group_text9) atrLength = input(title='ATR Length', defval=14,group =group_text9) slATRMult = input.float(title='Stop loss ATR multiplier',step=0.1, defval=2.0,group =group_text9) tpATRMult = input.float(title='Take profit multiplier',step=0.1, defval=1.5,group =group_text9) lookback = input.int(title='How Far To Look Back For High/Lows', defval=7, minval=1,group =group_text9) atr = ta.atr(atrLength) lowestLow = ta.lowest(low, lookback) highestHigh = ta.highest(high, lookback) longStopa = (enable_atrtrail ? lowestLow : close) - atr * slATRMult shortStopa = (enable_atrtrail ? highestHigh : close) + atr * slATRMult atr_l=0.0 atr_s=0.0 atr_l:=nz(strategy.position_avg_price-(atr[1] * slATRMult),strategy.position_avg_price-(1 * slATRMult)) atr_s:=nz(strategy.position_avg_price+ (atr[1] * slATRMult),strategy.position_avg_price-(1 * slATRMult)) stoploss_l = ta.valuewhen(strategy.position_size != 0 and strategy.position_size[1] == 0,atr_l, 0) stoploss_s = ta.valuewhen(strategy.position_size != 0 and strategy.position_size[1] == 0,atr_s, 0) takeprofit_l = strategy.position_avg_price - ((stoploss_l - strategy.position_avg_price) * tpATRMult) takeprofit_s = strategy.position_avg_price - ((stoploss_s - strategy.position_avg_price) * tpATRMult) // Submit stops based on highest high and lowest low if strategy.position_size > 0 and (option_ts=="Atr") strategy.exit(id='Xl', stop= enable_atrtrail?longStopa:stoploss_l,limit=takeprofit_l ,comment ="Long Exit") if strategy.position_size < 0 and (option_ts=="Atr") strategy.exit(id='XH', stop=enable_atrtrail?shortStopa:stoploss_s,limit=takeprofit_s,comment = "Short Exit") // // plot take profit plot(series=strategy.position_size > 0 and (option_ts=="Atr")? takeprofit_l : na, style=plot.style_circles, color=color.orange, linewidth=1, title="take profit sell") plot(series=strategy.position_size < 0 and (option_ts=="Atr")? takeprofit_s: na, style=plot.style_circles, color=color.blue, linewidth=1, title="take profit buy") // Plot stop Loss for visual confirmation plot(series=strategy.position_size >0 and (option_ts=="Atr") and not enable_atrtrail? stoploss_l : na, style=plot.style_circles, color=color.new(color.green, 0), linewidth=1, title='Lowest Low Stop') plot(series=strategy.position_size < 0 and (option_ts=="Atr") and not enable_atrtrail? stoploss_s : na, style=plot.style_circles, color=color.new(color.red, 0), linewidth=1, title='Highest High Stop') //PLOT TSL LINES plot(series=strategy.position_size >0 and option_ts=="Atr" and enable_atrtrail ? longStopa : na, color=color.new(color.green, 0), style=plot.style_linebr, linewidth=1, title='Long Trail Stop', offset=1) plot(series=strategy.position_size < 0 and (option_ts=="Atr") and enable_atrtrail? shortStopa : na, style=plot.style_linebr, color=color.new(color.red, 0), linewidth=1, title='short Trail Stop', offset=1)