Estratégia de acompanhamento da média móvel de rompimento do canal


Data de criação: 2024-01-15 12:25:26 última modificação: 2024-01-15 12:25:26
cópia: 0 Cliques: 639
1
focar em
1617
Seguidores

Estratégia de acompanhamento da média móvel de rompimento do canal

Visão geral

A estratégia é uma estratégia de ruptura baseada no canal de preço, combinando o indicador de linha média e o rastreamento de stop-loss/stop-offs para entrar e sair. Ela usa a linha média de alto e baixo preço para construir o canal de preço, entrar no canal de alta/baixa quando o preço quebra o canal e usar um stop-loss fixo ou trailing stop para controlar o risco.

Princípio da estratégia

A estratégia consiste em calcular um canal de preços através de uma linha média de preços altos e baixos. Concretamente, a linha média SMA de preços altos e baixos com um comprimento de 10 é calculada, formando o trajeto superior e inferior do canal. Quando o preço se move do trajeto inferior para o trajeto superior, faz-se uma entrada adicional.

Após a entrada, a estratégia usa um stop-loss fixo ou trailing stop para sair da posição. O trailing stop inclui dois parâmetros: stop-stop fixo e offset de ativação. Quando o preço atinge o desvio de ativação, o stop-stop é trail seguindo o preço.

A estratégia combina simultaneamente filtragem por período de tempo e retrospectiva somente dentro de datas históricas designadas, permitindo testar o desempenho em diferentes fases do mercado.

Análise de vantagens

A estratégia usa o canal de preço e o stop loss de rastreamento de tendências para capturar a direção da tendência de linha média e longa. Em comparação com a estratégia de linha média móvel simples, ela reduz as negociações inválidas causadas por oscilações de preços.

Em geral, a estratégia é clara em sua lógica, usa menos indicadores e parâmetros, é fácil de retroceder, é adequada para a negociação de tendências de linha média e longa e pode ser lucrativa em condições de forte.

Análise de Riscos

A estratégia pode ser facilmente bloqueada em situações de turbulência e não pode gerar lucros duradouros. Além disso, em situações extremas, o preço pode romper diretamente o ponto de parada e causar grandes perdas.

A configuração dos parâmetros é bastante subjetiva, e os parâmetros precisam ser ajustados em diferentes fases do mercado. O parâmetro de paragem e o desvio de ativação são fixos e não podem ser ajustados de acordo com a volatilidade do mercado.

Direção de otimização

Pode-se considerar a combinação de outros indicadores para filtrar os sinais de entrada, como volume de transação, faixa de Brin, etc., evitando a cobertura. Ou usar stop loss dinâmico para definir o ponto de parada de acordo com o ATR ou a volatilidade dos preços.

A regra de saída pode ser otimizada para um stop móvel ou Chandelier Exit. Uma saída parcial também pode ser considerada quando o preço entra novamente no Channel. A otimização da filtragem de entrada e da regra de saída pode aumentar significativamente a estabilidade da estratégia.

Resumir

O conjunto da estratégia é uma estratégia de quantificação baseada no canal de preços, acompanhamento de tendências e gerenciamento de parada / parada. Tem uma estrutura lógica clara, uma estrutura de parâmetros simples, fácil de entender e rastrear, adequada para o estudo de negociações de quantificação. A estratégia pode ser otimizada de várias maneiras, aumentando a estabilidade e a lucratividade.

Código-fonte da estratégia
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-21 23:59:59
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Generalized SSL Backtest w/ TSSL", shorttitle="GSSL Backtest", overlay=true )
// Generalized SSL:
//  This is the very first time the SSL indicator, whose acronym I ignore, is on Tradingview. 
//  It is based on moving averages of the highs and lows. 
//  Similar channel indicators can be found, whereas 
//  this one implements the persistency inside the channel, which is rather tricky.
//  The green line is the base line which decides entries and exits, possibly with trailing stops.
//  With respect to the original version, here one can play with different moving averages.
//  The default settings are (10,SMA)
//
// Vitelot/Yanez/Vts March 2019

lb = input(10, title="Lb", minval=1)
maType = input( defval="SMA", title="MA Type", options=["SMA","EMA","HMA","McG","WMA","Tenkan"])

fixedSL = input(title="SL Activation", defval=300)
trailSL = input(title="SL Trigger", defval=1)
fixedTP = input(title="TP Activation", defval=150)
trailTP = input(title="TP Trigger", defval=1)

FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth   = input(defval = 6, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 19, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2020, title = "To Year", minval = 2017)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
startTimeOk()  => true // create function "within window of time" if statement true
// QUANDL:BCHAIN/ETRVU is USD-denominated daily transaction value on BTC blockchain
// QUANDL:BCHAIN/MKTCP is USD-denominated Bitcoin marketcap

hma(sig, n) => // Hull moving average definition
    wma( 2*wma(sig,round(n/2))-wma(sig,n), round(sqrt(n)))

mcg(sig,length) => // Mc Ginley MA definition
    mg = 0.0
    mg := na(mg[1]) ? ema(sig, length) : mg[1] + (sig - mg[1]) / (length * pow(sig/mg[1], 4))

tenkan(sig,len) =>
    0.5*(highest(sig,len)+lowest(sig,len))

ma(t,sig,len) =>
    sss=na
    if t =="SMA"
        sss := sma(sig,len)
    if t == "EMA"
        sss := ema(sig,len)
    if t == "HMA"
        sss := hma(sig,len)
    if t == "McG" // Mc Ginley
        sss := mcg(sig,len)
    if t == "Tenkan"
        sss := tenkan(sig,len)
    if t == "WMA"
        sss := wma(sig,len)
    sss

base(mah, mal) =>
    bbb = na
    inChannel = close<mah and close>mal
    belowChannel = close<mah and close<mal
    bbb := inChannel? bbb[1]: belowChannel? -1: 1
    uuu = bbb==1? mal: mah
    ddd = bbb==1? mah: mal
    [uuu, ddd]

maH = ma(maType, high, lb)
maL = ma(maType, low, lb)

[up, dn] = base(maH,maL)

plot(up, title="High MA", color=lime, linewidth=3)
plot(dn, title="Low MA", color=orange, linewidth=3)

long = crossover(dn,up)
short = crossover(up,dn)

// === STRATEGY - LONG POSITION EXECUTION ===
strategy.entry("Long", strategy.long, when= long and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP) 
strategy.exit("Exit", when= short)
// === STRATEGY - SHORT POSITION EXECUTION ===
strategy.entry("Short", strategy.short, when= short and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)
strategy.exit("Exit", when= long)