
A estratégia usa a interseção de duas médias móveis para avaliar a mudança de tendência do mercado e realizar operações de compra e venda de acordo com a tendência. Faça mais quando atravessa a média de curto prazo na média de longo prazo e faça um espaço abaixo da média de curto prazo quando atravessa a média de longo prazo para seguir a direção da tendência.
O núcleo da estratégia é composto por duas médias móveis: uma média rápida (o ciclo padrão é de 32) e uma média lenta (o ciclo padrão também é de 32 e pode ser ajustado por meio de parâmetros). Quando o preço de fechamento atravessa/baixa o canal formado por essas duas médias, o que representa uma reversão de tendência, a estratégia gera um sinal de compra e venda:
Através desta forma de equilíbrio, a estratégia pode acompanhar a tendência, mantendo mais opções em uma tendência ascendente, mantendo opções vazias em uma tendência descendente, até que a tendência apareça um sinal de inversão.
Para os riscos acima, pode-se considerar a adição de filtros adequados, como ATR ou filtros de amplitude real média, para reduzir o excesso de negociação em mercados de turbulência; estabeleça um stop loss razoável, controle de perdas únicas; otimize continuamente os parâmetros para se adaptar ao mercado. Mas as limitações da própria estratégia são difíceis de evitar completamente.
A otimização acima pode melhorar a capacidade da estratégia de lidar com mercados complexos, mas é preciso ter em conta que a otimização excessiva pode levar ao encaixe da curva, causando um mau desempenho no futuro.
A estratégia de acompanhamento de tendências de dupla linha de equilíbrio captura tendências através de cruzamentos de equilíbrio, tem características de facilidade de uso e ampla aplicabilidade. No entanto, o seu desempenho é fraco em mercados turbulentos, a resposta insuficiente a situações extremas e a dificuldade de otimização de parâmetros. A estratégia pode ser otimizada através da introdução de mais indicadores de filtragem, stop loss dinâmico, gerenciamento de posição, combinação de múltiplos ciclos e adaptação de parâmetros.
/*backtest
start: 2023-03-16 00:00:00
end: 2024-03-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
//study(title="Demo - SSL Basic", shorttitle="Demo - SSL Basic", overlay=true)
strategy(title='Demo - SSL Basic', shorttitle='Demo - SSL Basic', overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, commission_value=0.15)
// Backtest Date Range
start_date_long = input(title='Backtest Long Start Date', defval=timestamp('01 Jan 2018 00:00 +0530'))
end_date_long = input(title='Backtest Long End Date', defval=timestamp('25 Jan 2030 00:00 +0530'))
backtest_range = true
// Inputs
maType = input.string(title='SSL MA Type', options=['SMA', 'EMA', 'WMA'], defval='SMA')
sslLen = input(title='SSL Length', defval=32)
showCross = input(title='Show Crossover?', defval=true)
showEntry = input(title='Show Entry?', defval=true)
showTrend = input(title='Show Trend Colors?', defval=true)
// Calc MA for SSL Channel
calc_ma(close, len, type) =>
float result = 0
if type == 'SMA' // Simple
result := ta.sma(close, len)
result
if type == 'EMA' // Exponential
result := ta.ema(close, len)
result
if type == 'WMA' // Weighted
result := ta.wma(close, len)
result
result
// Add SSL Channel
maHigh = calc_ma(high, sslLen, maType)
maLow = calc_ma(low, sslLen, maType)
Hlv = int(na)
Hlv := close > maHigh ? 1 : close < maLow ? -1 : Hlv[1]
sslDown = Hlv < 0 ? maHigh : maLow
sslUp = Hlv < 0 ? maLow : maHigh
ss1 = plot(sslDown, title='Down SSL', linewidth=2, color=showTrend ? na : color.red)
ss2 = plot(sslUp, title='Up SSL', linewidth=2, color=showTrend ? na : color.lime)
// Conditions
longCondition = ta.crossover(sslUp, sslDown)
shortCondition = ta.crossover(sslDown, sslUp)
// Strategy
if shortCondition
strategy.close('Long', comment='Long Exit', alert_message='JSON')
if longCondition
strategy.close('Short', comment='Short Exit', alert_message='JSON')
if backtest_range and longCondition
strategy.entry('Long', strategy.long, comment='Long Entry', alert_message='JSON')
if backtest_range and shortCondition
strategy.entry('Short', strategy.short, comment= 'Short Entry', alert_message='JSON')
// Plots
fill(ss1, ss2, color=showTrend ? sslDown < sslUp ? color.new(color.lime, transp=75) : color.new(color.red, transp=75) : na, title='Trend Colors')