Estratégia de combinação de média móvel alinhada e de índice baixo elevado acumulado

Autora:ChaoZhang, Data: 2023-11-21 15:19:35
Tags:

img

Resumo

Esta estratégia combina principalmente o índice de baixa alta, o índice de média móvel e o índice de super tendência para determinar a tendência do mercado e as posições abertas.

Estratégia lógica

  1. O Índice de Baixo Alto julga se o preço mais recente em um determinado período fez um novo alto ou novo baixo e acumula a pontuação.

  2. O índice de média móvel julga se o preço está em uma tendência ascendente em forma de escada ou uma tendência descendente em forma de escada.

  3. Combine os julgamentos do Índice de Baixo Alto e do Índice de Média Móvel para determinar a tendência do mercado e, em seguida, encontre oportunidades de negociação combinadas com a direção do Índice de Super Tendência. Especificamente, quando tanto o Índice de Baixo Alto quanto o Índice de Média Móvel mostram fortalecimento de forças de alta e a direção do Índice de Super Tendência é descendente, abra posições longas. Quando ambos os índices mostram fortalecimento de forças de baixa e a direção do Índice de Super Tendência é ascendente, abra posições curtas.

Vantagens

  1. O índice de alta baixa pode efetivamente julgar o movimento dos preços e as mudanças no impulso. O índice de média móvel pode efetivamente determinar a tendência dos preços. A combinação de ambos pode determinar com mais precisão a direção do mercado.

  2. A abertura de posições combinada com o Super Trend Index pode evitar a abertura prematura ou tardia de posições.

  3. Vários indicadores verificam-se mutuamente e reduzem os falsos sinais.

Riscos

  1. Os sinais incorretos do índice High Low e do índice da média móvel podem conduzir a posições perdedoras.

  2. A participação insuficiente e a configuração inadequada dos parâmetros do índice Super Trend podem gerar sinais incorretos.

  3. As reversões rápidas da tendência e as configurações de stop loss inadequadas podem levar a grandes perdas.

  4. Os riscos podem ser reduzidos através da otimização dos parâmetros dos indicadores, do ajustamento dos níveis dos preços de stop loss, etc.

Optimização

  1. Teste diferentes tipos de indicadores de média móvel para encontrar a combinação ideal de parâmetros.

  2. Otimizar os parâmetros do índice de baixa alta e do índice de média móvel para tornar os sinais mais estáveis e confiáveis.

  3. Incorporar outros indicadores de verificação, tais como MACD, KD, etc., para reduzir os falsos sinais.

  4. Incorporar algoritmos de aprendizagem de máquina para otimizar automaticamente parâmetros e pesos de sinal.

  5. Incluir análise de sentimento para evitar o comércio de produtos menos populares.

Conclusão

Esta estratégia determina as tendências e o impulso do mercado através do Índice de Baixo Alto e do Índice de Média Móvel, e depois filtra os sinais usando o Índice de Super Tendência, abrindo posições quando as forças de alta e baixa se confrontam e o Índice de Super Tendência reverte. Suas vantagens estão na verificação de múltiplos sinais e abertura oportuna de posições, o que pode controlar efetivamente os riscos. Os problemas existentes incluem sinais falsos e julgamento incorreto da tendência. Várias melhorias podem ser feitas por meio de otimização de parâmetros, configurações de stop loss, filtragem de sinal, etc. para tornar a estratégia mais robusta e confiável.


/*backtest
start: 2023-10-21 00:00:00
end: 2023-11-20 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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("AlignedMA and Cumulative HighLow Strategy", overlay=true, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

MAType = input(title="Moving Average Type", defval="sma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
includePartiallyAligned = input(true)
HighLowPeriod = input(50, minval=1,step=1)
LookbackPeriod = input(10, minval=1,step=1)

supertrendMult = input(2, minval=1, maxval=10, step=0.5)
supertrendLength = input(10, minval=1)

tradeDirection = input(title="Trade Direction", defval=strategy.direction.long, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])
backtestYears = input(10, minval=1, step=1)

f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma
    
f_getMaAlignment(MAType, includePartiallyAligned)=>
    ma5 = f_getMovingAverage(close,MAType,5)
    ma10 = f_getMovingAverage(close,MAType,10)
    ma20 = f_getMovingAverage(close,MAType,20)
    ma30 = f_getMovingAverage(close,MAType,30)
    ma50 = f_getMovingAverage(close,MAType,50)
    ma100 = f_getMovingAverage(close,MAType,100)
    ma200 = f_getMovingAverage(close,MAType,200)

    upwardScore = 0
    upwardScore := close > ma5? upwardScore+1:upwardScore
    upwardScore := ma5 > ma10? upwardScore+1:upwardScore
    upwardScore := ma10 > ma20? upwardScore+1:upwardScore
    upwardScore := ma20 > ma30? upwardScore+1:upwardScore
    upwardScore := ma30 > ma50? upwardScore+1:upwardScore
    upwardScore := ma50 > ma100? upwardScore+1:upwardScore
    upwardScore := ma100 > ma200? upwardScore+1:upwardScore
    
    upwards = close > ma5 and ma5 > ma10 and ma10 > ma20 and ma20 > ma30 and ma30 > ma50 and ma50 > ma100 and ma100 > ma200
    downwards = close < ma5 and ma5 < ma10 and ma10 < ma20 and ma20 < ma30 and ma30 < ma50 and ma50 < ma100 and ma100 < ma200
    upwards?1:downwards?-1:includePartiallyAligned ? (upwardScore > 5? 0.5: upwardScore < 2?-0.5:upwardScore>3?0.25:-0.25) : 0

f_getHighLowValue(HighLowPeriod)=>
    currentHigh = highest(high,HighLowPeriod) == high
    currentLow = lowest(low,HighLowPeriod) == low
    currentHigh?1:currentLow?-1:0

inDateRange = time >= timestamp(syminfo.timezone, year(timenow) - backtestYears, 01, 01, 0, 0)

maAlignment = f_getMaAlignment(MAType,includePartiallyAligned)
alignedMaIndex = sum(maAlignment,LookbackPeriod)

maAlignmentDirection = alignedMaIndex > alignedMaIndex[1] ? 1 : alignedMaIndex < alignedMaIndex[1] ? -1 : 0
maAlignmentDirection := maAlignmentDirection == 0? nz(maAlignmentDirection[1],0):maAlignmentDirection

highLowIndex = f_getHighLowValue(HighLowPeriod)
cumulativeHighLowIndex = sum(highLowIndex,LookbackPeriod)

hlDirection = cumulativeHighLowIndex > cumulativeHighLowIndex[1] ? 1 : cumulativeHighLowIndex < cumulativeHighLowIndex[1] ? -1 : 0
hlDirection := hlDirection == 0? nz(hlDirection[1],0):hlDirection

[superTrend, dir] = supertrend(supertrendMult, supertrendLength)

buyEntry = (dir == -1 and maAlignmentDirection == 1 and hlDirection == 1)
sellEntry = (dir == 1 and maAlignmentDirection == -1 and hlDirection == -1)

barColor = buyEntry?color.lime:sellEntry?color.orange:color.gray
barcolor(barColor)

// strategy.risk.allow_entry_in(tradeDirection)
strategy.entry("Buy", strategy.long, when=barColor == color.lime and inDateRange, oca_name="oca_buy")
strategy.close("Buy", when=dir == 1)

strategy.entry("Sell", strategy.short, when=barColor == color.orange and inDateRange, oca_name="oca_sell")
strategy.close("Sell", when=dir == -1)


Mais.