Negociação quantitativa baseada no valor médio móvel e no ATR Trailing Stop

Autora:ChaoZhang, Data: 2023-12-08 15:53:22
Tags:

img

Resumo

A estratégia é denominada MADEFlex, que significa Estratégia de Negociação Quantitativa Flexível Baseada em Envelope de Média Móvel e ATR Trailing Stop. Combina o indicador de Envelope de Média Móvel e o mecanismo de parada de trailing ATR para implementar uma solução de negociação quantitativa flexível e controlável.

Princípios

O núcleo desta estratégia é o indicador de Moving Average Displaced Envelope (MADE). O MADE forma bandas superiores e inferiores multiplicando fatores percentuais com a média móvel exponencial deslocada (EMA). Os sinais de venda são gerados quando os preços ultrapassam a faixa superior e os sinais de compra são gerados quando os preços ultrapassam a faixa inferior. Esta estratégia incorpora o indicador MADE com o mecanismo de parada de tração do Average True Range (ATR).

Especificamente, o indicador MADE contém 3 parâmetros: Período, porcentagem acima de perAb e porcentagem abaixo de perBl. O parâmetro Período determina o período da EMA. A distância das bandas superior e inferior da EMA é controlada por fatores percentuais. A parte de parada de atraso da ATR é definida principalmente pelo período ATR nATRPeriod e pelos múltiplos da ATR nATRMultip. Quando o preço excede a linha de stop loss da barra anterior, a linha de stop loss é ajustada ao preço menos a perda ATR fixa. Quando o preço cai abaixo da linha de stop loss da barra anterior, a linha de stop loss é ajustada ao preço mais a perda ATR fixa.

Finalmente, os sinais de compra e venda são gerados pela combinação dos sinais do indicador MADE e das condições de parada de trail ATR. A negociação reversa pode ser alcançada através do interruptor de entrada reversa.

Análise das vantagens

A estratégia MADEFlex tem as seguintes vantagens:

  1. O MADE em si tende a gerar sinais falsos. Incorporar o ATR trailing stop pode efetivamente filtrar algum ruído.

  2. Os parâmetros MADE e ATR podem ser ajustados para controlar a quantidade e a qualidade do sinal.

  3. Apoio ao reverse trading: o reverse trading enriquece cenários de aplicação.

  4. Intuitivo e visualizado, julgar o efeito de parada visualmente através de linhas de parada traçadas.

Análise de riscos

A estratégia MADEFlex apresenta igualmente os seguintes riscos:

  1. Os parâmetros MADE incorretos podem gerar sinais falsos excessivos.

  2. A paragem ATR excessivamente frouxa pode perder oportunidades de paragem.

  3. O risco é maior com a negociação reversa. Especialmente em situações de alta volatilidade, a negociação reversa pode aumentar o risco de perda.

  4. Em condições de mercado extremas, a ausência de proteção contra perdas de paragem pode levar a perdas mais elevadas.

Orientações de otimização

A estratégia MADEFlex pode ser otimizada nas seguintes direcções:

  1. Otimizar os parâmetros MADE para melhorar a qualidade do sinal. Diferentes períodos e combinações percentuais podem ser testados para encontrar conjuntos de parâmetros mais confiáveis.

  2. Otimizar os parâmetros de parada traseira do ATR para um melhor efeito de parada.

  3. Adicionar outros filtros para reduzir ainda mais os falsos sinais, por exemplo combinando indicadores de volatilidade para filtragem.

  4. Adicione um mecanismo de captação de lucro para sair em certos níveis de lucro.

  5. Utilize métodos de aprendizagem de máquina para otimizar dinamicamente parâmetros, por exemplo, aprendizagem por reforço.

Conclusão

A estratégia MADEFlex combina com sucesso os sinais de negociação do indicador Moving Average Envelope e a metodologia ATR trailing stop. Através de parâmetros ajustáveis, implementa uma solução de negociação quantitativa flexível e controlável. A estratégia tem uma confiabilidade relativamente alta e forte capacidade de controle. É adequada para usuários com alguma base quantitativa para usar e otimizar. Com melhorias adicionais, pode-se esperar um desempenho de estratégia mais significativo.


/*backtest
start: 2022-12-01 00:00:00
end: 2023-12-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
////////////////////////////////////////////////////////////
//  Copyright by HPotter v1.0 27/09/2022
// Moving Average Displaced Envelope. These envelopes are calculated 
// by multiplying percentage factors with their displaced expotential 
// moving average (EMA) core.
// How To Trade Using:
// Adjust the envelopes percentage factors to control the quantity and 
// quality of the signals. If a previous high goes above the envelope 
// a sell signal is generated. Conversely, if the previous low goes below 
// the envelope a buy signal is given.
//
// Average True Range Trailing Stops Strategy, by Sylvain Vervoort 
// The related article is copyrighted material from Stocks & Commodities Jun 2009 
//
// ATR TS used by filter for MADE signals.
//
// WARNING:
// - For purpose educate only
// - This script to change bars colors.
////////////////////////////////////////////////////////////
strategy(title='Moving Average Displaced Envelope & ATRTS', shorttitle='MADE+ATR', overlay=true)
tradeDirection = input.string('Both', title='Trade Direction', options=['Both', 'Long', 'Short'])
Price = input(title='Source', defval=close)
Period = input.int(defval=9, minval=1)
perAb = input.float(title='Percent above', defval=.5, minval=0.01, step=0.1)
perBl = input.float(title='Percent below', defval=.5, minval=0.01, step=0.1)
disp = input.int(title='Displacement', defval=13, minval=1)

nATRPeriod = input(15)
nATRMultip = input(2)
useATR = input(false, title='ATR Filter')
reverse = input(false, title='Trade reverse')

longAllowed = tradeDirection == 'Long' or tradeDirection == 'Both'
shortAllowed = tradeDirection == 'Short' or tradeDirection == 'Both'
pos = 0
sEMA = ta.ema(Price, Period)
top = sEMA[disp] * ((100 + perAb) / 100)
bott = sEMA[disp] * ((100 - perBl) / 100)

xATR = ta.atr(nATRPeriod)
xHHs =ta.sma(ta.highest(nATRPeriod), nATRPeriod)
xLLs =ta.sma(ta.lowest(nATRPeriod),nATRPeriod)
nSpread = (xHHs - xLLs) / 2
nLoss = nATRMultip * xATR
var xATRTrailingStop = 0.0
xATRTrailingStop := close > nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), close - nLoss) :
     close < nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), close + nLoss) : 
     close > nz(xATRTrailingStop[1], 0) ? close - nLoss : close + nLoss

ATRLong = close > xATRTrailingStop ? true : false
ATRShort = close < xATRTrailingStop ? true : false

iff_1 = close > top ? 1 : pos[1]
pos := close < bott ? -1 : iff_1
iff_2 = reverse and pos == -1 ? 1 : pos
possig = reverse and pos == 1 ? -1 : iff_2
clr = strategy.position_size
if possig == 1 
    if longAllowed and ATRLong
        strategy.entry('Long', strategy.long)
    else
        if ATRLong or strategy.position_size > 0
            strategy.close_all()
if possig == -1 
    if shortAllowed and ATRShort
        strategy.entry('Short', strategy.short)
    else    
        if ATRShort or strategy.position_size < 0
            strategy.close_all()
if possig == 0
    strategy.close_all()
    
plot(xATRTrailingStop[1], color=color.blue, title='ATR Trailing Stop')
barcolor(clr < 0 ? #b50404 : clr > 0 ? #079605 : #0536b3)



Mais.