RSI Stratégie de fluctuation des prix de renversement moyen

Auteur:ChaoZhang est là., Date: le 26 septembre 2023 19:55:03
Les étiquettes:

Résumé

Cette stratégie identifie les opportunités de survente à l'aide de l'indicateur RSI et prend des positions par lots lorsque les prix baissent pour réduire progressivement la base de coûts et réaliser des bénéfices à long terme.

La logique de la stratégie

La stratégie calcule d'abord l'indicateur RSI pour déterminer si le marché est survendu. Lorsque le RSI est inférieur à 30, il indique une opportunité de survente. Dans ce cas, si le prix est inférieur à la moyenne mobile à 100 périodes, une position longue sera ouverte.

Après l'ouverture de la position, la stratégie établit 6 niveaux de prix de renversement moyens à 98%, 97%, 95%, 90%, 84% et 70% du prix actuel. Lorsque le prix atteint ces niveaux, plus de positions seront ajoutées. En faisant une moyenne constante à la baisse, la base de coût de la position peut être abaissée.

En outre, le prix moyen de la position est calculé. La prise de profit commence lorsque le prix augmente de plus de 5% au-dessus du prix moyen. En outre, si le prix continue à augmenter au-dessus du prix de prise de profit de 5% du prix moyen, toutes les positions seront fermées.

Enfin, un mécanisme DCA est intégré à la stratégie. Tous les lundis, si des positions sont ouvertes et que le prix est inférieur au prix moyen, un montant fixe sera ajouté à la position.

Analyse des avantages

Le plus grand avantage de cette stratégie est l'utilisation de la moyenne descendante et des mécanismes DCA pour contrôler les risques.

  1. La prise de positions par lots diversifie le risque d'ouverture et évite de manquer le point le plus bas.

  2. La fixation de plusieurs niveaux de prix moyens de réversion réduit progressivement la base de coûts et gère le risque à la baisse.

  3. Le calcul du prix moyen de la position permet de réaliser des bénéfices en temps opportun et de les verrouiller lorsque le green est en jeu.

  4. L'application de la DCA réduit encore le coût de base et contrôle le risque.

  5. L'utilisation de l'indicateur RSI empêche l'ouverture de positions au sommet.

  6. Le filtre des moyennes mobiles évite les opérations de renversement.

Analyse des risques

La stratégie comporte également certains risques:

  1. La stratégie ne peut pas déterminer les points d'inversion du marché. Les positions longues persistantes pendant les bas de marché prolongés augmenteront les pertes.

  2. Il n'existe pas de mécanisme d'arrêt des pertes permettant de contrôler efficacement les pertes d'une seule transaction.

  3. Il n'y a pas de limite sur le nombre de positions, ce qui peut conduire à des ajouts effrénés si le marché s'effondre violemment.

  4. DCA comporte un risque de calendrier et ne garantit pas l'ouverture de positions au point le plus bas.

Des solutions possibles:

  1. Incorporer d'autres indicateurs pour juger de la structure du marché au lieu de se fier uniquement à l'indicateur RSI.

  2. Ajouter le stop loss en mouvement ou échelonné.

  3. Limitez le nombre d'ajouts de positions.

  4. Optimiser la logique d'entrée DCA pour un mécanisme plus stable.

Directions d'optimisation

La stratégie peut être améliorée de la manière suivante:

  1. Optimiser l'algorithme de réversion moyenne pour une approche plus scientifique.

  2. Améliorer les mécanismes de prise de bénéfices, tels que l'arrêt ultérieur ou la prise de bénéfices en couches.

  3. Ajoutez un stop loss pour un meilleur contrôle du risque unique.

  4. Incorporer d'autres indicateurs pour l'analyse de la structure du marché au lieu de l'indicateur RSI pur.

  5. Optimiser la logique DCA pour éviter les risques d'entrée à temps fixe.

  6. Ajouter la dimension de la position pour optimiser la taille totale de la position.

  7. Optimiser les paramètres en fonction des caractéristiques statistiques du marché.

  8. Ajouter une logique de commutation pour s'adapter aux différents régimes de marché.

Conclusion

En résumé, il s'agit d'une stratégie d'investissement à long terme utilisant le RSI pour le timing et la moyenne à la baisse avec plusieurs entrées sur une base de coût inférieure. Il est bien adapté au marché actuel de la crypto-monnaie volatil pour gérer les coûts de position pendant des périodes variées. Il y a également place à l'amélioration des mécanismes pour incorporer plus d'indicateurs pour l'analyse du marché et la gestion des risques afin de permettre à la stratégie de prospérer dans des environnements plus complexes.


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





Plus de