Estratégia de período cruzado de AlphaTrend

Autora:ChaoZhang, Data: 23 de janeiro de 2023
Tags:

Resumo

Esta estratégia baseia-se no indicador AlphaTrend, que combina as vantagens dos indicadores RSI e MFI e pode alcançar bons resultados em mercados de tendência de alta e baixa.

Estratégia lógica

  1. Calcular o indicador ATR para medir a volatilidade do mercado
  2. Usar o RSI para determinar a direcção do mercado se não existirem dados de volume; usar IFM se existirem dados de volume
  3. Calcular as faixas superior e inferior com base no ATR e na direção do mercado
  4. Calcular a curva de AlphaTrend, que incorpora bandas dinâmicas superiores e inferiores
  5. Gerar sinais de compra e venda quando o preço cruza acima ou abaixo da curva AlphaTrend

A estratégia baseia-se principalmente na curva AlphaTrend para determinar a direção da tendência de preços. Ela leva em conta ATR, RSI / MFI e pode rastrear a tendência de forma eficaz.

Vantagens

  1. A AlphaTrend combina os pontos fortes do RSI e das IFM, adaptando-se a mercados de alta e baixa
  2. As bandas dinâmicas superior e inferior ajustam-se automaticamente com base na volatilidade do mercado
  3. Inclui informações sobre preços e volumes, evitando sinais falsos
  4. A abordagem de ruptura identifica claramente a direcção da tendência
  5. Lógica simples e fácil de entender

Em resumo, esta estratégia funciona tanto para os mercados de alta como de baixa, filtra o ruído do mercado de forma eficaz, identifica as tendências com precisão e é uma estratégia de tendência eficiente.

Riscos

  1. A curva de AlphaTrend pode ter falhas de ruptura, que exigem confirmação de outros indicadores
  2. Muitos sinais falsos podem ocorrer durante a consolidação do mercado
  3. Resultados ineficazes devido a um mau ajuste dos parâmetros
  4. A taxa de stop loss pode ser tomada durante picos, incorrendo em grandes perdas

Para abordar os riscos, o stop loss pode controlar a perda de uma única operação; combinar com outros indicadores para evitar falsos sinais; ajustar parâmetros com base em diferentes mercados.

Oportunidades de melhoria

  1. Teste diferentes combinações de parâmetros para configurações otimizadas
  2. Incorporar outros indicadores para formar condições de confirmação
  3. Empregar um stop loss dinâmico ou de atraso para controlar os riscos
  4. Negociação em diferentes prazos (5m, 15m, etc.) com base nas condições de mercado
  5. Refinar o sistema de tempo de entrada para uma entrada mais precisa

Podem ser feitas melhorias adicionais através de testes em diferentes mercados e parâmetros, de modo a que a estratégia seja adaptável a mais condições de mercado.

Conclusão

Em geral, esta estratégia AlphaTrend é um sistema simples e eficiente de acompanhamento de tendências. Incorpora informações de preço e volume para se adaptar a mercados de alta e baixa. O mecanismo de ruptura fornece sinais de entrada claros. Com controle de risco adequado, pode alcançar bons resultados. Testes e melhorias adicionais podem ajudar a estabilizar sua lucratividade em mais condições de mercado.


/*backtest
start: 2023-09-20 00:00:00
end: 2023-09-26 00:00:00
period: 30m
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/
// author © KivancOzbilgic
// developer © KivancOzbilgic
// pv additions, simplification and strategy conversion @ treigen
//@version=5
strategy('AlphaTrend For ProfitView', overlay=true, calc_on_every_tick=true, process_orders_on_close=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1, initial_capital=1000)
coeff = input.float(1.5, 'Multiplier', step=0.1)
AP = input(15, 'Common Period')
ATR = ta.sma(ta.tr, AP)
novolumedata = input(title='Change calculation (no volume data)?', defval=false)

i_startTime = input(defval = timestamp("01 Jan 2014 00:00 +0000"), title = "Backtesting Start Time", inline="timestart", group='Backtesting')
i_endTime = input(defval = timestamp("01 Jan 2100 23:59 +0000"), title = "Backtesting End Time", inline="timeend", group='Backtesting')
timeCond = true

pv_ex = input.string('', title='Exchange', tooltip='Leave empty to use the chart ticker instead (Warning: May differ from actual market name in some instances)', group='PV Settings')
pv_sym = input.string('', title='Symbol', tooltip='Leave empty to use the chart ticker instead (Warning: May differ from actual market name in some instances)', group='PV Settings')
pv_acc = input.string("", title="Account", group='PV Settings')
pv_alert_long = input.string("", title="PV Alert Name Longs", group='PV Settings')
pv_alert_short = input.string("", title="PV Alert Name Shorts", group='PV Settings')
pv_alert_test = input.bool(false, title="Test Alerts", tooltip="Will immediately execute the alerts, so you may see what it sends. The first line on these test alerts will be excluded from any real alert triggers" ,group='PV Settings')

upT = low - ATR * coeff
downT = high + ATR * coeff
AlphaTrend = 0.0
AlphaTrend := (novolumedata ? ta.rsi(close, AP) >= 50 : ta.mfi(hlc3, AP) >= 50) ? upT < nz(AlphaTrend[1]) ? nz(AlphaTrend[1]) : upT : downT > nz(AlphaTrend[1]) ? nz(AlphaTrend[1]) : downT


k1 = plot(AlphaTrend, color=color.new(#0022FC, 0), linewidth=3)
k2 = plot(AlphaTrend[2], color=color.new(#FC0400, 0), linewidth=3)

buySignalk = ta.crossover(AlphaTrend, AlphaTrend[2])
sellSignalk = ta.crossunder(AlphaTrend, AlphaTrend[2])

var exsym = ""
if barstate.isfirst
    exsym := pv_ex == "" ? "" : "ex=" + pv_ex + ","
    exsym := pv_sym == "" ? exsym : exsym + "sym=" + pv_sym + ","


if barstate.isconfirmed and timeCond 
    if strategy.position_size <= 0 and buySignalk
        strategy.entry("Buy", strategy.long)
        alert(pv_alert_long + "(" + exsym + "acc=" + pv_acc + ")", alert.freq_once_per_bar_close)
    if strategy.position_size >= 0 and sellSignalk
        strategy.entry("Sell", strategy.short)
        alert(pv_alert_short + "(" + exsym + "acc=" + pv_acc + ")", alert.freq_once_per_bar_close)


//  Only used for testing/debugging alert messages
if pv_alert_test
    alert("<![Alert Test]!>\n" + pv_alert_long + "(" + exsym + "acc=" + pv_acc + ")", alert.freq_once_per_bar)
    alert("<![Alert Test]!>\n" + pv_alert_short + "(" + exsym + "acc=" + pv_acc + ")", alert.freq_once_per_bar)


Mais.