
Cette stratégie est une stratégie de trading automatique quantifiée de Bitcoin basée sur des indicateurs de super-tendance. Elle utilise des indicateurs de super-tendance pour juger de la tendance du marché, en combinaison avec le contrôle des risques de l’ATR Stop Loss Principle, pour réaliser des transactions à court et à long terme.
Cette stratégie utilise un indicateur de tendance supérieure pour déterminer la direction de la tendance du marché. Lorsque l’indicateur de tendance supérieure passe d’une tendance à la baisse à une tendance à la hausse, effectuez une entrée à plusieurs têtes. Lorsque l’indicateur de tendance supérieure passe d’une tendance à la hausse à une tendance à la baisse, effectuez une entrée à la baisse.
Plus précisément, la stratégie commence par calculer la longueur de l’indicateur ATR de 14 cycles, en multipliant chaque stop loss par un ATR stop loss multiple (par exemple 1,5 fois). Ensuite, le paramètre de l’indicateur est calculé en utilisant la valeur par défaut (ATR cycle 9, coefficient de super-tendance 2.5) et émet un signal de transaction lorsque l’indicateur de super-tendance change de direction.
Après l’entrée, le stop loss est fixé au-dessus ou en dessous du stop ATR. Le premier stop loss est calculé en fonction du ratio de risque/rendement, en supposant 0.75, c’est-à-dire que la distance d’arrêt est 0.75 fois la distance d’arrêt. Lorsque le prix atteint le premier stop loss, la position est libérée à 50% et le stop loss est déplacé vers le prix d’ouverture.
Ainsi, cette stratégie peut assurer la rentabilité par le biais d’un stop-loss partiel, tout en garantissant la maîtrise du risque de perte, ce qui convient à la stratégie d’investissement de détention à moyen et long terme.
Le plus grand avantage de cette stratégie est un bon rapport risque/rendement, qui peut être conservé à moyen et long terme. Les avantages spécifiques sont:
Il utilise les super tendances pour juger les tendances du marché, filtrer le bruit du marché et éviter de manquer les principales tendances.
L’ATR est un système de suivi dynamique des pertes, permettant de contrôler de manière fiable les pertes individuelles.
La méthode de blocage partiel est une méthode de verrouillage des bénéfices, avec un risque plus élevé que le bénéfice.
Lorsque le prix atteint le seuil de stop 1, ajustez le stop loss au prix d’ouverture de la position, assurez la rentabilité et améliorez la stabilité de la stratégie.
La logique de transaction est super simple, facile à comprendre et à mettre en œuvre, avec un grand espace de paramétrage.
Il est flexible et peut être utilisé sur les données journalières ou à haute fréquence des principales bourses.
Cette stratégie comporte également des risques, principalement liés aux aspects suivants:
Les événements inattendus du marché entraînent des lacunes ou des sauts, ne peuvent pas être arrêtés et sont exposés à de grandes pertes. Le risque peut être réduit en ajustant raisonnablement le coefficient d’arrêt ATR.
Le jugement de l’indicateur de super-tendance a échoué, ce qui a entraîné une erreur de signal de négociation. L’ATR et la combinaison de paramètres de la super-tendance peuvent être ajustés et optimisés de manière appropriée.
Le ratio de placement partiel est trop élevé pour obtenir un profit suffisant de la tendance. Le ratio de placement partiel doit être ajusté en fonction des différents marchés.
La fréquence de négociation peut être trop élevée ou trop faible. Les paramètres de la super tendance doivent être ajustés pour trouver l’équilibre optimal.
Il y a beaucoup de possibilités d’optimisation dans cette stratégie, qui se concentre principalement sur les aspects suivants:
Essayez différentes stratégies d’arrêt ATR, telles que l’ATR standard, l’arrêt de mouvement et l’arrêt de la bande de Bryn pour optimiser l’arrêt.
Test d’indicateurs de super-tendance pour différents paramètres afin de trouver la combinaison optimale de paramètres. L’optimisation des paramètres multidimensionnels peut être effectuée à l’aide d’une optimisation progressive ou d’un algorithme génétique.
Essayez de superposer un deuxième niveau d’indicateurs de stop sur le stop, comme le canal Donchian, pour rendre le stop plus fiable.
Testez différents ratios de placement partiel pour trouver le meilleur équilibre entre la rentabilité et le risque. Les ratios de placement partiel peuvent également être ajustés dynamiquement.
Découvrez des stratégies basées sur l’apprentissage automatique, telles que l’arrêt dynamique et le réglage dynamique de la position.
Cette stratégie est une stratégie quantitative basée sur une tendance de jugement de super-tendance, un arrêt ATR dynamique, et un arrêt partiel des gains. Elle est bien équilibrée entre les risques et les gains et convient aux transactions automatisées. La stratégie peut considérablement optimiser les méthodes d’excédent, d’arrêt et de profit, etc. C’est une stratégie quantitative qui vaut la peine d’être optimisée et utilisée à 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))