Cette stratégie utilise l’indicateur RSI pour identifier les opportunités de survente et d’entrée en bourse en cas de baisse des prix, afin de réaliser des bénéfices à long terme en réduisant constamment le coût moyen de la position. En même temps, la stratégie intègre le mécanisme DCA pour contrôler davantage les risques.
Cette stratégie commence par calculer le RSI pour déterminer si le marché est en survente. Lorsque le RSI est inférieur à 30, cela indique l’apparition d’une opportunité de survente.
Une fois la position ouverte, la stratégie définit six prix de retour à la valeur moyenne, soit respectivement 98%, 97%, 95%, 90%, 84% et 70% du prix actuel. Lorsque le prix touche ces prix, la position continue d’être ajoutée. Ainsi, le coût de maintien de la position peut être réduit par une valeur moyenne continue.
En outre, la stratégie calcule le prix moyen d’une position. Si la hausse est supérieure à 5% du prix moyen, la position est stoppée.
Enfin, la stratégie intègre un mécanisme de DCA. Chaque lundi, si vous avez une position et que le prix est inférieur à la moyenne, un montant fixe est ajouté à la position. Cela réduit encore le coût de la position.
Le plus grand avantage de cette stratégie réside dans le contrôle des risques grâce à l’utilisation de la valeur moyenne et du mécanisme DCA. Plus précisément, il comprend les points suivants:
La stratégie d’entrée par lots permet de diversifier le risque de placement et d’éviter de manquer le point le plus bas.
La mise en place de plusieurs prix de retour de la moyenne permet de réduire continuellement le coût de détention et de contrôler efficacement le risque de baisse.
Calculer le prix moyen d’une position, arrêter la position en temps opportun après la réalisation des bénéfices et bloquer les bénéfices.
L’application du mécanisme DCA a permis de réduire davantage le coût de détention et de contrôler les risques.
Le RSI est utilisé pour déterminer le moment où le marché est en hausse et pour éviter d’ouvrir une position à un moment de hausse.
Le filtrage en ligne uniforme est utilisé pour éviter le renversement de la position.
Cette stratégie comporte également des risques, principalement:
La stratégie n’est pas en mesure de déterminer le point de basculement du marché, ce qui entraînerait des pertes accrues si le marché était maintenu à un niveau bas pendant une longue période.
La stratégie ne prend pas en compte les mécanismes de stop loss et ne peut pas contrôler efficacement les pertes individuelles.
La stratégie ne limite pas le nombre de positions ouvertes, mais les positions augmentent si le marché chute fortement.
Le DCA présente un risque de temps et ne garantit pas que la position sera ouverte au point le plus bas.
La réponse:
La structure du marché peut être jugée en combinaison avec d’autres indicateurs afin d’éviter de dépendre uniquement du RSI.
Augmentation de l’arrêt de mouvement ou de l’arrêt de la contraction.
Limiter le nombre de niveaux ouverts et éviter les positions trop importantes.
Optimiser les délais d’ouverture des positions des DCA par une approche plus stable.
Cette stratégie peut être optimisée dans les domaines suivants:
Optimiser les algorithmes de régression de la moyenne pour calculer la valeur de la régression des prix de manière plus scientifique.
Optimisation de l’arrêt de l’arrêt, avec l’arrêt mobile ou l’arrêt de l’escalier
Il a ajouté: “Nous devons améliorer notre stratégie de gestion des pertes et mieux maîtriser les pertes individuelles”.
Combinez les autres indicateurs pour juger de la structure du marché et évitez de dépendre uniquement du RSI.
Optimiser la logique d’ouverture des positions de DCA afin d’éviter le risque d’ouverture de positions à des heures fixes.
Ajout d’un module de gestion des positions et optimisation de la taille des positions.
Optimisation des paramètres pour adapter les stratégies aux caractéristiques statistiques du marché.
Logique de commutation, stratégie de commutation dans différents environnements de marché.
Cette stratégie est globalement une stratégie d’investissement en ligne longue qui utilise le moment de jugement RSI pour une entrée en bourse en lots pour une valeur moyenne. Elle convient parfaitement au marché des monnaies numériques actuellement très volatil et peut utiliser efficacement la zone de choc pour la gestion des coûts de détention. De plus, le mécanisme de la stratégie existe également où il peut être optimisé.
/*backtest
start: 2023-08-26 00:00:00
end: 2023-09-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
//@version=4
// © A3Sh
// RSI Strategy that buys the dips, works with Price Averaging and has a Dollar Cost Average option.
// When the price drops below specified percentages of the price (6 PA layers), new entries are openend to average the price of the assets.
// Open entries are closed by a specified take profit.
// Entries can be reopened, after closing and consequently crossing a PA layer again.
// The idea is to lower the average position price to a point that when the market rises, the current price crosses over the average position price.
// When the current price crosses the average position size and reaches the specified take profit, all entries are closed at once.
// In case the market drops significantly, there is an option to activate DCA to lower the average price further.
// RSI code adapted from the Optimized RSI Buy the Dips strategy, by Coinrule
// https://www.tradingview.com/script/Pm1WAtyI-Optimized-RSI-Strategy-Buy-The-Dips-by-Coinrule/
// Pyramiding entries code adapted from Pyramiding Entries on Early Trends startegy, by Coinrule
// https://www.tradingview.com/script/7NNJ0sXB-Pyramiding-Entries-On-Early-Trends-by-Coinrule/
// Plot entry layers code adapted from HOWTO Plot Entry Price by vitvlkv
// https://www.tradingview.com/script/bHTnipgY-HOWTO-Plot-Entry-Price/
// Buy every week code based on the following question in Stack Overflow
// https://stackoverflow.com/questions/59870411/in-pine-script-how-can-you-do-something-once-per-day-or-keep-track-if-somethin
strategy(title = "RSI+PA+DCA", pyramiding = 16, overlay = true, initial_capital = 400, default_qty_type = strategy.percent_of_equity, default_qty_value = 15, commission_type = strategy.commission.percent, commission_value = 0.075)
port = input(15, title = "Portfolio %", type = input.float, step = 0.1, minval = 0.1, maxval = 100)
q = (strategy.equity / 100 * port) / open
// Long position entry layers. Percentage from the entry price of the the first long
PositionInputs = input("++++", title = "+++++ Long Positions VA Layers +++++")
ps2 = input(2, title = "2nd Long Entry %", step = 0.1)
ps3 = input(3, title = "3rd Long Entry %", step = 0.1)
ps4 = input(5, title = "4th Long Entry %", step = 0.1)
ps5 = input(10, title = "5th Long Entry %", step = 0.1)
ps6 = input(16, title = "6th Long Entry %", step = 0.1)
// Calculate Moving Averages
maInput = input("++++", title = "+++++ Moving Average Filter +++++")
plotMA = input(title = "Plot Moving Average", defval = false)
movingaverage_signal = sma(close, input(100))
plot (plotMA ? movingaverage_signal : na, color = color.white)
// RSI inputs and calculations
rsiInput = input( "++++", title = "+++++ RSI Inputs +++++" )
length = input( 14 )
overSold = input( 30, title = "oversold, entry trigger long position" )
overBought = input( 70, title = "overbought, has no specific function")
price = close
vrsi = rsi(price, length)
// Long trigger (co)
co = crossover(vrsi, overSold) and close < movingaverage_signal
// Take profit
takeprofit = input("++++", title = "+++++ Take Profit +++++")
ProfitTarget_Percent = input(5)
// Store values to create and plot the different DCA layers
long1 = valuewhen(co, close, 0)
long2 = valuewhen(co, close - (close / 100 * ps2), 0)
long3 = valuewhen(co, close - (close / 100 * ps3), 0)
long4 = valuewhen(co, close - (close / 100 * ps4), 0)
long5 = valuewhen(co, close - (close / 100 * ps5), 0)
long6 = valuewhen(co, close - (close / 100 * ps6), 0)
eps1 = 0.00
eps1 := na(eps1[1]) ? na : eps1[1]
eps2 = 0.00
eps2 := na(eps2[1]) ? na : eps2[1]
eps3 = 0.00
eps3 := na(eps3[1]) ? na : eps3[1]
eps4 = 0.00
eps4 := na(eps4[1]) ? na : eps4[1]
eps5 = 0.00
eps5 := na(eps5[1]) ? na : eps5[1]
eps6 = 0.00
eps6 := na(eps6[1]) ? na : eps6[1]
plot (strategy.position_size > 0 ? eps1 : na, title = "Long entry 1", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps2 : na, title = "Long entry 2", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps3 : na, title = "Long entry 3", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps4 : na, title = "Long entry 4", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps5 : na, title = "Long entry 5", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps6 : na, title = "Long entry 6", style = plot.style_linebr)
// Plot position average price
plot (strategy.position_avg_price, title = "Average price", style = plot.style_linebr, color = color.red, linewidth = 2)
// Take profit and exit all on take profit above position average price
tpv = strategy.position_avg_price + (strategy.position_avg_price / 100 * ProfitTarget_Percent)
tpl1 = close < tpv ? eps1 + close * (ProfitTarget_Percent / 100) : tpv
tpl2 = close < tpv ? eps2 + close * (ProfitTarget_Percent / 100) : tpv
tpl3 = close < tpv ? eps3 + close * (ProfitTarget_Percent / 100) : tpv
tpl4 = close < tpv ? eps4 + close * (ProfitTarget_Percent / 100) : tpv
tpl5 = close < tpv ? eps5 + close * (ProfitTarget_Percent / 100) : tpv
tpl6 = close < tpv ? eps6 + close * (ProfitTarget_Percent / 100) : tpv
// Open DCA order once at the start of the week
dcaWeek = input("++++", title = "+++++ Open DCA order once every week +++++")
newWeek = change(time("W"))
dcatime = input(title = "Buy a fixed amount every Monday", defval = false)
fixedAmount = input(40, title = "Fixed amount currency for DCA orders", step = 0.1)
dcaq = fixedAmount / open
plotchar (dcatime ? newWeek : na, "buy at Week start", "▼", location.top, size = size.tiny, color = color.white)
bgcolor (dcatime and newWeek ? color.white : na, transp = 50)
// Submit entry orders
if (co and strategy.opentrades == 0)
eps1 := long1
eps2 := long2
eps3 := long3
eps4 := long4
eps5 := long5
eps6 := long6
strategy.entry("Long1", strategy.long, q)
if (strategy.opentrades == 1)
strategy.entry("Long2", strategy.long, q, limit = eps2)
if (strategy.opentrades == 2)
strategy.entry("Long3", strategy.long, q, limit = eps3)
if (strategy.opentrades == 3)
strategy.entry("Long4", strategy.long, q, limit = eps4)
if (strategy.opentrades == 4)
strategy.entry("Long5", strategy.long, q, limit = eps5)
if (strategy.opentrades == 5)
strategy.entry("Long6", strategy.long, q, limit = eps6)
// Submit Weekly DCA order, only when price is below position average price and when a position is open
if (dcatime and newWeek and strategy.position_size > 0 and close < strategy.position_avg_price)
strategy.entry("DCA", strategy.long, dcaq)
// Exit orders
if (strategy.position_size > 0)
strategy.exit(id = "Exit 1", from_entry = "Long1", limit = tpl1)
strategy.exit(id = "Exit 2", from_entry = "Long2", limit = tpl2)
strategy.exit(id = "Exit 3", from_entry = "Long3", limit = tpl3)
strategy.exit(id = "Exit 4", from_entry = "Long4", limit = tpl4)
strategy.exit(id = "Exit 5", from_entry = "Long5", limit = tpl5)
strategy.exit(id = "Exit 6", from_entry = "Long6", limit = tpl6)
strategy.exit(id = "Exit DCA", from_entry = "DCA", limit = tpv)
// Make sure that all open limit orders are canceled after exiting all the positions
longClose = strategy.position_size[1] > 0 and strategy.position_size == 0 ? 1 : 0
if longClose
strategy.cancel_all()