Quantitative Handelsstrategie unter doppeltem Druck

Schriftsteller:ChaoZhang, Datum: 2023-11-02 13:56:23
Tags:

img

Übersicht

Die Dual Pressure Quantitative Trading Strategie ist eine Trendfolgestrategie, die Stochastische und Volumenindikatoren kombiniert.

Strategie Logik

Kaufsignale

Das Hauptkaufsignal wird ausgelöst, wenn:

  1. Beide K- und D-Linien kreuzen unterhalb des Überverkaufsbereichs (z. B. 20) und gehen nach oben, und sowohl K als auch D steigen

  2. Volumen liegt über einem Schwellenwert (z. B. 1,4 mal Durchschnittsvolumen)

  3. Schließen ist oben offen (weiße Kerze)

Zusätzliche Kaufsignale können von:

  1. Goldenes Kreuz: Schnelle EMA überschreitet langsame EMA, beide steigen

  2. Sowohl K als auch D steigen von niedrig in die mittlere Zone (z. B. von unter 20 auf 20-80)

Verkaufssignale

Die wichtigsten Verkaufssignale werden ausgelöst, wenn:

  1. Sowohl K als auch D gehen in den Überkaufbereich ein (z. B. über 80).

  2. Todeskreuz: Schnelle EMA überschreitet langsame EMA

  3. K geht unter D, und sowohl K als auch D fallen

Stop-Loss

Ein Prozentsatz (z. B. 6%) unter dem Kaufpreis wird als Stop-Loss-Level festgelegt.

Analyse der Vorteile

  • Dual Stochastic vermeidet falsche Signale
  • Lautstärke filtert Geräusche und sorgt für Trends
  • Mehrfachsignale verbinden die Genauigkeit
  • Gleitende Durchschnitte unterstützen den allgemeinen Trend
  • Stop-Loss-Risikokontrollen

Vorteil 1: Dual Stochastic vermeidet falsche Signale

Ein einzelner Stochastiker kann viele falsche Signale erzeugen. Die doppelte Stochastikkombination filtert falsche Signale und verbessert die Zuverlässigkeit.

Vorteil 2: Volumen filtert Lärm und sorgt für Trend

Die Volumenbedingung filtert nicht-trendige Spots mit niedrigem Volumen und verringert das Risiko, eingeschlossen zu werden.

Vorteil 3: Mehrfachsignale verbessern die Genauigkeit

Mehrere Indikatoren müssen sich ausrichten, um echte Handelssignale auszulösen. Dies verbessert die Signalzuverlässigkeit.

Vorteil 4: Gleitende Durchschnitte unterstützen den allgemeinen Trend

Regeln wie doppelte gleitende Durchschnitte sorgen dafür, dass Signale mit dem allgemeinen Trend übereinstimmen.

Vorteil 5: Stop Loss steuert das Risiko

Die Stop-Loss-Logik realisiert Gewinne und kontrolliert Verluste bei einzelnen Trades.

Risikoanalyse

  • Parameter müssen sorgfältig optimiert werden, falsche Einstellungen führen zu schlechter Leistung
  • Bei der Stop-Loss-Platzierung muss das Gap-Risiko berücksichtigt werden
  • Das Liquiditätsrisiko für Handelsinstrumente sollte überwacht werden
  • Rückblick Problem zwischen verschiedenen Zeitrahmen

Risiko 1: Die Parameter müssen sorgfältig optimiert werden

Die Strategie besteht aus mehreren Parametern, die für verschiedene Instrumente optimiert werden müssen, sonst wird die Leistung beeinträchtigt.

Risiko 2: Bei einer Stop-Loss-Platzierung muss das Gap-Risiko berücksichtigt werden

Der Stop-Loss-Punkt sollte Szenarien für Preisunterschiede berücksichtigen.

Risiko 3: Überwachung des Liquiditätsrisikos

Für illiquide Instrumente können Volumenregeln zu viele Signale filtern.

Risiko 4: Rückblick zwischen Zeitrahmen

Es kann eine Fehlausrichtung zwischen Signalen in verschiedenen Zeitrahmen auftreten. Die Übereinstimmung der Signale muss überprüft werden.

Möglichkeiten zur Verbesserung

Die Strategie kann in folgenden Bereichen verbessert werden:

  1. Optimierung der Parameter für die Robustheit

  2. Einführung von maschinellem Lernen für adaptive Parameter

  3. Verbesserung der Stop-Loss-Strategie zur Verringerung der Stop-Loss-Rate

  4. Hinzufügen von Filtern zur Verringerung der Handelsfrequenz

  5. Erforschen Sie bedingte Aufträge oder Gewinnentnahme, um die Belohnung zu verbessern

Möglichkeit 1: Optimierung der Parameter für die Robustheit

Methoden wie genetische Algorithmen können systematisch Parameter für Stabilität über Marktregime optimieren.

Gelegenheit 2: Einführung von maschinellem Lernen für anpassungsfähige Parameter

Die Modelle können die Marktbedingungen beurteilen und die Parameter entsprechend anpassen, um eine dynamische Optimierung zu erzielen.

Möglichkeit 3: Verbesserung der Stop Loss-Strategie zur Verringerung der Stop Loss-Rate

Bessere Stop-Loss-Algorithmen können unnötige Stops reduzieren und gleichzeitig die Risikokontrolle aufrechterhalten.

Gelegenheit 4: Filter hinzufügen, um die Handelsfrequenz zu reduzieren

Die Stärkung der Filter kann die Handelshäufigkeit reduzieren, die Kosten senken und die Rendite pro Handel verbessern.

Gelegenheit 5: Untersuchen Sie bedingte Aufträge oder Gewinngewinnung

Gemäß den Marktbedingungen können bedingte Aufträge oder Profit-taking-Strategien den Gewinn besser maximieren und gleichzeitig das Risiko kontrollieren.

Schlussfolgerung

Die Strategie balanciert Trend, Risikokontrolle, Kosten und andere Aspekte. Die Hauptvorteile sind die doppelte Stochastische Plusvolumen für Trend und Stop-Loss für Risikokontrolle. Die nächsten Schritte sind die Steigerung der Robustheit, adaptive Parameter, Stop-Loss-Optimierung usw., um in mehr Marktregimen stetige Gewinne zu erzielen.


/*backtest
start: 2023-10-02 00:00:00
end: 2023-11-01 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
// SW SVE - Stochastic+Vol+EMAs [Sergio Waldoke]
// Script created by Sergio Waldoke (BETA VERSION v0.5, fine tuning PENDING)
// Stochastic process is the main source of signals, reinforced on buying by Volume. Also by Golden Cross.
// Selling is determined by K and D entering overselling zone or EMA's Death Cross signal, the first occurring,
// and some other signals combined.
// Buy Long when you see a long buy arrow.
// Sell when you see a close arrow.
// This is a version to be tuned and improved, but already showing excelent results after tune some parameters
// according to the kind of market.
// Strategy ready for doing backtests.

// SVE SYSTEM DESIGN:
// Buy Signal Trigger:
// - Both Stoch <= 20 crossing up and both growing and green candle and Vol/sma vol >= 1.40 Avg Vol
//   or
// - Both Stoch growing up and Vol/sma vol >= 1.40 Avg Vol and green candle and
//   both prior Stoch crossing up
//   or
//   [OPTIONAL]: (Bad for BTC 2018, excelent for 2017)
// - Crossingover(fast_ema, slow_ema) and growing(fast_ema) and growing(slow_ema) and green candle

// Exit position:
// - Both Stoch <= 20 and Both Stoch were > 20 during position
//   or
// - CrossingUnder(Fast EMA, Medium EMA)
//   or   [OPTIONAL] (Better for BTC 2018, Worse for BNB 1H)
// - CrossingUnder(k, d) and (k and d starting over over_buying) and (k and d descending) and k crossing down over_buying line

//calc_on_every_tick=true,
//calc_on_order_fills=true,   (affects historical calculation, triggers in middle of the bar, may be better for automatic orders)
strategy("SW SVE - Stochastic+Vol+EMAs [Sergio Waldoke]", shorttitle="SW SVE", overlay=true, max_bars_back=5000,
         default_qty_type=strategy.percent_of_equity, default_qty_value=100, currency="USD",
         commission_type=strategy.commission.percent, commission_value=0.25)

//Strategy Parameters
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromYear  = input(defval = 2018, title = "From Year", minval = 2009, maxval = 2200)
ToDay     = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
ToMonth   = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToYear    = input(defval = 2030, title = "To Year", minval = 2009, maxval = 2200)

//Indicator Parameters
//Original defaults for 4HS: 14, 3, 80, 20,   14, 23, 40,   20, 40,   3:
stoch_k = input(title="Stoch K",  defval=14, minval=1)
stoch_d = input(title="Stoch D",  defval=3, minval=1)
over_buying  = input(title="Stoch Overbuying Zone",  defval=80, minval=0, maxval=100)
over_selling = input(title="Stoch Overselling Zone",  defval=20, minval=0, maxval=100)

fast_ema_periods = input(title="Fast EMA (Death Cross)",  defval=14, minval=1, maxval=600)
slow_ema_periods = input(title="Slow EMA (Death Cross)",  defval=23, minval=1, maxval=600)
trend_ema_periods = input(title="Slowest EMA (Trend Test)",  defval=40, minval=1, maxval=600)

volume_periods = input(title="Volume Periods",  defval=20, minval=1, maxval=600)
volume_factor = input(title="Min Volume/Media Increase (%)",  defval=80, minval=-100) / 100 + 1

threshold_sl_perc = input(title="[Sell Trigger] Stop Loss Threshold %", defval=6.0, type=float, minval=0, maxval=100)

//before_buy = input(title="# Growing Before Buy",  defval=2, minval=1)
//before_sell = input(title="# Decreasing Before Sell",  defval=1, minval=1)
//stepsignal = input(title="Show White Steps", type=bool, defval=true)
//steps_base = input(title="White Steps Base",  defval=242, minval=0)

//Signals
fast_ema = ema(close, fast_ema_periods)
slow_ema = ema(close, slow_ema_periods)
trend_ema = ema(close, trend_ema_periods)
k = stoch(close, high, low, stoch_k)
d = sma(k, stoch_d)
vol_ma = sma(volume, volume_periods)

//REVIEW CONSTANT 1.75:
in_middle_zone(a) => a > over_selling * 1.75 and a < over_buying
growing(a) => a > a[1] 

was_in_middle_zone = k == d
was_in_middle_zone := was_in_middle_zone[1] or in_middle_zone(k) and in_middle_zone(d)

//Buy Signal Trigger:
//- Both Stoch <= 20 crossing up and both growing and 
//  green candle and Vol/sma vol >= 1.40 Avg Vol
buy = k <= over_selling and d <= over_selling and crossover(k, d) and growing(k) and growing(d) and
      close > open and volume/vol_ma >= volume_factor

//or
//- Both Stoch growing up and Vol/sma vol >= 1.40 Avg Vol and green candle and
//  both prior Stoch crossing up
buy := buy or (growing(k) and growing(d) and volume/vol_ma >= volume_factor and close > open and
              crossover(k[1], d[1]) )
//Worse:
//              (crossover(k[1], d[1]) or (crossover(k, d) and k[1] <= over_selling and d[1] <= over_selling) ) )

//or
//  [OPTIONAL]: (Bad for BTC 2018, excelent for 2017)
//- Crossingover(fast_ema, slow_ema) and growing(fast_ema) and growing(slow_ema) and green candle
buy := buy or (crossover(fast_ema, slow_ema) and growing(fast_ema) and growing(slow_ema) and close > open)


//Debug:
//d1 = close > open  ? 400 : 0
//plot(d1+5200, color=white, linewidth = 3, style = stepline)

//Exit position:
//- Both Stoch <= 20 and Both Stoch were > 20 during position
sell = k <= over_selling and d <= over_selling and was_in_middle_zone

//  or
//- CrossingUnder(Fast EMA, Medium EMA)
sell := sell or crossunder(fast_ema, slow_ema)

//  or  [OPTIONAL] (Better for BTC 2018, Worse for BNB 1H)
//- CrossingUnder(k, d) and (k and d starting over over_buying) and (k and d descending) and k crossing down over_buying line
sell := sell or (crossunder(k, d) and k[1] >= over_buying and d[1] >= over_buying and
                 not growing(k) and not growing(d) and k <= over_buying)

color = buy ? green : red

bought_price = close
bought_price := nz(bought_price[1])

already_bought = false
already_bought := nz(already_bought[1], false)

//Date Ranges
buy  := buy and  not already_bought


//d1 = buy ? 400 : 0
//plot(d1+6500, color=white, linewidth = 3, style = stepline)

was_in_middle_zone := (not buy and was_in_middle_zone) or (in_middle_zone(k) and in_middle_zone(d))

already_bought   := already_bought[1] or buy
bought_price := buy ? close * (1 - threshold_sl_perc/100) : bought_price[1]
trigger_SL = close < bought_price[0]
sell := sell or trigger_SL

sell := sell and  
                 already_bought and not buy and (was_in_middle_zone or trigger_SL)

//plot((sell?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)
                 
already_bought   := already_bought[0] and not sell
bought_price := sell ? 0 : bought_price[0]

//plot((was_in_middle_zone?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)

was_in_middle_zone := not sell and was_in_middle_zone

//Plot signals
plot(fast_ema, title="Fast EMA", color=red, linewidth = 4)
plot(slow_ema, title="Slow EMA", color=blue, linewidth = 4)
plot(trend_ema, title="Trend EMA", color=yellow, linewidth = 4)

//Stop Loss
plot(bought_price, color=gray, linewidth=2, style=cross, join=true, title="Stop Loss")

//Y = stepsignal ? lowest(40) : na
//Y = steps_base
//plot(mysignal+Y, title="Steps", color=white, linewidth = 3, style = stepline)
//Unit steps - for debugging
//plot(mysteps+Y, title="Steps2", color=yellow, linewidth = 3, style = stepline)

//Bought or not - for debugging
//plot((already_bought?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)
//plot((sell?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)

plotshape(buy, title="Buy arrows", style=shape.arrowup, location=location.belowbar, color=color, text="Buy", textcolor=color, size=size.huge, transp=30)
plotshape(sell, title="Sell arrows", style=shape.arrowdown, location=location.abovebar, color=color, text="Sell", textcolor=color, size=size.huge, transp=30)

//if n>2000
strategy.entry("buy", strategy.long, when=buy)
strategy.close_all(when=sell)

//plot(strategy.equity, title="Equity", color=white, linewidth = 4, style = line)

//AlertS trigger
//msg = "[SW Magic Signals EMA] BUY/SELL Signal has been triggered." + "(" + tostring(fastema) + ", " + tostring(slowema) + ") on " + tickerid + ", " + period + "."
msg = "SW SVE BUY/SELL Signal has been triggered. (#, #) on EXCH:PAIR, period: #."

alertcondition(buy or sell, title="SW SVE (BUY/SELL SIGNAL)", message=msg)
alertcondition(buy, title="SW SVE (BUY SIGNAL)", message=msg)
alertcondition(sell, title="SW SVE (SELL SIGNAL)", message=msg)


Mehr