
Cette stratégie est appelée stratégie de DCA progressive à double indicateur. Elle est basée sur les signaux de négociation des canaux de Brin et de l’indice de force relative (RSI), tout en utilisant une méthode de prise de position progressive pour la gestion des risques.
La stratégie combine deux indicateurs: le canal de Bolling et le RSI. Le canal de Bolling permet de déterminer clairement la tendance du marché, le milieu de l’orbite de Bolling est au-dessus du marché haussier et au-dessous du marché baissier. L’indicateur RSI détermine le phénomène de survente et de survente.
La partie DCA progressive, ouvrant d’abord la première position lorsque l’indicateur MIX dépasse 20. Ensuite, chaque fois que le prix baisse d’une certaine ampleur, ajoutez une position d’un certain montant. Jusqu’à ce que vous atteigniez le montant de la position maximale ou que vous sortiez du stop loss.
Les deux indicateurs sont combinés avec une tendance à la clarté de jugement, augmentant la précision du signal.
Les stratégies de DCA progressive permettent de réduire les coûts des positions en baisse et de réduire le risque de perte.
Les conditions d’arrêt et d’arrêt de perte permettent de contrôler les risques de perte en temps opportun et de garantir une partie des bénéfices.
Ajout d’une plage de dates d’ouverture de position, qui peut être testée et optimisée pour une période de temps spécifique.
Les canaux de Boolean et l’indicateur RSI peuvent être défaillants. Des combinaisons différentes de paramètres peuvent être testées pour trouver le meilleur point.
Le DCA progressif peut entraîner une augmentation des pertes en cas d’augmentation continue des positions dans une situation de forte baisse. Il est possible de définir le nombre maximal de prises de position et d’améliorer le contrôle des risques de la ligne de freinage de manière appropriée.
Il est possible d’ajouter des indicateurs à un grand tableau pour évaluer le risque systémique et éviter les périodes anormales.
Tester l’optimisation des paramètres de l’indicateur MIX afin d’obtenir un signal de transaction plus précis.
Optimiser les paramètres de l’arrêt de perte pour maximiser le ratio de perte de profit.
Testez la fréquence et l’ampleur des différentes positions pour trouver la combinaison optimale.
On peut envisager d’ajouter un module de contrôle du volume des transactions pour ouvrir ou fermer la stratégie dans des conditions de volume spécifiques.
La stratégie de DCA progressive à double indice utilise une combinaison de plusieurs indicateurs et méthodes techniques quantifiés. Elle construit des indicateurs de jugement de tendance clairs et utilise la prise de risque progressive pour réduire les coûts.
/*backtest
start: 2023-01-11 00:00:00
end: 2024-01-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// © lagobrian23
//@version=4
strategy(title = 'Bollinger Bands and RSI mix with DCA', shorttitle = 'BB/RSI with DCA',pyramiding = 20, calc_on_every_tick = true, overlay = false )
source=close
smoothK = input(3, "K", minval=1)
smoothD = input(3, "D", minval=1)
lengthRSI = input(14, "RSI Length", minval=1)
lengthStoch = input(14, "Stochastic Length", minval=1)
src = input(close, title="RSI Source")
rsi1 = rsi(src, lengthRSI)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)
// Bollinger Band
length = input(20,title = 'BB lookback length', minval=1)
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
BBval = (src - basis)/dev*30+50
offset = input(0, title = "Offset", type = input.integer, minval = -500, maxval = 500)
mix=(d + BBval)/2
//plot
//plot(k, "K", color=#606060)
plot(BBval, "BBval", color=#872323, offset = offset)
plot(d, "D", color=#FF6A00)
h0 = hline(80, "Upper Band", color=#606060)
h1 = hline(20, "Lower Band", color=#606060)
plot(mix, "MIX", color=#888888, linewidth=3)
//background MIX
bgcolor(mix < 20 ? color.green : color.white, transp=50)
bgcolor(mix > 80 ? color.red : color.white, transp=50)
// Choosing the date range
fromMonth = input(defval = 1, title = "From Month", type = input.integer, minval = 1, maxval = 12)
fromDay = input(defval = 1, title = "From Day", type = input.integer, minval = 1, maxval = 31)
fromYear = input(defval = 2020, title = "From Year", type = input.integer, minval = 1970)
toMonth = input(defval = 1, title = "To Month", type = input.integer, minval = 1, maxval = 12)
toDay = input(defval = 1, title = "To Day", type = input.integer, minval = 1, maxval = 31)
toYear = input(defval = 2112, title = "To Year", type = input.integer, minval = 1970)
start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window
finish = timestamp(toYear, toMonth, toDay, 23, 59) // backtest finish window
window() => true
// Initializing the strategy paraeters
P = input(defval = 1, title = 'Amount (P)' , type = input.integer, minval = 1, maxval = 100)
X = input(defval = 2, title = '% Price drop for consecutive entries(X)', type = input.float, minval = 1, maxval = 100)
B_tp = input(defval = 10, title = '% Level for Take Profit (B)', type = input.float , minval = 1, maxval = 100)
D_sl = input(defval = 10, title = '% Level for Stop Loss (D)', type = input.float, minval = 1, maxval = 100)
A = input(defval = 5, title = 'Max consecutive entries (A)', type = input.integer, minval = 2, maxval = 20)
Z = input(defval = 0.5, title = 'Z', type = input.float , minval = 0, maxval = 10)
// Declaring key DCA variables
entry_price = 0.0
entry_price := na(entry_price[1]) ? na : entry_price[1]
new_entry = 0.0
consec_entryCondition = false
// Implementing the strategy
longEntry = crossover(mix,20)
exitLongs = crossunder(mix, 80)
if(longEntry)
entry_price := close
strategy.entry('main_LE', strategy.long , P, when = window() and longEntry)
// Exiting conditions
stoploss = strategy.position_avg_price*(1-(D_sl/100))
takeprofit = strategy.position_avg_price*(1+(B_tp/100))
slCondition = crossunder(close, stoploss)
tpCondition = crossover(close, takeprofit)
// We want to exit if the 'mix' indicator crosses 80, take profit is attained or stop loss is tagged.
exitConditions = exitLongs or slCondition or tpCondition
// Consecutive entries upto A times
// strategy.risk.max_intraday_filled_orders(A)
//Dollar-Cost-Averaging
// Enter long whenever price goes down X%: amount set to (P+Y)*Z
newAmount = (P+X)*Z
// If we haven't reached max open trades, buy newAmount immediately price crosses under X% lower the previous entry price
new_entry := entry_price - ((X/100)*entry_price)
consec_entryCondition := crossunder(close, new_entry)
if(consec_entryCondition and strategy.opentrades != A)
strategy.entry('consec_LE', strategy.long, newAmount, oca_name = 'consecLongs', when = window() and consec_entryCondition)
entry_price := close
// Exiting
// The main trade is closed only when the main exit conditions are satisfied
strategy.close('main_LE', comment = 'Main Long Closed', when = window() and exitConditions)
// A consective long is closed only when tp or sl is tagged
strategy.exit('ext a consec', 'consec_LE', loss = D_sl*strategy.position_avg_price , profit = B_tp*strategy.position_avg_price, oca_name = 'consecLongs')