
Esta é uma estratégia muito simples. Consiste apenas em um tracking stop. Quando o stop é acionado, a posição é invertida e um tracking stop é estabelecido para a nova posição.
A estratégia é construída com base em um dos três tipos de stop loss: stop loss percentual, stop loss ATR e stop loss absoluto. Quando o stop loss é acionado, a posição é invertida e um stop loss de seguimento é estabelecido para a nova posição.
Concretamente, a estratégia primeiro calcula o valor de parada de acordo com o tipo de parada escolhido. Em seguida, ela julga se há sinais de construção de posição, ou seja, quando o alto é maior do que o preço de parada anterior e o baixo é menor do que o preço de parada anterior.
A maior vantagem da estratégia é que é muito simples, basta acompanhar apenas um stop loss, sem ter que considerar a seleção de pontos de entrada e saída. A configuração flexível do valor de stop loss também torna a sua aplicação mais ampla.
Em comparação com o stop-loss fixo, ele usa o stop-loss de rastreamento para bloquear maiores ganhos, reduzindo a probabilidade de o stop-loss ser atingido. A reversão de posição após o stop-loss é acionada para capturar oportunidades de reversão de preço.
Os principais riscos que a estratégia pode ter são os riscos causados por uma configuração inadequada do preço de parada. A configuração de um valor de parada excessiva pode levar à expansão dos prejuízos; a configuração de um valor de parada muito pequena pode levar ao disparo frequente do stop. Isso precisa ser otimizado de acordo com as condições do mercado.
Outro risco é que o julgamento da direção da posição de reversão após o disparo do stop loss seja impreciso, perdendo assim a oportunidade de uma reversão de preço ou aumentando os prejuízos. Isso requer um julgamento de resistência de tendência e suporte para determinar o melhor momento de reversão.
A estratégia pode ser melhorada em vários aspectos:
A estratégia é lucrativa através de um mecanismo de parada de perda de seguimento simples, uma estratégia de quantificação adequada para os iniciantes. Em comparação com a estratégia de parada de perda tradicional, ele aumenta o mecanismo de reestruturação de posição após o disparo de parada, obtendo assim um lucro adicional.
/*backtest
start: 2022-11-24 00:00:00
end: 2023-11-30 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title="Trailing SL Strategy [QuantNomad]", shorttitle = "TrailingSL [QN]", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 50)
////////////
// Inputs //
sl_type = input("%", options = ["%", "ATR", "Absolute"])
sl_perc = input(4, title = "% SL", type = input.float)
atr_length = input(10, title = "ATR Length")
atr_mult = input(2, title = "ATR Mult", type = input.float)
sl_absol = input(10, title = "Absolute SL", type = input.float)
// 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 = 2016, 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 = 2100, 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 = time >= startDate and time <= finishDate
//////////////////
// CALCULATIONS //
// SL values
sl_val = sl_type == "ATR" ? atr_mult * atr(atr_length) :
sl_type == "Absolute" ? sl_absol :
close * sl_perc / 100
// Init Variables
pos = 0
trailing_sl = 0.0
// Signals
long_signal = nz(pos[1]) != 1 and high > nz(trailing_sl[1])
short_signal = nz(pos[1]) != -1 and low < nz(trailing_sl[1])
// Calculate SL
trailing_sl := short_signal ? high + sl_val :
long_signal ? low - sl_val :
nz(pos[1]) == 1 ? max(low - sl_val, nz(trailing_sl[1])) :
nz(pos[1]) == -1 ? min(high + sl_val, nz(trailing_sl[1])) :
nz(trailing_sl[1])
// Position var
pos := long_signal ? 1 : short_signal ? -1 : nz(pos[1])
//////////////
// PLOTINGS //
plot(trailing_sl, linewidth = 2, color = pos == 1 ? color.green : color.red)
//////////////
// STRATEGY //
if (time_cond and pos != 1)
strategy.entry("long", true, stop = trailing_sl)
if (time_cond and pos != -1)
strategy.entry("short", false, stop = trailing_sl)