Stratégie dynamique de DCA basée sur le volume

Auteur:ChaoZhang est là., Date: 2024-04-12 17:12:07 Je vous en prie.
Les étiquettes:Résultats de l'enquêteDCATPSLATRADXLe taux d'intérêtSMAIndice de résistanceLe MACD

img

Résumé

Cette stratégie est une stratégie DCA dynamique basée sur le volume qui utilise les ruptures de prix. Elle identifie le plus bas prix récent et commence à construire des positions lorsque le prix tombe en dessous de ce bas et que le volume de négociation augmente. Au fur et à mesure que le prix continue de chuter, la stratégie ajuste dynamiquement la quantité de chaque position en fonction de la taille de la perte flottante jusqu'à ce qu'elle atteigne le nombre total de positions.

Principes de stratégie

  1. Utilisez la fonction ta.pivotlow() pour identifier le plus bas prix récent et le traiter comme un niveau de support.
  2. Calculer les pourcentages historiques de baisse des prix après avoir franchi le niveau de soutien et prendre la médiane comme référence pour la distance de sécurité et le pourcentage de prise de profit.
  3. Déclencher le signal de construction de position lorsque le prix dépasse le niveau de support et que le volume de négociation relatif est supérieur au multiple défini.
  4. Sur la base du nombre total de positions défini, divisez le total des fonds en proportions égales.
  5. Au cours du processus de constitution des positions, si la perte variable atteint le seuil fixé, continuer à ajouter des positions jusqu'à ce que le nombre total de positions soit atteint.
  6. Lorsque le prix atteint le prix de prise de profit, fermez toutes les positions.

Les avantages de la stratégie

  1. Ajustement dynamique de la taille de la position: en ajustant dynamiquement la taille de chaque position en fonction de la perte flottante pendant la baisse des prix, la stratégie contrôle le risque tout en permettant des bénéfices plus élevés lorsque le prix rebondit.
  2. Paramètres établis sur la base de données historiques: en calculant la médiane des pourcentages de baisse des prix historiques après avoir franchi le niveau de soutien et en l'utilisant comme référence pour la distance de sécurité et le pourcentage de prise de profit, les paramètres stratégiques sont plus étroitement alignés sur les conditions réelles du marché.
  3. Limiter le nombre total de positions: en fixant un nombre total de positions, la stratégie contrôle son exposition globale au risque et évite des pertes excessives dues à un surpositionnement.

Risques stratégiques

  1. Risque d'échec du niveau de soutien: si le marché connaît des conditions extrêmes et que le prix continue de chuter fortement après avoir franchi le niveau de soutien, le mécanisme d'ajout de position de la stratégie peut entraîner des pertes importantes.
  2. Résultats de la stratégie dépendent en grande partie des paramètres définis.
  3. Risque de fixation du prix de prise de profit: si le prix de prise de profit est trop élevé, les bénéfices potentiels peuvent être manqués.

Directions d'optimisation de la stratégie

  1. Introduire plus d'indicateurs: Pour déterminer le signal de position, des indicateurs plus techniques tels que le RSI et le MACD peuvent être introduits afin d'améliorer la précision du signal.
  2. Optimiser la gestion de l'argent: sur la base de facteurs tels que la volatilité du marché et la tolérance au risque du compte, ajuster dynamiquement la proportion de fonds pour chaque position afin de mieux contrôler le risque.
  3. Prise de bénéfices et stop-loss adaptatifs: ajuster dynamiquement les pourcentages de prise de bénéfices et de stop-loss en fonction des changements de volatilité du marché afin de mieux s'adapter aux changements du marché.

Résumé

En ajustant dynamiquement la taille des positions et en définissant des paramètres basés sur des données historiques, cette stratégie vise à contrôler le risque tout en recherchant des bénéfices plus importants lors de rebonds de prix. Cependant, la performance de la stratégie dépend en grande partie des paramètres et des conditions du marché, et les risques existent toujours. En introduisant plus d'indicateurs, en optimisant la gestion de l'argent et en utilisant le profit adaptatif et le stop-loss, la performance de la stratégie peut être encore améliorée.


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


Relationnée

Plus de