Estratégia de reversão da combinação de indicadores de média móvel RSI dupla

Autora:ChaoZhang, Data: 2023-11-10 18:01:09
Tags:

img

Resumo

Esta estratégia combina média móvel dupla, índice de força relativa (RSI) e SAR parabólico (PSAR) para identificar pontos de reversão de preços e tomar decisões de compra e venda em conformidade.

Princípios

A estratégia utiliza principalmente os seguintes indicadores técnicos para determinar os pontos de reversão dos preços:

  1. A média móvel dupla: Calcule a média móvel rápida (linha rápida de MA) e a média móvel lenta (linha lenta de MA). Quando a linha rápida cruza acima da linha lenta, indica um mercado de alta e vai longo. Quando a linha rápida cruza abaixo da linha lenta, indica um mercado de baixa e vai curto.

  2. Indicador RSI: O RSI julga as condições de sobrecompra e sobrevenda, calculando o ganho médio de fechamento e a perda média de fechamento durante um período de tempo.

  3. Indicador PSAR: SAR parabólico indica a direção da tendência.

  4. Indicador ADX: o ADX mede a força de uma tendência, calculando o movimento direcional.

A lógica dos sinais de compra e venda é a seguinte:

Signal de compra: MA rápido cruza acima de MA lento, RSI abaixo de 30 (supervendido), pontos SAR acima do preço, ADX acima de 20.

Signal de venda: MA rápido cruza abaixo de MA lento, RSI acima de 70 (overbought), pontos SAR abaixo do preço, ADX acima de 20.

Quando ocorre um sinal de compra ou venda, tome uma posição com 10% do capital, respectivamente.

Vantagens

  • Os MAs duplos determinam a principal direção da tendência, com o RSI e o SAR filtrando falsos sinais, que podem identificar com precisão os pontos de reversão.

  • A combinação de vários indicadores evita sinais errados provenientes de um único indicador.

  • O stop loss evita riscos excessivos.

  • Uma lógica simples e clara torna-a fácil de implementar.

  • Funciona tanto para tendências ascendentes como descendentes.

Riscos e soluções

  • Considerar períodos de MA mais longos ou adicionar Bandas de Bollinger para confirmar o verdadeiro breakout.

  • Ajuste os parâmetros do RSI e adicione outros indicadores para confirmar os sinais do RSI.

  • Suspenda a negociação quando o ADX estiver abaixo de 20 para evitar a reversão da negociação em mercados sem direção.

  • SetStringry stop loss pode causar perdas desnecessárias.

  • Frequência de negociação elevada, ajustando os períodos de MA para uma frequência de negociação mais baixa.

Melhoria

  • Teste diferentes períodos de MA para encontrar a combinação ideal.

  • Teste diferentes parâmetros do RSI para melhor julgamento sobrecompra/supervenda.

  • Adicione outros indicadores como Bandas de Bollinger, KDJ para enriquecer a lógica.

  • Estabelecer um stop loss dinâmico com base em diferentes produtos e mercados.

  • Adicione o dimensionamento da posição para seguir melhor as tendências.

  • Teste diferentes parâmetros ADX para encontrar o melhor valor para determinar a força da tendência.

  • Adicionar a função de perda automática de parada.

Conclusão

Esta estratégia identifica a direção da tendência principal usando MAs duplos, e usa RSI, SAR para filtragem de sinal adicional. Pode determinar efetivamente pontos de reversão após otimização de parâmetros e capturar tendências em torno de reversões. Na prática, o gerenciamento de risco por stop loss adequado e otimização contínua de parâmetros são importantes.


/*backtest
start: 2023-10-10 00:00:00
end: 2023-11-09 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
//Based on Senpai BO 3
strategy(title="Senpai_Strat_3", shorttitle="Senpai_Strat_3", overlay=false, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
src = close

//psar
start = input(0.02)
increment = input(0.02)
maximum = input(0.2)
psar = sar(start, increment, maximum)


//ADX Init
adxlen = input(30, title="ADX Smoothing")	
dilen = input(30, title="DI Length")	
dirmov(len) =>	
	up = change(high)
	down = -change(low)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, len) / truerange)
	minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, len) / truerange)
	[plus, minus]
	
adx(dilen, adxlen) => 	
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
	[adx, plus, minus]
	
[sig, up, down] = adx(dilen, adxlen)	


// BB Init
source = close
length = input(50, minval=1)
mult = input(0.5, title="Mult Factor", minval=0.001, maxval=50)
alertLevel=input(0.1)
impulseLevel=input(0.75)
showRange = input(false, type=bool)


//RSI CODE
up1 = rma(max(change(src), 0), 14)
down1 = rma(-min(change(src), 0), 14)
rsi = down1 == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up1 / down1))


//BB CODE
basis = sma(source, length)
dev = mult * stdev(source, length)
upper = basis + dev
lower = basis - dev
bbr = source>upper?(((source-upper)/(upper-lower))/10): source<lower?(((source-lower)/(upper-lower))/10) : 0.05
bbi = bbr - nz(bbr[1]) 

//////////////////// Algo

//if (rsi>50 and n1>n2)
   //strategy.exit("Close", "Short")
  // strategy.entry("Long", strategy.long)
//if (rsi<50 and n2>n1)
   //strategy.exit("Close", "Long")
//   strategy.entry("Short", strategy.short)

//col = ma30 > ma50 > ma200 and rsi <=53?lime: ma50 < ma200  and rsi >= 60?red : silver
//short1 =  sig<18.5 and high>=upper and rsi>=70 and psar<close = 100%
//long1 = sig<18.5 and low<=lower and rsi<=30 and psar>close = 100%
short1 =  sig<18.5 and high>=upper and rsi>=70 and psar<close
long1 = sig<18.5 and low<=lower and rsi<=30 and psar>close

//Entry

long = long1[1] == 0 and long1 == 1
short = short1[1] == 0 and short1 == 1
longclose = long[3] == 1
shortclose = short[3] == 1
strategy.entry("short", strategy.short,qty = 10, when=short)
strategy.entry("long", strategy.long,qty=10, when=long)
strategy.close("long",when=longclose)
strategy.close("short",when=shortclose)



/////////////////////
///PLOT

plot(long,"long",color=green,linewidth=1)
plot(short,"short",color=red,linewidth=1)
plot(longclose,"close",color=blue,linewidth=1)
plot(shortclose,"close",color=orange,linewidth=1)


//plot(short,"short",color=red,linewidth=1)
//

//strategy.exit(id="long",qty = 100000,when=longclose)
//strategy.exit(id="short",qty = 100000,when=shortclose)

//strategy.exit(id="Stop", profit = 20, loss = 100)

Mais.