Volumenpreisindikator ausgewogene Handelsstrategie

Schriftsteller:ChaoZhang, Datum: 2023-11-24 14:35:13
Tags:

img

Übersicht

Diese Strategie ist eine Multi-Timeframe Volume Price Indicator Trading-Strategie. Sie nutzt umfassend den Relative Strength Index (RSI), den Average True Range (ATR), den Simple Moving Average (SMA) und benutzerdefinierte Volumenpreisbedingungen, um potenzielle Long-Signale zu identifizieren. Wenn bestimmte Überverkauf, Volumenpreis-Crossover, Preis-Breakout und andere Einstiegsbedingungen erfüllt sind, wird diese Strategie Long-Positionen etablieren. Sie setzt auch Stop-Loss- und Gewinnniveaus fest, um das Risiko-Rendite-Verhältnis pro Handel zu kontrollieren.

Strategie Logik

Die wichtigsten Punkte dieser Strategie sind:

  1. Wenn der RSI unter dem Überverkäufegrad liegt und die letzten 10 Baren überverkauft bleibt, gilt dies als Überverkaufssignal.
  2. Es werden mehrere Volumenpreisbedingungen definiert, und alle diese Bedingungen müssen gleichzeitig erfüllt sein, um das Long-Signal des Volumenpreisindikators auszulösen.
  3. Wenn der Schlusskurs den 13-Perioden-SMA überschreitet, gilt dies als Preis-Breakout-Signal.
  4. Die ATR kleine Periode ist niedriger als die ATR große Periode ist auch ein langes Signal
  5. Die Strategie kombiniert alle oben genannten Signale, um die endgültige Entscheidung für einen Long-Entry zu treffen.

Insbesondere setzt diese Strategie die Parameter für die Länge und den Überverkauf des RSI-Indikators fest und berechnet die RSI-Werte anhand dieser Parameter.

Darüber hinaus definiert die Strategie 3 Volumenschwellen und setzt mehrere Volumenpreisbedingungen auf Basis von Daten aus verschiedenen Zeitrahmen fest. Zum Beispiel ist der Volumenwert des 90-Zeitraums mehr als das 1,5fache des 49-Zeitraums. Wenn alle diese Volumenpreisbedingungen gleichzeitig erfüllt sind, erzeugt der Volumenpreisindikator ein langes Signal.

Bei der Preis-Seite berechnet die Strategie den 13-Perioden-SMA und zählt die Anzahl der Bars, seit der Preis über den SMA bricht.

Für die ATR-Periodenparameter gibt diese Strategie eine kleine Periode von 5 und eine große Periode von 14 für den ATR an. Wenn die kleine Periode ATR niedriger ist als die große Periode ATR, signalisiert dies, dass die Marktvolatilität nach unten beschleunigt und trägt zum langen Signal bei.

Schließlich berücksichtigt die Strategie alle oben genannten Einstiegskriterien, einschließlich Überverkauf, Volumenpreis, Preisdurchbruch und ATR-Indikatoren.

Vorteile

Diese Strategie hat folgende Vorteile:

  1. Durch die Auswertung mehrerer Volumenpreisdaten in verschiedenen Zeitrahmen anstelle eines einzigen Zeitrahmens kann die Strategie die Konzentration der Handelsvolumina genauer beurteilen.

  2. Der dreifache Bestätigungsmechanismus von Überverkauf + Volumenpreis + Preisdurchbruch sorgt für zuverlässige Einstiegssignale.

  3. Der Stop-Loss- und Take-Profit-Mechanismus kontrolliert das Risiko pro Handel streng. Die Stop-Loss- und Take-Profit-Parameter können basierend auf dem persönlichen Risikobereitschaft angepasst werden, um Gewinne zu maximieren und das Risiko pro Handel angemessen zu kontrollieren.

  4. Die Integration mehrerer Indikatoren erhöht die Robustheit.Selbst wenn einige Indikatoren versagen oder fehlerhaft funktionieren, kann sich die Strategie bei der Beurteilung immer noch auf andere Indikatoren stützen und ein gewisses Maß an Widerstandsfähigkeit gewährleisten.

Risiken und Gegenmaßnahmen

Diese Strategie birgt auch einige Risiken:

  1. Das Risiko der Parameterkonfiguration. Die Parameter-Einstellungen der Indikatoren beeinflussen das Urteil direkt, und unsachgemäße Parameter können zu Verzerrungen in den Handelssignalen führen. Die angemessenen Parameterwerte müssen sorgfältig validiert werden.

  2. Als Strategie, die mehrere Indikatoren für das kollektive Urteilen integriert, neigen ihre Signale dazu, bei relativ weniger Trades pro Zeiteinheit konservativer zu sein, so dass das Gewinnpotenzial einige Einschränkungen aufweist.

  3. Indikator-Divergenzrisiko: Wenn einige Indikatoren lange Signale geben, während andere kurze Signale geben, kann die Strategie nicht die optimale Entscheidung bestimmen.

Optimierungsrichtlinien

Diese Strategie kann in folgenden Bereichen weiter optimiert werden:

  1. Einbeziehung von Modellen des maschinellen Lernens zur Unterstützung des Urteils Modelle können auf den Volumenpreis- und Volatilitätsmerkmalen geschult werden, um die manuell definierten Parameter dynamisch einzustellen.

  2. Verbesserung der Komplexität von Take-Profit-Strategien, z. B. Trailing Stop Take-Profit, partielle Take-Profits usw., um den Profit pro Handel weiter zu erhöhen und gleichzeitig Gewinnverluste zu vermeiden.

  3. Bewertet durch Einbeziehung von Auftragsbuchdaten. Zusätzlich zu den Preis- und Volumendiagrammdaten zeigen die Auftragsbuchdaten auch tiefgreifende Informationen zur Liquiditätsverteilung, um zusätzliche Referenzsignale bereitzustellen.

  4. Testkombinationen mit anderen Indikatoren. Diese Strategie verwendet hauptsächlich Indikatoren wie RSI, ATR und SMA. Andere Indikatoren wie Bollinger Bands und KDJ können auch kombiniert werden, um die Quellen der Handelssignale zu diversifizieren und zu optimieren.

Schlussfolgerung

Diese Strategie nutzt eine Kombination von Indikatoren, einschließlich RSI, ATR, SMA und benutzerdefinierten Volumenpreisbedingungen, um potenzielle Long-Entry-Möglichkeiten zu identifizieren. Sie hat Vorteile wie Multi-Timeframe Volume-Preisbewertung, Dreifachbestätigungsmechanismus und Stop-Loss/Take-Profit-Risikokontrolle. Dennoch müssen Risiken wie Parameterkonfiguration, eingeschränktes Gewinnpotenzial auch beachtet werden. In Zukunft kann diese Strategie durch Maschinenlernverstärkung, anspruchsvolleres Take-Profit-Design, Einbeziehung von Orderbuchdaten sowie erweiterte Indikatorenkombinationen weiter verbessert werden.


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




Mehr