Estratégia de rompimento de preço de canal adaptativo médio


Data de criação: 2023-11-02 15:05:56 última modificação: 2023-11-02 15:05:56
cópia: 0 Cliques: 657
1
focar em
1617
Seguidores

Estratégia de rompimento de preço de canal adaptativo médio

Visão geral[Overview]

Uma estratégia de ruptura de preço de canal de adaptação uniforme é uma estratégia de ruptura de linha longa baseada em uma média móvel de adaptação uniforme (AMA) e uma faixa de canal de adaptação própria para julgar sinais de compra e venda. A estratégia usa a AMA para calcular a direção da tendência dos preços atuais e combina a faixa de canal de ajuste dinâmico para encontrar sinais de ruptura de preço para comprar e vender no momento certo.

Princípio da estratégia[Strategy Principle]

O indicador central da estratégia é a média móvel adaptada (AMA), cuja fórmula de cálculo para capturar a tendência dos preços é:

AMA(t) = α(t-1) * P(t) + [1 - α(t-1)] * AMA(t-1)

P (t) é o preço atual e α (t) é a constante de planeamento, cujo valor varia entre 0 e 1. A α (t) é ajustada dinamicamente por uma certa regra para controlar a sensibilidade do AMA às mudanças de preço. Concretamente, o valor de α (t) é proporcional ao AMA e à amplitude de desvio do preço em SNRT. A fórmula de SNRT é a seguinte:

SNRT = (P(t) - AMA(t-1)) / AMA(t-1)

Assim, quando a flutuação dos preços aumenta, α (t) aumenta, fazendo com que a AMA acompanhe os preços com mais sensibilidade; quando a flutuação dos preços diminui, α (t) diminui, fazendo com que a AMA tenha uma maior suavidade.

Com base na AMA, a estratégia cria uma faixa de corredores adaptativos para detectar sinais de ruptura de preços. Os trajectos superiores e inferiores da faixa de corredores são:

Subtracção: H{\displaystyle H} = (1 + β)*H(t-1)) * AMA(t)

Subtração: L (t) = (1 - β)*L(t-1)) * AMA(t)

Em que β é um parâmetro ajustável que controla a largura do canal. Finalmente, a estratégia gera um sinal de negociação observando se o preço vai ou não romper a trajetória ascendente e descendente:

  • Fazer mais quando os preços sobem;

  • “Não há nada de errado com o que está acontecendo no mercado.

  • Caso contrário, o armazém fica vazio.

Análise de vantagens[Advantage Analysis]

A estratégia tem as seguintes vantagens:

  1. O uso da AMA em vez da média móvel comum permite uma maior flexibilidade para capturar tendências de preços, especialmente em mercados com maior volatilidade.

  2. O alcance do canal de adaptação pode ser ajustado dinamicamente, ampliando a largura do canal em situações de incerteza e estreitando o canal de acompanhamento de preços quando há uma tendência clara.

  3. O uso de sinais de ruptura de preços, que podem ser capturados no início de uma tendência, tem uma maior taxa de vitória.

  4. A lógica da estratégia é simples, clara, fácil de entender e implementar, adequada para transações quantitativas.

Análise de Riscos[Risk Analysis]

A estratégia também apresenta os seguintes riscos:

  1. A configuração incorreta dos parâmetros do AMA pode causar tendências de preços erradas ou gerar falsos sinais.

  2. Os parâmetros de canais adaptativos como β precisam ser configurados com cautela, caso contrário, haverá transações excessivamente frequentes ou tendências de omissão.

  3. Os sinais de ruptura de preços são facilmente enganados por falsas rupturas e devem ser filtrados em combinação com mais indicadores.

  4. A estratégia em si não contempla a gestão de fundos e os mecanismos de suspensão de prejuízos, existindo um certo risco de perda.

Direção de otimização[Optimization Directions]

A estratégia pode ser otimizada em:

  1. Otimizar a forma de calcular o valor α do AMA para torná-lo mais sensível às mudanças de preço.

  2. Aumentar a confirmação adicional após a ruptura do canal, evitando que a falsa ruptura produza um sinal errado.

  3. Filtragem em combinação com volume de transações ou indicadores de volatilidade para garantir a eficácia da ruptura.

  4. Aumentar o mecanismo de tracking de stop loss para bloquear lucros e controlar riscos.

  5. Otimizar a gestão de fundos e determinar a gestão racional de posições de diferentes ativos.

Resumir[Conclusion]

A estratégia de ruptura de preço de canal auto-adaptado é, em geral, uma estratégia de ruptura de seguimento de tendência simples e prática. Ela é aplicada de forma flexível para acompanhar a tendência de preços com a adaptação de médias móveis, auxiliada pela detecção de sinais de ruptura de canal auto-adaptados.

Código-fonte da estratégia
/*backtest
start: 2022-10-26 00:00:00
end: 2023-11-01 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// CryptoStatistical - 2019
// AMA Strategy Channel Breakout Strategy from E. Durenard - Professional Automated Trading 
// https://www.amazon.com/Professional-Automated-Trading-Theory-Practice/dp/1118129857

strategy(title="[CS] AMA Strategy - Channel Break Out", shorttitle="AMA_ChannelBreakout_Strategy", initial_capital = 1000, overlay=true, pyramiding = 0, calc_on_every_tick=false, calc_on_order_fills=false, commission_type= strategy.commission.percent, commission_value = 0.08, currency=currency.USD)
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(6, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

testPeriodBackground = input(title="Color Background?", type=input.bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=95)

testPeriod() =>  true

price = input(title='Price Source:', type=input.source, defval=close)

ama = price
hb = price
lb = price

// Static model parameters
minfactor = 0.
maxfactor = 1.
deviation_max = 1.
deviation_min = 1.
beta_hb = 1.
beta_lb = 1.
snr = 1.

normalized_atan= 0.
alpha = 0.5
// Suggested snr-factor from .5 upto 3.1 by .3 to find best parameter
snrfactor = input(title='SNR Factor:', type=input.float, minval=0.6, maxval=3.3, step=0.3, defval=2.1)

// Sensitivity Lookback search for the best perdiod from 5 to 20
lookback = input(title='Sensitivity Lookback:', type=input.integer, defval=5)

// Suggested Beta from .5 below 4.5 by .3, usually in the range 1.2, 1.5
beta = input(title='Beta:', type=input.float, minval=0.6, maxval=4.5, step=0.3, defval=2.1)

offsetlabel = input(title='Offset Label:', type=input.float, minval=0.001, maxval=0.03, step=0.001, defval=0.001)

// pi/2
pi2 = 1.5707963267948966

// Zero-lag resampled moving average (Durschner nwma)
f_nwma(_src, _period) =>
    fast = _period/2
    lambda = _period/fast
    alpha = lambda * (_period - 1)/(_period - lambda)
    average1 = wma(_src,_period)
    average2 = wma(average1,fast)
    nwma = (1+alpha)*average1 - alpha*average2

ama := alpha[1]*price + (1-alpha[1])*nz(ama[1])

deviation_max := alpha[1]*max((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_max[1])
deviation_min := -alpha[1]*min((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_min[1])

beta_hb := beta*deviation_max
beta_lb := beta*deviation_min
hb := (1 + beta_hb[1])*ama
lb := (1 - beta_lb[1])*ama

snr := if price > hb
    ((price - ama[1])/ama[1])/beta_lb
else
    if price < lb
        -((price - ama[1])/ama[1])/beta_hb
    else
        0

normalized_atan := (atan(snrfactor*snr) + pi2)/(2*pi2)
alpha := f_nwma(minfactor + (maxfactor - minfactor)*normalized_atan, lookback)

plot(ama, color=color.black)
plot(hb, color=color.green)
plot(lb, color=color.red)

// Buy Condition Var
bc = false
// Sell Condition Var
sc = false
d = color.black

// Buy Condition
if(price > hb)
    bc := true
    d := color.green

// Sell Condition
if(price < lb)
    sc := true
    d := color.red

if(testPeriod())
    strategy.entry("Long", strategy.long, when = bc)
    strategy.entry("Short", strategy.short, when = sc)

alertcondition(bc, title='BuyCondition', message='Buy')
alertcondition(sc, title='SellCondition', message='Sell')

plotshape(title='Buy', series=bc ? price * (1 - offsetlabel) : na, text='A1B', style=shape.labelup, location=location.absolute, color=d, textcolor=color.white, offset=0)
plotshape(title='Sell', series=sc ? price  * (1 + offsetlabel) : na, text='A1S', style=shape.labeldown, location=location.absolute, color=d, textcolor=color.white, offset=0)