Bollinger Band et RSI mélangés à la stratégie DCA

Auteur:ChaoZhang est là., Date: 2024-01-18 11h23 et 15h
Les étiquettes:

img

Résumé

La stratégie s'appelle Bollinger Band et RSI Mixing with DCA. Elle construit des signaux de trading basés sur les indicateurs Bollinger Band et Relative Strength Index (RSI) et gère les risques en utilisant la moyenne progressive des coûts en dollars (DCA).

Principe de stratégie

La stratégie intègre les indicateurs Bollinger Band et RSI. La bande de Bollinger juge clairement la tendance où au-dessus de la bande du milieu signifie un marché haussier et en dessous signifie un marché baissier.

Pour la partie progressive DCA, une position initiale est ouverte lorsque MIX franchit le seuil de 20. Des positions supplémentaires sont ajoutées à un montant fixe à chaque fois que le prix chute d'un pourcentage fixe. Cela se poursuit jusqu'à ce que les positions maximales soient atteintes ou qu'un stop loss/take profit soit déclenché. En ajoutant des positions aux plus bas du marché plusieurs fois, le coût moyen peut être progressivement abaissé.

Les avantages de la stratégie

  1. La combinaison de deux indicateurs améliore l'exactitude du signal grâce à un jugement plus clair de la tendance.

  2. Le DCA progressif réduit la base de coûts pendant les baisses, réduisant le risque de perte tout en augmentant la fourchette de bénéfices.

  3. Les conditions de prise de profit et de stop-loss permettent de contrôler rapidement les risques et de verrouiller un profit partiel.

  4. Le filtre de plage de dates ajouté permet des backtests ciblés et des optimisations de périodes spécifiques.

Risques et solutions

  1. Les différentes combinaisons de paramètres peuvent être testées pour une meilleure précision du signal.

  2. Le DCA progressif peut augmenter les pertes lors de grands crashs en ajoutant continuellement des positions.

  3. Les événements du cygne noir et les mouvements anormaux des prix ne peuvent pas être prévus.

Directions d'optimisation

  1. Tester et optimiser les paramètres de l'indicateur MIX afin d'obtenir des signaux de trading plus précis.

  2. Optimisez les paramètres stop loss, profit pour le meilleur ratio profit/perte.

  3. Testez différentes tailles et fréquences de position d'addition pour trouver des combinaisons optimales.

  4. Envisager d'ajouter des modules de contrôle du volume de négociation à la stratégie d'ouverture/fermeture basée sur les conditions de volume.

Résumé

La combinaison de la bande de Bollinger et du RSI avec la stratégie DCA combine plusieurs techniques et méthodes quantitatives. Il construit un indicateur de jugement de tendance clair et réduit la base des coûts grâce à des ajouts progressifs. Des méthodes strictes de contrôle des risques, y compris le stop loss et le take profit, le rendent pratique. Des tests et des optimisations supplémentaires peuvent débloquer ses avantages uniques dans un système de trading rentable.


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


Plus de