Bitcoin-Quantifizierungstransaktionsstrategien basierend auf Supertrends

Schriftsteller:ChaoZhang, Datum: 2024-02-06 12:09:09
Tags:

基于超级趋势的比特币量化交易策略

Übersicht

Diese Strategie ist eine Bitcoin-Automatik-Quantifizierung-Handelsstrategie, die auf Supertrend-Indikatoren basiert. Sie verwendet Supertrend-Indikatoren, um Markttrends zu bestimmen, und kombiniert sie mit dem ATR-Stopp-Loss-Prinzip, um Risiken zu kontrollieren, um langfristige, zweiseitige Trades zu realisieren. Die größten Vorteile der Strategie sind ein gutes Risiko-Rendite-Verhältnis, eine zuverlässige Stop-Loss-Strategie, die für mittlere und lange Zeit geeignet ist.

Die Strategie

Diese Strategie verwendet Supertrend-Indikatoren, um die Markttrendrichtung zu bestimmen. Wenn der Supertrend-Indikator von einem Abwärtstrend in einen Aufwärtstrend umgewandelt wird, machen Sie einen Multi-Head-Eintritt; Wenn der Supertrend-Indikator von einem Aufwärtstrend in einen Abwärtstrend umgewandelt wird, machen Sie einen Leerkopf-Eintritt.

Konkret wird mit dieser Strategie zunächst die Länge des ATR-Indikators für 14 Zyklen berechnet und die Stop-Loss-Distanz für jede Einheit durch ein ATR-Stop-Loss-Mehrfach (z. B. 1,5) bestimmt. Danach wird der Supertrend-Indikator berechnet, wobei die Indikatorparameter den Standardwert (ATR-Zyklus 9, Supertrend-Koeffizient 2.5) verwenden.

Nach dem Eintritt wird der Stop-Loss-Platz oben oder unten am ATR festgesetzt. Der erste Stop-Loss-Platz wird anhand des Risiko-Rendite-Proportions berechnet, wobei der Standardabstand 0,75 ist. Wenn der Preis den ersten Stop-Platz erreicht, wird 50% der Position eingeebnet und der Stop-Loss auf den Eröffnungspreis verschoben, so dass die Position profitabel gesperrt wird.

Diese Strategie kann somit eine Gewinnsicherung durch eine teilweise Verhinderung von Verlusten gewährleisten, wobei das Stop-Loss-Risiko kontrolliert ist.

Stärkenanalyse

Der größte Vorteil dieser Strategie ist, dass die Risikobereitschaft gut ist und im mittleren und langen Zeitraum gehalten werden kann.

  1. Mit Hilfe von Supertrends werden Markttrends ermittelt, um Marktlärm zu filtern und wichtige Trends zu vermeiden.

  2. Der ATR ist ein dynamischer Stopp-Loss-Tracker, der den Einzelverlust zuverlässig kontrolliert.

  3. Ein Teil der Antidumping-Methode sperrt die Gewinne und erhöht das Risiko der Gewinne.

  4. Wenn der Preis den Stop-Loss 1 erreicht, wird der Stop-Loss an den Eröffnungspreis angepasst, um Gewinn zu sichern und die Strategie zu stabilisieren.

  5. Die Transaktionslogik ist super einfach, die Implementierung ist leicht zu verstehen und die Parameterbereinigungsfläche groß.

  6. Sie ist flexibel und kann auf Tages- oder Hochfrequenzdaten der Mainstream-Börsen angewendet werden.

Risikoanalyse

Die Strategie ist auch mit Risiken verbunden und konzentriert sich auf folgende Bereiche:

  1. Marktvorfälle verursachen Lücken oder Sprünge, die nicht gestoppt werden können und größere Verluste verursachen. Das Risiko kann durch eine vernünftige Anpassung der ATR-Stoppverlustmengen reduziert werden.

  2. Die Übertrend-Anzeige ist fehlerhaft und verursacht Handelssignalfehler. Die Kombination von ATR und Übertrend-Parametern kann entsprechend optimiert werden.

  3. Ein Teil des Ausgleichs ist zu hoch eingestellt, um einen ausreichenden Trendgewinn zu erzielen. Der Teil des Ausgleichs sollte je nach Markt angepasst werden.

  4. Die Handelsfrequenz kann zu hoch oder zu niedrig sein. Die Parameter für den Supertrend sollten angepasst werden, um das beste Gleichgewicht zu finden.

Optimierung

Die Strategie kann auch sehr optimiert werden und konzentriert sich vor allem auf folgende Bereiche:

  1. Versuche verschiedene ATR-Loss-Stopp-Methoden, wie Standard-ATR, Motor-Loss-Stopp, Brin-Band-Loss-Stopp, um die Stop-Loss-Strategie zu optimieren.

  2. Überprüfen Sie verschiedene Supertrend-Indikatoren, um die optimale Parameterkombination zu finden. Sie können mit schrittweisen Optimierungen oder genetischen Algorithmen mehrdimensionale Parameteroptimierungen durchführen.

  3. Versuchen Sie, einen zweiten Stop-Loss-Indikator, wie den Donchian-Kanal, auf den Stop-Loss zu überlagern, um den Stop-Loss zu sichern.

  4. Test verschiedene Teilausgleichsquoten, um die optimale Gewinn- und Risikobilanz zu finden. Teilausgleichsquoten können auch dynamisch angepasst werden.

  5. Erforschen Sie Strategien wie dynamisches Stoppen, dynamisches Positionieren und so weiter, basierend auf maschinellem Lernen.

Zusammenfassung

Diese Strategie ist eine Quantifizierungsstrategie, die auf Supertrend-Trends, ATR-Dynamic-Stopp-Loss und partiell-Stopp-Gewinne basiert. Sie ist gut ausgeglichen und eignet sich für automatisierte Trades. Die Strategie, die erhebliche Optimierungen von Übertrend-, Stop-Loss- und Profit-Methoden ermöglicht, ist eine Quantifizierungsstrategie, die langfristig optimiert und verwendet werden sollte.


/*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))


Weitere Informationen