Estratégia dinâmica de trailing stop loss


Data de criação: 2023-12-29 10:42:27 última modificação: 2023-12-29 10:42:27
cópia: 0 Cliques: 872
1
focar em
1617
Seguidores

Estratégia dinâmica de trailing stop loss

Visão geral

A estratégia de stop loss de rastreamento dinâmico é uma estratégia de negociação quantitativa que utiliza um mecanismo de stop loss de rastreamento. A estratégia é baseada na teoria de seguimento de tendências, configura uma linha de stop loss de rastreamento, realiza a confirmação de stop loss e rastreia o ajuste de stop loss. É usado principalmente para controlar o stop loss de uma única transação, maximizar o lucro de bloqueio e reduzir o risco de negociação.

Princípio da estratégia

O núcleo da estratégia de stop loss de rastreamento dinâmico consiste em definir três parâmetros-chave: a distância de parada inicial, a distância de parada de rastreamento e a distância de parada de rastreamento. Quando o sinal de compra é acionado, o preço de parada inicial é calculado de acordo com o preço de compra e a distância de parada inicial definida.

A estratégia também possui um stop-loss baixo, independentemente de iniciar ou não o stop-loss de rastreamento. Se o preço cair abaixo do stop-loss baixo, o stop-loss será imediatamente interrompido. O stop-loss baixo é usado para evitar que o preço salte para o ar.

Vantagens estratégicas

  1. O que é o que você pode fazer para evitar que o seu negócio se repare?

  2. A estrutura de suspensão de linha dupla para cima e para baixo garante o acompanhamento oportuno da linha de suspensão e evita perdas excessivas.

  3. O mecanismo de julgamento contínuo é usado para o ajustamento de parada de prejuízo, sendo a operação simples e fácil de implementar.

  4. Pode-se ajustar os parâmetros de acordo com as características do mercado e do indivíduo para otimizar o efeito de parada.

  5. Não há necessidade de prever a direção do mercado, mas sim de seguir a tendência.

Risco estratégico

  1. A configuração inadequada dos parâmetros pode levar a que o stop loss fique muito relaxado ou muito apertado. O excesso de relaxamento não permite um stop loss efetivo, e o excesso de aperto é facilmente atingido pelas flutuações normais do preço.

  2. O efeito de suspensão pode ser anulado quando um evento inesperado causa uma queda acelerada do preço, e deve ser acompanhado por outras medidas de proteção.

  3. As taxas de transação e os pontos de deslizamento podem afetar o preço de venda real após o desencadeamento da linha de parada.

  4. A adaptabilidade é fraca e não é muito eficaz em determinadas fases, como durante os períodos de tremor.

Resposta:

  1. Recomenda-se a otimização contínua dos parâmetros com base nos resultados dos testes de retorno e do disco rígido.
  2. Pode-se configurar um ponto de parada mais baixo para evitar saltos.
  3. Os custos de transação e os impactos de slippage são considerados no cálculo do preço de stop loss.
  4. Indicadores de tendência e oscilação podem ser usados.

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

  1. A alteração da trajectória do Stop Loss Line para a trajectória da variação percentual permite um melhor acompanhamento da variação dos preços das ações em diferentes níveis de preços.

  2. Adicionar um indicador de taxa de flutuação para determinar se há uma grande flutuação e suspender o rastreamento do stop loss para evitar que a flutuação normal desencadeie o stop loss.

  3. Otimizar automaticamente os parâmetros usando métodos de aprendizagem de máquina. A amostra de treinamento seleciona a taxa de retorno da combinação de parâmetros no período mais recente.

  4. Aumentar o julgamento das condições de abertura de posições, combinando indicadores como tendência e resistência de suporte, evitando abertura de posições em situações de choque.

Resumir

A estratégia de stop loss de rastreamento dinâmico usa um mecanismo de stop loss de duas linhas, configura uma linha de stop loss de rastreamento, realiza a confirmação de stop loss e o ajuste de stop loss de rastreamento. A distância de stop loss pode ser ajustada automaticamente de acordo com a mudança de preço, para bloquear o lucro, reduzir o retorno e controlar a perda. A estratégia é simples de operar, fácil de implementar, pode otimizar os parâmetros de acordo com a situação do mercado e é mais eficaz em combinação com outras estratégias.

Código-fonte da estratégia
/*backtest
start: 2023-11-28 00:00:00
end: 2023-12-17 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Thumpyr
//@version=5

/////////////////////////////////////////////////////////////////////////////////////////////
// Comment out Strategy Line and remove // from Indicator line to turn into Indicator  //////
// Do same for alertConidction at bottom                                               //////
/////////////////////////////////////////////////////////////////////////////////////////////
strategy("PCT Trailing Stoploss-Strategy", shorttitle="PCT Trailing Stoploss- Strategy", overlay=true)
//indicator(title="PCT Trailing Stoploss- Indicator", shorttitle="PCT Trailing Stoploss - Indicator", timeframe="", timeframe_gaps=true, overlay=true)//

sellLow=input.float(.035, minval=0, title="Stop Loss Loss: 1% = .01", group="Sell Settings")
trailStopArm=input.float(.0065, minval=0, title="Trailing Stop Arm: 1%=.01", group="Sell Settings")
trailStopPct=input.float(.003, minval=0, title="Trailing Stop Trigger: 1%=.01 ", group="Sell Settings")

/////////////////////////////////////////////////
//               Indicators                    //
/////////////////////////////////////////////////
ema1Len = input.int(14, minval=1, title=" ema 1 Length", group="Trend Line Settings")
ema1Src = input(close, title="ema 1 Source", group="Trend Line Settings")
ema1 = ta.ema(ema1Src, ema1Len)
plot(ema1, title="EMA", color=color.blue)

ema2Len = input.int(22, minval=1, title=" ema 2 Length", group="Trend Line Settings")
ema2Src = input(close, title="ema 2 Source", group="Trend Line Settings")
ema2 = ta.ema(ema2Src, ema2Len)
plot(ema2, title="EMA", color=color.orange)

ema3Len = input.int(200, minval=1, title=" ema 3 Length", group="Trend Line Settings")
ema3Src = input(close, title="ema 2 Source", group="Trend Line Settings")
ema3 = ta.ema(ema3Src, ema3Len)
plot(ema3, title="EMA", color=color.gray)


/////////////////////////////
////   Buy Conditions    ////
/////////////////////////////

alertBuy = ta.crossover(ema1,ema2) and close>ema3

////////////////////////////////////////////////////////////////////
////   Filter redundant Buy Signals if Sell has not happened    ////
////////////////////////////////////////////////////////////////////
var lastsignal = 0
showAlertBuy = 0
if(alertBuy and lastsignal !=1)
    showAlertBuy  := 1
    lastsignal      := 1
buyAlert= showAlertBuy > 0


//////////////////////////////////////////////////////////////////
////          Track Conditions at buy Signal                  ////
//////////////////////////////////////////////////////////////////

alertBuyValue = ta.valuewhen(buyAlert, close,0)
alertSellValueLow = alertBuyValue - (alertBuyValue*sellLow)

////////////////////////////////////////////////////////////
/////            Trailing Stop                         /////
////////////////////////////////////////////////////////////
var TSLActive=0         //Check to see if TSL has been activated
var TSLTriggerValue=0.0 //Initial and climbing value of TSL
var TSLStop = 0.0       //Sell Trigger
var TSLRunning =0       //Continuously check each bar to raise TSL or not

//  Check if a Buy has been triggered and set initial value for TSL //
if buyAlert
    TSLTriggerValue := alertBuyValue+(alertBuyValue*trailStopArm)
    TSLActive := 0
    TSLRunning :=1
    TSLStop := TSLTriggerValue - (TSLTriggerValue*trailStopPct)
    

//  Check that Buy has triggered and if Close has reached initial TSL//  
//  Keeps from setting Sell Signal before TSL has been armed w/TSLActive//
beginTrail=TSLRunning==1 and TSLActive==0 and close>alertBuyValue+(alertBuyValue*trailStopArm) and ta.crossover(close,TSLTriggerValue)
if beginTrail
    TSLTriggerValue :=close
    TSLActive :=1
    TSLStop :=TSLTriggerValue - (TSLTriggerValue*trailStopPct)
    
//  Continuously check if TSL needs to increase and set new value //    
runTrail= TSLActive==1 and (ta.crossover(close,TSLTriggerValue) or close>=TSLTriggerValue)
if runTrail
    TSLTriggerValue :=close
    TSLStop :=TSLTriggerValue - (TSLTriggerValue*trailStopPct)
    
//  Verify that TSL is active and trigger when close cross below TSL Stop//
TSL=TSLActive==1 and (ta.crossunder(close,TSLStop) or (close[1]>TSLStop and close<TSLStop)) 

// Plot point of inital arming of TSL//
TSLTrigger=TSLActive==1 and TSLActive[1]==0
plotshape(TSLTrigger, title='TSL Armed', location=location.abovebar, color=color.new(color.blue, 0), size=size.small, style=shape.cross, text='TSL Armed')


////////////////////////////////////////////////////////////
// Plots used for troubleshooting and verification of TSL //
////////////////////////////////////////////////////////////
//plot(TSLActive,"Trailing Stop", color=#f48fb1)
//plot(TSLRunning,"Trailing Stop", color=#f48fb1)
//plot(TSLTriggerValue,"Trailing Stop Trigger", color.new(color=#ec407a, transp = TSLRunning==1 ? 0 : 100))
//plot(TSLStop,"Trailing Stop", color.new(color=#f48fb1, transp = TSLRunning==1 ? 0 : 100))//


////////////////////////////////////////////////////////////
/////             Sell Conditions                    ///////
////////////////////////////////////////////////////////////
Sell1 = TSL
Sell2 = ta.crossunder(close,alertSellValueLow)

alertSell= Sell1 or Sell2
////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////
////        Remove Redundant Signals                    ////
////////////////////////////////////////////////////////////
showAlertSell = 0
if(alertSell and lastsignal != -1)
    showAlertSell := 1
    lastsignal      := -1
sellAlert= showAlertSell > 0

if sellAlert
    TSLActive :=0
    TSLRunning :=0

/////////////////////////////////////////
//  Plot Buy and Sell Shapes on Chart  //
/////////////////////////////////////////
plotshape(buyAlert, title='Buy', location=location.belowbar, color=color.new(color.green, 0), size=size.small, style=shape.triangleup, text='Buy')
plotshape(sellAlert, title='Sell', location=location.abovebar, color=color.new(color.red, 0), size=size.small, style=shape.triangledown, text='Sell')

/////////////////////////////////////////////////////////////////////////////////////////////
//                        Remove // to setup for Indicator                                 //
/////////////////////////////////////////////////////////////////////////////////////////////
//Alerts
//alertcondition(title='Buy Alert', condition=buyAlert, message='Buy Conditions are Met')
//alertcondition(title='Sell Alert', condition=sellAlert, message='Sell Conditions are Met')
/////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////
////  Comment out this section if setup as Indicator    ////
////////////////////////////////////////////////////////////
longCondition = buyAlert
if (longCondition)
    strategy.entry("Buy", strategy.long)
    alert(message='Buy', freq=alert.freq_once_per_bar_close)
    
shortCondition = sellAlert
if (shortCondition)
    strategy.close_all(sellAlert,"Sell")
    alert(message='Sell', freq=alert.freq_once_per_bar_close)
/////////////////////////////////////////////////////////////