Estratégia de Crossover de Média Móvel de Ângulo de Tendência


Data de criação: 2024-01-25 14:35:13 última modificação: 2024-01-25 14:35:13
cópia: 2 Cliques: 1182
1
focar em
1617
Seguidores

Estratégia de Crossover de Média Móvel de Ângulo de Tendência

Visão geral

A estratégia utiliza o ângulo de inclinação da linha média para determinar a direção da tendência e, em combinação com o indicador da taxa de variação de preços, para realizar negociações de longo e curto prazo. Sua essência é determinar a tendência de preços usando o ângulo de inclinação da linha média e a estratégia de acompanhamento de tendências de correção de tendências com o indicador da taxa de variação de preços.

Princípio da estratégia

A estratégia baseia-se nos seguintes indicadores:

  1. Ângulo de linha média: para determinar a direção da tendência de preços, calcule o ângulo de inclinação da linha média de Jurik e a média móvel do índice. Ângulo maior que 0 é a tendência ascendente e menor que 0 é a tendência descendente.

  2. Taxa de variação de preços: Calcule a taxa de variação de preços de fechamento das 12 linhas K mais recentes, filtrando os sinais de invalidez por volatilidade.

Quando o ângulo da linha média é para cima (((maior que 0)) e a taxa de variação do preço satisfaz as condições, faça mais; quando o ângulo da linha média é para baixo (((menor que 0)) e a taxa de variação do preço satisfaz as condições, faça um espaço.

Concretamente, a estratégia primeiro calcula o ângulo de inclinação da linha média de Jurik e do EMA. Em seguida, calcula um indicador da taxa de variação do preço para o período de liquidação do filtro. O ângulo da linha média indica a tendência e gera um sinal de negociação quando a taxa de variação do preço é condicional.

Análise de vantagens

A estratégia tem as seguintes vantagens:

  1. O uso da inclinação da linha média para determinar a tendência é muito confiável e a taxa de vitória é alta.

  2. Os indicadores de variação de preços podem filtrar e corrigir oscilações para evitar transações inválidas.

  3. O Jurik foi rápido na reação à ruptura, enquanto a EMA forneceu um julgamento de tendência estável, que se complementou.

  4. O método de negociação bidirecional de curto e longo prazo pode ser usado para capturar o lucro de uma tendência.

Análise de Riscos

A estratégia também apresenta alguns riscos:

  1. Quando os preços estão em alta, há uma maior probabilidade de que a linha média produza sinais errados. Este risco pode ser reduzido por meio de parâmetros de otimização.

  2. Os sinais de linha uniforme podem ser trocados com frequência ao entrar em equilibração, gerando uma quantidade excessiva de transações desnecessárias. Condições de filtragem adicionais podem ser adicionadas para reduzir as transações inválidas.

  3. O stop loss pode ser quebrado quando um evento surpreendente causa um salto no preço, e o ponto de stop loss pode ser liberado de forma apropriada.

Direção de otimização

A estratégia pode ser melhorada em vários aspectos:

  1. Otimizar os parâmetros da linha média, procurar a melhor combinação de parâmetros e melhorar a estabilidade da estratégia.

  2. Aumentar os filtros de volatilidade, volume de transação e outros, reduzindo ainda mais as transações inválidas.

  3. A combinação de outros indicadores para determinar o ponto de parada torna a parada mais inteligente.

  4. Desenvolver algoritmos de negociação adaptáveis ao tamanho das transações, para que os lucros sejam mais estáveis.

Resumir

A estratégia é uma estratégia de acompanhamento de tendências muito prática. Usando a inclinação da linha média, a tendência é muito confiável, enquanto o indicador de taxa de variação de preço filtra os sinais inativos. Ao mesmo tempo, a estratégia pode ser muito estável e confiável.

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

//@version=4
// Based on ma angles code by Duyck which also uses Everget Jurik MA calulation and angle calculation by KyJ
strategy("Trend Angle BF", overlay=false)

/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "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)

testPeriod() => true
    
src=input(ohlc4,title="source")

// definition of "Jurik Moving Average", by Everget
jma(_src,_length,_phase,_power) =>
    phaseRatio = _phase < -100 ? 0.5 : _phase > 100 ? 2.5 : _phase / 100 + 1.5
    beta = 0.45 * (_length - 1) / (0.45 * (_length - 1) + 2)
    alpha = pow(beta, _power)
    jma = 0.0
    e0 = 0.0
    e0 := (1 - alpha) * _src + alpha * nz(e0[1])
    e1 = 0.0
    e1 := (_src - e0) * (1 - beta) + beta * nz(e1[1])
    e2 = 0.0
    e2 := (e0 + phaseRatio * e1 - nz(jma[1])) * pow(1 - alpha, 2) + pow(alpha, 2) * nz(e2[1])
    jma := e2 + nz(jma[1])

//// //// Determine Angle by KyJ //// //// 
angle(_src) =>
    rad2degree=180/3.14159265359  //pi 
    ang=rad2degree*atan((_src[0] - _src[1])/atr(14)) 

jma_line=jma(src,10,50,1)
ma=ema(src,input(56))
jma_slope=angle(jma_line)
ma_slope=angle(ma)

///////////// Rate Of Change ///////////// 
source = close
roclength = input(12, minval=1)
pcntChange = input(2, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// Strategy ///////////////
long = ma_slope>=0 and isMoving()
short = ma_slope<=0 and isMoving()

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])
sl_inp = input(2.0, title='Stop Loss %') / 100
tp_inp = input(900.0, title='Take Profit %') / 100 
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp) 

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution /////////////// 
if testPeriod()
    strategy.entry("Long",  strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("Long Ex", "Long", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
    strategy.exit("Short Ex", "Short", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)
    
///////////// Plotting /////////////
hline(0, title='Zero line', color=color.purple, linewidth=1)
plot(ma_slope,title="ma slope", linewidth=2,color=ma_slope>=0?color.lime:color.red)
bgcolor(isMoving() ? long ? color.green : short ? color.red : na : color.white, transp=80)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)