Uma estratégia de negociação de vários períodos baseada em médias móveis

Autora:ChaoZhang, Data: 2023-12-26 10:13:34
Tags:

img

Resumo

Esta estratégia combina três indicadores - médias móveis, Bandas de Bollinger e o Índice de Força Relativa (RSI) para negociação de ações de vários períodos.

Estratégia lógica

A estratégia utiliza principalmente três indicadores para a tomada de decisões. Em primeiro lugar, o indicador MACD composto por médias móveis rápidas e lentas. Crossovers da linha rápida acima da linha lenta geram sinais de compra. Em segundo lugar, as Bandas de Bollinger com as faixas média, superior e inferior. Os preços perto da faixa inferior apresentam oportunidades de compra em baixas de balanço, enquanto os preços perto da faixa superior apresentam oportunidades de venda em altas de balanço.

Especificamente, a estratégia primeiro requer o cruzamento da média móvel rápida acima da média móvel lenta, indicando o fortalecimento da tendência de alta que sugere a compra. Também requer RSI abaixo de 50, mostrando que o preço pode estar em níveis de sobrevenda e apresentando oportunidades de compra. Além disso, requer o preço de fechamento abaixo da faixa média BB, indicando o baixo da oscilação do preço e um bom ponto de entrada.

Para a captação de lucro e stop loss, quando o RSI sobe acima de 70, indica que o preço pode estar em níveis de sobrecompra e que o impulso da tendência de alta está diminuindo, adequado para captação de lucro.

Vantagens

A estratégia combina os pontos fortes das médias móveis, Bandas de Bollinger e RSI para determinar com mais precisão os pontos de entrada e saída.

  1. As médias móveis determinam o impulso da tendência de alta dos preços. A faixa média do BB indica os mínimos de oscilação para a entrada. O RSI evita comprar em picos de preços. Os três juntos fornecem oportunidades de compra relativamente ideais durante as tendências de alta dos preços.

  2. A combinação do RSI e da faixa superior do BB capta bem os níveis mais altos de oscilação de preços para obter lucro para evitar condições de sobrecompra.

  3. As avaliações de vários períodos permitem capturar oportunidades de negociação em diferentes prazos para maximizar os lucros.

  4. As regras lógicas de negociação tornam a estratégia facilmente compreensível para investimentos de médio a longo prazo.

Riscos

Apesar da combinação de indicadores para melhorar a precisão das decisões, existem riscos principais:

  1. Os parâmetros para os indicadores precisam de um ajuste empírico.

  2. Mais adequado para mercados de alta. Em mercados de baixa, a velocidade das quedas de preços pode tornar as perdas de parada ineficazes.

  3. Os riscos de acções individuais continuam, apesar da carteira.

  4. Frequência potencialmente excessiva das transacções: uma definição óptima dos parâmetros pode resultar em transacções frequentes, que implicam custos e impostos mais elevados.

Soluções:

  1. Ajustar os parâmetros com base em backtests para atingir uma frequência de sinal adequada.

  2. Ajustar os períodos de média móvel para uma frequência de entrada moderada e minimizar as perdas.

  3. Diversificar os investimentos num maior número de ativos para minimizar os riscos de uma única ação.

  4. Relaxar moderadamente os critérios de compra e de obtenção de lucros para reduzir a frequência do comércio.

Oportunidades de melhoria

Ainda há espaço para melhorias:

  1. Adicionar mais filtros como volume para garantir volumes amplificados nas compras, melhorando a precisão da decisão.

  2. Incorporar módulos de dimensionamento de posições para dimensionar dinamicamente as posições com base nas condições de mercado.

  3. Utilize algoritmos de aprendizagem profunda para ajustar automaticamente parâmetros através de treinamento em grandes conjuntos de dados.

  4. Introduzir mais prazos para os acórdãos para alargar a aplicabilidade.

Conclusão

Em geral, a estratégia tem uma lógica clara e fácil de entender, sinergizando indicadores para reduzir falsos sinais. A adição de indicadores pode continuar a melhorar a robustez e a precisão da decisão. É adequado para investimentos de médio a longo prazo e negociação quantitativa.


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

//
//@author Alorse
//@version=4
strategy("MACD + BB + RSI [Alorse]", shorttitle="BB + MACD + RSI [Alorse]", overlay=true, pyramiding=0, currency=currency.USD, default_qty_type=strategy.percent_of_equity, initial_capital=1000, default_qty_value=20, commission_type=strategy.commission.percent, commission_value=0.01) 

txtVer = "1.0.1"
version = input(title="Version", type=input.string, defval=txtVer, options=[txtVer], tooltip="This is informational only, nothing will change.")
src = input(title="Source", type=input.source, defval=close)

// MACD
fast_length = input(title="Fast Length", type=input.integer, defval=12, group="MACD")
slow_length = input(title="Slow Length", type=input.integer, defval=26, group="MACD")
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9, group="MACD")
sma_source = input(title="Oscillator MA Type", type=input.string, defval="EMA", options=["SMA", "EMA"], group="MACD")
sma_signal = input(title="Signal Line MA Type", type=input.string, defval="EMA", options=["SMA", "EMA"], group="MACD")
fast_ma = sma_source == "SMA" ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source == "SMA" ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? sma(macd, signal_length) : ema(macd, signal_length)

// Bollinger Bands
bbGroup = "Bollindger Bands"
length = input(20, title="Length", group=bbGroup)
mult = input(2.0, title="StdDev", minval=0.001, maxval=5, group=bbGroup)

basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev

// RSI
rsiGroup = "RSI"
lenRSI = input(14, title="Length", minval=1, group=rsiGroup)
// lessThan = input(50, title="Less than", minval=1 , maxval=100, group=rsiGroup)
RSI = rsi(src, lenRSI)

// Strategy Conditions
buy = crossover(macd, signal) and RSI < 50 and close < basis
sell = RSI > 70 and close > upper


// Stop Loss
slGroup = "Stop Loss"
useSL = input(false, title="╔══════   Enable   ══════╗", group=slGroup, tooltip="If you are using this strategy for Scalping or Futures market, we do not recommend using Stop Loss.")
SLbased = input(title="Based on", type=input.string, defval="Percent", options=["ATR", "Percent"], group=slGroup, tooltip="ATR: Average True Range\nPercent: eg. 5%.")
multiATR = input(10.0, title="ATR   Mult", type=input.float, group=slGroup, inline="atr")
lengthATR = input(14, title="Length", type=input.integer, group=slGroup, inline="atr")
SLPercent = input(10, title="Percent", type=input.float, group=slGroup) * 0.01

longStop = 0.0
shortStop = 0.0

if SLbased == "ATR"
    longStop := valuewhen(buy, low, 0) - (valuewhen(buy, rma(tr(true), lengthATR), 0) * multiATR)
    longStopPrev = nz(longStop[1], longStop)
    longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop

    shortStop := (valuewhen(sell, rma(tr(true), lengthATR), 0) * multiATR) + valuewhen(sell, high, 0)
    shortStopPrev = nz(shortStop[1], shortStop)
    shortStop := close[1] > shortStopPrev ? max(shortStop, shortStopPrev) : shortStop
if SLbased == "Percent"
    longStop  := strategy.position_avg_price * (1 - SLPercent)
    shortStop := strategy.position_avg_price * (1 + SLPercent)

strategy.entry("Long", true, when=buy)
strategy.close("Long", when=sell, comment="Exit")

if useSL
    strategy.exit("Stop Loss", "Long", stop=longStop)


Mais.