Die relative Volumen-Preisstrategie ist eine quantitative Handelsstrategie, die auf einem abnormalen Handelsvolumen und einer Preisvolatilität basiert. Diese Strategie vergleicht das aktuelle Handelsvolumen mit dem historischen Durchschnitt, um festzustellen, ob das Handelsvolumen abnormal ist. Sie kombiniert auch das durchschnittliche wahre Intervall, um festzustellen, ob der Preis relativ stabil ist. Wenn das Handelsvolumen abnormal steigt und der Preis relativ stabil ist, gilt dies als Eintrittssignal.
Die Kernlogik der Preisstrategie für das relative Volumen beruht auf zwei Beurteilungsindikatoren: dem relativen Handelsvolumen und dem Preisschwankungsbereich.
Zuerst berechnen wir den einfachen gleitenden Durchschnitt des Handelsvolumens über die letzten 20 Perioden als das historische durchschnittliche Handelsvolumen. Dann setzen wir einen mehrfachen Parameter (z. B. 1,5 mal). Wenn das aktuelle Handelsvolumen größer als 1,5 mal das durchschnittliche Handelsvolumen ist, betrachten wir das Handelsvolumen als abnormal und gehören zu einer
Zweitens berechnen wir den durchschnittlichen wahren Bereich (ATR) über die letzten 14 Perioden als Maß für die Preisvolatilität. Gleichzeitig berechnen wir die Standardabweichung der durchschnittlichen Volatilität. Wenn die aktuelle wahre Volatilität zwischen dem Durchschnitt plus oder minus einer Standardabweichung liegt, betrachten wir die Preisfluktuation als relativ stabil.
Wenn die beiden oben genannten Bedingungen gleichzeitig erfüllt sind, wird ein Long-Signal ausgegeben, um eine Long-Position zu eröffnen. Während des Haltezeitraums wird zweimal der ATR als Stop-Loss-Level und der höchste Preis minus zweimal der ATR als Take-Profit-Level verwendet.
Der größte Vorteil der relativen Volumenpreisstrategie besteht darin, dass sie Preistrends erfasst, die durch ein abnormales Handelsvolumen verursacht werden. Wenn das Handelsvolumen steigt, bedeutet dies eine Veränderung der Haltung der Marktteilnehmer, die häufig Preisbruch und die Bildung neuer Trends signalisiert. Durch den Vergleich der Beziehung zwischen Handelsvolumen und historischen Durchschnitten kann die Strategie effektiv den Zeitpunkt eines abnormen Handelsvolumens bestimmen.
Auf der anderen Seite berücksichtigt die Strategie auch die Volatilitätsrate, so dass Signale in relativ stabilen Kursperioden auftreten. Dies vermeidet das enorme Verlustrisiko, das durch das Verfolgen von Höchstwerten während gewaltsamer Schwankungen verursacht wird. Es erhöht auch die Gewinnchancen, da Trends in der Regel nach relativer Stabilität durchbrechen.
Das größte Risiko dieser Strategie besteht darin, dass der Handelsvolumenindikator nicht zu 100% sicher über neue Trends sein kann.
Um Verluste zu reduzieren, passen Sie die Parameter des
Die Strategie kann in folgenden Aspekten optimiert werden:
Hinzufügen anderer Indikatoren für die Beurteilung, wie Veränderungsquote, Umsatz usw., um abnormale Handelsvolumensignale zuverlässiger zu machen.
Der ATR-Parameter kann für verschiedene Bestände optimiert werden, um die stabile Preisspanne genauer zu bestimmen.
Fügen Sie maschinelle Lernalgorithmen hinzu, um abnormales Handelsvolumen aktiv zu beurteilen, nicht nur einen einfachen Vergleich mit historischen Durchschnitten.
Verwenden Sie Deep-Learning-Modelle, um Preisschwankungen vorherzusagen, nicht nur basierend auf historischen ATR.
Die relative Volumen-Preisstrategie erfasst ein abnormales Handelsvolumen als charakteristisches Signal und kombiniert Preisstabilitätsurteile, um Handelssignale auszugeben. Die Strategie ist einfach und praktisch und funktioniert gut bei der Verfolgung eines abnormen Aktienhandelsvolumens.
/*backtest start: 2022-12-21 00:00:00 end: 2023-12-27 00:00:00 period: 1d basePeriod: 1h 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/ // © DojiEmoji (kevinhhl) //@version=4 strategy("[KL] Relative Volume + ATR Strategy",overlay=true,pyramiding=1) ENUM_LONG = "Long" // Timeframe { backtest_timeframe_start = input(defval = timestamp("01 Apr 2016 13:30 +0000"), title = "Backtest Start Time", type = input.time) USE_ENDTIME = input(false,title="Define backtest end-time (If false, will test up to most recent candle)") backtest_timeframe_end = input(defval = timestamp("01 May 2021 19:30 +0000"), title = "Backtest End Time (if checked above)", type = input.time) within_timeframe = true // } len_volat = input(14,title="Length of ATR to determine volatility") ATR_volat = atr(len_volat) avg_ATR_volat = sma(ATR_volat, len_volat) std_ATR_volat = stdev(ATR_volat, len_volat) // } // Trailing stop loss { ATR_X2_TSL = atr(input(14,title="Length of ATR for trailing stop loss")) * input(2.0,title="ATR Multiplier for trailing stop loss",type=input.float) TSL_source = low var stop_loss_price = float(0) TSL_line_color = color.green, TSL_transp = 100 if strategy.position_size == 0 or not within_timeframe TSL_line_color := color.black stop_loss_price := TSL_source - ATR_X2_TSL else if strategy.position_size > 0 stop_loss_price := max(stop_loss_price, TSL_source - ATR_X2_TSL) TSL_transp := 0 plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp)) // } // Signals for entry { _avg_vol = sma(volume,input(20, title="SMA(volume) length (for relative comparison)")) _relative_vol = _avg_vol * input(1.5,title="Multiple of avg vol to consider relative volume as being high",type=input.float) __lowerOfOpenClose = min(open,close) _wickRatio_lower = (__lowerOfOpenClose - low) / (high - low) entry_signal1 = volume > _relative_vol entry_signal2 = ATR_volat < avg_ATR_volat + std_ATR_volat and ATR_volat > avg_ATR_volat - std_ATR_volat // } alert_per_bar(msg)=> prefix = "[" + syminfo.root + "] " suffix = "(P=" + tostring(close) + "; atr=" + tostring(ATR_volat) + ")" alert(tostring(prefix) + tostring(msg) + tostring(suffix), alert.freq_once_per_bar) // MAIN: if within_timeframe if strategy.position_size > 0 and strategy.position_size[1] > 0 and (stop_loss_price/stop_loss_price[1]-1) > 0.005 alert_per_bar("TSL raised to " + tostring(stop_loss_price)) // EXIT :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: // placed before entry, will re-enter if stopped out exit_msg = close <= strategy.position_avg_price ? "stop loss" : "take profit" if strategy.position_size > 0 and TSL_source <= stop_loss_price strategy.close(ENUM_LONG, comment=exit_msg) // ENTRY ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: if entry_signal1 and entry_signal2// and entry_signal3 entry_msg = strategy.position_size > 0 ? "adding" : "initial" strategy.entry(ENUM_LONG, strategy.long, comment=entry_msg) // CLEAN UP: if strategy.position_size == 0 stop_loss_price := float(0)