Estratégia de negociação de balanço do momento

Autora:ChaoZhang, Data: 2024-02-05 10:44:19
Tags:

img

Resumo

Esta é uma estratégia de negociação de intervalos diários baseada em técnicas de impulso usando ATR Stops. Foi criada por Kory Hoang da Stably.

A estratégia identifica a direção da tendência utilizando indicadores de ímpeto e define linhas de stop loss baseadas no ATR para implementar a negociação swing de baixa compra-alta venda.

Estratégia lógica

O código define primeiro o intervalo de tempo de backtesting.

Em seguida, na secção dos indicadores, são calculados os seguintes indicadores:

  • atr(): calcular o ATR para a perda de parada;
  • max_/min_: preço mais alto/mais baixo da barra anterior;
  • is_uptrend: julgar se está numa tendência ascendente;
  • vstop: linha de stop loss;

A lógica principal para julgar a tendência é:

Se o fechamento for superior à linha de stop loss ascendente anterior, é considerado uma tendência de alta; se o fechamento for inferior à linha de stop loss ascendente anterior, é considerado uma tendência de baixa.

Quando a tendência mudar, ajuste a posição da linha de stop loss.

Especificamente, numa tendência ascendente, a linha de stop loss é definida no preço mais alto da barra anterior menos o valor ATR; numa tendência descendente, a linha de stop loss é definida no preço mais baixo da barra anterior mais o valor ATR.

Esta é a realização da tendência após o stop loss.

Na secção Regras de negociação, abrir posições longas/cortas quando o preço ultrapassar a linha de stop loss.

Análise das vantagens

As vantagens desta estratégia:

  1. Julgue a direção da tendência usando técnicas de impulso, capte pontos de virada em tempo hábil e evite falhas.
  2. ATR stop loss rastreia o preço mais alto / mais baixo, pode controlar o risco bem.
  3. Uma lógica estratégica simples e clara, fácil de compreender e implementar.
  4. Pode fazer transações de baixa compra e alta venda entre oscilações.

Análise de riscos

Há também alguns riscos:

  1. O parâmetro ATR inadequado pode fazer com que a perda de parada seja demasiado frouxa ou demasiado apertada.
  2. Os ferozes whipsaws podem ocorrer em tendências variáveis, causando stop loss consecutivos.
  3. Frequência de negociação elevada, comissões mais elevadas.

Algumas otimizações:

  1. Teste diferentes parâmetros ATR para encontrar o ideal.
  2. Otimizar o stop loss combinando métricas de volatilidade em cima do ATR.
  3. Adicione um filtro de tendência para evitar negociações desnecessárias durante mercados agitados.

Orientações de otimização

Algumas orientações para otimizar esta estratégia:

  1. Teste diferentes parâmetros ATR para encontrar o ideal.

  2. Optimize o stop loss combinando métricas de volatilidade em cima do ATR. Adicione métricas de volatilidade, relaxe o stop loss adequadamente durante períodos de aumento da volatilidade.

  3. Adicione um filtro de tendência para evitar negociações durante o mercado agitado.

  4. Adicionar um mecanismo de dimensionamento de posições. Ajustar o tamanho da posição com base na taxa de utilização da conta, tempos consecutivos de stop loss, etc.

  5. Adicionar o controlo do risco de gap overnight.

Conclusão

Como uma estratégia básica de negociação diária, a lógica geral é clara.

Ainda grande espaço para otimização, pode melhorar a partir de aspectos como julgamento de tendência, método de stop loss, dimensionamento de posição, etc. para tornar a estratégia mais prática.


/*backtest
start: 2023-01-29 00:00:00
end: 2024-02-04 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("BTC Swinger", overlay=true, commission_value = 0.25, default_qty_type=strategy.percent_of_equity, default_qty_value = 100)

/////////////////////////////////////////////////////////////
//START - SET DATE RANGE

// === BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1)
FromDay   = input(defval = 1, title = "From Day", minval = 1)
FromYear  = input(defval = 2010, title = "From Year")
ToMonth   = input(defval = 12, title = "To Month", minval = 1)
ToDay     = input(defval = 31, title = "To Day", minval = 1)
ToYear    = input(defval = 2020, title = "To Year")

startDate = time > timestamp(FromYear, FromMonth, FromDay, 1, 1)
endDate = time < timestamp(ToYear, ToMonth, ToDay, 23, 59)
withinTimeRange = true

/////////////////////////////////////////////////////////////
//END - SET DATE RANGE



/////////////////////////////////////////////////////////////
//START - INDICATORS

length = input(3)
mult = input(1, minval = 0.01)
atr_ = atr(length)
max1 = max(nz(max_[1]), close)
min1 = min(nz(min_[1]), close)
is_uptrend_prev = nz(is_uptrend[1], true)
stop = is_uptrend_prev ? max1 - mult * atr_ : min1 + mult * atr_
vstop_prev = nz(vstop[1])
vstop1 = is_uptrend_prev ? max(vstop_prev, stop) : min(vstop_prev, stop)
is_uptrend = close - vstop1 >= 0
is_trend_changed = is_uptrend != is_uptrend_prev
max_ = is_trend_changed ? close : max1
min_ = is_trend_changed ? close : min1
vstop = is_trend_changed ? is_uptrend ? max_ - mult * atr_ : min_ + mult * atr_ : vstop1
plot(vstop, color = is_uptrend ? yellow : red, style=circles, linewidth=2)

/////////////////////////////////////////////////////////////
//END - INDICATORS



/////////////////////////////////////////////////////////////
//START - TRADING RULES
direction = input(defval=1, title = "Strategy Direction", minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

condition1 = close > vstop and withinTimeRange
condition2 = close < vstop and withinTimeRange

strategy.entry("BUY", strategy.long, when = condition1)
strategy.entry("SELL", strategy.short, when = condition2)

/////////////////////////////////////////////////////////////
//END - TRADING RULES

Mais.