Estratégia de paragem de perdas em duas fases

Autora:ChaoZhang, Data: 2023-10-25 18:11:30
Tags:

img

Resumo

A ideia principal desta estratégia é definir duas metas de lucro e mover o stop loss para o preço de entrada após o primeiro objetivo ser atingido para evitar a caça de stop loss.

Estratégia lógica

Esta estratégia entra em negociações baseadas em Bandas de Bollinger e indicadores estocásticos.

Especificamente, a lógica de entrada é:

  1. Entrar em longo quando o fechamento estiver abaixo da faixa inferior de Bollinger e o Stochastic K cruzar abaixo de D.

  2. Entrar em curto quando o close estiver acima da banda superior de Bollinger e o Stochastic K cruzar acima de D.

A estratégia estabelece dois objetivos de lucro, o TP1 fixado em 200 pontos e o TP2 fixado em 500 pontos.

Quando o preço se move e o TP1 é acionado, a estratégia move o stop loss para o preço de entrada.

A estratégia fecha todas as posições quando o TP2 ou o stop loss é acionado.

Análise das vantagens

A maior vantagem desta abordagem de stop loss em dois estágios é que permite bloquear os lucros, evitando a caça de stop loss.

Outra vantagem é a combinação de Bandas de Bollinger para medir a faixa de volatilidade e Stochastic para sobrecompra/supervenda que permite entradas mais precisas.

Análise de riscos

Os principais riscos derivam de possíveis sinais falsos de Bandas de Bollinger e indicadores estocásticos.

Há também o risco de o stop loss ser caçado novamente após a mudança para o preço de entrada.

Estes riscos podem ser reduzidos através da otimização dos parâmetros para ambos os indicadores e do aumento da distância entre as perdas de parada.

Orientações de otimização

Outras optimizações desta estratégia:

  1. Teste diferentes combinações de parâmetros para encontrar parâmetros Bollinger e Estocásticos ideais.

  2. Teste diferentes metas de lucro/perda para encontrar configurações ideais.

  3. Adicione outros indicadores como médias móveis para criar sistemas de múltiplos indicadores para maior precisão.

  4. Pesquise uma lógica alternativa de posicionamento de stop loss, como distância fixa da entrada em vez do preço de entrada em si.

  5. Aumentar as ocorrências de movimentos de stop loss para 3 ou mais estágios.

Conclusão

Esta estratégia usa Bandas de Bollinger e Estocástico para as entradas, define duas metas de lucro e move o stop loss para a entrada após o primeiro alvo atingido para formar um stop loss de dois estágios. Isso bloqueia efetivamente os lucros e impede a caça de stop loss.


/*backtest
start: 2022-10-18 00:00:00
end: 2023-10-24 00:00:00
period: 1d
basePeriod: 1h
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/
// © fpsd4ve

//@version=5

// Add Bollinger Bands indicator (close, 20, 2) manually to visualise trading conditions
strategy("2xTP, SL to entry", 
     overlay=false,
     pyramiding=0,
     calc_on_every_tick=false,
     default_qty_type=strategy.percent_of_equity,
     default_qty_value=25,
     initial_capital=1000,
     commission_type=strategy.commission.percent,
     commission_value=0.01
     )

// PARAMETERS
// Assumes quote currency is FIAT as with BTC/USDT pair
tp1=input.float(200, title="Take Profit 1")
tp2=input.float(500, title="Take Profit 2")
sl=input.float(200, title="Stop Loss")
stOBOS = input.bool(true, title="Use Stochastic overbought/oversold threshold")

// Colors
colorRed = #FF2052
colorGreen = #66FF00


// FUNCTIONS
// Stochastic
f_stochastic() =>
    stoch = ta.stoch(close, high, low, 14)
    stoch_K = ta.sma(stoch, 3)
    stoch_D = ta.sma(stoch_K, 3)
    stRD = ta.crossunder(stoch_K, stoch_D)
    stGD = ta.crossover(stoch_K, stoch_D)
    [stoch_K, stoch_D, stRD, stGD]


// VARIABLES
[bbMiddle, bbUpper, bbLower] = ta.bb(close, 20, 2)
[stoch_K, stoch_D, stRD, stGD] = f_stochastic()


// ORDERS
// Active Orders
// Check if strategy has open positions
inLong = strategy.position_size > 0
inShort = strategy.position_size < 0
// Check if strategy reduced position size in last bar
longClose = strategy.position_size < strategy.position_size[1]
shortClose = strategy.position_size > strategy.position_size[1]

// Entry Conditions
// Enter long when during last candle these conditions are true:
// Candle high is greater than upper Bollinger Band
// Stochastic K line crosses under D line and is oversold
longCondition = stOBOS ?
     low[1] < bbLower[1] and stGD[1] and stoch_K[1] < 25 :
     low[1] < bbLower[1] and stGD[1]

// Enter short when during last candle these conditions are true:
// Candle low is lower than lower Bollinger Band
// Stochastic K line crosses over D line and is overbought
shortCondition = stOBOS ?
     high[1] > bbUpper[1] and stRD[1] and stoch_K[1] > 75 :
     high[1] > bbUpper[1] and stRD[1]

// Exit Conditions
// Calculate Take Profit 
longTP1 = strategy.position_avg_price + tp1
longTP2 = strategy.position_avg_price + tp2
shortTP1 = strategy.position_avg_price - tp1
shortTP2 = strategy.position_avg_price - tp2

// Calculate Stop Loss
// Initialise variables
var float longSL = 0.0
var float shortSL = 0.0

// When not in position, set stop loss using close price which is the price used during backtesting
// When in a position, check to see if the position was reduced on the last bar
// If it was, set stop loss to position entry price. Otherwise, maintain last stop loss value
longSL := if inLong and ta.barssince(longClose) < ta.barssince(longCondition)
    strategy.position_avg_price
else if inLong
    longSL[1]
else
    close - sl

shortSL := if inShort and ta.barssince(shortClose) < ta.barssince(shortCondition)
    strategy.position_avg_price
else if inShort
    shortSL[1]
else
    close + sl

// Manage positions
strategy.entry("Long", strategy.long, when=longCondition)
strategy.exit("TP1/SL", from_entry="Long", qty_percent=50, limit=longTP1, stop=longSL)
strategy.exit("TP2/SL", from_entry="Long", limit=longTP2, stop=longSL)

strategy.entry("Short", strategy.short, when=shortCondition)
strategy.exit("TP1/SL", from_entry="Short", qty_percent=50, limit=shortTP1, stop=shortSL)
strategy.exit("TP2/SL", from_entry="Short", limit=shortTP2, stop=shortSL)


// DRAW
// Stochastic Chart
plot(stoch_K, color=color.blue)
plot(stoch_D, color=color.orange)

// Circles
plot(stOBOS ? stRD and stoch_K >= 75 ? stoch_D : na : stRD ? stoch_D : na, color=colorRed, style=plot.style_circles, linewidth=3)
plot(stOBOS ? stGD and stoch_K <= 25 ? stoch_D : na : stGD ? stoch_K : na, color=colorGreen, style=plot.style_circles, linewidth=3)

// Levels
hline(75, linestyle=hline.style_dotted)
hline(25, linestyle=hline.style_dotted)

Mais.