Long-Short-Balance-Handelsstrategie basierend auf Volumen- und Preisindikatoren


Erstellungsdatum: 2023-11-24 14:35:13 zuletzt geändert: 2023-11-24 14:35:13
Kopie: 0 Klicks: 649
1
konzentrieren Sie sich auf
1617
Anhänger

Long-Short-Balance-Handelsstrategie basierend auf Volumen- und Preisindikatoren

Überblick

Die Strategie ist eine quantitative Kursindicator-Trading-Strategie für mehrere Zeitrahmen. Sie verwendet einen relativ starken Index (RSI), die durchschnittliche reale Bandbreite (ATR), den einfachen Moving Average (SMA) und benutzerdefinierte Kursbedingungen, um potenzielle Mehr-Signal-Signale zu identifizieren. Die Strategie erstellt mehrere Positionen, wenn bestimmte Bedingungen wie Überverkauf, Crossover, Preisbruch erfüllt werden.

Strategieprinzip

Die Strategie basiert auf folgenden Schlüsselpunkten:

  1. Der RSI wird als Überverkaufssignal betrachtet, wenn er unterhalb der Überverkaufsgrenze liegt und innerhalb der letzten 10 K-Linien in einer fortlaufenden Überverkaufszustand war
  2. Es wurden mehrere Gruppen von Wertebedingungen definiert, die gleichzeitig erfüllt werden müssen, um als mehrere Signale angesehen zu werden.
  3. Wenn der Schlusskurs den 13-Zyklus-SMA von unten nach oben durchbricht, wird dies als Preisbruchsignal angesehen
  4. ATR-Kleine-Perioden unterhalb von Groß-Perioden sind auch Fördersignale
  5. Mehrfache Entscheidungsprozesse aus den oben genannten Kennzahlen zusammengefasst

Insbesondere setzt die Strategie die Parameter für die Länge und die Überselllinie für den RSI ein, um den RSI-Wert zu berechnen. Wenn der RSI mehrere K-Linien in Folge unter der Überselllinie liegt, wird ein Übersellsignal erzeugt.

Darüber hinaus definiert die Strategie 3 Handelsvolumen-Durchschnitte und setzt mehrere Gruppen von Volumen-Konditionen anhand von Daten aus verschiedenen Zeitperioden. Beispielsweise ist der Volumenwert von 90 Perioden größer als das 1,5-fache des Volumenwerts von 49 Perioden. Wenn diese Volumen-Konditionen gleichzeitig erfüllt werden, wird ein Mehrmacher-Signal des Volumen-Konditors ausgesendet.

Bei den Preisen berechnet die Strategie die 13-Zyklus-SMA-Indikatoren und die Anzahl der K-Linien, die der Preis nach oben durchbrochen hat, seit er den SMA durchbrochen hat. Wenn der Preis den SMA von unten nach oben durchbrochen hat und weniger als 5 K-Linien nach dem Durchbruch vorhanden sind, wird dies als ein Preisbruchsignal angesehen.

Was die ATR-Parameter betrifft, so gibt die Strategie die ATR für die Kleine-Periode 5 und die Große-Periode 14 an. Wenn die Kleine-Periode ATR niedriger als die Große-Periode ATR ist, bedeutet dies, dass die Marktfluktuation beschleunigt und schrumpft.

Letztendlich berücksichtigt die Strategie die oben genannten mehreren Kaufbedingungen, einschließlich Überverkauf, Quantifizierung, Preisdurchbruch und ATR-Indikator. Wenn diese Bedingungen gleichzeitig erfüllt werden, erzeugt die Strategie ein endgültiges Mehrmachersignal und erstellt eine Mehrmacherposition.

Strategische Vorteile

Die Strategie hat folgende Vorteile:

  1. Die Strategie berücksichtigt nicht nur die Preisdaten für eine einzelne Periode, sondern bewertet die Kreuzung von mehreren Gruppen verschiedener Preisbedingungen für die Periode, um die Konzentration der Preise genauer zu beurteilen.

  2. Überverkauf + Menge + Preis Dreifachurteilungsmechanismus, um die Zuverlässigkeit der Kaufsignale zu gewährleisten. Überverkauf bietet die grundlegendste Kaufzeitwahl, außerdem erhöht die Kreuzung von Menge und Preis zusätzliche Bestätigung für die Kaufzeit und erhöht die Zuverlässigkeit.

  3. Die Stop-Loss-Stop-Mechanismen sind so eingerichtet, dass die Risiken für einzelne Geschäfte streng kontrolliert werden. Die Stop-Loss- und Stop-Stop-Parameter können an die persönlichen Risikopräferenzen angepasst werden, um das Risiko für jede Einheit angemessen zu kontrollieren, während die Gewinnmaximierung angestrebt wird.

  4. Die Integration von mehreren Indikatoren erhöht die Elastizität der Beurteilung. Auch wenn ein Teil der Indikatoren ausfällt oder fehlerhaft ist, kann auf die Beurteilung anderer Indikatoren angewiesen werden, um eine bestimmte dauerhafte Funktionsfähigkeit zu gewährleisten.

Risiken und Gegenmaßnahmen

Die Strategie birgt auch einige Risiken:

  1. Parameterkonfigurationsrisiken. Die Einstellung von Parametern für verschiedene Indikatoren beeinflusst die Urteilsergebnisse unmittelbar. Unvernünftige Parameter können zu einer Abweichung der Handelssignale führen.

  2. Der Gewinnraum ist begrenzt. Als Strategie zur Integration von mehreren Indikatoren zur Integration von Urteilen ist die Signalfrequenz relativ konservativer, die Anzahl der Transaktionen pro Einheit ist geringer und der Gewinnraum ist begrenzt.

  3. Die Strategie kann keine optimale Entscheidung treffen, wenn einige Indikatoren mehrere Signale und andere keine Signale senden. Dies erfordert die vorherige Identifizierung und Behebung möglicher Differenzen zwischen den Indikatoren.

Richtung der Strategieoptimierung

Die Strategie kann in folgenden Bereichen weiter optimiert werden:

  1. Zusatze zu Machine-Learning-Modellen zur Unterstützung von Beurteilungen. Sie können Modelle für Quanten- und Schwankungsmerkmale trainieren, die manuell gesetzten Parameter unterstützen und die Dynamik der Parameter realisieren.

  2. Erhöhen Sie die Reife der Stop-Off-Strategie. Sie können beispielsweise Floating-Stops, Batch-Stops, Tracking-Stops usw. einrichten, um die Einnahmen pro Einheit weiter zu steigern, während Sie den Ausfall verhindern.

  3. Beurteilung der Einführung von Börsenangaben. Neben den K-Linien-Präsenzdaten kann die Verteilung der Positionen in Kombination mit den Deep-Buy-Shopping-Börsenangaben beurteilt werden, was zusätzliche Referenzsignale liefert.

  4. Die Strategie verwendet vor allem RSI-, ATR- und SMA-Indikatoren zur Integration. Es kann auch versucht werden, eine Kombination aus anderen Indikatoren wie Brinline, KDJ und anderen einzuführen, um die Handelssignalquelle zu bereichern und zu optimieren.

Zusammenfassen

Diese Strategie verwendet RSI, ATR, SMA und benutzerdefinierte Preisbedingungen, um die Identifizierung potenzieller Überstunden zu ermöglichen. Sie bietet gleichzeitig Vorteile wie die Bewertung von mehreren Zeitfenstern, die Bestätigung von Drei-Signal-Mechanismen und die Risikokontrolle von Stop Loss Stop Loss. Natürlich muss auch auf die Risiken der Parameterkonfiguration und die Einschränkung des Gewinnraums geachtet werden. In Zukunft kann die Strategie durch die Unterstützung von Machine Learning, die Optimierung der Stop Loss-Strategie, die Einführung von Börsengrunddaten und die Erweiterung der Integration von Indikatoren weiter optimiert werden.

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

// © Kimply_Tr
//@version=5

// Strategy settings and parameters
strategy(title='Volume ValueWhen Velocity', overlay=true)

// Define the stop-loss and take-profit percentages for the long strategy
long_stoploss_value = input.float(defval=3, title='Stop-Loss (SL) %', minval=0, group='▶ Stop Loss/Take Profit => Long-Strategy', inline='2')
long_stoploss_percentage = close * (long_stoploss_value / 100) / syminfo.mintick  // Calculate long stop-loss percentage
long_takeprofit_value = input.float(defval=2, title='Take-Profit (TP) %', minval=0, group='▶ Stop Loss/Take Profit => Long-Strategy', inline='2')
long_takeprofit_percentage = close * (long_takeprofit_value / 100) / syminfo.mintick  // Calculate long take-profit percentage

// Define parameters related to ValueWhen occurrences
occurrence_ValueWhen_1 = input.int(title='occurrence_ValueWhen_1', defval=1, maxval=100, step=1, group="▶ ValueWhen",tooltip ="Its value must be smaller than (occurrence_ValueWhen_2)")  
occurrence_ValueWhen_2 = input.int(title='occurrence_ValueWhen_2', defval=5, maxval=100, step=1, group="▶ ValueWhen" ,tooltip="Its value must be greater than (occurrence_ValueWhen_1)")
distance_value=input.int(title='distance_value_occurrence', defval=170, maxval=5000, step=1, group="▶ ValueWhen" ,tooltip="It indicates the minimum distance between the occurrences of 1 and 2, i.e. the difference between the occurrences of 1 and 2 is greater than (distance_value_occurrence)")

// Define RSI-related parameters
rsi_over_sold = input.int(defval=60, minval=1, title='Oversold Level', group='▶ RSI',inline ='2')  // Input for oversold level in RSI
rsi_length = input.int(defval=40, minval=1, title='RSI Length', group='▶ RSI',inline ='2')  // Input for RSI length
rsi = ta.rsi(close, rsi_length)  // Calculate RSI

// Define volume thresholds
volume_threshold1 = input.float(title='volume_threshold_1', defval=0.5, maxval=10, step=0.1, group="▶ Volume")  
volume_threshold2 = input.float(title='volume_threshold_2', defval=0.4, maxval=10, step=0.1, group="▶ Volume")  
volume_threshold3 = input.float(title='volume_threshold_3', defval=0.62, maxval=10, step=0.1, group="▶ Volume")  

// ATR (Average True Range)
// Define ATR parameters
atr_small = input.int(title='ATR_Small', defval=5, maxval=500, step=1, group="▶ Atr",inline ='2') 
atr_big = input.int(title='ATR_Big ', defval=14, maxval=500, step=1, group="▶ Atr",inline ='2') 

atr_value3 = ta.atr(15)  // Calculate ATR value 3
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Date Range
// Define the date range for back-testing
start_date = input.int(title='Start Day', defval=1, minval=1, maxval=31, group='▶ Time-Period for Back-Testing', inline='1')  // Input for start day
end_date = input.int(title='until Day', defval=1, minval=1, maxval=31, group='▶ Time-Period for Back-Testing', inline='1')  // Input for end day
start_month = input.int(title='Start Month', defval=7, minval=1, maxval=12, group='▶ Time-Period for Back-Testing', inline='2')  // Input for start month
end_month = input.int(title='until Month', defval=1, minval=1, maxval=12, group='▶ Time-Period for Back-Testing', inline='2')  // Input for end month
start_year = input.int(title='Start Year', defval=2022, minval=1800, maxval=3000, group='▶ Time-Period for Back-Testing', inline='3')  // Input for start year
end_year = input.int(title='until Year', defval=2077, minval=1800, maxval=3000, group='▶ Time-Period for Back-Testing', inline='3')  // Input for end year
in_date_range = time >= timestamp(syminfo.timezone, start_year, start_month, start_date, 0, 0) and time < timestamp(syminfo.timezone, end_year, end_month, end_date, 0, 0)  // Check if the current time is within the specified date range
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
was_over_sold = ta.barssince(rsi <= rsi_over_sold) <= 10  // Check if RSI was oversold in the last 10 bars
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
getVolume(symbol, bar) =>
    request.security(syminfo.tickerid, "D", volume)[bar]  // Function to get volume data for a specific symbol and bar

getVolume2(symbol, bar) =>
    request.security(syminfo.tickerid, "39", volume)[bar]  // Function to get volume data for a specific symbol and bar 2
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

firstCandleColor1 = request.security(syminfo.tickerid, "D", close[2] > open[1] ? 1 : 0)
firstCandleColor2 = request.security(syminfo.tickerid, "1", close[2] > open[0] ? 1 : 0)
firstCandleColor3 = request.security(syminfo.tickerid, "W", close[1] > open[1] ? 1 : 0)

firstCandleColor= ((firstCandleColor1+firstCandleColor2)) > firstCandleColor3 ? 1 : 0

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
sma = ta.sma(close, 13)  // Calculate the simple moving average (SMA) of the close price over 13 periods
numCandles = ta.barssince(close > sma)  // Count the number of candles since the close price crossed above the SMA
atr1=request.security(syminfo.tickerid, "30", ta.atr(atr_small)<ta.atr(atr_big))  // Get the ATR value for the specific security and timeframe (30 minutes) and check if ATR_small is less than ATR_big

prevClose = ta.valuewhen(close > sma, close, occurrence_ValueWhen_1)  // Get the close price when it first crosses above the SMA based on occurrence_ValueWhen_1
prevCloseBarsAgo = ta.valuewhen(close > sma, close, occurrence_ValueWhen_2)  // Get the close price when it first crosses above the SMA based on occurrence_ValueWhen_2
prevCloseChange =  (prevCloseBarsAgo - prevClose )  // Calculate the change in the close price between the occurrences of crossing above the SMA

atrval=(atr_value3>140) or (atr_value3 < 123)  // Check if atr_value3 is either greater than 140 or less than 123

Condition =  getVolume(syminfo.tickerid, 90) > volume_threshold1 * getVolume(syminfo.tickerid, 49)   and getVolume(syminfo.tickerid, 110) > volume_threshold3 * getVolume(syminfo.tickerid, 49)  and getVolume2(syminfo.tickerid, 30) > volume_threshold2 * getVolume2(syminfo.tickerid, 55) and getVolume2(syminfo.tickerid, 7) > volume_threshold2 * getVolume2(syminfo.tickerid, 3)  // Check multiple volume conditions

buy_signal=Condition  and atrval and firstCandleColor==0 and  was_over_sold and  prevCloseChange> distance_value and atr1 and  numCandles<5  // Determine if the buy signal is generated based on various conditions

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Long Strategy
// Enter long position if the buy signal conditions are met and within the specified date range
if buy_signal and in_date_range
    strategy.entry('Long', strategy.long, alert_message='Open Long Position')  // Enter long position
    strategy.exit('Long SL/TP', from_entry='Long', loss=long_stoploss_percentage, profit=long_takeprofit_percentage, alert_message='Your SL/TP-Limit for the Long-Strategy has been activated.')  // Exit long position with stop-loss and take-profit