Esta estratégia usa duas médias móveis de Arnaud Legoux (ALMA), uma rápida e outra lenta, para gerar sinais de cruzamento.
Os principais indicadores e regras são:
ALMA Rápido: período mais curto para apanhar fuga.
ALMA lento: período mais longo para medir a tendência.
Filtro de volume: válido quando a EMA curta cruza a EMA longa.
Sinal de compra: ALMA rápido cruza ALMA lento e o filtro de volume passa.
Signo de venda: ALMA rápido cruza ALMA lento.
Sinais curtos: ALMA rápido cruza abaixo do ALMA lento e o filtro de volume passa.
Sinais de cobertura: ALMA rápido cruza ALMA lento.
A estratégia combina análise de tendência, impulso e volume para sinais robustos.
Em comparação com as estratégias tradicionais de média móvel, as principais vantagens são:
O ALMA reduz o atraso e melhora a qualidade do sinal.
O filtro de volume evita perdas de falhas.
A combinação rápida/lenta mede a direcção da tendência.
Regras simples e intuitivas, fáceis de implementar.
Ajuste flexível dos parâmetros de MA para os diferentes mercados.
Gestão razoável dos riscos.
Potencial de otimização adicional através do ajuste de parâmetros.
Estabilidade e qualidade globais melhoradas em relação às estratégias tradicionais de cruzamento.
Apesar dos méritos, devem ser observados os seguintes riscos:
Os sistemas crossover são intrinsecamente vulneráveis aos whipssaws.
O desempenho do ALMA depende do ajuste dos parâmetros.
Os picos de volume podem induzir em erro a geração de sinal.
Há sempre algum atraso, não se pode evitar todas as perdas.
Risco de sobreajuste da otimização excessiva.
Os sinais falham quando o volume é anormal.
As técnicas de aprendizagem de máquina podem gerar melhores resultados.
Monitorizar o rácio risco/benefício para evitar a utilização excessiva de recursos.
Para enfrentar os riscos, podem ser realizadas melhorias nos seguintes domínios:
Otimizar os parâmetros do ALMA para melhor sensibilidade.
Experimente com diferentes métricas de volume.
Introduzir stop loss para controlar a perda por transação.
Incorporar outros indicadores para sinais robustos.
Adicione um módulo de aprendizagem de máquina para um ajuste de sinal mais inteligente.
Implementar vários produtos para diversificar a estratégia.
Otimizar os modelos de dimensionamento de posições para diferentes mercados.
Pesquise a robustez para evitar a sobreajuste.
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)