Quantitative Bitcoin-Handelsstrategie basierend auf Supertrend


Erstellungsdatum: 2024-02-06 12:09:09 zuletzt geändert: 2024-02-06 12:09:09
Kopie: 2 Klicks: 983
1
konzentrieren Sie sich auf
1617
Anhänger

Quantitative Bitcoin-Handelsstrategie basierend auf Supertrend

Überblick

Diese Strategie ist eine Bitcoin-Automatik-Quantitative-Trading-Strategie, die auf Supertrend-Indikatoren basiert. Sie verwendet Supertrend-Indikatoren, um Markttrends zu beurteilen, kombiniert mit ATR-Stopp-Prinzipien, um Risiken zu kontrollieren und langfristige, wechselseitige Geschäfte zu realisieren. Der größte Vorteil der Strategie ist ein gutes Risiko-Ertrags-Verhältnis, die Stop-Loss-Strategie ist zuverlässig und eignet sich für mittelfristige und langfristige Haltungen.

Strategieprinzip

Diese Strategie verwendet Supertrend-Indikatoren, um die Richtung des Markttrends zu bestimmen. Wenn der Supertrend-Indikator von einem Abwärtstrend in einen Aufwärtstrend umgewandelt wird, wird ein Übertritt getätigt. Wenn der Supertrend-Indikator von einem Aufwärtstrend in einen Abwärtstrend umgewandelt wird, wird ein Shorttritt getätigt.

Konkret berechnet die Strategie zunächst die Länge des ATR-Indikators mit 14 Zyklen, um die Stopp-Distanz für jede einzelne zu bestimmen, indem sie mit einem ATR-Stopp-Multiplikator multipliziert wird (z. B. 1,5 mal). Danach wird der Supertrend-Indikator berechnet, dessen Parameter den Standardwert haben (ATR-Zyklen 9, Supertrend-Faktor 2.5).

Nach dem Eintritt wird der Stop-Loss auf der ATR-Stop-Ober- oder Unterseite festgelegt. Der erste Stop-Loss wird nach dem Risiko-Rendite-Verhältnis berechnet und implizit 0,75 angenommen, d. h. die Stop-Loss-Distanz ist 0,75 mal so groß wie die Stop-Loss-Distanz. Wenn der Preis den ersten Stop-Loss erreicht, werden 50% der Positionen platziert und die Stop-Loss-Position auf den Eröffnungspreis verschoben.

So kann die Strategie durch Teilstopps einen Gewinn sichern, während die Stop-Loss-Risiken kontrolliert werden, und ist geeignet für eine Investitionsstrategie mit mittlerem und langem Halt.

Analyse der Stärken

Der größte Vorteil dieser Strategie ist, dass die Gewinne und Risiken in einem guten Verhältnis sind und auf mittlere und lange Sicht gehalten werden können.

  1. Die Verwendung von Supertrends, um Markttrends zu beurteilen, filtert Marktlärm und verhindert, dass die wichtigsten Trends verpasst werden.

  2. ATR dynamische Tracking Stop Loss, zuverlässige Kontrolle von Einzelschäden.

  3. Ein Teil der Stop-Off-Methode ist ein Profit-Lock-In mit einem höheren Risiko-Gewinn-Verhältnis.

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

  5. Super-einfache Transaktionslogik, leicht verständliche Implementierung, großer Spielraum für Parameter.

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

Risikoanalyse

Die Strategie birgt Risiken, die sich auf folgende Bereiche konzentrieren:

  1. Die Risiken können durch eine angemessene Anpassung des ATR-Stopp-Loss-Kopfwerts verringert werden.

  2. Die Übertrend-Indikatoren scheitern, was zu falschen Handelssignalen führt. Die Kombination von ATR und Übertrend-Parametern kann entsprechend angepasst und optimiert werden.

  3. Ein Teil des Ausgleichs ist zu hoch eingestellt, um ausreichend Trendgewinne zu erzielen. Ein Teil des Ausgleichs sollte je nach Markt angepasst werden.

  4. Die Häufigkeit des Handels kann zu hoch oder zu niedrig sein. Die Parameter des Supertrends sollten angepasst werden, um die optimale Balance zu finden.

Optimierungsrichtung

Die Strategie bietet viel Optimierungsmöglichkeiten und konzentriert sich auf folgende Bereiche:

  1. Versuchen Sie mit verschiedenen ATR-Stopp-Methoden, wie Standard-ATR, Dynamik-Stopp, Brin-Band-Stopp, um Ihre Stop-Strategie zu optimieren.

  2. Tests mit unterschiedlichen Parametern für Supertrend-Indikatoren, um die optimale Parameterkombination zu finden. Die mehrdimensionale Parameteroptimierung kann mit Schritt-Schritt-Optimierung oder genetischen Algorithmen durchgeführt werden.

  3. Versuchen Sie, eine zweite Schicht von Stop-Indicatoren wie Donchian-Kanäle auf den Stop-Loss zu überlagern, um den Stop-Loss zuverlässiger zu machen.

  4. Verschiedene Teilabsetzungsquoten werden getestet, um die optimale Gewinn-Risiko-Balance zu finden. Teilabsetzungsquoten können auch dynamisch angepasst werden.

  5. Erforschung von Strategien wie Dynamic Stop Loss, Dynamic Position Adjustment und anderen, die auf Machine Learning basieren.

Zusammenfassen

Diese Strategie ist eine quantitative Strategie, die auf Supertrends basiert, Trends beurteilt, ATR-dynamische Stop-Loss und teilweise Stop-Reward. Sie ist ein gut ausbalanciertes Risiko-Gewinn-System, das für den automatisierten Handel geeignet ist. Die Strategie kann die Überlagerung, die Stop-Loss-Methode, die Gewinn-Methode usw. erheblich optimieren und ist eine quantitative Strategie, die es wert ist, langfristig optimiert und verwendet zu werden.

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