Paragem gradual com estratégia de captação parcial de lucros

Autora:ChaoZhang, Data: 2023-11-28 16:05:24
Tags:

img

Resumo

Esta é uma estratégia de saída que utiliza um stop de trail gradual com lucro parcial. Ele move o stop loss para o ponto de equilíbrio após atingir o primeiro nível de lucro e se move para o primeiro nível de lucro após atingir o segundo nível. Isso permite bloquear alguns lucros mantendo o potencial de lucro.

Estratégia lógica

Os principais componentes desta estratégia são:

  1. Definir um stop loss e 3 leva níveis de lucro em pontos.
  2. Definição de funções para calcular o lucro corrente em pontos e preço de stop loss.
  3. Definição de uma função para determinar a fase de lucro atual.
  4. Modificação do preço de stop loss com base no estágio de lucro para o preço de trail.

Especificamente, estabelece em primeiro lugar um stop loss de 100 pontos e obtém lucros em 100/200/300 pontos.curProfitInPtsA função calcula o lucro corrente com base no preço corrente e no preço de entrada.calcStopLossPriceA função calcula o preço de stop loss com base na distância do ponto.

A lógica chave está dentro dogetCurrentStageFunção que verifica se existe uma posição e se o lucro excedeu cada nível de lucro, avançando o estágio se for verdadeiro.

Por fim, o stop loss é modificado de acordo com a fase.

Análise das vantagens

As vantagens desta estratégia gradual de trailing stop:

  1. Permite a obtenção de alguns lucros, mantendo ainda o potencial de lucro.
  2. O trailing stop loss segue o preço e reduz a possibilidade de um drawdown.
  3. O controlo de lucro em várias etapas é melhor que o controlo de lucro em uma.
  4. Lógica simples e clara.

Análise de riscos

Há alguns riscos a considerar:

  1. A tomada gradual de lucro pode perder melhores oportunidades de saída, pode otimizar os níveis de lucro.
  2. Se a distância do trail stop for muito alta, o stop pode ser desencadeado prematuramente.
  3. A incapacidade de reduzir as perdas também pode levar a perdas maiores.

Optimização

Algumas formas de melhorar esta estratégia:

  1. Teste diferentes ganhos e distâncias de parada para otimizar parâmetros.
  2. Considerar mecanismos de stop loss rápidos para situações específicas.
  3. Usar indicadores técnicos para determinar metas de lucro e níveis de parada.
  4. Equilibrar saídas lucrativas e distâncias de parada.

/*backtest
start: 2023-11-20 00:00:00
end: 2023-11-27 00:00:00
period: 3m
basePeriod: 1m
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/
// © adolgov

// @description
// when tp1 is reached, sl is moved to break-even
// when tp2 is reached, sl is moved to tp1
// when tp3 is reached - exit

//@version=4
strategy("Stepped trailing strategy example", overlay=true)

// random entry condition
longCondition = crossover(sma(close, 14), sma(close, 28))
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

// sl & tp in points
sl = input(100)
tp1 = input(100)
tp2 = input(200)
tp3 = input(300)

curProfitInPts() =>
    if strategy.position_size > 0
        (high - strategy.position_avg_price) / syminfo.mintick
    else if strategy.position_size < 0
        (strategy.position_avg_price - low) / syminfo.mintick
    else
        0
        
calcStopLossPrice(OffsetPts) =>
    if strategy.position_size > 0
        strategy.position_avg_price - OffsetPts * syminfo.mintick
    else if strategy.position_size < 0
        strategy.position_avg_price + OffsetPts * syminfo.mintick
    else
        0
        
calcProfitTrgtPrice(OffsetPts) =>
    calcStopLossPrice(-OffsetPts)

getCurrentStage() =>
    var stage = 0
    if strategy.position_size == 0 
        stage := 0
    if stage == 0 and strategy.position_size != 0
        stage := 1
    else if stage == 1 and curProfitInPts() >= tp1
        stage := 2
    else if stage == 2 and curProfitInPts() >= tp2
        stage := 3
    stage

stopLevel = -1.
profitLevel = calcProfitTrgtPrice(tp3)

// based on current stage set up exit
// note: we use same exit ids ("x") consciously, for MODIFY the exit's parameters
curStage = getCurrentStage()
if curStage == 1
    stopLevel := calcStopLossPrice(sl)
    strategy.exit("x", loss = sl, profit = tp3, comment = "sl or tp3")
else if curStage == 2
    stopLevel := calcStopLossPrice(0)
    strategy.exit("x", stop = stopLevel, profit = tp3, comment = "breakeven or tp3")
else if curStage == 3
    stopLevel := calcStopLossPrice(-tp1)
    strategy.exit("x", stop = stopLevel, profit = tp3, comment = "tp1 or tp3")
else
    strategy.cancel("x")
    
// this is debug plots for visulalize TP & SL levels
plot(stopLevel > 0 ? stopLevel : na, style = plot.style_linebr)
plot(profitLevel > 0 ? profitLevel : na, style = plot.style_linebr)

Mais.