Estratégia de reversão de perdas de parada de atraso

Autora:ChaoZhang, Data: 2023-12-01 13:41:41
Tags:

img

Resumo

Esta é uma estratégia muito simples. Consiste apenas de um stop loss de trailing. Quando o stop loss é acionado, a posição é invertida e um stop loss de trailing é definido para a nova posição.

Estratégia lógica

A estratégia é construída com base em um dos três tipos de stop loss: stop loss percentual, stop loss ATR, stop loss absoluto.

Especificamente, a estratégia primeiro calcula o valor de stop loss com base no tipo de stop loss escolhido. Em seguida, verifica os sinais de entrada, indo longo quando alto está acima do preço de stop loss anterior e indo curto quando baixo está abaixo do preço de stop loss anterior. Depois de entrar, ele continua atualizando o preço de stop loss para seguir as mudanças de preço. O preço de stop loss longo é baixo menos o valor de stop loss, o preço de stop loss curto é alto mais o valor de stop loss.

Análise das vantagens

A maior vantagem desta estratégia é a sua simplicidade, exigindo o acompanhamento de apenas uma perda de parada sem a necessidade de considerar as seleções de pontos de entrada e saída.

Em comparação com o stop loss fixo, o trailing stop loss empregado pode bloquear lucros maiores, reduzindo também a probabilidade de o stop loss ser atingido.

Análise de riscos

Os principais riscos desta estratégia podem vir da configuração inadequada do valor de stop loss. O valor de stop loss muito grande pode levar a perdas aumentadas, enquanto o valor muito pequeno pode causar o gatilho de stop loss frequente. Isso requer otimização adaptativa com base nas condições do mercado.

Outro risco é o julgamento direcional impreciso após o gatilho de stop loss ao reverter as posições, perdendo assim chances de reversão de preço ou aumentando as perdas.

Orientações de otimização

A estratégia pode ser otimizada nos seguintes aspectos:

  1. Adicionar o julgamento da tendência para evitar a negociação contra tendências
  2. Otimizar o cálculo do valor de stop loss para que seja mais dinâmico o acompanhamento do mercado
  3. Aumentar a validação de ruptura para sinais de reversão de maior probabilidade
  4. Incorporar medidas de volatilidade para encontrar o melhor momento de reversão

Conclusão

A estratégia realiza lucros por meio de um mecanismo de stop loss simples e é fácil de entender para iniciantes. Em comparação com as estratégias tradicionais de stop loss, ela adiciona posições de reversão de gatilho de pós-stop loss para adquirir ganhos adicionais. Com testes e otimização contínuos, pode se tornar um programa quantitativo muito prático.


/*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)

Mais.