3 Estratégia de inversão do intervalo de oscilação da média móvel

Autora:ChaoZhang, Data: 2024-02-18 11:18:51
Tags:

img

Resumo

Esta estratégia utiliza uma média móvel rápida de 3 dias, uma média móvel lenta de 10 dias e uma média móvel de suavização de sinal de 16 dias para construir o indicador MACD, complementado pelo indicador RSI e pelas características de volume, e define características multidimensionais da linha K para determinar a extensão excessiva da tendência do mercado, formando uma tendência de oscilação de faixa e inversão de entradas longas ou curtas para obter lucros.

A estratégia visa capturar reversões rápidas de preços a partir de níveis locais de sobrecompra ou sobrevenda.

Estratégia lógica

A estratégia usa principalmente média móvel rápida de 3 dias menos média móvel lenta de 10 dias para formar o indicador MACD, com linha de sinal de 16 dias para suavizar, constituindo uma estratégia MACD padrão. Também combina análise de volume de volumes de compra e venda para determinar características de momento. O indicador RSI é introduzido para determinar níveis de sobrecompra ou sobrevenda. Através da combinação de vários indicadores, ele julga as características do mercado e detecta mudanças nas tendências de oscilação de intervalo para construir sinais de entrada.

Especificamente, observando a relação entre a linha MACD e a linha de sinal, bem como as mudanças de inclinação, ele determina o fluxo e refluxo das forças de alta e baixa para detectar oportunidades de reversão. Ao mesmo tempo, as mudanças nos volumes de compra e venda refletem mudanças no impulso de alta e baixa. Combinadas com as mudanças no indicador RSI para determinar condições de sobrecompra e sobrevenda, esses indicadores nos permitem determinar características do perfil de mercado localizado e potencial tempo de reversão.

A estratégia estabelece três sinais de entrada no total:

  1. Long quando o volume de compra não tem vantagem sobre o volume de venda, RSI abaixo de 41 enquanto em alta, sinal MACD não tem desvios significativos;

  2. Long quando o volume de compra é mais forte do que o volume de venda, RSI na faixa de 45-55 e em alta, MACD e linha de sinal em ascensão em uníssono;

  3. Curto quando o MACD está acima do limiar enquanto sobe.

Estes três cenários refletem oscilações localizadas de variação em uma sobre-expansão direcional, julgada como um momento de reversão oportuno para entradas de contra-direção.

As saídas são definidas como Take profit (limit order) e Stop loss, para controlar os drawdowns e realizar lucros.

Análise das vantagens

A estratégia combina múltiplos indicadores para determinar as condições de variação e sobrecompra / sobrevenda, com uma lógica clara de reversão de lucro.

Em especial, as vantagens incluem:

  1. O MACD, como oscilador de momento ponderado pelo volume, evita uma análise técnica simplista;

  2. As condições de volume aumentam a convicção de entrada;

  3. O RSI ajuda a detectar potenciais reversões;

  4. O stop loss e o take profit controlam os drawdowns excessivos e bloqueiam alguns lucros.

Análise de riscos

Apesar de combinar indicadores para melhorar a taxa de vitória, todas as estratégias têm riscos.

  1. Probabilidade de falsos sinais, como continuações após a inversão inicial;

  2. As configurações inadequadas de stop loss e take profit levam a extrações excessivas e a uma incapacidade de bloquear o lucro;

  3. Ajuste de parâmetros como comprimentos MA, períodos RSI, taxas de lucro podem precisar de otimização adicional.

Estes riscos podem ser reduzidos através de uma otimização adicional.

Orientações de otimização

Ainda há espaço para uma maior otimização, principalmente:

  1. Ensaiar diferentes combinações de parâmetros MA para obter os melhores resultados;

  2. Teste os períodos de observação do RSI para encontrar o juiz de sobrecompra/supervenda ideal;

  3. Otimizar os rácios de captação de lucros e de stop loss para equilibrar os drawdowns e a captura de lucros;

  4. Introduzir modelos de aprendizagem de máquina, alavancar mais dados para reduzir erros de julgamento e melhorar a taxa de vitória.

Estes podem ser implementados através de backtests mais sistemáticos. À medida que os espaços de parâmetros se expandem e os tamanhos da amostra crescem, a taxa de vitória da estratégia e a lucratividade também melhorarão.

Conclusão

Esta estratégia combina MACD, RSI e análise de volume para determinar características de variação do mercado, estabelecendo entradas em zonas de reversão para capturar movimentos de retração. A lógica é clara, equilibrando tendência e reversões. Com otimização adicional, tem forte potencial de lucro como uma estratégia quântica robusta.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("3 1 Oscillator Profile Flagging", shorttitle="3 1 Oscillator Profile Flagging", overlay=false)

signalBiasValue = input(title="Signal Bias", defval=0.26)
macdBiasValue = input(title="MACD Bias", defval=0.7)
shortLookBack = input( title="Short LookBack", defval=3)
longLookBack = input( title="Long LookBack", defval=6)
takeProfit = input( title="Take Profit", defval=2)
stopLoss = input( title="Stop Loss", defval=0.7)

fast_ma = ta.sma(close, 3)
slow_ma = ta.sma(close, 10)
macd = fast_ma - slow_ma
signal = ta.sma(macd, 16)
hline(0, "Zero Line", color = color.black)

buyVolume = volume*((close-low)/(high-low))
sellVolume = volume*((high-close)/(high-low))
buyVolSlope = buyVolume - buyVolume[1]
sellVolSlope = sellVolume - sellVolume[1]
signalSlope = ( signal - signal[1] )
macdSlope = ( macd - macd[1] )
plot(macd, color=color.blue, title="Total Volume")
plot(signal, color=color.orange, title="Total Volume")
plot(macdSlope, color=color.green, title="MACD Slope")
plot(signalSlope, color=color.red, title="Signal Slope")
intrabarRange = high - low
rsi = ta.rsi(close, 14)
rsiSlope = rsi - rsi[1]
plot(rsiSlope, color=color.black, title="RSI Slope")

getRSISlopeChange(lookBack) =>
    j = 0
    for i = 0 to lookBack
        if ( rsi[i] - rsi[ i + 1 ] ) > -5
            j += 1
    j

getBuyerVolBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if buyVolume[i] > sellVolume[i]
            j += 1
    j

getSellerVolBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if sellVolume[i] > buyVolume[i]
            j += 1
    j

getVolBias(lookBack) =>
    float b = 0.0
    float s = 0.0
    for i = 1 to lookBack
        b += buyVolume[i]
        s += sellVolume[i]
    b > s

getSignalBuyerBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] > signalBiasValue
            j += 1
    j

getSignalSellerBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] < ( 0.0 - signalBiasValue )
            j += 1
    j

getSignalNoBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] < signalBiasValue and signal[i] > ( 0.0 - signalBiasValue )
            j += 1
    j

getPriceRising(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if close[i] > close[i + 1]
            j += 1
    j


getPriceFalling(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if close[i] < close[i + 1] 
            j += 1
    j

getRangeNarrowing(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if intrabarRange[i] < intrabarRange[i + 1] 
            j+= 1
    j

getRangeBroadening(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if intrabarRange[i] > intrabarRange[i + 1] 
            j+= 1
    j

bool isNegativeSignalReversal = signalSlope < 0.0 and signalSlope[1] > 0.0
bool isNegativeMacdReversal = macdSlope < 0.0 and macdSlope[1] > 0.0

bool isPositiveSignalReversal = signalSlope > 0.0 and signalSlope[1] < 0.0
bool isPositiveMacdReversal = macdSlope > 0.0 and macdSlope[1] < 0.0

bool hasBearInversion = signalSlope > 0.0 and macdSlope < 0.0
bool hasBullInversion = signalSlope < 0.0 and macdSlope > 0.0

bool hasSignalBias = math.abs(signal) >= signalBiasValue
bool hasNoSignalBias = signal < signalBiasValue and signal > ( 0.0 - signalBiasValue )

bool hasSignalBuyerBias = hasSignalBias and signal > 0.0
bool hasSignalSellerBias = hasSignalBias and signal < 0.0

bool hasPositiveMACDBias = macd > macdBiasValue
bool hasNegativeMACDBias = macd < ( 0.0 - macdBiasValue )

bool hasBullAntiPattern = ta.crossunder(macd, signal)
bool hasBearAntiPattern = ta.crossover(macd, signal)

bool hasSignificantBuyerVolBias = buyVolume > ( sellVolume * 1.5 )
bool hasSignificantSellerVolBias = sellVolume > ( buyVolume * 1.5 )


// 202.30 Profit 55.29% 5m
if ( ( getVolBias(longLookBack) == false ) and rsi <= 41 and math.abs(rsi - rsi[shortLookBack]) > 1 and hasNoSignalBias and rsiSlope > 1.5 and close > open)
    strategy.entry("5C1", strategy.long, qty=1)
strategy.exit("TPS", "5C1", limit=strategy.position_avg_price + takeProfit, stop=strategy.position_avg_price - stopLoss)

// 171.70 Profit 50.22% 5m
if ( getVolBias(longLookBack) == true and rsi > 45 and rsi < 55 and macdSlope > 0 and signalSlope > 0)
    strategy.entry("5C2", strategy.long, qty=1)
strategy.exit("TPS", "5C2", limit=strategy.position_avg_price + takeProfit, stop=strategy.position_avg_price - stopLoss)

// 309.50 Profit 30.8% 5m 2 tp .7 sl 289 trades
if ( macd > macdBiasValue and macdSlope > 0)
    strategy.entry("5P1", strategy.short, qty=1)
strategy.exit("TPS", "5P1", limit=strategy.position_avg_price - takeProfit, stop=strategy.position_avg_price + stopLoss)


Mais.