
A estratégia é uma estratégia de ruptura baseada no canal de preço, combinando o indicador de linha média e o rastreamento de stop-loss/stop-offs para entrar e sair. Ela usa a linha média de alto e baixo preço para construir o canal de preço, entrar no canal de alta/baixa quando o preço quebra o canal e usar um stop-loss fixo ou trailing stop para controlar o risco.
A estratégia consiste em calcular um canal de preços através de uma linha média de preços altos e baixos. Concretamente, a linha média SMA de preços altos e baixos com um comprimento de 10 é calculada, formando o trajeto superior e inferior do canal. Quando o preço se move do trajeto inferior para o trajeto superior, faz-se uma entrada adicional.
Após a entrada, a estratégia usa um stop-loss fixo ou trailing stop para sair da posição. O trailing stop inclui dois parâmetros: stop-stop fixo e offset de ativação. Quando o preço atinge o desvio de ativação, o stop-stop é trail seguindo o preço.
A estratégia combina simultaneamente filtragem por período de tempo e retrospectiva somente dentro de datas históricas designadas, permitindo testar o desempenho em diferentes fases do mercado.
A estratégia usa o canal de preço e o stop loss de rastreamento de tendências para capturar a direção da tendência de linha média e longa. Em comparação com a estratégia de linha média móvel simples, ela reduz as negociações inválidas causadas por oscilações de preços.
Em geral, a estratégia é clara em sua lógica, usa menos indicadores e parâmetros, é fácil de retroceder, é adequada para a negociação de tendências de linha média e longa e pode ser lucrativa em condições de forte.
A estratégia pode ser facilmente bloqueada em situações de turbulência e não pode gerar lucros duradouros. Além disso, em situações extremas, o preço pode romper diretamente o ponto de parada e causar grandes perdas.
A configuração dos parâmetros é bastante subjetiva, e os parâmetros precisam ser ajustados em diferentes fases do mercado. O parâmetro de paragem e o desvio de ativação são fixos e não podem ser ajustados de acordo com a volatilidade do mercado.
Pode-se considerar a combinação de outros indicadores para filtrar os sinais de entrada, como volume de transação, faixa de Brin, etc., evitando a cobertura. Ou usar stop loss dinâmico para definir o ponto de parada de acordo com o ATR ou a volatilidade dos preços.
A regra de saída pode ser otimizada para um stop móvel ou Chandelier Exit. Uma saída parcial também pode ser considerada quando o preço entra novamente no Channel. A otimização da filtragem de entrada e da regra de saída pode aumentar significativamente a estabilidade da estratégia.
O conjunto da estratégia é uma estratégia de quantificação baseada no canal de preços, acompanhamento de tendências e gerenciamento de parada / parada. Tem uma estrutura lógica clara, uma estrutura de parâmetros simples, fácil de entender e rastrear, adequada para o estudo de negociações de quantificação. A estratégia pode ser otimizada de várias maneiras, aumentando a estabilidade e a lucratividade.
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-21 23:59:59
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("Generalized SSL Backtest w/ TSSL", shorttitle="GSSL Backtest", overlay=true )
// Generalized SSL:
// This is the very first time the SSL indicator, whose acronym I ignore, is on Tradingview.
// It is based on moving averages of the highs and lows.
// Similar channel indicators can be found, whereas
// this one implements the persistency inside the channel, which is rather tricky.
// The green line is the base line which decides entries and exits, possibly with trailing stops.
// With respect to the original version, here one can play with different moving averages.
// The default settings are (10,SMA)
//
// Vitelot/Yanez/Vts March 2019
lb = input(10, title="Lb", minval=1)
maType = input( defval="SMA", title="MA Type", options=["SMA","EMA","HMA","McG","WMA","Tenkan"])
fixedSL = input(title="SL Activation", defval=300)
trailSL = input(title="SL Trigger", defval=1)
fixedTP = input(title="TP Activation", defval=150)
trailTP = input(title="TP Trigger", defval=1)
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth = input(defval = 6, title = "To Month", minval = 1, maxval = 12)
ToDay = input(defval = 19, title = "To Day", minval = 1, maxval = 31)
ToYear = input(defval = 2020, title = "To Year", minval = 2017)
start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window
startTimeOk() => true // create function "within window of time" if statement true
// QUANDL:BCHAIN/ETRVU is USD-denominated daily transaction value on BTC blockchain
// QUANDL:BCHAIN/MKTCP is USD-denominated Bitcoin marketcap
hma(sig, n) => // Hull moving average definition
wma( 2*wma(sig,round(n/2))-wma(sig,n), round(sqrt(n)))
mcg(sig,length) => // Mc Ginley MA definition
mg = 0.0
mg := na(mg[1]) ? ema(sig, length) : mg[1] + (sig - mg[1]) / (length * pow(sig/mg[1], 4))
tenkan(sig,len) =>
0.5*(highest(sig,len)+lowest(sig,len))
ma(t,sig,len) =>
sss=na
if t =="SMA"
sss := sma(sig,len)
if t == "EMA"
sss := ema(sig,len)
if t == "HMA"
sss := hma(sig,len)
if t == "McG" // Mc Ginley
sss := mcg(sig,len)
if t == "Tenkan"
sss := tenkan(sig,len)
if t == "WMA"
sss := wma(sig,len)
sss
base(mah, mal) =>
bbb = na
inChannel = close<mah and close>mal
belowChannel = close<mah and close<mal
bbb := inChannel? bbb[1]: belowChannel? -1: 1
uuu = bbb==1? mal: mah
ddd = bbb==1? mah: mal
[uuu, ddd]
maH = ma(maType, high, lb)
maL = ma(maType, low, lb)
[up, dn] = base(maH,maL)
plot(up, title="High MA", color=lime, linewidth=3)
plot(dn, title="Low MA", color=orange, linewidth=3)
long = crossover(dn,up)
short = crossover(up,dn)
// === STRATEGY - LONG POSITION EXECUTION ===
strategy.entry("Long", strategy.long, when= long and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)
strategy.exit("Exit", when= short)
// === STRATEGY - SHORT POSITION EXECUTION ===
strategy.entry("Short", strategy.short, when= short and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)
strategy.exit("Exit", when= long)