Stratégie dynamique de renforcement de la position

Auteur:ChaoZhang est là., Date: 2024-02-20 14:16:30
Les étiquettes:

img

Résumé

L'idée principale de cette stratégie est de construire dynamiquement une position basée sur les signaux du système dans un marché haussier afin de contrôler les risques et d'obtenir un prix d'entrée moyen inférieur.

La logique de la stratégie

La stratégie définit d'abord le capital de départ et le pourcentage DCA. À la fermeture de chaque barre, elle calcule un pourcentage ajusté en fonction du changement de prix. Si le prix augmente, elle abaisse le pourcentage. Si le prix baisse, elle augmente le pourcentage. Cela permet d'ajouter à la position à des prix plus bas. Elle calcule ensuite la taille de l'ordre en fonction du pourcentage ajusté et du capital restant. À chaque barre de fermeture, elle place des ordres pour construire la position jusqu'à ce que le capital de départ soit épuisé.

Ainsi, il peut contrôler les risques et obtenir un prix d'entrée moyen inférieur pendant l'action des prix fluctuante.

Analyse des avantages

La stratégie présente les avantages suivants:

  1. Il peut évoluer dynamiquement dans la position, augmentant l'allocation sur les baisses et diminuant l'allocation sur les rallyes pour contrôler les risques.

  2. Il obtient un prix d'entrée moyen inférieur par rapport au prix médian, ce qui permet un potentiel de profit plus élevé.

  3. Il s'adapte à des marchés haussiers avec volatilité pour de meilleurs ratios risque-rendement.

  4. Il permet de préétablir le capital de départ et le pourcentage DCA pour contrôler le risque de dimensionnement des positions.

  5. Il fournit des statistiques sur le prix d'entrée moyen et le prix médian pour un jugement clair de la qualité d'entrée.

Analyse des risques

Il y a aussi des risques:

  1. En cas de chute des marchés, il continuera à augmenter la position, ce qui entraînera de lourdes pertes.

  2. Si le prix augmente rapidement, la mise à l'échelle diminuera, manquant éventuellement une grande partie du rallye.

  3. Une mauvaise configuration des paramètres présente également des dangers: un capital de départ excessif et un pourcentage élevé de DCA augmenteront les pertes.

Directions d'optimisation

Quelques façons d'optimiser la stratégie:

  1. Ajoutez une logique de stop-loss pour cesser de faire des ventes lourdes.

  2. Adapter dynamiquement le pourcentage de DCA en fonction de la volatilité ou d'autres indicateurs.

  3. Incorporer des modèles d'apprentissage automatique pour prévoir les prix et guider les décisions d'échelle.

  4. Combiner d'autres indicateurs pour identifier les changements de la structure du marché pour l'échelle des points de sortie.

  5. Ajouter des règles de gestion du capital à des ordres de taille dynamique basés sur les valeurs du compte.

Conclusion

Il s'agit d'une stratégie de mise à l'échelle dynamique très pratique. Il ajuste de manière flexible la taille de la position en fonction des fluctuations de prix pour atteindre de bonnes entrées moyennes sur les marchés haussiers, tout en limitant le risque via des paramètres configurables.


/*backtest
start: 2024-01-20 00:00:00
end: 2024-02-19 00:00:00
period: 1h
basePeriod: 15m
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/
// © RWCS_LTD

//@version=5
strategy("DCA IN Calculator {RWCS}", overlay=true, pyramiding=999, default_qty_type=strategy.cash, initial_capital=10000, commission_value=0.02)

// User inputs
backtestStartDate = input(timestamp("1 Jan 2024"), 
     title="Start Date", group="Backtest Time Period",
     tooltip="This start date is in the time zone of the exchange " + 
     "where the chart's instrument trades. It doesn't use the time " + 
     "zone of the chart or of your computer.")
start_date = true
starting_capital = input.float(defval=5000, title="Starting Capital")
dca_allocation_percentage = input.int(defval=10, title="DCA Allocation Percentage")

// Calculate DCA allocation based on price change
price_change_percentage = ((close - close[1]) / close[1]) * 100
adjusted_allocation_percentage = close > close[1] ? dca_allocation_percentage - price_change_percentage : dca_allocation_percentage + price_change_percentage // If price action is negative, increase allocations
adjusted_allocation_percentage1 = dca_allocation_percentage - price_change_percentage // If price action is positive, reduce allocations

// Calculate order size based on adjusted allocation percentage
order_size = (adjusted_allocation_percentage / 100) * starting_capital

// Track remaining capital
var remaining_capital = starting_capital

// Long on the close of every bar
if true
    // Ensure the order size doesn't exceed remaining capital or adjusted allocation
    order_size := math.min(order_size, remaining_capital, adjusted_allocation_percentage / 100 * starting_capital)
    // Ensure order size is not negative
    order_size := math.max(order_size, 0)
    
    strategy.entry("DCA", strategy.long, qty = order_size)
    remaining_capital := remaining_capital - order_size

// Plot average entry price
var float total_entry_price = 0.0
var int total_signals = 0

if start_date
    total_entry_price := total_entry_price + close
    total_signals := total_signals + 1

avg_entry_price = total_entry_price / total_signals

// Calculate and plot median price
var float median_price = na

if start_date
    var float sum_prices = 0.0
    var int num_prices = 0
    
    for i = 0 to bar_index
        if (time[i] >= backtestStartDate)
            sum_prices := sum_prices + close[i]
            num_prices := num_prices + 1
    
    median_price := sum_prices / num_prices

// Reset variables at the start of each day
if (dayofweek != dayofweek[1])
    total_entry_price := 0.0
    total_signals := 0

//table colors
borders_col = color.new(color.black, 90)
top_row_col = color.new(color.gray, 90)
size = input.string(defval='Normal', options=['Tiny', 'Small', 'Normal', 'Large'], title='Table size', inline='design', group='Table Design')
table_size = size == 'Tiny' ? size.tiny : size == 'Small' ? size.small : size == 'Normal' ? size.normal : size == 'Large' ? size.large : na

var tablee = table.new(position=position.top_right, columns=2, rows=3, frame_color=borders_col, frame_width=4, border_color=borders_col, border_width=4)

table.cell(tablee, 0, 0, "Average Entry Price", bgcolor=top_row_col, text_color=color.white, text_size=table_size)
table.cell(tablee, 1, 0, str.tostring(avg_entry_price, '#.##'), text_color=color.white, text_size=table_size)
table.cell(tablee, 0, 1, "Median Price", bgcolor=top_row_col, text_color=color.white, text_size=table_size)
table.cell(tablee, 1, 1, str.tostring(median_price, '#.##'), text_color=color.white, text_size=table_size)
table.cell(tablee, 0, 2, "Remaining Capital", bgcolor=top_row_col, text_color=color.white, text_size=table_size)
table.cell(tablee, 1, 2, str.tostring(remaining_capital, '#.##'), text_color=color.white, text_size=table_size)



Plus de