Estratégia de flutuação de preços de reversão média do RSI

Autora:ChaoZhang, Data: 2023-09-26 19:55:03
Tags:

Resumo

Esta estratégia identifica oportunidades de sobrevenda utilizando o indicador RSI e toma posições em lotes quando os preços caem para reduzir gradualmente a base de custos e alcançar lucros a longo prazo.

Estratégia lógica

A estratégia primeiro calcula o indicador RSI para determinar se o mercado está sobrevendido. Quando o RSI está abaixo de 30, ele sinaliza uma oportunidade de sobrevenda. Neste caso, se o preço estiver abaixo da média móvel de 100 períodos, uma posição longa será aberta.

Após a abertura da posição, a estratégia define 6 níveis de preço de reversão média em 98%, 97%, 95%, 90%, 84% e 70% do preço atual. Quando o preço atinge esses níveis, mais posições serão adicionadas.

Além disso, o preço médio da posição é calculado. A captação de lucro começa quando o preço sobe mais de 5% acima do preço médio. Além disso, se o preço continuar a subir acima do preço de captação de lucro de 5% do preço médio, todas as posições serão fechadas.

Por último, um mecanismo DCA é incorporado na estratégia. Todas as segundas-feiras, se houver posições abertas e o preço estiver abaixo do preço médio, uma quantia fixa será adicionada à posição. Isso reduz ainda mais a base de custo.

Análise das vantagens

A maior vantagem desta estratégia é a utilização da média descendente e dos mecanismos DCA para controlar os riscos.

  1. A tomada de posições em lotes diversifica o risco de abertura e evita perder o ponto mais baixo.

  2. A fixação de níveis de preços de reversão média múltiplos reduz progressivamente a base de custos e gerencia o risco de queda.

  3. O cálculo do preço médio da posição permite obter lucros oportunos e bloquear os lucros quando estiver no green.

  4. A aplicação da DCA reduz ainda mais a base de custos e controla o risco.

  5. Usar o indicador RSI impede a abertura de posições nos picos.

  6. O filtro da média móvel evita negociações de reversão.

Análise de riscos

A estratégia apresenta também alguns riscos:

  1. A estratégia não pode determinar os pontos de reversão do mercado.

  2. Não existe um mecanismo de stop loss para controlar efetivamente a perda de uma única transação.

  3. Não há limite no número de posições, o que pode levar a adições descontroladas se o mercado cair violentamente.

  4. A DCA comporta um risco de calendário e não garante a abertura de posições no ponto mais baixo.

Possíveis soluções:

  1. Incorporar outros indicadores para julgar a estrutura do mercado em vez de depender apenas do RSI.

  2. Adicionar stop loss em movimento ou escalonado.

  3. Limite o número de adições de posições.

  4. Otimizar a lógica de entrada DCA para um mecanismo mais estável.

Orientações de otimização

A estratégia pode ser melhorada das seguintes formas:

  1. Otimizar o algoritmo de reversão média para uma abordagem mais científica.

  2. Melhorar os mecanismos de captação de lucro, tais como trailing stop ou captação de lucro em camadas.

  3. Adicionar stop loss para um melhor controlo do risco de negociação única.

  4. Incorporar outros indicadores para a análise da estrutura de mercado em vez de apenas RSI.

  5. Otimizar a lógica DCA para evitar riscos de entrada em tempo fixo.

  6. Adicionar dimensionamento de posição para otimizar o tamanho total da posição.

  7. Otimizar os parâmetros para se adequarem às características estatísticas do mercado.

  8. Adicionar a lógica de comutação para se adaptar aos diferentes regimes de mercado.

Conclusão

Em resumo, esta é uma estratégia de investimento de longo prazo que utiliza o RSI para cronometragem e média para baixo com várias entradas para uma base de custo menor. É bem adequado para o atual mercado de criptomoedas volátil para gerenciar os custos de posição durante períodos variados.


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





Mais.