Die Ressourcen sind geladen. Beförderung...

VAWSI und Trendbeständigkeit Umkehrstrategie mit dynamischer Längenberechnung Multi-Indikator-Analysesystem

Schriftsteller:ChaoZhang, Datum: 2024-06-21 15:36:43
Tags:VAWSIATRRSIWMASMARMA

Quelle - die vorherige Quelle, nimmt dann den absoluten Wert seiner Änderung und normalisiert ihn mit der Quelle.

  1. Dynamische Längenberechnung: Verwendet die dynamische Längenberechnungsmethode von BlackCat1402, um die Längenparameter des Indikators anhand der Marktbedingungen anzupassen.

  2. Zusammengesetzte Analyse: Kombiniert Messwerte von VAWSI, Trendpersistenz und ATR, um einen zusammengesetzten Indikator zu erzeugen.

  3. Dynamischer Stop-Loss/Take-Profit: Berechnet dynamische Stop-Loss- und Take-Profit-Level auf der Grundlage des zusammengesetzten Indikators und der aktuellen Trendrichtung.

  4. Handelssignale: Bestätigt Crossovers und erzeugt Handelssignale, wenn der Preis die berechnete Schwellenlinie vollständig überschreitet.

Strategische Vorteile

  1. Mehrdimensionale Analyse: Durch die Kombination mehrerer Indikatoren kann die Strategie den Markt aus verschiedenen Blickwinkeln analysieren und die Entscheidungsgenauigkeit verbessern.

  2. Anpassungsfähigkeit: Durch die dynamische Längenberechnung kann sich die Strategie an unterschiedliche Marktbedingungen anpassen und somit flexibler werden.

  3. Risikomanagement: Dynamische Stop-Loss- und Take-Profit-Einstellungen helfen, Risiken besser zu kontrollieren und sich an Marktveränderungen anzupassen.

  4. Originalindikatoren: Die Indikatoren VAWSI und Trendpersistenz liefern einzigartige Marktinformationen, die möglicherweise Signale erfassen, die von herkömmlichen Indikatoren übersehen werden.

  5. Anti-Repainting: Die Verwendung von barstate.isconfirmed sorgt dafür, dass Signale nicht neu bemalt werden, wodurch die Genauigkeit des Backtests verbessert wird.

  6. Anpassbarkeit: Durch die Vielzahl anpassbarer Parameter kann die Strategie für verschiedene Handelsinstrumente und Zeitrahmen angepasst werden.

Strategische Risiken

  1. Überoptimierung: Die große Anzahl von Parametern kann zu einer Überoptimierung führen, die im Live-Handel möglicherweise schlecht abschneidet.

  2. Marktanpassungsfähigkeit: Obwohl es auf bestimmten Märkten gute Ergebnisse erzielt, ist es möglicherweise nicht für alle Marktbedingungen geeignet, insbesondere auf Märkten mit geringer Volatilität.

  3. Komplexität: Aufgrund der Komplexität der Strategie kann es schwierig sein, sie zu verstehen und aufrechtzuerhalten, was das Risiko von Betriebsfehlern erhöht.

  4. Rechenintensiv: Mehrere benutzerdefinierte Indikatoren und dynamische Berechnungen können zu einer hohen Rechenlast führen, was die Ausführungsgeschwindigkeit beeinträchtigt.

  5. Abhängigkeit von historischen Daten: Die Strategie verwendet eine große Menge historischer Daten für Berechnungen, was in einigen Situationen zu Verzögerungen führen kann.

Optimierungsrichtlinien

  1. Parameteroptimierung: Verwenden Sie Machine-Learning-Algorithmen, um verschiedene Gewichts- und Längenparameter zu optimieren, um die Strategieleistung unter verschiedenen Marktbedingungen zu verbessern.

  2. Marktzustandserkennung: Hinzufügen eines Marktzustandserkennungsmoduls zur automatischen Anpassung der Strategieparameter in verschiedenen Marktumgebungen.

  3. Signalfilterung: Einführung zusätzlicher Filtermechanismen, wie z. B. Trendstärke-Schwellenwerte, um falsche Signale zu reduzieren.

  4. Volumenanalyse: Vertiefung der Volumenanalyse, möglicherweise durch Einführung der Volumenmustererkennung zur Verbesserung der Signalzuverlässigkeit.

  5. Multi-Timeframe-Analyse: Integration von Signalen aus mehreren Zeitrahmen zur Verbesserung der Robustheit von Handelsentscheidungen.

  6. Optimierung des Risikomanagements: Implementieren Sie anspruchsvollere Risikomanagementstrategien wie dynamische Positionsgrößen und mehrstufige Stop-Losses.

  7. Rechenleistung: Code optimieren, um die Rechenleistung zu verbessern, insbesondere bei der Verarbeitung großer Mengen historischer Daten.

Schlussfolgerung

Die VAWSI und Trend Persistence Reversal Strategy ist ein komplexes und umfassendes Handelssystem, das mehrere innovative Indikatoren und dynamische Parameteranpassungen kombiniert. Seine Stärken liegen in der mehrdimensionalen Marktanalyse und Anpassungsfähigkeit, so dass es potenzielle Umkehrmöglichkeiten unter verschiedenen Marktbedingungen suchen kann. Die Komplexität der Strategie bringt jedoch auch Herausforderungen in Bezug auf Überoptimierung und Anpassungsfähigkeit mit sich.

Durch weitere Optimierung, insbesondere bei Parameteranpassung, Marktzustandserkennung und Risikomanagement, hat diese Strategie das Potenzial, zu einem leistungsstarken Handelswerkzeug zu werden. Benutzer sollten jedoch beachten, dass keine Strategie perfekt ist und kontinuierliche Überwachung und Anpassung notwendig sind. In der Praxis wird empfohlen, gründliche Tests auf Demo-Konten durchzuführen und diese Strategie mit anderen analytischen Tools und Marktkenntnissen zu kombinieren, um Handelsentscheidungen zu treffen.


/*backtest
start: 2024-05-21 00:00:00
end: 2024-06-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("VAWSI and Trend Persistance Reversal", overlay=true, max_bars_back = 4999, process_orders_on_close = true)


//INPUTS
sltp = input.float(title = "Minimum SL/TP", defval = 5.0)
rsi_weight = input.float(title = "Wawsi weight", defval = 100.0)
half_weight= input.float(title = "Trend Persistence Weight", defval = 79.0)
atr_weight = input.float(title = "ATR Weight", defval = 20.0)
com_mult = input.float(title = "Combination Mult", defval = 1, step = .001)
smoothing = input.int(title = "Trend Persistence smooth length", defval = 3)
CycPart = input.float(1.1, step = .001, title = "Length Cycle Decimal")
src = close
hclose = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, src)

//BlackCat1402's Dynamic Length Calculation
EhlersHoDyDC(Price, CycPart) =>
    // Vars: 
    Smooth = 0.00
    Detrender = 0.00
    I1 = 0.00
    Q1 = 0.00
    jI = 0.00
    jQ = 0.00
    I2 = 0.00
    Q2 = 0.00
    Re = 0.00
    Im = 0.00
    Period = 0.00
    SmoothPeriod = 0.00
    pi = 2 * math.asin(1)
    DomCycle = 0.0

    //Hilbert Transform
    Smooth := bar_index > 5 ? (4 * Price + 3 * nz(Price[1]) + 2 * nz(Price[2]) + nz(Price[3])) / 10 : Smooth
    Detrender := bar_index > 5 ? (.0962 * Smooth + .5769 * nz(Smooth[2]) - .5769 * nz(Smooth[4]) - .0962 * nz(Smooth[6])) * (.075 * nz(Period[1]) + .54) : Detrender
    //Compute InPhase and Quadrature components
    Q1 := bar_index > 5 ? (.0962 * Detrender + .5769 * nz(Detrender[2]) - .5769 * nz(Detrender[4]) - .0962 * nz(Detrender[6])) * (.075 * nz(Period[1]) + .54) : Q1
    I1 := bar_index > 5 ? nz(Detrender[3]) : I1

    //Advance the phase of I1 and Q1 by 90 degrees
    jI := (.0962 * I1 + .5769 * nz(I1[2]) - .5769 * nz(I1[4]) - .0962 * nz(I1[6])) * (.075 * nz(Period[1]) + .54)
    jQ := (.0962 * Q1 + .5769 * nz(Q1[2]) - .5769 * nz(Q1[4]) - .0962 * nz(Q1[6])) * (.075 * nz(Period[1]) + .54)

    //Phasor addition for 3 bar averaging
    I2 := I1 - jQ
    Q2 := Q1 + jI

    //Smooth the I and Q components before applying the discriminator
    I2 := .2 * I2 + .8 * nz(I2[1])
    Q2 := .2 * Q2 + .8 * nz(Q2[1])

    //Homodyne Discriminator
    Re := I2 * nz(I2[1]) + Q2 * nz(Q2[1])
    Im := I2 * nz(Q2[1]) - Q2 * nz(I2[1])
    Re := .2 * Re + .8 * nz(Re[1])
    Im := .2 * Im + .8 * nz(Im[1])

    Period := Im != 0 and Re != 0 ? 2 * pi / math.atan(Im / Re) : Period
    Period := Period > 1.5 * nz(Period[1]) ? 1.5 * nz(Period[1]) : Period
    Period := Period < .67 * nz(Period[1]) ? .67 * nz(Period[1]) : Period
    //Limit Period to be within the bounds of 6 bar and 50 bar cycles
    Period := Period < 6 ? 6 : Period
    Period := Period > 50 ? 50 : Period
    Period := .2 * Period + .8 * nz(Period[1])
    SmoothPeriod := .33 * Period + .67 * nz(SmoothPeriod[1])
    //it can add filter to Period here
    DomCycle := math.ceil(CycPart * SmoothPeriod) > 34 ? 34 : math.ceil(CycPart * SmoothPeriod) < 1 ? 1 : math.ceil(CycPart * SmoothPeriod)
    DomCycle

wma(src, length) =>
    wma = 0.0
    sum = 0.0
    norm = length * (length + 1) / 2
    for i = 0 to length - 1
        sum := sum + src[i] * (length - i)
    wma := sum / norm


length = math.round(math.ceil(EhlersHoDyDC(hclose,CycPart)))

// Traditional Function initialization
highest_custom(src, length) =>
    x = src
    for i = 0 to math.min(length, 4999)
        if src[i] > x
            x := src[i]
    x
lowest_custom(src, length) => 
    x = src
    for i = 0 to math.min(length, 4999)
        if src[i] < x
            x := src[i]
    x

rma(src, len) =>
    sum = 0.0
    for i = 0 to len - 1
        math.min(1, len)
        sum += src[i]
    rma = sum / len
    rma := nz(rma[1]) * (len - 1) / len + src / len
    
sma(src, length) =>
    math.sum(src, length) / length

hln(src, length) =>
    TR = math.max(math.abs(src - src[1]), high - low)
    TR := src / math.abs(ta.change(rma(TR, length)))
    TR := (1 / TR) * 100

vawma(src, length) =>
    atr = ta.atr(1)
    aavg = sma(atr, length)
    vavg = sma(volume, length)
    weighted_sum = 0.0
    sum_weights = 0.0
    weighted = 0.0
    for i = 0 to length
        weight = ((volume[i] / vavg + (atr[i]) / aavg) / 2)
        weighted_sum += src[i] * weight
        sum_weights += weight
    a = (weighted_sum / sum_weights)

vawsi(src, len) =>
    rmaUp = vawma(math.max(ta.change(src), 0), len)
    rmaDown = vawma(-math.min(ta.change(src), 0), len)
    rsi = 100 - (100 / (1 + rmaUp / rmaDown))

trendPersistence(src, length, smoothing) =>
    trendu = math.abs(src - highest_custom(src, length))
    trendd = math.abs(src - lowest_custom(src, length))
    trendu := wma(trendu, smoothing)
    trendd := wma(trendd, smoothing)
    trendu := ta.change(ta.cum(trendu))
    trendd := ta.change(ta.cum(trendd))
    trend = wma(math.max(trendu, trendd), smoothing)
    rmaUp = rma(math.max(ta.change(trend), 0), length)
    rmaDown = rma(-math.min(ta.change(trend), 0), length)
    rsi = 100 - (100 / (1 + rmaUp / rmaDown))

//Strategy Calculations
sl = ((100 - sltp) / 100) * close
tp = ((100 + sltp) / 100) * close

var bool crossup = na
var bool crossdown = na
var float dir = na
var float BearGuy = 0

BullGuy = ta.barssince(crossup or crossdown)
if na(BullGuy)
    BearGuy += 1
else
    BearGuy := math.min(BullGuy, 4999)


rsiw = rsi_weight / 100
cew = half_weight / 100
atrw = atr_weight / 100

atr = hln(hclose, length) * atrw
ce = 1 / trendPersistence(hclose, length, smoothing)
com = 1 / math.max(math.abs(vawsi(hclose, length) - 50) * 2, 20)

comfin = (((com * rsiw) + (ce * cew) - atr)) * com_mult

lower = highest_custom(math.min((math.max(highest_custom(src, BearGuy) * (1 - comfin), sl)), src[1]), BearGuy)
upper = lowest_custom(math.max((math.min(lowest_custom(src, BearGuy) * (1 + comfin), tp)), src[1]), BearGuy)

var float thresh = na

if na(thresh)
    thresh := lower
if na(dir)
    dir := 1
if crossdown
    dir := -1
if crossup
    dir := 1
if dir == 1
    thresh := lower
if dir == -1
    thresh := upper

crossup := ta.crossover(hclose, thresh) and barstate.isconfirmed
crossdown := ta.crossunder(hclose, thresh) and barstate.isconfirmed

//STRATEGY
if crossup
    strategy.entry("long", strategy.long)
if crossdown
    strategy.entry("Short", strategy.short)

//PLOTTING
col = hclose > thresh ? color.lime : color.red
plot(thresh, linewidth = 2, color = color.new(col[1], 0))



Verwandt

Mehr