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.
Os principais componentes e regras são:
Multiplos MAs rápidos/lentos: Usando SMA, WMA, VWMA, etc.
Sinais longos: todos os MAs rápidos atravessando MAs lentos.
sinal de saída: qualquer travessia rápida de MA abaixo da MA lenta.
Pontos de lucro/perda: Pontos fixos baseados no ATR.
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.
Em comparação com as estratégias de MA individuais, as vantagens são as seguintes:
A existência de múltiplos MAs permite uma avaliação mais abrangente da tendência.
A votação evita sinais falsos de ruído.
Grande espaço de ajuste de configurações MA personalizadas.
O apoio a diferentes tipos de AIM aumenta a adaptabilidade.
O valor da posição em risco deve ser calculado em função do risco/recompensa.
Funciona melhor em períodos de tempo mais longos, menos curvas.
Lógica simples e intuitiva, fácil de implementar e operar.
Em geral, mais estável com maior longevidade em comparação com a MA única.
No entanto, existem alguns riscos:
Aumentou a complexidade com MAs múltiplas.
Riscos de otimização excessiva.
Uma deficiência fundamental na identificação das alterações de tendência.
Sem considerar o volume, corre o risco de ficar preso.
Pontos de lucro/perda podem causar saídas desnecessárias.
Desempenho sujeito a mudanças nos regimes de mercado.
Precisa de monitorizar as relações recompensa/risco e a suavidade da curva.
A robustez entre instrumentos requer validação.
Com base na análise, as melhorias podem incluir:
Teste da robustez dos parâmetros em diferentes instrumentos.
Adição de confirmação de volume ou volatilidade.
Otimizar os pontos de lucro/perda.
Estabelecimento do limite máximo tolerável de utilização.
Construção de modelos dinâmicos de dimensionamento de posição.
Avaliação dos efeitos da introdução do machine learning.
Monitorização da absorção máxima e da suavidade da curva.
Iterações contínuas para evitar sobreajustes.
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