SuperTrend Trading Strategy with Multiple Filters (2024)

  1. Square
  2. SuperTrend Trading Strategy with Multiple Filters

Author: ChaoZhang, Date: 2023-09-15 16:19:57
Tags:

This strategy is called SuperTrend Trading Strategy with Multiple Filters. It adds multiple indicators as filters on top of the Supertrend to strictly control entries.

How the strategy works:

  1. Calculate the Supertrend indicator to generate buy and sell signals.
  2. If MACD filter is enabled, buy signals are only generated when MACD crosses above signal line and fast MA crosses above slow MA. Sell signals are only generated when MACD crosses below signal line and fast MA crosses below slow MA.
  3. If EMA filter is enabled, buy signals are only generated when price crosses above 200-day EMA. Sell signals are only generated when price crosses below 200-day EMA.
  4. If Stochastic RSI filter is enabled, buy signals are only generated when Stochastic RSI crosses from overbought to oversold. Sell signals are only generated when Stochastic RSI crosses from oversold to overbought.
  5. If MFI filter is enabled, buy signals are only generated when MFI crosses above its EMA. Sell signals are only generated when MFI crosses below its EMA.
  6. If CCI filter is enabled, buy signals are only generated when price crosses above CCI baseline. Sell signals are only generated when price crosses below CCI baseline.
  7. Use ATR or Bollinger Bands to calculate stop loss and take profit levels.

Advantages of this strategy:

  1. Multiple filters increase signal reliability and avoid false signals.
  2. Strict stop loss and take profit helps control risks.
  3. Customizable parameters and toggle switches provide flexibility.

Risks of this strategy:

  1. Too many filter conditions may miss some trading opportunities.
  2. Improper indicator parameters may render filters ineffective.
  3. Incorrect stop loss and take profit may enlarge losses.

In summary, the SuperTrend Trading Strategy with Multiple Filters considers both trend following and indicator analysis, improving signal quality through multiple confirmations. Reasonable stop loss and take profit mechanisms are key to reducing trading risks. The strategy is suitable for traders with some experience.

/*backteststart: 2023-09-07 00:00:00end: 2023-09-14 00:00:00period: 1hbasePeriod: 15mexchanges: [{"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/// © mathlabel//@version=5strategy("My strategy", overlay=true, margin_long=100, margin_short=100)atrPeriod = input(10, "ATR Length")factor = input.float(3.0, "Factor", step = 0.01)stopLossFactor = input(2.0, "Stop Loss Factor")takeProfitFactor = input(1.5, "Take Profit Factor")stochlenght= input(14,'stochlenght')oversold_level = input(title = 'Oversold', defval = 20)overbought_level = input(title = 'Overbought', defval = 80)use_atr_exits=input.bool(false)use_bollinger_exits=input.bool(false)use_cci_filter=input.bool(false)longLossPerc = input.float(title='Long Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01shortLossPerc = input.float(title='Short Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01longprofitPerc = input.float(title='Long profit (%)', minval=0.0, step=0.1, defval=1) * 0.01shortprofitPerc = input.float(title='Short profit (%)', minval=0.0, step=0.1, defval=1) * 0.01// Calculate ATRatr = ta.atr(atrPeriod)plotsuper=input.bool(false)[supertrend, direction] = ta.supertrend(factor, atrPeriod)upTrend = plot(plotsuper? (direction < 0 ? supertrend : na) : na, "Up Trend", color = color.green, style=plot.style_linebr)downTrend = plot(plotsuper ? (direction < 0? na : supertrend):na, "Down Trend", color = color.red, style=plot.style_linebr)long_supertrend_filter= (direction < 0 ? supertrend : na)short_supertrend_filter= (direction < 0? na : supertrend)//--trama--lengths = input(99,title='Trama lenght')src =(close)ama = 0.hh = math.max(math.sign(ta.change(ta.highest(lengths))), 0)ll = math.max(math.sign(ta.change(ta.lowest(lengths)) * -1), 0)tc = math.pow(ta.sma(hh or ll ? 1 : 0, lengths), 2)ama := nz(ama[1] + tc * (src - ama[1]), src)plottrama=input.bool(false, title="Show Lux TRAMA")plot(plottrama?ama : na, 'Plot', color.new(#ff1100, 0), 2)use_LUX_trama_filter=input.bool(false)long_LUX_trama_filter= (close > ama)short_LUX_trama_filter= (close < ama)// highest highhighest = ta.highest(high, stochlenght)// lowest lowlowest = ta.lowest(low, stochlenght)// stochastic oscillatorstochastic_K = ((close - lowest) / (highest - lowest)) * 100stochastic_D = ta.sma(stochastic_K, 3)use_stochastic_filter = input.bool(false)long_stoch_filter = stochastic_K > oversold_level and stochastic_K[1] < oversold_levelshort_stoch_filter = stochastic_K < overbought_level and stochastic_K[1] > overbought_level//Define a ATR band upline and bottome line.upline = open + (atr* takeProfitFactor)bottomline = open -(atr*stopLossFactor)plot(use_atr_exits ? upline : na, color=color.white)plot(use_atr_exits ? bottomline:na, color=color.white)// Calculate stop loss and take profit levelsstopLoss = stopLossFactor * atrtakeProfit = takeProfitFactor * atr//input macdma_fast=ta.sma(close,input(14,title='ma fast for macd filter'))ma_slow=ta.sma(close,input(28, title='ma slowfor macd filter'))use_macd_filter=input.bool(false)[macdLine, signalLine, histLine]= ta.macd(close,12,26,9)long_macd_filter= (macdLine > signalLine) and ta.crossover(ma_fast,ma_slow)short_macd_filter= (macdLine < signalLine) and ta.crossunder(ma_fast,ma_slow)// ema 200ema1= ta.ema(close,1)ema2= ta.ema(close,200)use_ema200_filter= input.bool(false)long_ema_filter = (close > ema2)short_ema_filter= (close < ema2)plotAverage = input.bool(true, title="Plot EMA200")plot(plotAverage ? ta.ema(close, 200) : na, title="Exponential Average")// mfisignalLength = input(title="mfi Signal Length", defval=9)length1 = input(title="mfi Length", defval=14)src1 = hlc3mf = ta.mfi(src1, length1)signal = ta.ema(mf, signalLength)use_mfi_filter=input.bool(false)long_mfi_filter= ta.crossover(mf,signal) ?mf:na short_mfi_filter= ta.crossunder(mf,signal)? mf : na//ccicci_l = input(50, title='CCI Period Length')atr_l = input(5, title=' CCI ATR Length')level = 0sd_length = 20cci = ta.cci(src, cci_l)atr2 = ta.atr(atr_l)var st = 0.if cci >= level st := low - atr stif cci <= level st := high + atr stvar tu = 0.var td = 0.var optimal_line = 0.if cci >= level and cci[1] < level tu := td[1] tuif cci <= level and cci[1] > level td := tu[1] tdif cci > level tu := low - atr2 if tu < tu[1] and cci[1] >= level tu := tu[1] tuif cci < level td := high + atr2 if td > td[1] and cci[1] <= level td := td[1] tdoptimal_line := math.max(tu, td)// Creating a Price Channel, avg_st8 = ta.ema(st, 8)avg_st13 = ta.ema(st, 13)avg_st21 = ta.ema(st, 21)avg_st34 = ta.ema(st, 21)avg_st55 = ta.ema(st, 55)avg_st89 = ta.ema(st, 89)avg_st144 = ta.ema(st, 144)avg_st233 = ta.ema(st, 233)average_weighting = (optimal_line + avg_st8 + avg_st13 + avg_st21 + avg_st34 + avg_st55 + avg_st89 + avg_st144 + avg_st233) / 9basis = ta.sma(average_weighting, sd_length)devs = ta.stdev(average_weighting, sd_length)upperS = basis + devslowerS = basis - devsplot(use_cci_filter ? basis: na, 'Basis', color=color.new(#872323, 0))p3 = plot(use_cci_filter ? upperS : na, 'UpperS', color=color.new(color.teal, 0))p4 = plot(use_cci_filter ? lowerS: na ,'LowerS', color=color.new(color.teal, 0))long_cci_filter= ta.crossover(close,upperS) short_cci_filter= ta.crossunder(close,lowerS) var isLong = falsevar isShort = falselong = (not use_LUX_trama_filter or long_LUX_trama_filter) and ( long_supertrend_filter) and (not use_ema200_filter or long_ema_filter) and (not isLong) and (not use_stochastic_filter or long_stoch_filter) and (not use_macd_filter or long_macd_filter) and (not use_mfi_filter or long_mfi_filter) and (not use_cci_filter or long_cci_filter)short= (not use_LUX_trama_filter or short_LUX_trama_filter) and ( short_supertrend_filter) and (not use_ema200_filter or short_ema_filter) and (not isShort) and ( not use_stochastic_filter or short_stoch_filter) and (not use_macd_filter or long_macd_filter) and (not use_mfi_filter or short_mfi_filter) and (not use_cci_filter or short_cci_filter)if long isLong := true isShort := falseif short isLong := false isShort := trueplotshape(long, title='Buy', text='Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.white, 0), size=size.tiny)plotshape(short, title='Sell', text='Sell', style=shape.labeldown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)//bollingerlengthss = input(20, title='bollinger lenght')mult = input.float(2.0, minval=0.001, maxval=50, title="bollinger StdDev")basiss = ta.sma(src, lengthss)dev = mult * ta.stdev(src, lengthss)upper = basiss + devlower = basiss - devoffset = input.int(0, "bollinger Offset", minval = -500, maxval = 500)plot(use_bollinger_exits ? basiss : na, "Basis", color=#FF6D00, offset = offset)p1 = plot(use_bollinger_exits ? upper : na, "Upper", color=#2962FF, offset = offset)p2 = plot(use_bollinger_exits ? lower: na, "Lower", color=#2962FF, offset = offset)long_bollinger_exits= close > uppershort_bollinger_exits=close < lowerlong_atr_exits = close > upline short_atr_exits = close < bottomlinetakelong = (not use_atr_exits or long_atr_exits) and (not use_bollinger_exits or long_bollinger_exits)takeshort = (not use_atr_exits or short_atr_exits) and (not use_bollinger_exits or short_bollinger_exits)plotshape(use_atr_exits? takelong : na,title = 'take profit',text='high SL/TP',style=shape.cross,location = location.abovebar, color=color.new(color.green,0) , size=size.tiny)plotshape(use_atr_exits ? takeshort : na,title = 'take profit',text='low SL/TP',style=shape.cross,location = location.belowbar, color=color.new(color.green,0), size=size.tiny)plotshape(use_bollinger_exits ? takelong: na,title = 'take profit',text='high SL/TP',style=shape.cross,location = location.abovebar, color=color.new(color.green,0) , size=size.tiny)plotshape(use_bollinger_exits ? takeshort: na,title = 'take profit',text='low SL/TP',style=shape.cross,location = location.belowbar, color=color.new(color.green,0), size=size.tiny)alertcondition(long,'long','buy')alertcondition(short,'short','short')alertcondition(takeshort,'trail short close','short trailing take profit')alertcondition(takelong ,'trail long close','long trailing take profit')use_trailing_stop_loss=input.bool(title = 'use trailing stop loss (atr or bollinger)?', defval = true)// Determine stop loss pricelongStopPrice = strategy.position_avg_price * (1 - longLossPerc)shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)// Determine take profit pricelongprofitPrice = strategy.position_avg_price * (1 + longprofitPerc)shortprofitPrice = strategy.position_avg_price * (1 - shortprofitPerc)// Plot stop loss values for confirmationplot(series=strategy.position_size > 0 ? longStopPrice : na, color=color.new(color.red, 0), style=plot.style_cross, linewidth=1, title='Long Stop Loss')plot(series=strategy.position_size < 0 ? shortStopPrice : na, color=color.new(color.red, 0), style=plot.style_cross, linewidth=1, title='Short Stop Loss')plot(series=strategy.position_size > 0 ? longprofitPrice : na, color=color.new(color.green, 0), style=plot.style_cross, linewidth=1, title='Long profit')plot(series=strategy.position_size < 0 ? shortprofitPrice : na, color=color.new(color.green, 0), style=plot.style_cross, linewidth=1, title='Short profit')longCondition = longif (longCondition) strategy.entry("Long Entry", strategy.long)shortCondition = shortif (shortCondition) strategy.entry("Short Entry", strategy.short,stop = shortStopPrice)if use_trailing_stop_loss if takelong or close < longStopPrice strategy.close("Long Entry") if takeshort or close > shortStopPrice strategy.close("Short Entry")else if close < longStopPrice or close > longprofitPrice strategy.close("Long Entry") if close < shortprofitPrice or close > shortStopPrice strategy.close("Short Entry")

template: strategy.tpl:40:21: executing "strategy.tpl" at <.api.GetStrategyListByName>: wrong number of args for GetStrategyListByName: want 7 got 6

SuperTrend Trading Strategy with Multiple Filters (2024)
Top Articles
What is Trade? Definition of Trade, Trade Meaning - The Economic Times
Firewall port requirements for SCCM remote control - Microsoft Q&A
Creepshotorg
Fiskars X27 Kloofbijl - 92 cm | bol
Srtc Tifton Ga
Euro (EUR), aktuální kurzy měn
Pieology Nutrition Calculator Mobile
Identifont Upload
Missing 2023 Showtimes Near Cinemark West Springfield 15 And Xd
DEA closing 2 offices in China even as the agency struggles to stem flow of fentanyl chemicals
Steve Strange - From Punk To New Romantic
Ktbs Payroll Login
Hope Swinimer Net Worth
Regal Stone Pokemon Gaia
Costco Gas Foster City
Amazing deals for DKoldies on Goodshop!
Testberichte zu E-Bikes & Fahrrädern von PROPHETE.
Mccain Agportal
Uta Kinesiology Advising
Garnish For Shrimp Taco Nyt
Greyson Alexander Thorn
Redfin Skagit County
Haunted Mansion Showtimes Near Epic Theatres Of West Volusia
Sam's Club Gas Price Hilliard
Hefkervelt Blog
Cable Cove Whale Watching
Japanese Emoticons Stars
Meggen Nut
Happy Shuttle Cancun Review
Red Sox Starting Pitcher Tonight
Www.craigslist.com Syracuse Ny
Quality Tire Denver City Texas
Solve 100000div3= | Microsoft Math Solver
Goodwill Houston Select Stores Photos
Cruise Ships Archives
Craigslist West Seneca
Oxford Alabama Craigslist
Bella Thorne Bikini Uncensored
Legit Ticket Sites - Seatgeek vs Stubhub [Fees, Customer Service, Security]
The Banshees Of Inisherin Showtimes Near Reading Cinemas Town Square
Union Corners Obgyn
Autozone Battery Hold Down
Marcal Paper Products - Nassau Paper Company Ltd. -
Best Suv In 2010
Holzer Athena Portal
Menu Forest Lake – The Grillium Restaurant
Fine Taladorian Cheese Platter
Ty Glass Sentenced
18443168434
Jasgotgass2
How to Find Mugshots: 11 Steps (with Pictures) - wikiHow
Die 10 wichtigsten Sehenswürdigkeiten in NYC, die Sie kennen sollten
Latest Posts
Article information

Author: Rob Wisoky

Last Updated:

Views: 6330

Rating: 4.8 / 5 (48 voted)

Reviews: 87% of readers found this page helpful

Author information

Name: Rob Wisoky

Birthday: 1994-09-30

Address: 5789 Michel Vista, West Domenic, OR 80464-9452

Phone: +97313824072371

Job: Education Orchestrator

Hobby: Lockpicking, Crocheting, Baton twirling, Video gaming, Jogging, Whittling, Model building

Introduction: My name is Rob Wisoky, I am a smiling, helpful, encouraging, zealous, energetic, faithful, fantastic person who loves writing and wants to share my knowledge and understanding with you.