Dynamische Anpassung der DCA-Strategie basierend auf dem Handelsvolumen

QFL DCA TP SL ATR ADX EMA SMA RSI MACD
Erstellungsdatum: 2024-04-12 17:12:07 zuletzt geändert: 2024-04-12 17:12:07
Kopie: 5 Klicks: 995
1
konzentrieren Sie sich auf
1617
Anhänger

Dynamische Anpassung der DCA-Strategie basierend auf dem Handelsvolumen

Überblick

Die Strategie ist eine dynamische DCA-Strategie, die auf Handelsvolumen und Preisbruch basiert. Sie identifiziert den jüngsten Preisniedrigpunkt und beginnt mit dem Positionieren, wenn der Preis diesen Tiefpunkt überschreitet und das Handelsvolumen steigt. Während der Preis weiter sinkt, passt die Strategie die Anzahl der Positionen pro Positionierung dynamisch an die Größe der schwebenden Verluste an, bis eine festgelegte Gesamtzahl von Positionen erreicht wird.

Strategieprinzip

  1. Identifizieren Sie die jüngsten Preisniedrigpunkte mit der Funktion ta.pivotlow () und verwenden Sie sie als Unterstützung.
  2. Berechnen Sie den Rückgang des historischen Preises nach dem Bruch der Unterstützung und verwenden Sie diese Ziffern als Referenz für die Sicherheitsabstands- und Stopp-Werte.
  3. Ein Positionssignal wird ausgelöst, wenn der Preis die Unterstützung überschreitet und das relative Handelsvolumen größer ist als das festgelegte Multiple.
  4. Die Summe wird in mehrere gleichmäßige Teile aufgeteilt, je nachdem, wie viele Lagerstätten gebaut wurden. Bei jedem Lagerstätteaufbau wird die Anzahl der Lagerstätten dynamisch an die aktuelle Anzahl der Lagerstätten angepasst, um ein Indexwachstum der Lagerstätten zu erzielen.
  5. Während der Lagerung, wenn die schwimmenden Verluste den festgelegten Schwellenwert erreichen, wird die Lagerung fortgesetzt, bis die Gesamtmenge der Lagerung erreicht ist.
  6. Wenn der Preis bis zum Stop-Loss-Preis steigt, werden alle Positionen abgewickelt.

Strategische Vorteile

  1. Dynamische Anpassung der Anzahl der Positionen: Die Anzahl der Positionen wird dynamisch angepasst, um die Anzahl der positionierten Positionen anhand der schwankenden Verluste während des Preisrückgangs anzupassen und gleichzeitig die Risiken zu kontrollieren, um bei einem Preisrückschlag mehr Gewinne zu erzielen.
  2. Referenz für historische Datensatzparameter: Berechnen Sie den Rückgang nach dem historischen Preisbruch der Unterstützung und verwenden Sie diese als Referenz für die Sicherheitsabstands- und Stoppparameter, um die Strategieparameter näher an die tatsächlichen Marktsituationen zu bringen.
  3. Begrenzung der Anzahl der Gesamtpositionen: Durch die Einstellung der Anzahl der Gesamtpositionen wird die Gesamtrisikoöffnung der Strategie kontrolliert, um Verluste durch übermäßige Positionen zu vermeiden.

Strategisches Risiko

  1. Gefahr eines Ausfalls der Unterstützung: Wenn der Markt in extremen Verhältnissen auftritt und die Preise nach dem Bruch der Unterstützung weiter sinken, kann die strategische Beinplatzierung zu erheblichen Verlusten führen.
  2. Risiken bei der Einstellung von Parametern: Die Strategie ist stark von der Einstellung der Parameter abhängig, und die falsche Einstellung der Parameter kann zu einer schlechten Strategieleistung führen.
  3. Stop-Price-Risiken: Wenn der Stop-Price zu hoch ist, kann ein Teil der Gewinne verpasst werden. Wenn er zu niedrig ist, kann es zu früh sein, die Position zu schließen und die Chance auf eine Preiserholung nicht auszuschöpfen.

Richtung der Strategieoptimierung

  1. Einführung von mehr Indikatoren: Bei der Beurteilung von Lagerhaltungssignalen können mehr technische Indikatoren wie RSI, MACD usw. eingeführt werden, um die Genauigkeit des Signals zu verbessern.
  2. Optimierung der Kapitalverwaltung: Der Kapitalanteil bei jeder Anlage kann dynamisch angepasst werden, um die Risiken besser zu kontrollieren, basierend auf Faktoren wie Marktvolatilität und Risikobereitschaft der Konten.
  3. Adaptive Stop-Loss: Die Höhe des Stop-Losses wird dynamisch angepasst, um sich besser an die Veränderungen des Marktes anzupassen.

Zusammenfassen

Die Strategie versucht, mehr Profit zu erzielen, wenn die Preise sich bei einem Rückschlag bewegen, indem sie die Anzahl der Positionen dynamisch anpasst und die Parameter anhand historischer Daten anpasst. Die Strategie kann jedoch durch die Einführung von mehr Kennzahlen, die Optimierung der Kapitalverwaltung und die Anpassung an die Stop-Loss-Systeme weiter verbessert werden.

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