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


Data de criação: 2023-09-26 19:55:03 última modificação: 2023-09-26 19:55:03
cópia: 2 Cliques: 749
1
focar em
1617
Seguidores

Visão geral

Esta estratégia usa o indicador RSI para identificar oportunidades de oversold, entrar em lotes quando os preços caem e obter lucro a longo prazo por meio da redução contínua do custo médio de manutenção. Ao mesmo tempo, a estratégia incorpora o mecanismo de DCA para controlar ainda mais o risco.

Princípio da estratégia

Esta estratégia primeiro calcula o indicador RSI para determinar se o mercado está sobrevendido. Quando o RSI está abaixo de 30, sinaliza a ocorrência de uma oportunidade de supera venda.

Após a abertura da posição, a estratégia define seis preços de retorno ao valor médio, respectivamente, 98%, 97%, 95%, 90%, 84% e 70% do preço atual. Quando os preços atingem esses preços, a estratégia continua adicionando posições. Isso reduz o custo de manutenção da posição por meio de uma média contínua.

Além disso, a estratégia também calcula o preço médio de uma posição. Quando o preço sobe mais de 5% do preço médio, começa a parar. Ao mesmo tempo, se o preço continuar a subir e ultrapassar o preço de parada de 5% do preço médio, tudo é parado.

Finalmente, a estratégia também inclui o mecanismo de DCA. Se houver uma posição e o preço estiver abaixo do preço médio, uma posição de valor fixo é adicionada a cada segunda-feira. Isso reduz ainda mais o custo da posição.

Análise de vantagens

A principal vantagem desta estratégia é o controle de riscos através da utilização de mecanismos de mediana e DCA. Em particular, incluem-se os seguintes pontos:

  1. A estratégia de entrada por lotes permite dispersar o risco de abertura de posições e evitar a perda do ponto mais baixo.

  2. A configuração de vários preços de retorno ao valor médio permite reduzir continuamente os custos de manutenção da posição e controlar efetivamente o risco de queda.

  3. Calcular o preço médio de uma posição, bloquear o lucro e parar a negociação em tempo hábil.

  4. Aplicar mecanismos de DCA para reduzir ainda mais os custos de detenção e controlar os riscos.

  5. Utilize o RSI para avaliar o momento do mercado, evitando posições de alta.

  6. A utilização de filtros uniformizados evita a reversão da abertura da posição.

Análise de Riscos

A estratégia também apresenta alguns riscos, incluindo:

  1. A estratégia não pode determinar o ponto de reversão do mercado, e se o mercado permanecer baixo por um longo período de tempo, o excesso de negociação pode aumentar os prejuízos.

  2. A estratégia não contempla o mecanismo de parada de perdas e não consegue controlar efetivamente os prejuízos individuais.

  3. A estratégia não limita o número de posições abertas, mas aumenta as posições em caso de queda acentuada.

  4. Os mecanismos de DCA possuem riscos de tempo e não garantem que as posições sejam abertas no ponto mais baixo.

Resolução:

  1. A estrutura do mercado pode ser avaliada em combinação com outros indicadores, evitando a dependência do RSI.

  2. Aumentar a perda móvel ou a perda de escala.

  3. Limitar o número de níveis de negociação para evitar posições excessivas.

  4. Otimizar o tempo de abertura de posições de DCA para uma forma mais estável.

Direção de otimização

A estratégia pode ser melhorada em alguns aspectos:

  1. Otimizar o algoritmo de regressão da média para calcular a regressão do preço de forma mais científica.

  2. Otimizar o modo de travagem, pode ser usado com travagem móvel ou travagem por escadas.

  3. Aumentar as estratégias de stop loss e controlar melhor as perdas individuais.

  4. Combine com outros indicadores para determinar a estrutura do mercado, evitando a dependência do RSI.

  5. Optimizar a lógica de abertura de posições de DCA para evitar o risco de abertura de posições em horários fixos.

  6. Adição de módulo de gerenciamento de posições para otimizar o tamanho das posições.

  7. Optimizar a configuração dos parâmetros para que a estratégia seja mais adequada às características estatísticas do mercado.

  8. Adição de lógica de comutação, comutação de estratégias em diferentes cenários de mercado.

Resumir

Em geral, esta estratégia é uma estratégia de investimento de longo prazo que usa o ponto de julgamento do RSI para entrar em média em lotes. É muito adequado para o mercado de moedas digitais atual de alta volatilidade, e pode usar efetivamente os intervalos de turbulência para gerenciar os custos de manutenção.

Código-fonte da estratégia
/*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()