Volumenbasierte dynamische DCA-Strategie

Schriftsteller:ChaoZhang, Datum: 2024-04-12 17:12:07
Tags:QFLDCATPSLATRADXEMASMARSIMACD

img

Übersicht

Diese Strategie ist eine volumenbasierte dynamische DCA-Strategie, die Preisbruch verwendet. Sie identifiziert den jüngsten Preistief und beginnt Positionen zu bauen, wenn der Preis unter diesen Tiefpunkt bricht und das Handelsvolumen steigt. Während der Preis weiter fällt, passt die Strategie die Menge jeder Position dynamisch an, basierend auf der Größe des schwimmenden Verlustes, bis sie die gesetzte Gesamtzahl von Positionen erreicht. Gleichzeitig setzt die Strategie den Take-Profit-Preis basierend auf dem Median der historischen Kursrückgangsprozentsätze fest.

Strategieprinzipien

  1. Verwenden Sie die Funktion ta.pivotlow(, um das jüngste Preistief zu identifizieren und als Unterstützungsniveau zu behandeln.
  2. Berechnen Sie die historischen Preisrückgangsprozentsätze nach dem Durchbruch der Unterstützungsstufe und nehmen Sie den Median als Referenz für die sichere Entfernung und den Prozentsatz des Gewinns.
  3. Auslösen des Positionsbausignals, wenn der Preis unter die Unterstützungsstufe bricht und das relative Handelsvolumen größer als das festgelegte Vielfaches ist.
  4. Auf der Grundlage der gesetzten Gesamtzahl von Positionen teilen Sie die Gesamtfonds in gleiche Anteile. Jedes Mal, wenn eine Position erstellt wird, passen Sie die Positionsgröße dynamisch an die aktuelle Anzahl von Positionen an, um ein exponentielles Wachstum der Positionsgröße zu erzielen.
  5. Wenn während des Positionsbuilding-Prozesses der variable Verlust den festgelegten Schwellenwert erreicht, werden die Positionen weiter addiert, bis die Gesamtzahl der Positionen erreicht ist.
  6. Wenn der Kurs auf den Take-Profit-Preis steigt, schließen Sie alle Positionen.

Strategische Vorteile

  1. Dynamische Anpassung der Positionsgröße: Durch die dynamische Anpassung der Größe jeder Position auf der Grundlage des schwimmenden Verlustes während des Kursrückgangs kontrolliert die Strategie das Risiko und ermöglicht gleichzeitig größere Gewinne, wenn der Kurs zurückfällt.
  2. Parameter-Einstellung auf der Grundlage historischer Daten: Durch die Berechnung des Medians der historischen Preisrückgangsprozentsätze nach dem Überschreiten des Unterstützungsniveaus und die Verwendung dieses Medians als Referenz für den sicheren Abstand und den Gewinnprozentsatz werden die Strategieparameter enger an die tatsächlichen Marktbedingungen angepasst.
  3. Begrenzung der Gesamtzahl der Positionen: Durch die Festlegung einer Gesamtzahl der Positionen kontrolliert die Strategie ihr Gesamtrisiko und vermeidet übermäßige Verluste durch Überpositionisierung.

Strategische Risiken

  1. Das Risiko eines Ausfalls der Unterstützungsstufe: Wenn der Markt extreme Bedingungen erlebt und der Preis nach dem Durchbrechen der Unterstützungsstufe weiter stark sinkt, kann der Mechanismus zur Erhöhung der Position der Strategie zu erheblichen Verlusten führen.
  2. Parameterrisiko: Die Leistung der Strategie hängt weitgehend von den Parameter-Einstellungen ab.
  3. Risiko bei der Festlegung des Take-Profit-Preises: Wenn der Take-Profit-Preis zu hoch festgelegt wird, können potenzielle Gewinne verpasst werden. Wenn er zu niedrig festgelegt wird, können Positionen zu früh geschlossen werden und Möglichkeiten verpasst werden, vollständig von Kursrückschlägen zu profitieren.

Strategieoptimierungsrichtlinien

  1. Einführung weiterer Indikatoren: Bei der Bestimmung des Positionsbildungssignals können mehr technische Indikatoren wie RSI und MACD eingeführt werden, um die Genauigkeit des Signals zu verbessern.
  2. Optimierung des Geldmanagements: Anhand von Faktoren wie Marktvolatilität und Risikotoleranz des Kontos wird der Anteil der Mittel für jede Position dynamisch angepasst, um das Risiko besser zu kontrollieren.
  3. Adaptiver Take-Profit und Stop-Loss: Die Prozentsätze für Take-Profit und Stop-Loss werden dynamisch anhand von Veränderungen der Marktvolatilität angepasst, um sich besser an die Veränderungen des Marktes anzupassen.

Zusammenfassung

Durch die dynamische Anpassung der Positionsgrößen und die Festlegung von Parametern auf der Grundlage historischer Daten zielt diese Strategie darauf ab, das Risiko zu kontrollieren und gleichzeitig größere Gewinne bei Kursrückschlägen zu erzielen. Die Performance der Strategie hängt jedoch weitgehend von Parameter-Einstellungen und Marktbedingungen ab, und Risiken bestehen immer noch. Durch die Einführung mehrerer Indikatoren, die Optimierung des Geldmanagements und die Verwendung von adaptivem Take-Profit und Stop-Loss kann die Performance der Strategie weiter verbessert werden.


/*backtest
start: 2024-04-04 00:00:00
end: 2024-04-11 00:00:00
period: 1m
basePeriod: 1m
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/
// © AHMEDABDELAZIZZIZO

//@version=5

strategy("Qfl Dca strategy", overlay=true)

// Parameters
swing = input(3 , title = "Swing Points")
mediandropmult = input.float(1.1, "Median drop Mult", step=0.1 , tooltip = "The script Calculate The Median Drop for all last Bases That Was cracked you can Increase or decrease it")
floatinglossvalue = input(-5 , "Floating Loss" , tooltip = "Position Floating Loss to start firs DCA order")
num_orders = input(5 , "Number of all orders" , tooltip = " The number of orders is including the base order and the DCA orders the script will alculate every order qty based on the orders number So that the position size doubles with every order")
length = input(20, title="Length of relative volume" ,tooltip =  " the length of relative volume indicator")
mult = input(2.0, title="Volume Multiplier" , tooltip = "you can adjust the relative volume multiplier to find best parameter")
tpmult = input.float(1, step=0.1 ,title = "Take Profit Multiplier" ,tooltip =  " By default, the script is set to take profits based on the same median drop percent you can adjust it as you like")



// Pivot Calculation
p = ta.pivotlow(low, swing, swing)
v = ta.valuewhen(p, low[swing], 0)

// Variables
var float[] lows = array.new_float()
var float chn = na

// Calculate drops
if v < v[1]
    chn := (v[1] - v) / v[1] * 100
    if array.size(lows) < 4000
        array.push(lows, chn)
    else
        array.shift(lows)
        array.push(lows, chn)

mediandrop = array.avg(lows)
maxdrop = array.max(lows)
mindrop = array.min(lows)

// Table display
textcolor = color.white
// tabl = table.new(position=position.top_right, columns=4, rows=4)
// table.cell(table_id=tabl, column=1, row=1, text="Avg Drop %", width=15, text_color=textcolor)
// table.cell(table_id=tabl, column=2, row=1, text="Min Drop %", width=15, text_color=textcolor)
// table.cell(table_id=tabl, column=3, row=1, text="Max Drop %", width=15, text_color=textcolor)
// table.cell(table_id=tabl, column=1, row=2, text=str.tostring(mediandrop), width=10, text_color=textcolor)
// table.cell(table_id=tabl, column=2, row=2, text=str.tostring(mindrop), width=10, text_color=textcolor)
// table.cell(table_id=tabl, column=3, row=2, text=str.tostring(maxdrop), width=10, text_color=textcolor)

// Plot support
t = fixnan(ta.pivotlow(low, swing, swing))
plot(t, color=ta.change(t) ? na : #03f590b6, linewidth=3, offset=-(swing), title="Support")

// Calculate relative volume
avgVolume = ta.sma(volume, length)
relVolume = volume / avgVolume

// Base Activation
var bool baseisactive = na
if not na(p)
    baseisactive := true

// Buy Signal Calculation
buyprice = v * (1 - (mediandrop / 100) * mediandropmult)
signal = close <= buyprice and relVolume > mult and baseisactive

// Take Profit Calculation
tpsl = (mediandrop / 100)
tp = (strategy.position_avg_price * (1 + (tpsl * tpmult)))

// Position Sizing
capital_per_order(num_orders, equity) =>
    equity / math.pow(2, (num_orders - 1))

equity_per_order = capital_per_order(num_orders, strategy.equity)

qty_per_order(equity_per_order, order_number) =>
    equity_per_order * order_number / close

// Calculate floating loss
floatingLoss = ((close - strategy.position_avg_price) / strategy.position_avg_price) * 100

// Strategy Entries
if signal and strategy.opentrades == 0
    strategy.entry("Buy", strategy.long, qty=qty_per_order(equity_per_order, 1))
    baseisactive := false

for i = 1 to num_orders -1
    if signal and strategy.opentrades == i and floatingLoss <= floatinglossvalue
        strategy.entry("Buy", strategy.long, qty=qty_per_order(equity_per_order, i), comment="DCA Order" + str.tostring(i))
        baseisactive := false

// Strategy Exit
strategy.exit("exit", "Buy", limit=tp)

// Plot
plot(strategy.position_avg_price, color=color.rgb(238, 255, 0), style=plot.style_linebr, linewidth=2)


Verwandt

Mehr