Estratégia de cruzamento do ALMA

Autora:ChaoZhang, Data: 23 de setembro de 2023 15:11:02
Tags:

Resumo

Esta estratégia usa duas médias móveis de Arnaud Legoux (ALMA), uma rápida e outra lenta, para gerar sinais de cruzamento.

Estratégia lógica

Os principais indicadores e regras são:

  1. ALMA Rápido: período mais curto para apanhar fuga.

  2. ALMA lento: período mais longo para medir a tendência.

  3. Filtro de volume: válido quando a EMA curta cruza a EMA longa.

  4. Sinal de compra: ALMA rápido cruza ALMA lento e o filtro de volume passa.

  5. Signo de venda: ALMA rápido cruza ALMA lento.

  6. Sinais curtos: ALMA rápido cruza abaixo do ALMA lento e o filtro de volume passa.

  7. Sinais de cobertura: ALMA rápido cruza ALMA lento.

A estratégia combina análise de tendência, impulso e volume para sinais robustos.

Vantagens

Em comparação com as estratégias tradicionais de média móvel, as principais vantagens são:

  1. O ALMA reduz o atraso e melhora a qualidade do sinal.

  2. O filtro de volume evita perdas de falhas.

  3. A combinação rápida/lenta mede a direcção da tendência.

  4. Regras simples e intuitivas, fáceis de implementar.

  5. Ajuste flexível dos parâmetros de MA para os diferentes mercados.

  6. Gestão razoável dos riscos.

  7. Potencial de otimização adicional através do ajuste de parâmetros.

  8. Estabilidade e qualidade globais melhoradas em relação às estratégias tradicionais de cruzamento.

Riscos

Apesar dos méritos, devem ser observados os seguintes riscos:

  1. Os sistemas crossover são intrinsecamente vulneráveis aos whipssaws.

  2. O desempenho do ALMA depende do ajuste dos parâmetros.

  3. Os picos de volume podem induzir em erro a geração de sinal.

  4. Há sempre algum atraso, não se pode evitar todas as perdas.

  5. Risco de sobreajuste da otimização excessiva.

  6. Os sinais falham quando o volume é anormal.

  7. As técnicas de aprendizagem de máquina podem gerar melhores resultados.

  8. Monitorizar o rácio risco/benefício para evitar a utilização excessiva de recursos.

Reforço

Para enfrentar os riscos, podem ser realizadas melhorias nos seguintes domínios:

  1. Otimizar os parâmetros do ALMA para melhor sensibilidade.

  2. Experimente com diferentes métricas de volume.

  3. Introduzir stop loss para controlar a perda por transação.

  4. Incorporar outros indicadores para sinais robustos.

  5. Adicione um módulo de aprendizagem de máquina para um ajuste de sinal mais inteligente.

  6. Implementar vários produtos para diversificar a estratégia.

  7. Otimizar os modelos de dimensionamento de posições para diferentes mercados.

  8. Pesquise a robustez para evitar a sobreajuste.

Conclusão

Em conclusão, em comparação com as estratégias de crossover tradicionais, esta estratégia melhora a qualidade e robustez do sinal através do algoritmo ALMA e filtro de volume.


/*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/
// © Sarahann999
// Calculations for TP/SL based off: https://kodify.net/tradingview/orders/percentage-profit/
//@version=5
strategy("ALMA Cross", overlay=true)

//User Inputs
src= (close)
long_entry = input(true, title='Long Entry')
short_entry = input(true, title='Short Entry')

//Fast Settings
ALMA1 = input(100, "ALMA Lenghth 1", group= "ALMA Fast Length Settings")
alma_offset = input.float(defval=0.85, title='Arnaud Legoux (ALMA) - Offset Value', minval=0, step=0.01)
alma_sigma = input.int(defval=6, title='Arnaud Legoux (ALMA) - Sigma Value', minval=0)
Alma1 = ta.alma(src, ALMA1, alma_offset, alma_sigma)

//Slow Settings
ALMA2 = input(120, "ALMA Length 2", group = "ALMA Slow Length Settings")
alma_offset2 = input.float(defval=0.85, title='Arnaud Legoux (ALMA) - Offset Value', minval=0, step=0.01)
alma_sigma2 = input.int(defval=6, title='Arnaud Legoux (ALMA) - Sigma Value', minval=0)
Alma2 = ta.alma(src, ALMA2, alma_offset2, alma_sigma2)

//Volume
var cumVol = 0.
cumVol += nz(volume)
if barstate.islast and cumVol == 0
    runtime.error("No volume is provided by the data vendor.")
shortlen = input.int(5, minval=1, title = "Short Length", group= "Volume Settings")
longlen = input.int(10, minval=1, title = "Long Length")
short = ta.ema(volume, shortlen)
long = ta.ema(volume, longlen)
osc = 100 * (short - long) / long

//Define Cross Conditions
buy = ta.crossover(Alma1, Alma2)
sell = ta.crossunder(Alma1, Alma2)

//Calculate Take Profit Percentage
longProfitPerc = input.float(title="Long Take Profit", group='Take Profit Percentage',
     minval=0.0, step=0.1, defval=2) / 100
shortProfitPerc = input.float(title="Short Take Profit",
     minval=0.0, step=0.1, defval=2) / 100
     
// Figure out take profit price 1
longExitPrice  = strategy.position_avg_price * (1 + longProfitPerc)
shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc)

// Make inputs that set the stop %  1
longStopPerc = input.float(title="Long Stop Loss", group='Stop Percentage',
     minval=0.0, step=0.1, defval=2.5) / 100
shortStopPerc = input.float(title="Short Stop Loss",
     minval=0.0, step=0.1, defval=2.5) / 100

// Figure Out Stop Price
longStopPrice  = strategy.position_avg_price * (1 - longStopPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortStopPerc)

//Define Conditions
buySignal = buy and osc > 0
     and strategy.position_size == 0

//sellSignal 
sellSignal = sell and osc > 0
     and strategy.position_size == 0

// Submit entry orders
if buySignal and long_entry
    strategy.entry(id="Long", direction=strategy.long, alert_message="Enter Long")
    alert(message="BUY Trade Entry Alert", freq=alert.freq_once_per_bar)
    
if sellSignal and short_entry
    strategy.entry(id="Short", direction=strategy.short, alert_message="Enter Short")
    alert(message="SELL Trade Entry Alert", freq=alert.freq_once_per_bar)
    
// Submit exit orders based on take profit price
if (strategy.position_size > 0)
    strategy.exit(id="Long TP/SL", limit=longExitPrice, stop=longStopPrice, alert_message="Long Exit 1 at {{close}}")
if (strategy.position_size < 0)
    strategy.exit(id="Short TP/SL", limit=shortExitPrice, stop=shortStopPrice, alert_message="Short Exit 1 at {{close}}")

//Draw
plot(Alma1,"Alma Fast", color=color.purple, style=plot.style_circles)
plot(Alma2,"Alma Slow", color=#acb5c2, style=plot.style_circles)

Mais.