Estratégia dinâmica de suspensão de perdas

Autora:ChaoZhang, Data: 2023-12-29 10:42:27
Tags:

img

Resumo

A estratégia dinâmica de stop loss é uma estratégia quantitativa de negociação que utiliza um mecanismo de stop loss de trailing. Ela define uma linha de stop loss de trailing baseada na teoria de rastreamento de tendências para confirmar o stop loss e ajustar o stop loss de trailing.

Estratégia lógica

O núcleo da estratégia dinâmica de stop loss está em definir três parâmetros-chave: distância inicial de stop loss, distância de stop loss e distância de gatilho de stop loss. Após um sinal de compra ser acionado, o preço inicial de stop loss é calculado com base no preço de entrada e na distância inicial de stop loss definida. Em seguida, cada barra julgará se a condição de gatilho de stop loss é atendida. Se sim, um novo preço de stop loss será definido. O novo preço de stop loss é calculado com base no preço de fechamento atual e na distância de stop loss. Assim, enquanto o preço correr em uma direção favorável, a linha de stop loss continuará a subir para bloquear lucros. Quando a inversão de preço acionar a linha de stop loss, um sinal de venda será gerado.

Esta estratégia também possui um stop loss mais baixo. Não importa se o stop loss traseiro é ativado ou não, se o preço quebra abaixo do stop loss mais baixo, o stop loss será diretamente acionado. O stop loss mais baixo serve para proteger contra as lacunas de preço causadas por eventos repentinos. Portanto, através do mecanismo de stop loss dinâmico na forma de stop loss de linha dupla, a linha de stop loss pode rastrear automaticamente tendências favoráveis, evitando perdas excessivas.

Vantagens

  1. Bloquear continuamente os lucros através de stop loss, evitando dar muito espaço de retracement.

  2. Adotar uma estrutura de stop loss de duas linhas para garantir que a linha de stop loss possa dar seguimento prontamente, evitando perdas excessivas.

  3. Utilização de um mecanismo de avaliação contínua para o ajustamento de stop loss com operação simples e fácil implementação.

  4. Os parâmetros podem ser otimizados de acordo com as características do mercado e dos estoques para melhorar a eficácia do stop loss.

  5. Não é preciso prever tendências do mercado, basta seguir a tendência.

Riscos

  1. A configuração incorreta dos parâmetros pode resultar em uma perda de parada muito frouxa ou muito apertada.

  2. Em caso de diferenças de preços causadas por acontecimentos súbitos, pode não conseguir deter as perdas.

  3. Os custos de negociação e o deslizamento podem afetar o preço de venda real após a linha de stop loss ser acionada.

  4. A adaptabilidade não é forte, não funciona bem em certos estágios, como os movimentos de alcance limitado.

Contramedidas:

  1. Recomenda-se a otimização contínua dos parâmetros com base nos resultados dos backtests e dos testes em tempo real.
  2. Definir um stop loss mais amplo e mais baixo para proteger contra diferenças de preço.
  3. O preço de stop loss deve ser calculado de acordo com o método de classificação do preço de stop loss.
  4. Utilização em combinação com indicadores de tendência e volatilidade.

Orientações para a otimização

  1. Ajustar a linha de stop loss final em variação percentual, o que pode acompanhar melhor os movimentos dos preços em diferentes níveis de preços.

  2. Adicionar métricas de volatilidade para suspender o stop loss de trailing quando se depara com alta volatilidade, evitando que as flutuações normais desencadeem o stop loss.

  3. Optimize automaticamente os parâmetros por meio de aprendizado de máquina.

  4. Adicionar critérios de posição aberta com consideração de indicadores como tendência, suporte e resistência para evitar a abertura de posições em mercados variados.

Conclusão

A estratégia dinâmica de stop loss de trail estabelece linhas de stop loss de trail através de um mecanismo de stop loss de linha dupla para confirmar a stop loss e ajustar a stop loss de trail com base nas mudanças de preço. Ela pode ajustar automaticamente a distância de stop loss para bloquear lucros, reduzir pullbacks e controlar perdas. Com operação simples e implementação fácil, essa estratégia pode ser otimizada ainda mais com base nas condições do mercado e usada junto com outras estratégias para melhor desempenho. Mas também tem algumas limitações. É aconselhável melhorá-la e testá-la suficientemente antes de aplicá-la na negociação ao vivo.


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




Mais.