Estratégia de negociação de Bitcoin baseada no RVI e na EMA

Autora:ChaoZhang, Data: 2024-02-22 13:50:17
Tags:

img

Resumo

Esta estratégia baseia-se nos indicadores RVI (Relative Vigor Index) e EMA (Exponential Moving Average). Ele vai longo quando RVI dá um sinal de entrada e a EMA rápida está acima da EMA lenta, e vai curto quando RVI dá um sinal de entrada e a EMA lenta está acima da EMA rápida, implementando uma estratégia quantitativa de negociação baseada em tendência e condições de sobrecompra-supervenda.

Princípio da estratégia

  1. Usar RVI para julgar as condições de sobrecompra e sobrevenda. Quando a linha do indicador RVI cruza acima de sua linha de sinal, é um sinal de sobrecompra para ir longo. Quando a linha RVI cruza abaixo de sua linha de sinal, é um sinal de sobrevenda para ir curto.

  2. Quando a EMA rápida está acima da EMA lenta, é uma tendência de alta. Quando a EMA lenta está acima da EMA rápida, é uma tendência de baixa.

  3. Apenas vá longo quando o RVI dá um sinal de entrada e as EMAs mostram uma tendência de alta.

  4. O stop loss após o longo é definido abaixo do mínimo recente por uma distância de atratrSL, e o lucro de take-profit é fixado acima da alta recente por uma distância de atrAtrTP. O stop loss após o short é definido acima da alta recente por uma distância de atrAtrSL, e o lucro do take-profit está situado abaixo do mínimo recente a uma distância de atratrTP.

Análise das vantagens

  1. A combinação de indicadores de tendência e de sobrecompra e sobrevenda evita falhas.

  2. O stop loss dinâmico e o take profit ajudam a apanhar grandes movimentos.

  3. Equilibra a qualidade da tendência e os níveis de sobrecompra/supervenda, melhorando a precisão do sinal.

  4. Extenso backtesting, parâmetros otimizados, bom desempenho comercial real.

Análise de riscos

  1. As alterações frequentes de tendência avaliadas pelas EMA durante os mercados variáveis podem conduzir a uma sobrecomercialização.

  2. Os parâmetros do RVI e os períodos de EMA necessitam de otimização para diferentes instrumentos de negociação, caso contrário, o desempenho pode sofrer.

  3. Os coeficientes stop loss e take profit devem ser estabelecidos de forma razoável com base na volatilidade do mercado, caso contrário, os riscos não poderão ser controlados de forma eficaz.

Orientações de otimização

  1. Podem ser adicionados mais indicadores que avaliam a qualidade da tendência, como osciladores, bandas de Bollinger, etc., para tornar as decisões de negociação mais precisas.

  2. As distâncias stop loss/take profit podem ser ajustadas dinamicamente com base em medidas de volatilidade como o ATR, permitindo paradas mais largas durante períodos de alta volatilidade.

  3. As combinações de parâmetros podem ser testadas e otimizadas separadamente para diferentes instrumentos para melhorar a robustez da estratégia.

Conclusão

Esta estratégia combina os pontos fortes dos indicadores RVI e EMA, julgando os níveis de sobrecompra / sobrevenda, respeitando a direção da tendência principal, evitando negócios conflitantes. O mecanismo dinâmico de stop loss / take profit ajuda a capturar os movimentos na direção da tendência principal. Através da otimização de parâmetros e controle de risco rigoroso, esta estratégia pode alcançar retornos relativamente estáveis. Ainda há espaço para mais ajustes e otimizações em aplicações de negociação reais. Os comerciantes podem fazer modificações personalizadas com base em suas próprias preferências de risco e características do instrumento.


/*backtest
start: 2024-01-22 00:00:00
end: 2024-02-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//this strategy works well on h4 (btc or eth)


//@version=5
strategy(title="Relative Vigor Index", shorttitle="RVGI",overlay=true)
//indicator(title="Relative Vigor Index", shorttitle="RVGI", format=format.price, precision=4, timeframe="", timeframe_gaps=true)
len = input.int(4, title="Length rvi", minval=1)
rvi = math.sum(ta.swma(close-open), len)/math.sum(ta.swma(high-low),len)
sig = ta.swma(rvi)
offset = input.int(0, "Offset rvi", minval = -500, maxval = 500)


atrlength = input.int(19,title="Atr Length",minval=1)
ema1 =  input.int(95,title="Long EMA rapida",minval=1,step=10)
ema2 =  input.int(200,title="Long EMA lenta",minval=1,step=10)

atrSL = input.float(2.0,title="Atr SL", step=0.1)
atrTP = input.float(1.0,title="Atr TP", step=0.1)

atr = ta.atr(atrlength)
esalcista = low > ta.ema(close,ema1) and ta.ema(close,ema1) > ta.ema(close,ema2)
bajista = high < ta.ema(close,ema1) and ta.ema(close,ema1) < ta.ema(close,ema2)


//plot(high + atr)
//plot(low - atr)

//strategy.entry("compra",strategy.long, when=ta.crossover(rvi,sig))
//strategy.close("compra",when=ta.crossunder(rvi,sig))

//plot(rvi, color=#008000, title="RVGI", offset = offset)
//plot(sig, color=#FF0000, title="Signal", offset = offset)
//plotshape(true,style=shape.xcross)

var TP = 0.0
var SL = 0.0

comprado = strategy.position_size>0
vendido = strategy.position_size<0

crucepositivo = ta.crossover(rvi,sig)
crucenegativo = ta.crossunder(rvi,sig)

if comprado
    // ver SL
    if low < SL
        strategy.close("BUY",comment="SL")
        
        
if comprado    
    //ver tp
    if high > TP
        strategy.close("BUY",comment="TP")
        
       
    
    
    
if not comprado and not vendido
    if crucepositivo and esalcista
        strategy.entry("BUY",strategy.long)
        SL := low - (atr * atrSL)
        TP := high + (atr * atrTP)
        alert("BUY",alert.freq_once_per_bar)



//---------------

if vendido
    // ver SL
    if high > SL
        strategy.close("SELL",comment="SL")
        
        
if vendido    
    //ver tp
    if low < TP
        strategy.close("SELL",comment="TP")
        
       

if not vendido and not comprado
    if crucenegativo and bajista
        strategy.entry("SELL",strategy.short)
        SL := high + (atr * atrSL)
        TP := low - (atr * atrTP)
        alert("SELL",alert.freq_once_per_bar)







//----------------

//plotshape(comprado,style=shape.xcross)
plot( comprado ? SL : na, color=color.red,style=plot.style_circles)
plot( comprado ? TP : na, color=color.blue,style=plot.style_circles)

plot( ta.ema(close,ema1),color=color.orange)
plot( ta.ema(close,ema2),color=color.yellow)


plot( vendido ? SL : na, color=color.red,style=plot.style_circles)
plot( vendido ? TP : na, color=color.blue,style=plot.style_circles)


Mais.