Strategi ini disebut SuperTrend Trading Strategy with Multiple Filters. Ini menambahkan beberapa indikator sebagai filter di atas Supertrend untuk mengendalikan entri secara ketat.
Bagaimana strategi ini bekerja:
Keuntungan dari strategi ini:
Risiko dari strategi ini:
Secara singkat, Strategi Perdagangan SuperTrend dengan Multiple Filter mempertimbangkan baik mengikuti tren dan analisis indikator, meningkatkan kualitas sinyal melalui beberapa konfirmasi.
/*backtest start: 2023-09-07 00:00:00 end: 2023-09-14 00:00:00 period: 1h basePeriod: 15m 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/ // © mathlabel //@version=5 strategy("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.01 shortLossPerc = input.float(title='Short Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01 longprofitPerc = input.float(title='Long profit (%)', minval=0.0, step=0.1, defval=1) * 0.01 shortprofitPerc = input.float(title='Short profit (%)', minval=0.0, step=0.1, defval=1) * 0.01 // Calculate ATR atr = 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 high highest = ta.highest(high, stochlenght) // lowest low lowest = ta.lowest(low, stochlenght) // stochastic oscillator stochastic_K = ((close - lowest) / (highest - lowest)) * 100 stochastic_D = ta.sma(stochastic_K, 3) use_stochastic_filter = input.bool(false) long_stoch_filter = stochastic_K > oversold_level and stochastic_K[1] < oversold_level short_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 levels stopLoss = stopLossFactor * atr takeProfit = takeProfitFactor * atr //input macd ma_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 200 ema1= 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") // mfi signalLength = input(title="mfi Signal Length", defval=9) length1 = input(title="mfi Length", defval=14) src1 = hlc3 mf = 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 //cci cci_l = input(50, title='CCI Period Length') atr_l = input(5, title=' CCI ATR Length') level = 0 sd_length = 20 cci = ta.cci(src, cci_l) atr2 = ta.atr(atr_l) var st = 0. if cci >= level st := low - atr st if cci <= level st := high + atr st var tu = 0. var td = 0. var optimal_line = 0. if cci >= level and cci[1] < level tu := td[1] tu if cci <= level and cci[1] > level td := tu[1] td if cci > level tu := low - atr2 if tu < tu[1] and cci[1] >= level tu := tu[1] tu if cci < level td := high + atr2 if td > td[1] and cci[1] <= level td := td[1] td optimal_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) / 9 basis = ta.sma(average_weighting, sd_length) devs = ta.stdev(average_weighting, sd_length) upperS = basis + devs lowerS = basis - devs plot(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 = false var isShort = false long = (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 := false if short isLong := false isShort := true plotshape(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) //bollinger lengthss = 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 + dev lower = basiss - dev offset = 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 > upper short_bollinger_exits=close < lower long_atr_exits = close > upline short_atr_exits = close < bottomline takelong = (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 price longStopPrice = strategy.position_avg_price * (1 - longLossPerc) shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc) // Determine take profit price longprofitPrice = strategy.position_avg_price * (1 + longprofitPerc) shortprofitPrice = strategy.position_avg_price * (1 - shortprofitPerc) // Plot stop loss values for confirmation plot(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 = long if (longCondition) strategy.entry("Long Entry", strategy.long) shortCondition = short if (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")