BabyShark VWAP-Handelsstrategie auf der Grundlage von VWAP- und OBV-RSI-Indikatoren

Schriftsteller:ChaoZhang, Datum: 2024-03-08 16:39:28
Tags:

img

Strategieübersicht

Die BabyShark VWAP-Handelsstrategie ist eine quantitative Handelsstrategie, die auf dem Volume Weighted Average Price (VWAP) und dem On Balance Volume Relative Strength Index (OBV RSI) basiert. Die Strategie zielt darauf ab, potenzielle Kauf- und Verkaufssignale auf der Grundlage von Abweichungen von VWAP und OBV RSI zu identifizieren, die bestimmte Schwellenwerte überschreiten.

Strategieprinzip

Das Kernprinzip dieser Strategie besteht darin, VWAP- und OBV-RSI-Indikatoren zu nutzen, um Markttrends und Dynamikveränderungen zu erfassen. VWAP ist ein dynamischer gleitender Durchschnitt, der auf Preis und Volumen basiert und die wichtigsten Handelsbereiche des Marktes widerspiegelt. Wenn der Preis erheblich von VWAP abweicht, zeigt er normalerweise überkaufte oder überverkaufte Bedingungen auf dem Markt an. OBV RSI hingegen führt den Volumenfaktor auf der Grundlage des traditionellen RSI-Indikators ein, um die Stärke der Markttrends zu bestimmen, indem die Intensität der Volumenveränderungen gemessen wird.

Insbesondere verwendet die Strategie 60 Kerzen als Berechnungszeitraum für VWAP, wobei der Schlusskurs als Eingabedaten verwendet wird. Sie konstruiert dann Überkauf- und Überverkaufszonen auf der Grundlage von Preisabweichungen von positiven und negativen 3 Standardabweichungen von VWAP. Für den OBV RSI verwendet sie 5 Kerzen als Berechnungszeitraum und setzt Schwellenwerte von 70 und 30 als Kriterien für die Bestimmung von Überkauf- und Überverkaufsbedingungen.

In Bezug auf die Handelslogik erzeugt die Strategie, wenn sich der Preis in der Überverkaufszone unter dem unteren Band von VWAP befindet und der OBV RSI kleiner als 30 ist, ein langes Signal. Umgekehrt, wenn sich der Preis in der Überkaufszone über dem oberen Band von VWAP befindet und der OBV RSI größer als 70 ist, erzeugt sie ein kurzes Signal. Darüber hinaus setzt die Strategie eine Gewinn- und Stop-Loss-Ratio von 0,6% und führt nach aufeinanderfolgenden Verlusten eine Abkühlzeit von 10 Kerzen ein, um Risiken zu kontrollieren.

Strategische Vorteile

  1. Kombiniert mehrere Marktfaktoren wie Preis und Volumen, um Markttrends und -dynamik umfassend zu erfassen.
  2. Anwendet dynamische VWAP- und OBV-RSI-Indikatoren, um sich an Veränderungen in verschiedenen Marktzyklen anzupassen.
  3. Festlegt angemessene Gewinn- und Stop-Loss-Verhältnisse sowie Abkühlzeiten, um Risiken effektiv zu kontrollieren und gleichzeitig Chancen zu nutzen.
  4. Eine klare Logik, leicht verständlich und umsetzbar, mit einer gewissen Interpretationsfähigkeit.
  5. Einstellbare Parameter, geeignet für Händler mit unterschiedlichen Optimierungs- und Verbesserungsstilen.

Strategische Risiken

  1. Bei schwankenden oder sich wiederholenden Märkten können häufige Handelssignale zu Überhandelungen und erhöhten Slippage-Kosten führen.
  2. In Trending-Märkten kann die ausschließliche Nutzung von VWAP zur Gewinngewinnung dazu führen, dass die Strategie zu früh beendet wird und die nachfolgenden Trendgewinne verpasst werden.
  3. Festparameter-Einstellungen können sich möglicherweise nicht an Veränderungen der Marktbedingungen anpassen, was eine Optimierung für verschiedene Instrumente und Zeitrahmen erfordert.
  4. Der OBV-Indikator stützt sich stark auf Volumendaten; wenn Volumendaten ungenau oder manipuliert sind, können Indikatorverzerrungen die Urteile irreführen.
  5. Die Strategie berücksichtigt nicht externe Faktoren wie Makroökonomie und Nachrichten und kann unter extremen Marktbedingungen scheitern.

Optimierungsrichtlinien

  1. Einführung von mehr Filterbedingungen für schwankende Märkte, wie z. B. Trendbestätigungs- und Volatilitätsindikatoren, um den häufigen Handel zu reduzieren.
  2. Optimieren Sie die Ausgangszustände, z. B. die Verwendung von Trailing-Stops oder die Kombination mit anderen Trendindikatoren, um Trendmärkte besser zu erfassen.
  3. Durchführung einer adaptiven Optimierung der VWAP- und OBV-RSI-Parameter durch dynamische Anpassung der Berechnungszeiten und Schwellenwerte.
  4. Einführung von Mechanismen zur Echtheitsüberprüfung des Volumens zur Verbesserung der Zuverlässigkeit des OBV-RSI-Indikators.
  5. Es sollte die Einbeziehung makroökonomischer Datenanalysen, Stimmungsindikatoren usw. in Betracht gezogen werden, um die Anpassungsfähigkeit und Robustheit der Strategie zu verbessern.

Zusammenfassung

Die BabyShark VWAP-Handelsstrategie ist eine quantitative Handelsstrategie, die den volumengewichteten Durchschnittspreis und den Relativstärkeindex des Volumens auf der Bilanz kombiniert, um Handelssignale zu erzeugen, indem überkaufte und überverkaufte Bedingungen und Veränderungen der Trenddynamik erfasst werden. Die Strategie hat eine klare Logik, indem sie mehrere Marktfaktoren wie Preis und Volumen integriert, um den Marktpuls umfassend zu erfassen. Gleichzeitig ermöglichen angemessene Gewinn- und Stop-Loss-Einstellungen und Risikokontrollmechanismen der Strategie, Renditen zu erzielen, während das Risikomanagement berücksichtigt wird. Die Strategie hat jedoch auch potenzielle Probleme wie unzureichende Anpassungsfähigkeit an oszillierende und trendende Märkte und feste Optimierer. Zukünftige Verbesserungen können sich auf Einstiegsadapter, dynamische Gewinnnahme, dynamische Parameter, Verbesserung der externen Datenanalyse und weitere Verbesserung der Robustheit und Rentabilität der Strategie konzentri


/*backtest
start: 2024-02-01 00:00:00
end: 2024-02-29 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © GreatestUsername

//@version=5
strategy("BabyShark VWAP Strategy", overlay=true, margin_long=100, margin_short=100, calc_on_every_tick = true)


// VWAP
ls = input(false, title='Log-space', group = "Optional")
type = 'Average Deviation'
length = input(60, group="Strategy Modification")
source = input(close, group="Strategy Modification")
_low = ls == true ? math.log(low) : low
_high = ls == true ? math.log(high) : high
src = ls == true ? math.log(source) : source

//weighted mean
pine_vwmean(x, y) =>
    cw = 0.0
    cd = 0.0
    w_sum = 0.0
    d_sum = 0.0
    for i = 0 to y - 1 by 1
        cd := x[i]
        cw := volume[i]
        d_sum += cw * cd
        w_sum += cw
        w_sum
    d_sum / w_sum

//weighted standard deviation
pine_vwstdev(x, y, b) =>
    d_sum = 0.0
    w_sum = 0.0
    cd = 0.0
    for i = 0 to y - 1 by 1
        cd := x[i]
        cw = volume[i]
        d_sum += cw * math.pow(cd - b, 2)
        w_sum += cw
        w_sum
    math.sqrt(d_sum / w_sum)

//weighted average deviation
pine_vwavdev(x, y, b) =>
    d_sum = 0.0
    w_sum = 0.0
    cd = 0.0
    for i = 0 to y - 1 by 1
        cd := x[i]
        cw = volume[i]
        d_sum += cw * math.abs(cd - b)
        w_sum += cw
        w_sum
    d_sum / w_sum

vwmean = pine_vwmean(src, length)

//consider using Average Deviation instead of Standard Deviatio if there are values outside of 3rd upper & lower bands within a rolling window
dev = if type == 'Standard Deviation'
    dev = pine_vwstdev(src, length, vwmean)
    dev
else if type == 'Average Deviation'
    dev = pine_vwavdev(src, length, vwmean)
    dev

basis = ls == true ? math.exp(vwmean) : vwmean
plot(basis, color=color.new(#b7b7b7, 60), title='Basis')

upper_dev_2 = vwmean + dev * 2
upper_dev_3 = vwmean + dev * 3

lower_dev_2 = vwmean - dev * 2
lower_dev_3 = vwmean - dev * 3

fill(
     plot1=plot(ls == true ? math.exp(upper_dev_2) : upper_dev_2, color=color.new(#B20000, 0), title='Upper dev 2'), 
     plot2=plot(ls == true ? math.exp(upper_dev_3) : upper_dev_3, color=color.new(#FF6666, 0), title='Upper dev 3', display=display.none), 
     color=color.new(#FF4D4D, 80), title='Upper band'
     )
fill(
     plot1=plot(ls == true ? math.exp(lower_dev_3) : lower_dev_3, color=color.new(#00CC00, 0), title='Lower dev 3', display=display.none), 
     plot2=plot(ls == true ? math.exp(lower_dev_2) : lower_dev_2, color=color.new(#008000, 0), title='Lower dev 2'), 
     color=color.new(#006600, 80), title='Lower band'
     )


// Input to enable or disable the table visibility
table_visible = input(false, title="Show Table", group="Deviation Cross Monitor")
// Input for the number of candles to look back
table_length = input(300, title="Table Lookback Length", group="Deviation Cross Monitor")

// Custom count function
count_occurrences(cond, length) =>
    count = 0
    for i = 0 to length - 1
        if cond[i]
            count := count + 1
    count

// Count occurrences of prices above Upper dev 2 and below Lower dev 2

above_upper_dev_2 = count_occurrences(close > upper_dev_2, table_length)
below_lower_dev_2 = count_occurrences(close < lower_dev_2, table_length)

// Create table in the bottom right corner
var table tbl = table.new(position=position.bottom_right, rows=2, columns=2)

if table_visible
    if barstate.islast
        // Update the table headers
        table.cell(tbl, 0, 0, "Above Upper Dev 2", bgcolor=color.gray, text_color=color.white)
        table.cell(tbl, 0, 1, "Below Lower Dev 2", bgcolor=color.gray, text_color=color.white)
        
        // Update the table values
        table.cell(tbl, 1, 0, str.tostring(above_upper_dev_2), bgcolor=color.new(color.green, 90), text_color=color.green)
        table.cell(tbl, 1, 1, str.tostring(below_lower_dev_2), bgcolor=color.new(color.red, 90), text_color=color.red)
else
    table.delete(tbl)

// RSI
obvsrc = close
change_1 = ta.change(obvsrc)
obv = ta.cum(ta.change(obvsrc) > 0 ? volume : change_1 < 0 ? -volume : 0 * volume)

src2 = obv
len = input.int(5, minval=1, title="RSI Length", group="Strategy Modification")
up = ta.rma(math.max(ta.change(src2), 0), len)
down = ta.rma(-math.min(ta.change(src2), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - 100 / (1 + up / down)
higherlvl = input(70, title="Higher Level", group="Strategy Modification")
lowerlvl = input(30, title="Lower Level", group="Strategy Modification")


plot_color = rsi >= higherlvl ? color.red : rsi <= lowerlvl ? color.green : color.new(#b7b7b7, 60)
// plot(rsi, color=plot_color)

//plot(rsi, color=color.white)



// Count occurrences of RSI crossing higher level and lower level
cross_above_higher = ta.crossover(rsi, higherlvl)
cross_below_lower = ta.crossunder(rsi, lowerlvl)
above_higher_count = count_occurrences(cross_above_higher, table_length)
below_lower_count = count_occurrences(cross_below_lower, table_length)

// Create table in the bottom right corner
if (table_visible)
    var table tbl2 = table.new(position=position.bottom_right, rows=2, columns=2)
    if (barstate.islast)
        // Update the table headers
        table.cell(tbl2, 0, 0, "Higher Level Cross", bgcolor=color.gray, text_color=color.white)
        table.cell(tbl2, 0, 1, "Lower Level Cross", bgcolor=color.gray, text_color=color.white)
        
        // Update the table values
        table.cell(tbl2, 1, 0, str.tostring(above_higher_count), bgcolor=color.new(color.red, 90), text_color=color.red)
        table.cell(tbl2, 1, 1, str.tostring(below_lower_count), bgcolor=color.new(color.green, 90), text_color=color.green)


// Entries

// Long Entry:
// Price is in the shaded GREEN area of [Hoss] VWAP Deviation
// and the [Hoss] OBV RSI is GREEN.
longCondition1 = close <= lower_dev_3
longConditions = plot_color == color.green and longCondition1 and strategy.position_size == 0

// Short Entry:
// Price is in the shaded RED area of [Hoss] VWAP Deviation
// and the [Hoss] OBV RSI is RED.
shortCondition1 = close >= upper_dev_3
shortConditions = plot_color == color.red and shortCondition1 and strategy.position_size == 0

var int lastEntryBar = 0


shortEMA = ta.ema(close, 12)
longEMA = ta.ema(close, 21)
uptrend = shortEMA > longEMA

if longConditions and lastEntryBar < bar_index - 10 //and uptrend
    strategy.entry("Long", strategy.long, stop=close * 0.994)
    lastEntryBar := bar_index

if shortConditions and lastEntryBar < bar_index - 10 //and not uptrend
    strategy.entry("Short", strategy.short, stop=close * 1.006)
    lastEntryBar := bar_index


if strategy.position_size > 0 and (ta.crossover(close, basis) or strategy.opentrades.entry_price(strategy.opentrades - 1) * 0.994 > close)
    strategy.close("Long", immediately = true)
if strategy.position_size < 0 and (ta.crossunder(close, basis) or strategy.opentrades.entry_price(strategy.opentrades - 1) * 1.006 < close)
    strategy.close("Short", immediately = true)

// Stop Loss:
// 0.6%
// After 1 Loss => NO more Trades for 10 Candles (10 minutes) (usually a breakout will happen, and it takes average 10min till it ranges again. So basically wait for range to form again)

// Take Profit:
// Grey line on [Hoss] VWAP Deviation or 0.6%



Mehr