Handelsstrategie für den Volumenunterschied Delta-Zyklus-Oszillator

Schriftsteller:ChaoZhang, Datum: 2023-10-30 11:45:42
Tags:

img

Übersicht

Diese Strategie beurteilt die Umwandlung von Bullen- und Bärenzyklen, indem sie die Veränderungsrate der Volumenänderung berechnet, die zu den Volumenpreisdivergenzstrategien gehört. Sie kombiniert den Momentumindikator des Volumens und Bollinger-Bänder des Preises, um den führenden Effekt der Volumenänderung auf den Preis zu bestimmen und Wendepunkte der Trends zu erfassen.

Handelslogik

  1. Berechnen Sie die Veränderungsrate der Volumenänderung (die Veränderungsrate des Volumendifferenzindikators), um das Ergebnis des Volumenmomentums basierenden Indikators zu erhalten.

  2. Berechnen Sie Bollinger-Bänder von n Ergebnis, um bbr zu erhalten, die die Standardabweichung des Volumenmomentums darstellt.

  3. Berechnen Sie Bollinger-Bänder des Schlusskurses, um bbr1 zu erhalten, die die Standardabweichung des Preises darstellt.

  4. Berechnen Sie die Differenz zwischen den beiden, d. h. die Standardabweichung des Volumenmomentums abzüglich der Standardabweichung des Preises, als Endindikator.

  5. Wenn hist über 0 geht, ist es das kurze Einstiegssignal, und wenn es unter 0 geht, ist es das lange Einstiegssignal.

Durch die Berechnung der Veränderungsrate der Volumenänderung wird der führende Effekt der Volumenänderung auf den Preis verstärkt. Wenn sich das Volumen umkehrt, während der Preis noch nicht umgekehrt ist, wird hist über oder unter 0 gehen und Handelssignale erzeugen. Es kann die Wendepunkte der Preisentwicklung im Voraus vorhersagen.

Vorteile

  1. Diese Strategie ist eine auf der Veränderungsrate des Volumens basierende Strategie der Volumen-Preis-Divergenz, die die Wendepunkte der Preisentwicklung im Voraus widerspiegeln kann.

  2. Die Berechnung der Veränderungsrate der Volumenänderung verstärkt die führende Wirkung der Volumenänderung auf den Preis, was zu einer besseren Handelsleistung führt.

  3. Die Kombination von Volume-Impulsindikatoren mit Bollinger-Bändern des Preises macht Handelssignale zuverlässiger.

  4. Die Verwendung von dreifacher exponentieller Glättung auf Hist-Daten macht die Signale genauer und glatter.

  5. Das Festlegen von Überkauf-/Überverkaufslinien und langen/kurzen Stop-Loss-/Take-Profit-Orders hilft, Risiken wirksam zu kontrollieren.

  6. Viele anpassbare Parameter wie Bollinger-Band-Länge, Standardabweichungsmultiplikator und Hist-Glanzungsfaktoren ermöglichen die Optimierung der Strategie.

Risiken

  1. Die Volumendaten spiegeln möglicherweise nicht wirklich den Markthandel wider und können manipuliert werden.

  2. Die Volumenpreisdivergenz kann nicht bestehen bleiben und der Preis kann ohne Umkehrung durchbrechen.

  3. Eine falsche Einstellung der Parameter kann zu einem Überhandel oder zu ungenauen Signalen führen.

  4. Vorsicht vor falschen Signalen aus abnormalen Lautstärkungsdaten.

  5. Wenn der Trend stark ist, sollten Umkehrsignale vermieden werden.

Risiken können durch Optimierung von Parametern, Hinzufügen anderer Filter und Einstellung von Stop-Loss/Take-Profit gemindert werden.

Möglichkeiten zur Verbesserung

  1. Optimieren Sie die Bollinger Bands-Parameter für stabilere Signale.

  2. Hinzufügen eines Trendfilters, um den Handel gegen den Trend zu vermeiden.

  3. Einbeziehung anderer Indikatoren wie MACD zur Signalbestätigung.

  4. Nutzen Sie KI, um die Parameter automatisch zu optimieren.

  5. Hinzufügen dynamischer Stop-Loss/Take-Profit zur Optimierung des Risikomanagements.

  6. Anwendung von maschinellem Lernen zur Ermittlung der Erfolgsrate der Volumen-Preis-Divergenz für eine höhere Signalqualität.

Schlussfolgerung

Diese Strategie verstärkt die führende Wirkung der Volumenänderung auf den Preis, indem sie die Veränderungsrate der Volumenänderung berechnet und eine frühzeitige Erkennung von Trendwendepunkten ermöglicht. Im Vergleich zu einzelnen Volumenindikatoren hat sie eine höhere Zuverlässigkeit und Genauigkeit. Allerdings sollten Risiken wie Volumenmanipulation und Divergenzbruch durch Parameteroptimierung, Indikatorfilter usw. vermieden werden. In Zukunft kann KI für die adaptive Parameteroptimierung genutzt werden, um die Stabilität und Rentabilität der Strategie weiter zu verbessern.


/*backtest
start: 2022-10-23 00:00:00
end: 2023-10-29 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/
// © tathal and special thanks to oakwhiz for his porting of my custom volume indicator

//@version=5
strategy('Volume Difference Delta Cycle Oscillator', 'VDDC Osc', default_qty_type=strategy.percent_of_equity, default_qty_value=100, max_bars_back=5000)

startDate = input.int(title='Start Date', defval=1, minval=1, maxval=31)
startMonth = input.int(title='Start Month', defval=1, minval=1, maxval=12)
startYear = input.int(title='Start Year', defval=2010, minval=1800, maxval=2100)

endDate = input.int(title='End Date', defval=31, minval=1, maxval=31)
endMonth = input.int(title='End Month', defval=12, minval=1, maxval=12)
endYear = input.int(title='End Year', defval=2021, minval=1800, maxval=2100)

// Normalize Function
normalize(_src, _min, _max) =>
    // Normalizes series with unknown min/max using historical min/max.
    // _src      : series to rescale.
    // _min, _min: min/max values of rescaled series.
    var _historicMin = 10e10
    var _historicMax = -10e10
    _historicMin := math.min(nz(_src, _historicMin), _historicMin)
    _historicMax := math.max(nz(_src, _historicMax), _historicMax)
    _min + (_max - _min) * (_src - _historicMin) / math.max(_historicMax - _historicMin, 10e-10)


// STEP 2:
// Look if the close time of the current bar
// falls inside the date range
inDateRange = true

// Stop loss & Take Profit Section     
l_sl_inp = input(2.0, title='Long Stop Loss %') / 100
l_tp_inp = input(4.0, title='Long Take Profit %') / 100

l_stop_level = strategy.position_avg_price * (1 - l_sl_inp)
l_take_level = strategy.position_avg_price * (1 + l_tp_inp)

s_sl_inp = input(2.0, title='Short Stop Loss %') / 100
s_tp_inp = input(4.0, title='Short Take Profit %') / 100

s_stop_level = strategy.position_avg_price * (1 + s_sl_inp)
s_take_level = strategy.position_avg_price * (1 - s_tp_inp)

src = close

//  Volume Differnce Indicator Delta

float change_src = ta.change(src)
float i_obv = ta.cum(change_src > 0 ? volume : change_src < 0 ? -volume : 0 * volume)
float i_pvt = ta.pvt

float result = ta.change(i_obv - i_pvt)

float nresult = ta.ema(normalize(result, -1, 1), 20)


// Volume Differnce Indicator Delta %B
length = input.int(20, minval=1, title='Volume Bands Length')
mult = input.float(2.0, minval=0.001, maxval=50, title='Volume Bands StdDev')
basis = ta.ema(nresult, length)
dev = mult * ta.stdev(nresult, length)
upper = basis + dev
lower = basis - dev
bbr = (nresult - lower) / (upper - lower)

// Normal %B, Based on close

l1 = input.int(20, minval=1, title='Bollinger Bands Length')
src2 = close
mult1 = input.float(2.0, minval=0.001, maxval=50, title='Bollinger Bands StdDev')
basis1 = ta.sma(src2, l1)
dev1 = mult1 * ta.stdev(src2, l1)
upper1 = basis1 + dev1
lower1 = basis1 - dev1
bbr1 = (src - lower1) / (upper1 - lower1)

/// Final Output Line

hist = ta.ema(ta.ema(ta.ema(bbr1 - bbr, input(2, title='Hist Smoothing Factor #1')), input(2, title='Hist Smoothing Factor #2')), input(2, title='Hist Smoothing Factor #3'))

/// Overbought / Oversold Line Creation
oversold = input(-.1)
overbought = input(.4)
hline(oversold, linewidth=2, color=color.new(#81c784, 62))
hline(overbought, linewidth=2, color=color.new(#c2185b, 38))

/// Long & Short Conditions

short = hist > overbought
long = hist < oversold

/// Colors & Plotting
histColor = hist >= 0 ? hist[1] < hist ? #26A69A : #B2DFDB : hist[1] < hist ? #FFCDD2 : #EF5350
plot(hist, title='Histogram', style=plot.style_columns, color=color.new(histColor, 0))

CrossBgColor = long ? color.new(#81c784, 62) : short ? color.new(#c2185b, 38) : na
bgcolor(color.new(CrossBgColor, 90))

/// Strategy Methodology

if inDateRange
    strategy.entry('long', strategy.long, when=long, stop=l_stop_level, limit=l_take_level)

if inDateRange and strategy.position_size > 0
    strategy.close_all(when=short)

if inDateRange
    strategy.entry('short', strategy.short, when=short, stop=s_stop_level, limit=s_take_level)

if inDateRange and strategy.position_size < 0
    strategy.close_all(when=long)



Mehr