Ajustement dynamique de la stratégie DCA en fonction du volume de transactions

QFL DCA TP SL ATR ADX EMA SMA RSI MACD
Date de création: 2024-04-12 17:12:07 Dernière modification: 2024-04-12 17:12:07
Copier: 5 Nombre de clics: 995
1
Suivre
1617
Abonnés

Ajustement dynamique de la stratégie DCA en fonction du volume de transactions

Aperçu

La stratégie est une stratégie DCA dynamique basée sur le volume de transactions et les ruptures de prix. Elle commence à se positionner en identifiant le plus récent point bas du prix et commence à se positionner lorsque le prix franchit ce point bas et que le volume de transactions augmente.

Principe de stratégie

  1. La fonction ta.pivotlow (()) identifie les bas de prix les plus récents et les utilise comme support.
  2. Calculer la baisse des prix historiques après la rupture des supports, en utilisant les chiffres comme référence pour la distance de sécurité et la baisse de la hausse.
  3. Un signal de construction de position est déclenché lorsque le prix dépasse le support et que le volume de transactions est supérieur au multiplicateur défini.
  4. En fonction du nombre total de fois que le magasin est construit, le capital total est divisé en plusieurs parties de proportion égale. Chaque fois que le magasin est construit, le nombre de magasins construits est ajusté en fonction de la dynamique du nombre de fois que le magasin est construit, ce qui permet d’augmenter l’indice de la position.
  5. Au cours de la construction d’un entrepôt, si les pertes flottantes atteignent le seuil fixé, continuez à augmenter les positions jusqu’à atteindre le nombre total de positions construites.
  6. Lorsque le prix atteint le seuil d’arrêt, effacez toutes les positions.

Avantages stratégiques

  1. Adaptation dynamique du nombre de positions: en fonction des pertes flottantes dans le processus de baisse des prix, ajustez dynamiquement le nombre de positions créées à chaque fois, tout en contrôlant les risques, et en obtenant plus de bénéfices lorsque les prix rebondissent.
  2. Paramètres de configuration des données historiques de référence: en calculant la baisse des prix historiques après la rupture du support, en prenant les chiffres comme référence pour la distance de sécurité et la marge de freinage, afin de rendre les paramètres de stratégie plus proches de la situation réelle du marché.
  3. Limiter le nombre total de mises en place: en réglant le nombre total de mises en place, contrôler le seuil de risque total de la stratégie et éviter les pertes causées par une mise en place excessive.

Risque stratégique

  1. Risque de rupture du support: si le marché est exposé à des conditions extrêmes et que les prix continuent de chuter fortement après avoir franchi le support, le mécanisme de mise en position stratégique peut entraîner des pertes importantes.
  2. Risque de paramétrage: la performance d’une stratégie dépend en grande partie de la configuration des paramètres. Une mauvaise configuration des paramètres peut entraîner une mauvaise performance de la stratégie.
  3. Risque de fixation de prix d’arrêt: si le prix d’arrêt est trop élevé, vous risquez de perdre une partie de vos bénéfices; si le prix est trop bas, vous risquez de fermer votre position trop tôt et de ne pas profiter pleinement de la reprise des prix.

Orientation de l’optimisation de la stratégie

  1. Introduction de plus d’indicateurs: Dans le jugement des signaux de stockage, il est possible d’introduire plus d’indicateurs techniques, tels que le RSI, le MACD, etc., pour améliorer l’exactitude du signal.
  2. Optimisation de la gestion des fonds: le pourcentage de fonds à investir pour chaque placement peut être ajusté de manière dynamique en fonction de facteurs tels que la volatilité du marché et la tolérance au risque du compte, afin de mieux contrôler les risques.
  3. Adaptation de l’arrêt-stop: Adaptation dynamique de l’arrêt-stop en fonction de la volatilité du marché afin de mieux s’adapter aux changements du marché.

Résumer

La stratégie cherche à obtenir plus de profit en cas de rebond des prix, tout en contrôlant les risques, en ajustant dynamiquement le nombre de positions et en se référant aux paramètres de configuration des données historiques. Cependant, la performance de la stratégie dépend en grande partie de la configuration des paramètres et des conditions du marché.

Code source de la stratégie
/*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)