Estratégia de trailing stop loss com base na diferença de preço


Data de criação: 2023-11-28 13:53:16 última modificação: 2023-11-28 13:53:16
cópia: 0 Cliques: 655
1
focar em
1617
Seguidores

Estratégia de trailing stop loss com base na diferença de preço

Visão geral

A estratégia usa o princípio do intervalo de preço, comprando e configurando um stop loss e um stop loss quando um ponto baixo é atingido, para rastrear o menor preço de stop loss e obter lucro.

Princípio da estratégia

Quando o preço cai abaixo do ponto mais baixo nas últimas N horas, o intervalo de posicionamento é feito de acordo com a porcentagem definida, enquanto o stop loss e o stop order são definidos. Depois, o stop loss e o stop line são movidos de acordo com a tendência. A lógica específica é a seguinte:

  1. Calcular o ponto mais baixo em N horas como preço de fixação
  2. Preço em tempo real abaixo do preço fixo multiplicado pela percentagem de compra
  3. O preço de entrada multiplicado pela percentagem de venda de um anúncio de parada definido
  4. Configure o Stop Loss como o preço de entrada menos o preço de entrada vezes o percentual de stop loss
  5. Número múltipla como percentagem de direitos e interesses estratégicos
  6. Seguir a linha de stop loss móvel do preço mínimo
  7. Stop Stop ou Stop Loss

Análise de vantagens estratégicas

A estratégia tem as seguintes vantagens:

  1. A ideia de um preço de brecha para entrar em jogo quando o preço é mais baixo e aumentar a probabilidade de vitória
  2. Stop loss automático para bloquear a maior parte dos lucros
  3. Percentagem de stop loss configurável para diferentes mercados
  4. Aplicável a variedades com características de regresso evidentes
  5. Operação simples e fácil de implementar

Análise de risco estratégico

A estratégia também apresenta alguns riscos:

  1. A brecha pode não ser bem-sucedida, mas pode ser explorada novamente.
  2. A configuração inadequada de parada ou parada pode causar parada ou parada prematura e perda de maior velocidade
  3. Parâmetros que precisam ser regularmente otimizados para se adaptar a mudanças no mercado
  4. Variedades limitadas e podem não ser eficazes para certas variedades
  5. Há uma certa necessidade de intervenção humana.

Direção de otimização da estratégia

A estratégia também pode ser melhorada em:

  1. Adição de algoritmos de aprendizagem de máquina para otimização automática de parâmetros
  2. Aumentar o número de paradas de perda, como paradas móveis, paradas penduradas, etc.
  3. Otimização da lógica de parada de perda para uma parada de perda mais inteligente e mais suave
  4. Combinação de mais indicadores para avaliar a confiabilidade do sinal, filtrando os sinais errados
  5. Expandir a aplicação para mais variedades e aumentar a universalidade da estratégia

Resumir

Esta estratégia é, em geral, uma estratégia simples e eficaz de rastreamento e parada de perdas, baseada na idéia de intervalo de preço. Ela reduz a probabilidade de entrada errônea, é capaz de bloquear os lucros de forma eficaz, e há muito espaço para otimização em termos de otimização e filtragem de parâmetros, que vale a pena investigar e melhorar ainda mais.

Código-fonte da estratégia
/*backtest
start: 2022-11-21 00:00:00
end: 2023-11-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title="Squeeze Backtest by Shaqi v1.0", overlay=true, pyramiding=0, currency="USD", process_orders_on_close=true, commission_type=strategy.commission.percent, commission_value=0.075, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, backtest_fill_limits_assumption=0)
strategy.risk.allow_entry_in(strategy.direction.long)

R0 = "6 Hours"
R1 = "12 Hours"
R2 = "24 Hours"
R3 = "48 Hours"
R4 = "1 Week"
R5 = "2 Weeks"
R6 = "1 Month"
R7 = "Maximum"


buyPercent = input( title="Buy, %",         type=input.float,   defval=3,       minval=0.01,                        step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
sellPercent = input(title="Sell, %",        type=input.float,   defval=1,       minval=0.01,                        step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
stopPercent = input(title="Stop Loss, %",   type=input.float,   defval=1,       minval=0.01,        maxval=100,     step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
isMaxBars = input(  title="Max Bars To Sell",               type=input.bool,    defval=true ,                                   inline="MaxBars",   group="Squeeze Settings")
maxBars = input(    title="",       type=input.integer, defval=2,     minval=0,           maxval=1000, step=1,                  inline="MaxBars",   group="Squeeze Settings")
bind = input(       title="Bind",           type=input.source,  defval=close,                                                                       group="Squeeze Settings")
isRange = input(    title="Fixed Range",               type=input.bool,    defval=true,                                         inline="Range",     group="Backtesting Period")
rangeStart = input( title="",                       defval=R4,      options=[R0, R1, R2, R3, R4, R5, R6, R7],                   inline="Range",     group="Backtesting Period")
periodStart = input(title="Backtesting Start", type=input.time,    defval=timestamp("01 Aug 2021 00:00 +0000"),                                     group="Backtesting Period")
periodEnd = input(  title="Backtesting End",   type=input.time,    defval=timestamp("01 Aug 2022 00:00 +0000"),                                     group="Backtesting Period")

int startDate = na
int endDate = na
if isRange
    if rangeStart == R0
        startDate := timenow - 21600000
        endDate := timenow
    else if rangeStart == R1
        startDate := timenow - 43200000
        endDate := timenow
    else if rangeStart == R2
        startDate := timenow - 86400000
        endDate := timenow
    else if rangeStart == R3
        startDate := timenow - 172800000
        endDate := timenow
    else if rangeStart == R4
        startDate := timenow - 604800000
        endDate := timenow
    else if rangeStart == R5
        startDate := timenow - 1209600000
        endDate := timenow
    else if rangeStart == R6
        startDate := timenow - 2592000000
        endDate := timenow
    else if rangeStart == R7
        startDate := time
        endDate := timenow
else 
    startDate := periodStart
    endDate := periodEnd

afterStartDate = (time >= startDate)
beforeEndDate = (time <= endDate)
notInTrade = strategy.position_size == 0
inTrade = strategy.position_size > 0

barsFromEntry = barssince(strategy.position_size[0] > strategy.position_size[1])
entry = strategy.position_size[0] > strategy.position_size[1]
entryBar = barsFromEntry == 0
notEntryBar = barsFromEntry != 0
buyLimitPrice = bind - bind * buyPercent
buyLimitFilled = low <= buyLimitPrice
sellLimitPriceEntry = buyLimitPrice * (1 + sellPercent)
sellLimitPrice = strategy.position_avg_price * (1 + sellPercent)

stopLimitPriceEntry = buyLimitPrice - buyLimitPrice * stopPercent
stopLimitPrice = strategy.position_avg_price - strategy.position_avg_price * stopPercent

if afterStartDate and beforeEndDate and notInTrade
    strategy.entry("BUY", true, limit = buyLimitPrice)
    strategy.exit("INSTANT", limit = sellLimitPriceEntry, stop = stopLimitPriceEntry)
strategy.cancel("INSTANT", when = inTrade)
if isMaxBars
    strategy.close("BUY", when = barsFromEntry >= maxBars, comment = "Don't Sell")
strategy.exit("SELL", limit = sellLimitPrice, stop = stopLimitPrice)

showStop = stopPercent <= 0.03

plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", style=plot.style_linebr, color=color.red, linewidth=1)
plot(sellLimitPrice, title="Take Profit Limit Order", style=plot.style_linebr, color=color.purple, linewidth=1)
plot(strategy.position_avg_price, title="Buy Order Filled Price", style=plot.style_linebr, color=color.blue, linewidth=1)
plot(buyLimitPrice, title="Trailing Buy Limit Order", style=plot.style_stepline, color=color.new(color.blue, 30), offset=1)