
L’idée principale de cette stratégie est de prendre des positions en fonction de la dynamique des signaux du système et de construire progressivement des positions dans un marché haussier afin de contrôler le risque et d’obtenir un prix d’entrée moyen plus bas.
La stratégie définit d’abord le pourcentage de capital de départ et de DCA. Lors de la clôture de chaque ligne K, elle calcule le pourcentage de la disposition après ajustement en fonction de la variation du prix. Si le prix augmente, elle réduit le pourcentage; si le prix baisse, elle augmente le pourcentage.
De cette façon, il peut contrôler le risque et obtenir un prix d’entrée moyen inférieur lorsque le marché fluctue. En même temps, il calcule le prix d’entrée moyen et le prix médian, ce qui permet de juger de la situation actuelle.
Cette stratégie présente les avantages suivants:
Il est possible d’augmenter la position dynamiquement, d’augmenter la position en cas de baisse du cours, de réduire la position en cas de hausse du cours, afin de contrôler le risque.
Le prix d’entrée moyen est inférieur au prix moyen, ce qui permet d’obtenir une marge bénéficiaire plus élevée.
Le meilleur rapport risque/bénéfice est obtenu en s’adaptant aux fluctuations du marché haussier.
Il est possible de pré-configurer le capital de démarrage et le pourcentage de DCA, de contrôler la quantité de capital à investir à chaque fois et d’éviter un risque excessif.
Il fournit des statistiques sur le prix d’entrée moyen et moyen, permettant de juger de manière intuitive des avantages et des inconvénients de l’entrée.
Cette stratégie comporte aussi des risques:
La stratégie consiste à continuer à accumuler des positions en cas de chute abrupte du marché, ce qui peut entraîner de grandes pertes de fonds. Des arrêts de perte peuvent être mis en place pour contrôler le risque.
Si le cours augmente rapidement, le gain de la stratégie diminue, ce qui peut entraîner la perte d’une grande partie de l’opportunité de hausse. Il est alors nécessaire d’utiliser d’autres signaux pour un LSI agile.
Le mauvais réglage des paramètres entraîne également un certain risque. Un capital de départ trop élevé et un pourcentage de DCA trop élevé augmentent les pertes.
La stratégie peut également être optimisée dans les domaines suivants:
Il est possible d’ajouter une logique de stop-loss pour arrêter la prise de position en cas de forte baisse.
Le pourcentage de DCA peut être ajusté en fonction de la dynamique de la volatilité ou d’autres indicateurs.
Des modèles d’apprentissage automatique peuvent être ajoutés pour prédire les variations de prix et ainsi guider les décisions de mise.
Il peut être combiné avec d’autres indicateurs techniques pour juger de la structure du marché et arrêter la prise de position à un point de basculement structurel.
Un module de gestion de fonds peut être ajouté pour ajuster dynamiquement le montant de chaque mise en réserve en fonction de l’état des fonds du compte.
Cette stratégie est une stratégie de prise de position dynamique et très pratique. Elle permet d’ajuster les positions de manière flexible en fonction des fluctuations du marché et d’obtenir un prix d’entrée moyen plus bas dans un marché haussier.
/*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)