Estratégia de paragem de perdas de média móvel dupla de rastreamento

Autora:ChaoZhang, Data: 2023-11-16 17:18:59
Tags:

img

Resumo

Esta estratégia gera sinais longos e curtos através de médias móveis duplas e implementa o rastreamento de stop loss.

Estratégia lógica

Esta estratégia usa hl2 como o preço de origem e calcula o ATR de um determinado período como o intervalo de stop loss. As bandas superior e inferior são calculadas com base no ATR multiplicado por um determinado fator. Quando o preço quebra acima da banda superior, um sinal de compra é gerado para ir longo. Quando o preço quebra abaixo da banda inferior, um sinal de venda é gerado para ir curto.

Após a abertura de posições, o stop loss é ajustado em tempo real com base nas mudanças no ATR para alcançar o rastreamento do stop loss. Especificamente, depois de longo, a faixa inferior é aumentada progressivamente com base no mínimo mais recente para rastrear o stop loss.

Esta estratégia faz pleno uso da capacidade das médias móveis para determinar a direção da tendência e incorpora também o mecanismo de rastreamento de stop loss baseado no ATR para garantir a direção da negociação e o controlo do risco.

Vantagens

A maior vantagem desta estratégia reside no controle de risco. As estratégias de média móvel tradicionais só consideram julgamentos direcionais e podem facilmente explodir contas. Ao incorporar o ATR para rastrear o stop loss, esta estratégia pode ajustar dinamicamente o stop loss com base na volatilidade do mercado para controlar efetivamente os riscos de negociação.

Além disso, essa estratégia combina negociação bidirecional. Em comparação com as estratégias unidirecionais, ela pode ajustar prontamente as direções das posições quando as tendências se invertem, evitando ficar preso em uma direção e melhorando a lucratividade da estratégia.

Riscos

Os principais riscos desta estratégia vêm das configurações de parâmetros do período ATR e do multiplicador. Se o período ATR for muito curto ou o multiplicador for muito grande, o intervalo de stop loss seria muito pequeno para controlar efetivamente os riscos. Se o período ATR for muito longo ou o multiplicador for muito pequeno, o stop loss seria muito frouxo para lucrar.

Os riscos podem ser geridos através da otimização do período de ATR e do multiplicador para equilibrar os objetivos de stop loss e lucro, e da incorporação de outros indicadores para filtrar falhas e melhorar a qualidade do sinal.

Oportunidades de melhoria

Esta estratégia pode ser reforçada pelos seguintes aspectos:

  1. Otimizar os períodos de média móvel para encontrar a melhor combinação de parâmetros.

  2. Adicione outros indicadores como MACD, KDJ etc. para filtrar sinais e melhorar a qualidade.

  3. Incorporar dimensionamento de posição como fração fixa, Martingale etc. para melhorar a rentabilidade.

  4. Pesquisa de parâmetros de diferenças entre vários produtos para otimização.

  5. Aplicar aprendizado de máquina como algoritmos genéticos para treinamento de parâmetros e otimização.

Conclusão

Esta estratégia considera plenamente a avaliação da tendência e o controle de riscos, buscando lucros enquanto reduz os drawdowns. A melhoria adicional através da otimização de parâmetros e métodos de carteira pode ajudar a melhorar a rentabilidade da estratégia.


/*backtest
start: 2022-11-09 00:00:00
end: 2023-11-15 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/
// © KivancOzbilgic


//@version=4
strategy("Trenbolone Strategy", overlay = true)
Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
barcoloring = input(title="Bar Coloring On/Off ?", type=input.bool, defval=true)
atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 999)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 999)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)       
window()  => time >= start and time <= finish ? true : false
longCondition = buySignal
if (longCondition)
    strategy.entry("BUY", strategy.long, when = window())
shortCondition = sellSignal
if (shortCondition)
    strategy.entry("SELL", strategy.short, when = window())
buy1 = barssince(buySignal)
sell1 = barssince(sellSignal)
color1 = buy1[1] < sell1[1] ? color.green : buy1[1] > sell1[1] ? color.red : na
barcolor(barcoloring ? color1 : na)

Mais.