Melhor estratégia de trail stop

Autora:ChaoZhang, Data: 21 de janeiro de 2023 20:58:22
Tags:

Resumo

Esta estratégia usa um mecanismo de stop loss para mover o stop loss dinamicamente com base na faixa de flutuação do preço, alcançando paradas dinâmicas.

Estratégia lógica

A estratégia entra com base em cruzamento de MA duplo julgando a direção da tendência.

A inovação reside no projeto de stop loss:

  1. Uma linha de stop é definida e a trailing stop começa depois que o preço atravessa esta linha.

  2. A linha de stop loss segue baseada no parâmetro Percentagem, por exemplo, 3% de atraso significa 3% abaixo da última baixa.

  3. A posição é fechada quando o preço se inverte para tocar a linha de stop loss.

Isso garante que a parada irá seguir os lucros automaticamente, reduzindo a chance de parar quando o lucro ainda é bom.

Vantagens

  • Paragem automática de atraso em percentagem
  • A linha do gatilho evita a ativação prematura
  • O seguimento dinâmico protege os lucros
  • Evita parar devido a retracements curtos
  • Linha de desencadeamento e percentagem ajustáveis aos mercados

Riscos

  • O cruzamento MA pode apresentar atrasos, gerando sinais falsos
  • Configurações incorretas da linha de gatilho causam ativação prematura ou tardia
  • Configurações de percentagem incorretas dão paradas demasiado largas ou demasiado apertadas
  • Não é possível evitar completamente os riscos da serra
  • Os parâmetros devem ser otimizados para a volatilidade do mercado

Os riscos podem ser reduzidos:

  • Optimização dos períodos de MA para melhores entradas
  • Teste de diferentes valores do gatilho para melhor posicionamento
  • Reexame das percentagens ideais com base em tomadas históricas
  • Considerando a reentrada para evitar tendências perdidas
  • Adicionando filtros para evitar falhas

Orientações para a melhoria

A estratégia pode ser melhorada:

  1. Otimização dos períodos de dupla MA

  2. Otimizar ou remover linha de gatilho

    Iniciar directamente o seguimento ou utilizar valores diferentes para produtos diferentes

  3. Teste de diferentes valores percentuais de atraso

    Encontrar valores ideais para diferentes produtos

  4. Adição de regras de reentrada

    Definição das condições de reentrada após a parada

  5. Ajuste da rigidez de suspensão por volatilidade

    Paradas mais amplas em ambientes de volatilidade aumentada

Resumo

Esta estratégia usa uma parada percentual de trail com uma linha de gatilho antes da ativação. Este mecanismo dinâmico equilibra a proteção dos lucros e evita paradas desnecessárias com base nos movimentos do mercado. Mas os parâmetros precisam de otimização para diferentes produtos, além de filtros adicionais em entradas para melhorar a precisão. As reentradas também ajudam a evitar tendências perdidas após a parada prematura. Melhorias contínuas são necessárias para a adaptabilidade.


/*backtest
start: 2022-09-14 00:00:00
end: 2023-09-20 00:00:00
period: 2d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//@author=Daveatt

SystemName = "BEST Trailing Stop Strategy"
TradeId = "BEST"

InitCapital = 100000
InitPosition = 100
InitCommission = 0.075
InitPyramidMax = 1
CalcOnorderFills = true
CalcOnTick = true
DefaultQtyType = strategy.fixed
DefaultQtyValue = strategy.fixed
Precision = 2
Overlay=true


// strategy(title=SystemName, shorttitle=SystemName, overlay=Overlay, 
//  pyramiding=InitPyramidMax, initial_capital=InitCapital, default_qty_type=DefaultQtyType, default_qty_value=InitPosition, commission_type=strategy.commission.percent, 
//  commission_value=InitCommission, calc_on_order_fills=CalcOnorderFills, calc_on_every_tick=CalcOnTick, precision=2)


src = close
// Calculate moving averages
fastSMA = sma(close, 15)
slowSMA = sma(close, 45)

// Calculate trading conditions
enterLong  = crossover(fastSMA, slowSMA)
enterShort = crossunder(fastSMA, slowSMA)

// trend states
since_buy  = barssince(enterLong)
since_sell = barssince(enterShort)
buy_trend  = since_sell > since_buy
sell_trend = since_sell < since_buy 

change_trend = (buy_trend and sell_trend[1]) or (sell_trend and buy_trend[1])

//plot(buy_trend ? 1 : 0, title='buy_trend', transp=100)
//plot(sell_trend ? 1 : 0, title='sell_trend', transp=100)

// get the entry price
entry_price = valuewhen(enterLong or enterShort, close, 0)

// Plot moving averages
plot(series=fastSMA, color=color.teal)
plot(series=slowSMA, color=color.orange)

// Plot the entries
plotshape(enterLong, style=shape.circle, location=location.belowbar, color=color.green, size=size.small)
plotshape(enterShort, style=shape.circle, location=location.abovebar, color=color.red, size=size.small)



///////////////////////////////
//======[ Trailing STOP ]======//
///////////////////////////////

// use SL?
useSL = input(true, "Use stop Loss")
// Configure trail stop level with input
StopTrailPerc = input(title="Trail Loss (%)", type=input.float, minval=0.0, step=0.1, defval=3) * 0.01
// Will trigger the take profit trailing once reached
use_SL_Trigger = input(true, "Use stop Loss Trigger")
StopTrailTrigger   = input(2.0, "SL Trigger (%)",minval=0,step=0.5,type=input.float) * 0.01


StopLossPriceTrigger = 0.0
StopLossPriceTrigger := if (use_SL_Trigger)
    if buy_trend
        entry_price * (1 + StopTrailTrigger) 
    else
        entry_price * (1 - StopTrailTrigger)
else
    -1


var SL_Trigger_Long_HIT = false
SL_Trigger_Long_HIT := useSL and use_SL_Trigger and buy_trend and high >= StopLossPriceTrigger
 ? true : SL_Trigger_Long_HIT[1]


var SL_Trigger_Short_HIT = false
SL_Trigger_Short_HIT := useSL and use_SL_Trigger and sell_trend and low <= StopLossPriceTrigger
 ? true : SL_Trigger_Short_HIT[1]


display_long_SL_trigger     = useSL and buy_trend  and use_SL_Trigger 
 and SL_Trigger_Long_HIT == false and StopLossPriceTrigger != -1
display_short_SL_trigger    = useSL and sell_trend and use_SL_Trigger 
 and SL_Trigger_Short_HIT == false and StopLossPriceTrigger != -1
display_SL_trigger          = display_long_SL_trigger or display_short_SL_trigger

plot(display_SL_trigger ? StopLossPriceTrigger : na, title='SLPriceTrigger', transp=0, 
 color=color.maroon, style=plot.style_circles, linewidth=3)


// Determine trail stop loss prices
longStopPrice = 0.0, shortStopPrice = 0.0

longStopPrice := if useSL and buy_trend
    stopValue = low * (1 - StopTrailPerc)
    max(stopValue, longStopPrice[1])
else
    0

shortStopPrice := if useSL and sell_trend
    stopValue = high * (1 + StopTrailPerc)
    min(stopValue, shortStopPrice[1])
else
    999999

//////////////////////////////////////////////////////////////////////////////////////////
//*** STOP LOSS HIT CONDITIONS TO BE USED IN ALERTS  ***//
//////////////////////////////////////////////////////////////////////////////////////////

cond_long_stop_loss_hit  = useSL and buy_trend and crossunder(low, longStopPrice[1]) 
 and (SL_Trigger_Long_HIT or use_SL_Trigger == false)
cond_short_stop_loss_hit = useSL and sell_trend and crossover(high, shortStopPrice[1]) 
 and (SL_Trigger_Short_HIT or use_SL_Trigger == false)


// Plot stop loss values for confirmation
plot(series=useSL and buy_trend and low >= longStopPrice 
 and (SL_Trigger_Long_HIT or use_SL_Trigger == false)
 ? longStopPrice : na,
 color=color.fuchsia, style=plot.style_cross,
 linewidth=2, title="Long Trail Stop")

plot(series=useSL and sell_trend and high <= shortStopPrice 
 and (SL_Trigger_Short_HIT or use_SL_Trigger == false)
 ? shortStopPrice : na,
 color=color.fuchsia, style=plot.style_cross,
 linewidth=2, title="Short Trail Stop")

close_long  = cond_long_stop_loss_hit
close_short = cond_short_stop_loss_hit

// Submit entry orders
strategy.entry(TradeId + " L", long=true, when=enterLong)
strategy.close(TradeId + " L", when=close_long)

//if (enterShort)
strategy.entry(TradeId + " S", long=false, when=enterShort)
strategy.close(TradeId + " S", when=close_short)


if change_trend
    SL_Trigger_Long_HIT := false
    SL_Trigger_Short_HIT := false


Mais.