Estratégia de negociação do RSI e da média móvel de vários prazos

Autora:ChaoZhang, Data: 2024-01-22 11:00:20
Tags:

img

Resumo

Esta estratégia combina o indicador RSI, a média móvel simples (SMA) e a média móvel ponderada (WMA) para identificar sinais de negociação.

Estratégia lógica

A estratégia primeiro calcula a WMA de 144 períodos e a SMA de 5 períodos nos intervalos de tempo de 1 hora e 5 minutos. Um mercado de alta é identificado apenas quando a SMA de 5 minutos está acima da WMA. A estratégia então calcula o oscilador RSI e as linhas K e D correspondentes. Os sinais de venda são gerados quando a linha K cruza abaixo da linha D da área de supercompra. Os sinais de compra são gerados quando a linha K cruza a linha D da área de supervenda.

Análise das vantagens

Esta é uma estratégia muito eficaz de acompanhamento de tendências. Ao incorporar dois prazos para determinar a tendência, ele reduz significativamente os sinais falsos. Além disso, ele combina vários filtros, incluindo RSI, SMA e WMA para tornar os sinais mais confiáveis. Ao conduzir KDJ com RSI, ele também evita alguns sinais falsos inerentes à estratégia normal de KDJ. Além disso, as configurações adequadas de stop loss e take profit ajudam a bloquear lucros e controlar riscos.

Análise de riscos

O maior risco desta estratégia está no julgamento errado da tendência. Em pontos de virada, as médias móveis de curto e longo prazo podem virar para cima ou para baixo, resultando em sinais errados. Além disso, o RSI pode gerar sinais mais barulhentos durante os mercados variáveis. No entanto, esses riscos podem ser reduzidos ajustando adequadamente os períodos dos parâmetros SMA, WMA e RSI.

Orientações de otimização

A estratégia pode ser melhorada pelos seguintes aspectos:

  1. Teste diferentes comprimentos de SMA, WMA e RSI para encontrar a combinação ideal
  2. Incorporar outros indicadores como MACD, Bollinger Bands para verificar a confiabilidade do sinal
  3. Otimizar os mecanismos de stop loss e take profit através do teste de paradas de taxa fixa, paradas de trailing, etc.
  4. Adicionar módulos de gestão de capital para controlar o tamanho das transacções e a exposição ao risco global
  5. Introduzir modelos de aprendizagem de máquina para encontrar os melhores parâmetros de desempenho através de backtesting em larga escala

Resumo

A estratégia utiliza plenamente os pontos fortes das médias móveis e osciladores para estabelecer um sistema de tendência relativamente sólida. Ao confirmar sinais em vários prazos e indicadores, ele pode capturar sem problemas tendências de médio a longo prazo. As configurações de stop loss e take profit também o tornam resistente a flutuações normais do mercado em certo grau. No entanto, ainda há espaço para melhorias, como testar mais combinações de indicadores, alavancar o aprendizado de máquina para otimização de parâmetros.


/*backtest
start: 2023-12-22 00:00:00
end: 2024-01-21 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/
// © bufirolas

// Works well with a wide stop with 20 bars lookback
// for the SL level and a 2:1 reward ratio Take Profit .
// These parameters can be modified in the Inputs section of the strategy panel.

// "an entry signal it's a cross down or up on
// the stochastics. if you're in a downtrend
// on the hourly time frame you
// must also be in a downtrend on the five
// minute so the five period has to be below the 144
// as long as the five period is still trading below
// the 144 period on both the hourly and the five minutes
// we are looking for these short signals crosses down
// in the overbought region of the stochastic. Viceversa for longs"

//@version=4
strategy("Stoch + WMA + SMA strat", overlay=true)

//SL & TP Inputs
i_SL=input(true, title="Use Swing Lo/Hi Stop Loss & Take Profit")
i_SwingLookback=input(20, title="Swing Lo/Hi Lookback")
i_SLExpander=input(defval=10, step=1, title="SL Expander")
i_TPExpander=input(defval=30, step=1, title="TP Expander")
i_reverse=input(false, title="Reverse Trades")
i_TStop =input(false, title="Use Trailing Stop")

//Strategy Inputs
src4 = input(close, title="RSI Source")
stochOS=input(defval=20, step=5, title="Stochastics Oversold Level")
stochOB=input(defval=80, step=5, title="Stochastics Overbought Level")

//Stoch rsi Calculations
smoothK = input(3, minval=1)
smoothD = input(3, minval=1)
lengthRSI = input(14, minval=1)
lengthStoch = input(14, minval=1)
rsi1 = rsi(src4, lengthRSI)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)
h0 = hline(80, linestyle=hline.style_dotted)
h1 = hline(20, linestyle=hline.style_dotted)

//MA
wmalen=input(defval=144, title="WMA Length")
WMA = security(syminfo.tickerid, "60", wma(close, wmalen))
SMA = security(syminfo.tickerid, "60", sma(close, 5))
minWMA = wma(close, wmalen)
minSMA = sma(close, 5)

//Entry Logic
stobuy = crossover(k, d) and k < stochOS
stosell = crossunder(k, d) and k > stochOB
mabuy = minSMA > minWMA
daymabuy = SMA > WMA

//SL & TP Calculations
SwingLow=lowest(i_SwingLookback)
SwingHigh=highest(i_SwingLookback)
bought=strategy.position_size != strategy.position_size[1]
LSL=valuewhen(bought, SwingLow, 0)-((valuewhen(bought, atr(14), 0)/5)*i_SLExpander)
SSL=valuewhen(bought, SwingHigh, 0)+((valuewhen(bought, atr(14), 0)/5)*i_SLExpander)
lTP=(strategy.position_avg_price + (strategy.position_avg_price-(valuewhen(bought, SwingLow, 0)))+((valuewhen(bought, atr(14), 0)/5)*i_TPExpander))
sTP=(strategy.position_avg_price - (valuewhen(bought, SwingHigh, 0) - strategy.position_avg_price))-((valuewhen(bought, atr(14), 0)/5)*i_TPExpander)
islong=strategy.position_size > 0
isshort=strategy.position_size < 0

//TrailingStop
dif=(valuewhen(strategy.position_size>0 and strategy.position_size[1]<=0, high,0))
 -strategy.position_avg_price
trailOffset     = strategy.position_avg_price - LSL
var tstop = float(na)
if strategy.position_size > 0
    tstop := high- trailOffset - dif
    if tstop<tstop[1]
        tstop:=tstop[1]
else
    tstop := na
StrailOffset     = SSL - strategy.position_avg_price
var Ststop = float(na)
Sdif=strategy.position_avg_price-(valuewhen(strategy.position_size<0 
 and strategy.position_size[1]>=0, low,0))
if strategy.position_size < 0
    Ststop := low+ StrailOffset + Sdif
    if Ststop>Ststop[1]
        Ststop:=Ststop[1]
else
    Ststop := na
    
//Stop Selector
SL= islong ? LSL : isshort ? SSL : na
if i_TStop 
    SL:= islong ? tstop : isshort ? Ststop : na
TP= islong ? lTP : isshort ? sTP : na


//Entries
if stobuy and mabuy and daymabuy
    strategy.entry("long", long=not i_reverse?true:false)
if stosell and not mabuy and not daymabuy
    strategy.entry("short", long=not i_reverse?false:true)


//Exit
if i_SL
    strategy.exit("longexit", "long", stop=SL, limit=TP)
    strategy.exit("shortexit", "short", stop=SL, limit=TP)

//Plots
plot(i_SL ? SL : na, color=color.red, style=plot.style_cross)
plot(i_SL ? TP : na, color=color.green, style=plot.style_cross)
plot(minWMA)
plot(minSMA, color=color.green)




Mais.