Estratégia de negociação quantitativa de reversão média do canal ATR

Autora:ChaoZhang, Data: 2023-12-11 15:38:25
Tags:

img

Resumo

Esta é uma estratégia de longo prazo que identifica os sinais de entrada quando os preços quebram abaixo da faixa inferior do canal ATR e obtém lucro quando os preços atingem a faixa média (EMA) ou a faixa superior do canal ATR.

Estratégia lógica

Quando o preço se rompe abaixo da faixa inferior do ATR, ele sinaliza uma queda de anomalia. A estratégia vai ficar longa na próxima abertura da vela. O stop loss é definido no preço de entrada menos o multiplicador de perda do ATR. O take profit está na faixa média (EMA) ou na faixa superior do ATR. Se o fechamento atual da barra for menor do que a baixa das barras anteriores, use a baixa das barras anteriores como take profit.

Especificamente, a lógica chave inclui:

  1. Calcular o ATR e a faixa média (EMA)
  2. Definir filtros de tempo
  3. Identificar o sinal longo quando o preço < faixa ATR inferior
  4. Entrem no próximo bar aberto.
  5. Preço de entrada recorde
  6. Cálculo do preço de stop loss
  7. Previsão de prejuízo
  8. Caso o preço < preço stop loss

Análise das vantagens

As vantagens desta estratégia:

  1. Utiliza o canal ATR para sinais de entrada e saída fiáveis
  2. Só muito tempo após a queda de anomalia evita perseguir altos
  3. Controlo rigoroso do risco de stop loss
  4. Adequado para operações rápidas de curto prazo
  5. Lógica simples fácil de implementar e otimizar

Análise de riscos

Há alguns riscos:

  1. A alta frequência de negociação leva a custos de transacção e deslizamento mais elevados
  2. Podem ocorrer gatilhos de stop loss consecutivos
  3. Optimização inadequada dos parâmetros afeta o desempenho
  4. As grandes oscilações de preços podem resultar num stop loss de grande dimensão

Estes riscos podem ser reduzidos ajustando o período ATR, o multiplicador de stop loss, etc. Também é importante escolher corretores com baixas taxas de negociação.

Orientações de otimização

A estratégia pode ser melhorada:

  1. Adição de outros indicadores de filtro para evitar a ausência dos melhores sinais de entrada
  2. Optimização do período ATR
  3. Considerando um mecanismo de reentrada
  4. Tamanho de stop loss adaptativo
  5. Adição de um filtro de tendência para evitar transações contra-tendência

Conclusão

Em resumo, esta é uma estratégia de reversão média simples e prática baseada no canal ATR. Tem regras de entrada claras, stop loss rigoroso e lucro razoável. Há também espaço para ajuste de parâmetros. Se os comerciantes podem escolher o símbolo certo e controlar o risco com stop loss, esta estratégia pode alcançar bons resultados.


/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 00:00:00
period: 1d
basePeriod: 1h
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/
// © Bcullen175

//@version=5
strategy("ATR Mean Reversion", overlay=true, initial_capital=100000,default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=6E-5) // Brokers rate (ICmarkets = 6E-5)
SLx = input(1.5, "SL Multiplier", tooltip = "Multiplies ATR to widen stop on volatile assests, Higher values reduce risk:reward but increase winrate, Values below 1.2 are not reccomended")
src = input(close, title="Source")
period = input.int(10, "ATR & MA PERIOD")
plot(open+ta.atr(period))
plot(open-ta.atr(period))
plot((ta.ema(src, period)), title = "Mean", color=color.white)

i_startTime     = input(title="Start Filter", defval=timestamp("01 Jan 1995 13:30 +0000"), group="Time Filter", tooltip="Start date & time to begin searching for setups")
i_endTime       = input(title="End Filter", defval=timestamp("1 Jan 2099 19:30 +0000"), group="Time Filter", tooltip="End date & time to stop searching for setups")

// Check filter(s)
f_dateFilter = true

atr = ta.atr(period)

// Check buy/sell conditions
var float buyPrice = 0
buyCondition    = low < (open-ta.atr(period)) and strategy.position_size == 0 and f_dateFilter
sellCondition   = (high > (ta.ema(close, period)) and strategy.position_size > 0 and close < low[1]) or high > (open+ta.atr(period))
stopDistance    = strategy.position_size > 0 ? ((buyPrice - atr)/buyPrice) : na
stopPrice       = strategy.position_size > 0 ? (buyPrice - SLx*atr): na
stopCondition   = strategy.position_size > 0 and low < stopPrice

// Enter positions
if buyCondition
    strategy.entry(id="Long", direction=strategy.long)

if buyCondition[1]
    buyPrice := open

// Exit positions
if sellCondition or stopCondition
    strategy.close(id="Long", comment="Exit" + (stopCondition ? "SL=true" : ""))
    buyPrice := na

// Draw pretty colors
plot(buyPrice, color=color.lime, style=plot.style_linebr)
plot(stopPrice, color=color.red, style=plot.style_linebr, offset=-1)


Mais.