A estratégia de supertrend é uma estratégia de acompanhamento de tendências baseada no cálculo da amplitude real média. Ela usa a amplitude real média para definir uma linha de parada e determinar a direção da tendência, determinando se o preço ultrapassou a linha de parada, para gerar um sinal de negociação.
A estratégia primeiro calcula o ATR, a média real da amplitude de onda em um determinado período. Em seguida, o valor do ATR é multiplicado por um fator de escala para calcular a linha de parada de linha longa e a linha de parada de linha curta. A forma específica de cálculo é a seguinte:
atr = mult * atr(length)
longStop = hl2 - atr
shortStop = hl2 + atr
onde long é o comprimento de ciclo calculado do ATR, mult é o coeficiente de escala do ATR.
Depois de calcular a linha de parada, a estratégia continua a julgar se o preço quebrou a linha de parada de uma linha K anterior para determinar a direção da tendência:
dir := dir == -1 and close > shortStopPrev ? 1 :
dir == 1 and close < longStopPrev ? -1 : dir
Quando a linha de parada de linha longa é quebrada, a tendência é considerada uma reversão. Quando a linha de parada de linha curta é quebrada, a tendência é considerada uma reversão.
A tendência é de que os preços dos produtos sejam mais baixos do que os preços dos produtos, o que significa que os preços dos produtos são mais baixos.
buySignal = dir == 1 and dir[1] == -1
sellSignal = dir == -1 and dir[1] == 1
Por fim, quando os sinais de compra e venda surgirem, execute as operações correspondentes.
Usando a amplitude real média para calcular a linha de parada, pode efetivamente filtrar o ruído do mercado e capturar um sinal de tendência mais confiável.
Os parâmetros de estratégia são menores, fáceis de entender e operar. O ciclo ATR e o fator de multiplicador podem ser ajustados para se adaptar a diferentes condições de mercado.
O uso de uma linha de parada de ruptura para determinar a mudança de direção da tendência pode controlar o risco de forma eficaz e parar os prejuízos a tempo.
Pode ser configurado para transações múltiplas ou bidirecionais, para atender a diferentes estilos de negociação.
Pode ser usado em qualquer período de tempo, para vários tipos de transações.
Em situações de turbulência, o valor do ATR pode ser elevado, o que leva a um alargamento excessivo da linha de parada, gerando mais falsos sinais.
Não é possível determinar o melhor conjunto de parâmetros, o ciclo ATR e o múltiplo precisam ser otimizados de acordo com a situação do mercado.
Não é possível determinar o melhor ciclo de negociação para uma variedade de negociação e é necessário testar para cada variedade de negociação.
Não é possível determinar a melhor hora de entrada, existindo um certo atraso.
Existe um certo risco de uma posição vazia, que pode estar em uma posição vazia quando a tendência é mais fraca.
Se houver risco de ruptura do stop loss, deve-se relaxar a linha de stop loss adequadamente.
Pode-se considerar a filtragem em combinação com outros indicadores, para evitar erros de sinal em situações de turbulência. Por exemplo, MACD, RSI, etc.
Pode-se usar aprendizado de máquina ou algoritmos genéticos para encontrar a melhor combinação de parâmetros.
Os parâmetros podem ser otimizados para diferentes variedades, determinando o melhor ciclo de ATR e o coeficiente de multiplicação.
Pode-se combinar indicadores de capacidade quantitativa para determinar o momento da admissão, como volume de transações, evitando a admissão prematura.
Pode-se considerar a adoção de uma estratégia de bloqueio de posição, mantendo a posição em posição vazia.
A largura de parada pode ser adequadamente ampliada e a posição de parada pode ser otimizada em combinação com o indicador de força de tendência.
A estratégia de supertrend é uma estratégia de acompanhamento de tendências mais confiável e de risco controlado, com base na medição da amplitude real da onda para calcular a linha de parada dinâmica e determinar a ruptura do preço. A estratégia é simples, fácil de usar e se aplica a vários tipos de negociação, mas precisa ser otimizada para os parâmetros e as regras da estratégia para obter melhores resultados em diferentes mercados.
/*backtest
start: 2023-09-12 00:00:00
end: 2023-10-12 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
// strategy("SuperTrend Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=1000)
LongOnly = input(title="Long Only ?", type=input.bool, defval=true)
length = input(title="ATR Period", type=input.integer, defval=22)
mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
showLabels = input(title="Show Buy/Sell Labels ?", type=input.bool, defval=true)
////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE
// From Date Inputs
fromDay = input(defval=1, title="From Day", minval=1, maxval=31)
fromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
fromYear = input(defval=2019, title="From Year", minval=1970)
// To Date Inputs
toDay = input(defval=1, title="To Day", minval=1, maxval=31)
toMonth = input(defval=1, title="To Month", minval=1, maxval=12)
toYear = input(defval=2020, title="To Year", minval=1970)
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true
////////////////////////////////////////////////////////////////////////////////
atr = mult * atr(length)
longStop = hl2 - atr
longStopPrev = nz(longStop[1], longStop)
longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop = hl2 + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and close > shortStopPrev ? 1 :
dir == 1 and close < longStopPrev ? -1 : dir
longColor = color.green
shortColor = color.red
plot(dir == 1 ? longStop : na, title="Long Stop", style=plot.style_linebr, linewidth=2, color=longColor)
buySignal = dir == 1 and dir[1] == -1
plotshape(buySignal ? longStop : na, title="Long Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=longColor, transp=0)
plotshape(buySignal and showLabels ? longStop : na, title="Buy Label", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=longColor, textcolor=color.white, transp=0)
plot(dir == 1 ? na : shortStop, title="Short Stop", style=plot.style_linebr, linewidth=2, color=shortColor)
sellSignal = dir == -1 and dir[1] == 1
plotshape(sellSignal ? shortStop : na, title="Short Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=shortColor, transp=0)
plotshape(sellSignal and showLabels ? shortStop : na, title="Sell Label", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=shortColor, textcolor=color.white, transp=0)
if LongOnly
if buySignal and time_cond
strategy.entry("Long", strategy.long, comment="Long")
if(sellSignal and time_cond)
strategy.close("Long")
else
if buySignal and time_cond
strategy.entry("Long", strategy.long, comment="Long")
else
strategy.cancel("Long")
if sellSignal and time_cond
strategy.entry("Short", strategy.short, comment="Short")
else
strategy.cancel("Short")
if not time_cond
strategy.close_all()