Dies ist eine automatisierte quantitative Handelsstrategie für Bitcoin, die auf dem SuperTrend-Indikator basiert. Sie verwendet den SuperTrend-Indikator, um Markttrends zu bestimmen, und kombiniert das ATR-Stop-Loss-Prinzip, um Risiken zu kontrollieren, was den Long- und Short-Handel ermöglicht. Der größte Vorteil dieser Strategie ist ein gutes Risiko-Rendite-Verhältnis und eine zuverlässige Stop-Loss-Strategie, die für mittelfristige bis langfristige Haltungen geeignet ist. Diese Strategie kann auf Mainstream-Börsen wie Coinbase Pro mit einem Zeitrahmen von 4 Stunden angewendet werden.
Diese Strategie verwendet den SuperTrend-Indikator, um die Richtung der Markttrends zu bestimmen. Es geht lang, wenn der SuperTrend-Indikator von einem Abwärtstrend in einen Aufwärtstrend wechselt, und geht kurz, wenn der SuperTrend-Indikator von einem Aufwärtstrend in einen Abwärtstrend wechselt.
Insbesondere berechnet diese Strategie zunächst die ATR-Periode als 14 Bars und bestimmt die Stop-Loss-Distanz für jeden Trade, indem sie durch einen ATR-Stop-Loss-Multiplikator (z. B. 1,5x) multipliziert wird.
Nach dem Eintritt in einen Trade wird der Stop-Loss über oder unter dem ATR-Stop-Loss festgelegt. Der erste Take-Profit-Level wird auf der Grundlage eines Risiko-Reward-Verhältnisses berechnet, standardmäßig auf 0,75, was bedeutet, dass die Take-Profit-Distanz 0,75x der Stop-Loss-Distanz beträgt. Wenn der Preis den ersten Take-Profit-Level erreicht, wird 50% der Position geschlossen, und der Stop-Loss wird zum Einstiegspreis (Break Even) verschoben, um Gewinne zu erzielen. Der zweite Take-Profit-Level verwendet weiterhin ein Risiko-Reward-Verhältnis von 0,75. Wenn der Preis den Stop-Loss erreicht, wird die verbleibende Position durch Stop-Loss geschlossen.
Auf diese Weise gewährleistet diese Strategie ein kontrollierbares Stop-Loss-Risiko und sichert gleichzeitig Gewinne durch teilweise Gewinne, die für mittelfristige und langfristige Anlagestrategien geeignet sind.
Der größte Vorteil dieser Strategie ist ein gutes Risiko-Rendite-Verhältnis, das eine mittelfristige bis langfristige Beteiligung ermöglicht.
SuperTrend zur Ermittlung von Markttrends, Filterung von Marktlärm und Erfassung wichtiger Trends.
Dynamische ATR-Verfolgung von Stop-Loss, die einen einzelnen Handelsverlust zuverlässig kontrolliert.
Teilweise Gewinnsperren im Gewinn, was zu einem hohen Risiko-Rendite-Verhältnis führt.
Die Verlagerung des Stop-Loss auf den Einstiegspreis nach dem Erreichen von TP1 schließt den Gewinn und erhöht die Strategie-Stabilität.
Extrem einfache Logik, leicht zu verstehen und umzusetzen, mit großem Parameter-Tuning-Raum.
Anwendbar auf Mainstream-Börsen mit Intraday- oder Hochfrequenzdaten, hohe Flexibilität.
Diese Strategie birgt auch einige Risiken, vor allem in den folgenden Bereichen:
Das Risiko, dass ein GAP-Risiko den Stop-Loss nicht auslösen kann, kann bei einem großen Verlust geändert werden, um das Risiko zu reduzieren.
SuperTrend kann den richtigen Trend nicht bestimmen, was zu falschen Handelssignalen führt.
Die Gewinnquote ist zu hoch, man kann den Trend nicht überstehen.
Die Handelsfrequenz kann zu hoch oder zu niedrig sein.
Es gibt noch viel Raum für die Optimierung dieser Strategie, vor allem in folgenden Bereichen:
Verschiedene ATR-Stop-Loss-Methoden wie Fixed ATR, Momentum-Stop, Bollinger-Stop-Loss usw. testen.
Optimieren Sie die SuperTrend-Parameter mit Walk-Forward- oder genetischen Algorithmen für die besten Parameter.
Hinzufügen einer zweiten Stop-Loss-Schicht wie Donchian-Kanäle, um den Stop zuverlässiger zu machen.
Testen Sie verschiedene Gewinnverhältnisse für optimale Gewinnentnahme vs. Risikobilanzierung. Machen Sie es dynamisch.
Erforschen Sie maschinelle Lerntechniken für dynamischen Stop-Loss, Positionsanpassung usw.
Dies ist eine quantitative Strategie, die auf SuperTrend für Trend, ATR-Dynamic Stop und partielle Take-Profit basiert. Es hat ein ausgewogenes Risiko-Rendite-Verhältnis, das für den Algo-Handel geeignet ist. Es gibt viel Raum für die Optimierung von Parametern, Stop-Loss, Profittaking usw. Es lohnt sich langfristig zu tunen und anzuwenden.
/*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))