Sistema de votação multi-MA configurável

Autora:ChaoZhang, Data: 2023-09-23 15:52:06
Tags:

Resumo

Esta estratégia permite a configuração flexível de vários pares de médias móveis rápidas / lentas. Ela fica longa quando todos os MA rápidos cruzam acima dos MA lentos e sai quando qualquer MA rápido cruza abaixo do MA lento. O mecanismo de votação com vários MA visa formar decisões robustas de detenção de posição.

Estratégia lógica

Os principais componentes e regras são:

  1. Multiplos MAs rápidos/lentos: Usando SMA, WMA, VWMA, etc.

  2. Sinais longos: todos os MAs rápidos atravessando MAs lentos.

  3. sinal de saída: qualquer travessia rápida de MA abaixo da MA lenta.

  4. Pontos de lucro/perda: Pontos fixos baseados no ATR.

  5. Configurabilidade: configuração flexível de vários pares de MA.

A entrada baseada em votação com múltiplos MAs melhora a confiabilidade do sinal.

Vantagens

Em comparação com as estratégias de MA individuais, as vantagens são as seguintes:

  1. A existência de múltiplos MAs permite uma avaliação mais abrangente da tendência.

  2. A votação evita sinais falsos de ruído.

  3. Grande espaço de ajuste de configurações MA personalizadas.

  4. O apoio a diferentes tipos de AIM aumenta a adaptabilidade.

  5. O valor da posição em risco deve ser calculado em função do risco/recompensa.

  6. Funciona melhor em períodos de tempo mais longos, menos curvas.

  7. Lógica simples e intuitiva, fácil de implementar e operar.

  8. Em geral, mais estável com maior longevidade em comparação com a MA única.

Riscos

No entanto, existem alguns riscos:

  1. Aumentou a complexidade com MAs múltiplas.

  2. Riscos de otimização excessiva.

  3. Uma deficiência fundamental na identificação das alterações de tendência.

  4. Sem considerar o volume, corre o risco de ficar preso.

  5. Pontos de lucro/perda podem causar saídas desnecessárias.

  6. Desempenho sujeito a mudanças nos regimes de mercado.

  7. Precisa de monitorizar as relações recompensa/risco e a suavidade da curva.

  8. A robustez entre instrumentos requer validação.

Melhorias

Com base na análise, as melhorias podem incluir:

  1. Teste da robustez dos parâmetros em diferentes instrumentos.

  2. Adição de confirmação de volume ou volatilidade.

  3. Otimizar os pontos de lucro/perda.

  4. Estabelecimento do limite máximo tolerável de utilização.

  5. Construção de modelos dinâmicos de dimensionamento de posição.

  6. Avaliação dos efeitos da introdução do machine learning.

  7. Monitorização da absorção máxima e da suavidade da curva.

  8. Iterações contínuas para evitar sobreajustes.

Conclusão

A abordagem multi-MA configurável constitui um mecanismo robusto de manutenção de posição, mas a prevenção do sobreajuste e adaptações dinâmicas aos mercados em mudança são fundamentais para a longevidade de qualquer estratégia.


/*backtest
start: 2022-09-16 00:00:00
end: 2023-09-22 00:00:00
period: 1d
basePeriod: 1h
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/
// © levieux

//@version=5
strategy(title='Configurable Multi MA Crossover Voting System', shorttitle='Configurable Multi MA Crossover Voting System', initial_capital=1000, overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)
crossoverConfig= input.string(defval="2x4,3x5,4x6", title="Crossover Config")
source= input.source(high)
maType= input.string("WMA", title="Moving Average Type", options=["WMA","SMA","VWMA"])
atrPeriod= input(14, title="ATR Period")
profitAtr = input(10, title="Profit ATR x")
lossAtr = input(5, title="Loss ATR x")


ma(src,length,type) => 
    float ma = switch type
	    "SMA" => ta.sma(src, length)
	    "WMA" => ta.wma(src, length)
	    "VWMA" => ta.vwma(src, length)

crossoverGroups= str.split(crossoverConfig, ",")
crossoverCount= array.size(crossoverGroups)
crossovers= array.new_string(crossoverCount)
positions= array.new_int(crossoverCount, 0)
longVotes= 0
for i= 0 to crossoverCount-1
    crossover= str.tostring(array.get(crossoverGroups, i))
    crossoverBoundaries= str.split(crossover, "x")
    int fastLength= math.round(str.tonumber(array.get(crossoverBoundaries, 0)))
    int slowLength= math.round(str.tonumber(array.get(crossoverBoundaries, 1)))
    wmaFast= ma(source,fastLength,maType)
    wmaSlow= ma(source,slowLength,maType)
    if wmaFast>wmaSlow
        longVotes:= longVotes + 1
        array.set(positions, i, 1)

longCondition= longVotes==crossoverCount and strategy.position_size==0


//profitTicks = profitAtr*ta.atr(atrPeriod)/syminfo.mintick
//lossTicks = lossAtr*ta.atr(atrPeriod)/syminfo.mintick
profitPrice= close+profitAtr*ta.atr(atrPeriod)
lossPrice= close-lossAtr*ta.atr(atrPeriod)

if strategy.position_size>0
    profitPrice:= profitPrice[1]
    lossPrice:= lossPrice[1]

plot(profitPrice, color=color.green)
plot(lossPrice, color=color.red)

if longCondition and profitPrice>0
    strategy.entry("Long", strategy.long)

if longVotes<crossoverCount and strategy.position_size>0 and (high>profitPrice or low<lossPrice)
    strategy.close("Long")
    
longVotes:= 0

Mais.