Artikel ini menjelaskan secara rinci strategi perdagangan kuantitatif menggunakan indikator Supertrend di beberapa kerangka waktu.
I. Logika Strategi
Komponen utama dari strategi ini meliputi:
Menghitung Supertrend pada periode saat ini untuk menentukan arah tren harga.
Menghitung Supertrend pada jangka waktu yang lebih tinggi (seperti harian) untuk mengukur tren utama.
Membentuk sinyal perdagangan berdasarkan konsistensi antara arah Supertrend pada dua kerangka waktu.
Menetapkan stop loss yang tepat dan mengambil keuntungan berdasarkan sinyal.
Meningkatkan dengan porsi tetap untuk mengunci keuntungan.
Ketika Supertrend menyetujui jangka waktu tinggi dan rendah, tren utama diidentifikasi dan sinyal beli / jual dihasilkan berdasarkan hubungan indikator. Stop loss dan take profit mengelola risiko dan imbalan dari setiap perdagangan.
II. Keuntungan dari Strategi
Keuntungan terbesarnya terletak pada penggunaan beberapa kerangka waktu untuk menyaring sinyal palsu dan meningkatkan keandalan.
Selain itu, pengaturan stop loss dan take profit yang masuk akal memastikan risiko yang terkendali per perdagangan, menghindari kerugian yang berlebihan.
Akhirnya, skala bagian dari keuntungan juga merupakan fitur yang menentukan strategi.
III. Kemunduran Potensial
Namun, risiko berikut juga harus diakui:
Pertama, Supertrend sendiri memiliki masalah tertinggal yang dapat menyebabkan titik masuk optimal yang hilang.
Kedua, stop loss yang diatur terlalu agresif berisiko dihentikan lebih awal.
Akhirnya, skala-out dapat membawa biaya slippage tambahan.
IV. Ringkasan
Secara singkat, artikel ini telah menjelaskan strategi kuantitatif menggunakan Supertrend di beberapa kerangka waktu. Ini meningkatkan kualitas sinyal melalui kombinasi analisis periode tinggi dan rendah, dan mengelola risiko melalui stop loss, take profit dan scaling out. Secara keseluruhan dengan penyesuaian yang tepat strategi ini menawarkan pendekatan yang masuk akal menggunakan indikator.
/*backtest start: 2023-09-06 00:00:00 end: 2023-09-13 00:00:00 period: 10m basePeriod: 1m 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/ // © ranga_trading //@version=5 // strategy(title='SuperTrend Multi Time Frame Long and Short Trading Strategy with Take Profit, Stop Loss and in build alerts V01', shorttitle='SuperTrend Multi Time Frame Long and Short Trading Strategy with Take Profit, Stop Loss and in build alerts V01 ', overlay=true, default_qty_value=60, initial_capital=2000, default_qty_type=strategy.percent_of_equity, pyramiding=0, process_orders_on_close=true) tf1 = input.timeframe('D', title='Timeframe 1') tf2 = input.timeframe('W', title='Timeframe 2') length = input(title='ATR Period', defval=22) mult = input.float(title='ATR Multiplier', step=0.1, defval=3.0) showLabels = input(title='Show Buy/Sell Labels ?', defval=true) useClose = input(title='Use Close Price for Extremums ?', defval=true) highlightState = input(title='Highlight State ?', defval=true) atr = mult * ta.atr(length) longStop = (useClose ? ta.highest(close, length) : ta.highest(length)) - atr longStopPrev = nz(longStop[1], longStop) longStop := close[1] > longStopPrev ? math.max(longStop, longStopPrev) : longStop shortStop = (useClose ? ta.lowest(close, length) : ta.lowest(length)) + atr shortStopPrev = nz(shortStop[1], shortStop) shortStop := close[1] < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop var int dir = 1 dir := close > shortStopPrev ? 1 : close < longStopPrev ? -1 : dir var color longColor = color.green var color shortColor = color.red longStopPlot = plot(dir == 1 ? longStop : na, title='Long Stop', style=plot.style_linebr, linewidth=2, color=color.new(longColor, 0)) buySignal = dir == 1 and dir[1] == -1 plotshape(buySignal ? longStop : na, title='Long Stop Start', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(longColor, 0)) shortStopPlot = plot(dir == 1 ? na : shortStop, title='Short Stop', style=plot.style_linebr, linewidth=2, color=color.new(shortColor, 0)) sellSignal = dir == -1 and dir[1] == 1 plotshape(sellSignal ? shortStop : na, title='Short Stop Start', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(shortColor, 0)) midPricePlot = plot(ohlc4, title='', style=plot.style_circles, linewidth=0, display=display.none, editable=false) longFillColor = highlightState ? dir == 1 ? longColor : na : na shortFillColor = highlightState ? dir == -1 ? shortColor : na : na fill(midPricePlot, longStopPlot, title='Long State Filling', color=longFillColor, transp=90) fill(midPricePlot, shortStopPlot, title='Short State Filling', color=shortFillColor, transp=90) // CE Function ce() => atr2 = mult * ta.atr(length) longStop2 = (useClose ? ta.highest(close, length) : ta.highest(length)) - atr2 longStop2Prev = nz(longStop2[1], longStop2) longStop2 := close[1] > longStop2Prev ? math.max(longStop2, longStop2Prev) : longStop2 shortStop2 = (useClose ? ta.lowest(close, length) : ta.lowest(length)) + atr2 shortStop2Prev = nz(shortStop2[1], shortStop2) shortStop2 := close[1] < shortStop2Prev ? math.min(shortStop2, shortStop2Prev) : shortStop2 var int dir2 = 1 dir2 := close > shortStop2Prev ? 1 : close < longStop2Prev ? -1 : dir2 ce = dir2 == 1 ? longStop2 : shortStop2 [dir2, ce] [side, ce_plot] = ce() ce1_plot = request.security(syminfo.tickerid, tf1, ce_plot[1], barmerge.gaps_off, barmerge.lookahead_on) ce2_plot = request.security(syminfo.tickerid, tf2, ce_plot[1], barmerge.gaps_off, barmerge.lookahead_on) ce1 = request.security(syminfo.tickerid, tf1, side[1], barmerge.gaps_off, barmerge.lookahead_on) ce2 = request.security(syminfo.tickerid, tf2, side[1], barmerge.gaps_off, barmerge.lookahead_on) long = buySignal and ce1 > 0 and ce2 > 0 short = sellSignal and ce1 < 0 and ce2 < 0 tradeType = input.string('BOTH', title='What trades should be taken : ', options=['LONG', 'SHORT', 'BOTH']) // Position Management Tools pos = 0.0 if tradeType == 'BOTH' pos := long ? 1 : short ? -1 : pos[1] pos if tradeType == 'LONG' pos := long ? 1 : pos[1] pos if tradeType == 'SHORT' pos := short ? -1 : pos[1] pos longCond = long and (pos[1] != 1 or na(pos[1])) shortCond = short and (pos[1] != -1 or na(pos[1])) plot(ce1_plot, title='Timeframe 1 CE', color=ce1 > 0 ? #008000 : #800000, linewidth=2) plot(ce2_plot, title='Timeframe 2 CE', color=ce2 > 0 ? color.green : color.red, linewidth=2) // EXIT FUNCTIONS // i_sl = input.float(5.0, title='Stop Loss %', minval=0, group='Trades') sl = i_sl > 0 ? i_sl / 100 : 99999 long_entry = ta.valuewhen(longCond, close, 0) short_entry = ta.valuewhen(shortCond, close, 0) // Simple Stop Loss + 2 Take Profits sl_long = strategy.position_avg_price * (1 - sl) sl_short = strategy.position_avg_price * (1 + sl) // Position Adjustment long_sl = low < sl_long and pos[1] == 1 short_sl = high > sl_short and pos[1] == -1 if long_sl or short_sl pos := 0 pos long_exit = sellSignal and pos[1] == 1 short_exit = buySignal and pos[1] == -1 if long_exit or short_exit pos := 0 pos tp1percent = input.int(5, title='TP1 %', group='Trades') / 100.0 tp2percent = input.int(10, title='TP2 %', group='Trades') / 100.0 tp3percent = input.int(15, title='TP3 %', group='Trades') / 100.0 tp1amt = input.int(10, title='TP1 Amount %', group='Trades') tp2amt = input.int(15, title='TP2 Amount %', group='Trades') tp3amt = input.int(20, title='TP3 Amount %', group='Trades') // Strategy Backtest Limiting Algorithm i_startTime = input(defval=timestamp('01 Jun 2021 13:30 +0000'), title='Backtesting Start Time') i_endTime = input(defval=timestamp('30 Sep 2099 19:30 +0000'), title='Backtesting End Time') timeCond = true KeepLastPosition = input(false) // Make sure we are within the bar range, Set up entries and exit conditions strategy.entry('long', strategy.long, when=longCond == true and tradeType != 'SHORT' and timeCond) strategy.entry('short', strategy.short, when=shortCond == true and tradeType != 'LONG' and timeCond) var float Qty1 = na var float Qty2 = na var float Qty3 = na var float Qty4 = na if strategy.position_size == 0 equity_q = (50000 + strategy.netprofit) / close Qty1 := equity_q * tp1amt / 100.0 Qty2 := equity_q * tp2amt / 100.0 Qty3 := equity_q * tp3amt / 100.0 Qty4 := equity_q - Qty1 - Qty2 - Qty3 Qty4 strategy.exit('Exit1', qty=Qty1, stop=sl_long, limit=strategy.position_avg_price * (1 + tp1percent), when=strategy.position_size > 0) strategy.exit('Exit2', qty=Qty2, stop=sl_long, limit=strategy.position_avg_price * (1 + tp2percent), when=strategy.position_size > 0) strategy.exit('Exit3', qty=Qty3, stop=sl_long, limit=strategy.position_avg_price * (1 + tp3percent), when=strategy.position_size > 0) strategy.exit('Exit4', qty=Qty4, stop=sl_long, when=strategy.position_size > 0 and KeepLastPosition == false) strategy.close('long', when=long_exit, comment='CE Exit') strategy.exit('Exit1', qty=Qty1, stop=sl_short, limit=strategy.position_avg_price * (1 - tp1percent), when=strategy.position_size < 0) strategy.exit('Exit2', qty=Qty2, stop=sl_short, limit=strategy.position_avg_price * (1 - tp2percent), when=strategy.position_size < 0) strategy.exit('Exit3', qty=Qty3, stop=sl_short, limit=strategy.position_avg_price * (1 - tp3percent), when=strategy.position_size < 0) strategy.exit('Exit4', qty=Qty4, stop=sl_short, when=strategy.position_size < 0 and KeepLastPosition == false) strategy.close('short', when=short_exit, comment='CE Exit') plot(strategy.position_size > 0 ? strategy.position_avg_price * (1 + tp1percent) : na, color=color.new(color.green, 0), style=plot.style_linebr) plot(strategy.position_size > 0 ? strategy.position_avg_price * (1 + tp2percent) : na, color=color.new(color.green, 0), style=plot.style_linebr) plot(strategy.position_size > 0 ? strategy.position_avg_price * (1 + tp3percent) : na, color=color.new(color.green, 0), style=plot.style_linebr) plot(strategy.position_size > 0 ? sl_long : na, color=color.new(color.red, 0), style=plot.style_linebr) plot(strategy.position_size > 0 ? strategy.position_avg_price : na, color=color.new(color.gray, 0), style=plot.style_linebr) plot(strategy.position_size < 0 ? strategy.position_avg_price * (1 - tp1percent) : na, color=color.new(color.green, 0), style=plot.style_linebr) plot(strategy.position_size < 0 ? strategy.position_avg_price * (1 - tp2percent) : na, color=color.new(color.green, 0), style=plot.style_linebr) plot(strategy.position_size < 0 ? strategy.position_avg_price * (1 - tp3percent) : na, color=color.new(color.green, 0), style=plot.style_linebr) plot(strategy.position_size < 0 ? sl_short : na, color=color.new(color.red, 0), style=plot.style_linebr) plot(strategy.position_size < 0 ? strategy.position_avg_price : na, color=color.new(color.gray, 0), style=plot.style_linebr)