Cet article explique en détail une stratégie de trading quantitative utilisant l'indicateur Supertrend sur plusieurs délais.
I. Logique stratégique
Les éléments clés de la stratégie sont les suivants:
Calcul de la Supertrend sur la période en cours pour déterminer la direction de la tendance des prix.
Calcul de la Supertendance sur une période plus longue (par exemple quotidienne) pour évaluer la tendance majeure.
Formation de signaux commerciaux basés sur la cohérence entre les directions de Supertrend sur les deux délais.
Définition d'un stop-loss et d'un take profit appropriés basés sur les signaux.
En augmentant avec des portions fixes pour verrouiller les bénéfices.
Lorsque Supertrend s'accorde sur des délais élevés et bas, une tendance majeure est identifiée et des signaux d'achat / vente sont générés en fonction de la relation de l'indicateur.
II. Avantages de la stratégie
Le plus grand avantage réside dans l'utilisation de plusieurs délais pour filtrer les faux signaux et améliorer la fiabilité.
En outre, des paramètres raisonnables de stop loss et de prise de profit assurent un risque contrôlable par transaction, évitant ainsi des pertes excessives.
Enfin, l'élargissement de certaines parties des bénéfices est également une caractéristique déterminante de la stratégie.
III. Les faiblesses potentielles
Toutefois, il convient également de prendre en compte les risques suivants:
Premièrement, Supertrend lui-même a des problèmes de retard qui peuvent causer des points d'entrée optimaux manqués.
Deuxièmement, un arrêt trop agressif risque d'être arrêté prématurément.
Enfin, la mise à l'échelle peut entraîner des coûts supplémentaires de glissement.
IV. Résumé
En résumé, cet article a expliqué une stratégie quantitative utilisant Supertrend sur plusieurs délais. Il améliore la qualité du signal grâce à la combinaison de l'analyse de la période élevée et basse, et gère les risques via stop loss, take profit et scaling out.
/*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)