SuperTrend Stratégie de trading quantitative pour Bitcoin

Auteur:ChaoZhang est là., Date: 2024-02-06 12:09:09 Je suis désolé
Les étiquettes:

img

Résumé

Il s'agit d'une stratégie de trading quantitative automatisée pour Bitcoin basée sur l'indicateur SuperTrend. Il utilise l'indicateur SuperTrend pour déterminer les tendances du marché et combine le principe de stop loss ATR pour contrôler les risques, permettant ainsi le trading long et court. Le plus grand avantage de cette stratégie est un bon ratio risque-rendement et une stratégie de stop loss fiable, adaptée à la détention à moyen et long terme.

Principe de stratégie

Cette stratégie utilise l'indicateur SuperTrend pour déterminer la direction des tendances du marché.

Plus précisément, cette stratégie calcule d'abord la période ATR à 14 barres, et détermine la distance stop loss pour chaque transaction en la multipliant par un multiplicateur de stop loss ATR (comme 1.5x).

Après l'entrée d'un commerce, le stop loss est fixé au-dessus ou en dessous du stop loss ATR. Le premier niveau de profit est calculé sur la base d'un ratio risque-rendement, par défaut à 0,75, ce qui signifie que la distance de profit est 0,75 fois la distance de stop loss. Lorsque le prix atteint le premier niveau de profit, 50% de la position sera fermée et le stop loss est déplacé au prix d'entrée (break even) pour verrouiller les profits. Le deuxième niveau de profit continue à utiliser un ratio risque-rendement de 0,75. Si le prix atteint le stop loss, la position restante sera fermée par stop loss.

Cette stratégie garantit ainsi un risque de stop loss contrôlable tout en assurant des bénéfices par des bénéfices partiels, adaptés aux stratégies d'investissement à moyen et long terme.

Analyse des avantages

L'avantage majeur de cette stratégie est un bon rapport risque/rendement, permettant une détention à moyen et long terme.

  1. Utiliser SuperTrend pour déterminer les tendances du marché, filtrer le bruit du marché et détecter les principales tendances.

  2. Suivi dynamique par ATR du stop loss, contrôlant de manière fiable les pertes d'une seule transaction.

  3. Les prises partielles de bénéfices se verrouillent dans les bénéfices, ce qui entraîne un rapport risque/rendement élevé.

  4. Le déplacement du stop-loss vers le prix d'entrée après avoir atteint TP1 bloque les bénéfices et améliore la stabilité de la stratégie.

  5. Une logique extrêmement simple, facile à comprendre et à mettre en œuvre, avec un grand espace de réglage de paramètres.

  6. Applicable aux échanges traditionnels utilisant des données intradiennes ou à haute fréquence, grande flexibilité.

Analyse des risques

Cette stratégie comporte également certains risques, principalement dans les domaines suivants:

  1. Le risque d'écart ne déclenche pas le stop loss, face à une grande perte.

  2. SuperTrend ne parvient pas à déterminer la bonne tendance, ce qui entraîne de mauvais signaux commerciaux.

  3. Prendre un ratio de profit trop élevé, incapable de suivre la tendance, devrait s'ajuster en fonction des différents marchés.

  4. La fréquence des transactions peut être trop élevée ou trop faible.

Directions d'optimisation

Il reste encore beaucoup de place pour optimiser cette stratégie, principalement dans les domaines suivants:

  1. Les méthodes d'arrêt des pertes ATR sont différentes, telles que l'ATR fixe, l'arrêt de l'élan, l'arrêt des pertes Bollinger, etc.

  2. Optimiser les paramètres de SuperTrend en utilisant des algorithmes de marche vers l'avant ou génétiques pour les meilleurs paramètres.

  3. Ajout d'une deuxième couche de stop loss comme les canaux Donchian pour rendre le stop plus fiable.

  4. Testez différents ratios de prise de profit pour une prise de profit optimale par rapport à l'équilibrage des risques.

  5. Explorez les techniques d'apprentissage automatique pour le stop loss dynamique, l'ajustement de la position, etc.

Conclusion

Il s'agit d'une stratégie quantitative basée sur la SuperTrend pour la tendance, l'arrêt dynamique ATR et la prise partielle de profit. Il a un rapport risque-rendement équilibré, adapté au trading d'algo. Il y a beaucoup de place pour optimiser les paramètres, le stop loss, la prise de profit, etc. Il vaut la peine d'être ajusté et appliqué à long terme.


/*backtest
start: 2024-01-06 00:00:00
end: 2024-02-05 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/
// Developed by © StrategiesForEveryone
//@version=5

strategy("SuperTrend Strategy for BTCUSD 4H", overlay=true, process_orders_on_close = true, initial_capital = 100, default_qty_type = strategy.cash, precision = 2, slippage = 50, commission_value = 0.03, backtest_fill_limits_assumption = 50)

// ------ Date filter (obtained from ZenAndTheArtOfTrading) ---------

initial_date = input(title="Initial date", defval=timestamp("10 Feb 2014 13:30 +0000"), group="Time filter", tooltip="Enter the start date and time of the strategy")
final_date   = input(title="Final date", defval=timestamp("01 Jan 2030 19:30 +0000"), group="Time filter", tooltip="Enter the end date and time of the strategy")
dateFilter(int st, int et) => time >= st and time <= et
colorDate = input.bool(defval=false, title="Date background", tooltip = "Add color to the period of time of the strategy tester")
bgcolor(colorDate and dateFilter(initial_date, final_date) ? color.new(color.blue, transp=90) : na)

// ------------ Super Trend ----------

atrPeriod = input(9, "ATR Length SuperTrend")
factor = input.float(2.5, "Factor SuperTrend", step = 0.05)
[supertrend, direction] = ta.supertrend(factor, atrPeriod)
show_supertrend = input.bool(defval = false, title="Show supertrend ?", group = "Appearance")
bodyMiddle = plot(show_supertrend ? ((open + close) / 2) : na, display=display.none)
upTrend = plot(show_supertrend and direction < 0 ? supertrend : na, "Up Trend", color = color.green, style=plot.style_linebr)
downTrend = plot(show_supertrend and direction > 0 ? supertrend : na, "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)

// ---------- Atr stop loss (obtained from garethyeo)

source_atr = input(close, title='Source', group = "Atr stop loss", inline = "A")
length_atr = input.int(14, minval=1, title='Period', group = "Atr stop loss" , inline = "A")
multiplier = input.float(1.5, minval=0.1, step=0.1, title='Atr multiplier', group = "Atr stop loss", inline = "A", tooltip = "Defines the stop loss distance based on the Atr stop loss indicator")
shortStopLoss = source_atr + ta.atr(length_atr) * multiplier
longStopLoss = source_atr - ta.atr(length_atr) * multiplier
show_atr_stoploss = input.bool(defval=false, title="Show Atr stop loss ?", group = "Appearance")
plot(show_atr_stoploss ? longStopLoss : na, color=color.white, style = plot.style_circles)
plot(show_atr_stoploss ? shortStopLoss : na, color=color.white, style = plot.style_circles)

// ------------- Money management --------------

strategy_contracts = strategy.equity / close
distance_sl_atr_long = -1 * (longStopLoss - close) / close
distance_sl_atr_short = (shortStopLoss - close) / close
risk = input.float(2.5, '% Account risk per trade', step=1, group = "Risk management for trades", tooltip = "Percentage of total account to risk per trade")
long_amount = strategy_contracts * (risk / 100) / distance_sl_atr_long
short_amount = strategy_contracts * (risk / 100) / distance_sl_atr_short

// ---------- Risk management ---------------

risk_reward_breakeven_long= input.float(title="Risk/reward for breakeven long", defval=0.75, step=0.05, group = "Risk management for trades")
risk_reward_take_profit_long= input.float(title="Risk/reward for take profit long", defval=0.75, step=0.05, group = "Risk management for trades")
risk_reward_breakeven_short= input.float(title="Risk/reward for break even short", defval=0.75, step=0.05, group = "Risk management for trades")
risk_reward_take_profit_short= input.float(title="Risk/reward for take profit short", defval=0.75, step=0.05, group = "Risk management for trades")
tp_percent=input.float(title="% of trade for first take profit", defval=50, step=5, group = "Risk management for trades", tooltip = "Closing percentage of the current position when the first take profit is reached.")

// ------------ Trade conditions ---------------

bought = strategy.position_size > 0
sold = strategy.position_size < 0
long_supertrend=ta.crossover(close, supertrend)
short_supertrend=ta.crossunder(close, supertrend)
var float sl_long = na
var float sl_short = na 
var float be_long = na
var float be_short = na
var float tp_long = na
var float tp_short = na
if not bought
    sl_long:=na
if not sold
    sl_short:=na

// ---------- Strategy -----------

// Long position 

if not bought and long_supertrend
    sl_long:=longStopLoss           
    long_stoploss_distance = close - longStopLoss
    be_long := close + long_stoploss_distance * risk_reward_breakeven_long
    tp_long:=close+(long_stoploss_distance*risk_reward_take_profit_long)
    strategy.entry('L', strategy.long, long_amount, alert_message = "Long")
    strategy.exit("Tp", "L", stop=sl_long, limit=tp_long, qty_percent=tp_percent)
    strategy.exit('Exit', 'L', stop=sl_long)
if high > be_long
    sl_long := strategy.position_avg_price
    strategy.exit("Tp", "L", stop=sl_long, limit=tp_long, qty_percent=tp_percent)
    strategy.exit('Exit', 'L', stop=sl_long)
if bought and short_supertrend
    strategy.close("L", comment="CL")

// Short position

if not sold and short_supertrend
    sl_short:=shortStopLoss
    short_stoploss_distance=shortStopLoss - close  
    be_short:=((short_stoploss_distance*risk_reward_breakeven_short)-close)*-1
    tp_short:=((short_stoploss_distance*risk_reward_take_profit_short)-close)*-1
    strategy.entry("S", strategy.short, short_amount, alert_message = "Short")
    strategy.exit("Tp", "S", stop=sl_short, limit=tp_short, qty_percent=tp_percent)
    strategy.exit("Exit", "S", stop=sl_short)
if low < be_short
    sl_short:=strategy.position_avg_price
    strategy.exit("Tp", "S", stop=sl_short, limit=tp_short, qty_percent=tp_percent)
    strategy.exit("Exit", "S", stop=sl_short)    
if sold and long_supertrend
    strategy.close("S", comment="CS") 

// ---------- Draw position on chart -------------

if high>tp_long
    tp_long:=na
if low<tp_short
    tp_short:=na
if high>be_long
    be_long:=na
if low<be_short
    be_short:=na

show_position_on_chart = input.bool(defval=true, title="Draw position on chart ?", group = "Appearance", tooltip = "Activate to graphically display profit, stop loss and break even")
position_price = plot(show_position_on_chart? strategy.position_avg_price : na, style=plot.style_linebr, color = color.new(#ffffff, 10), linewidth = 1)

sl_long_price = plot(show_position_on_chart and bought ? sl_long : na, style = plot.style_linebr, color = color.new(color.red, 10), linewidth = 1)
sl_short_price = plot(show_position_on_chart and sold ? sl_short : na, style = plot.style_linebr, color = color.new(color.red, 10), linewidth = 1)

tp_long_price = plot(strategy.position_size>0 and show_position_on_chart? tp_long : na, style = plot.style_linebr, color = color.new(#11eb47, 10), linewidth = 1)
tp_short_price = plot(strategy.position_size<0 and show_position_on_chart? tp_short : na, style = plot.style_linebr, color = color.new(#11eb47, 10), linewidth = 1)

breakeven_long = plot(strategy.position_size>0 and high<be_long and show_position_on_chart ? be_long : na , style = plot.style_linebr, color = color.new(#00ff40, 60), linewidth = 1)
breakeven_short = plot(strategy.position_size<0 and low>be_short and show_position_on_chart ? be_short : na , style = plot.style_linebr, color = color.new(#00ff40, 60), linewidth = 1)

position_profit_long = plot(bought and show_position_on_chart and strategy.openprofit>0 ? close : na, style = plot.style_linebr, color = color.new(#4cd350, 10), linewidth = 1)
position_profit_short = plot(sold and show_position_on_chart and strategy.openprofit>0 ? close : na, style = plot.style_linebr, color = color.new(#4cd350, 10), linewidth = 1)

fill(plot1 = position_price, plot2 = position_profit_long, color = color.new(color.green,90))
fill(plot1 = position_price, plot2 = position_profit_short, color = color.new(color.green,90))

fill(plot1 = position_price, plot2 = sl_long_price, color = color.new(color.red,90))
fill(plot1 = position_price, plot2 = sl_short_price, color = color.new(color.red,90))

fill(plot1 = position_price, plot2 = tp_long_price, color = color.new(color.green,90))
fill(plot1 = position_price, plot2 = tp_short_price, color = color.new(color.green,90))


Plus de