Estrategia de suspensión de pérdidas en dos etapas

El autor:¿ Qué pasa?, Fecha: 2023-10-25 18:11:30
Las etiquetas:

img

Resumen general

La idea principal de esta estrategia es establecer dos objetivos de ganancia y mover el stop loss al precio de entrada después de que se alcance el primer objetivo para evitar la caza de stop loss.

Estrategia lógica

Esta estrategia entra en operaciones basadas en bandas de Bollinger e indicadores estocásticos.

Específicamente, la lógica de entrada es:

  1. Introduzca largo cuando el cierre está por debajo de la banda inferior de Bollinger y el Stochastic K cruza por debajo de D.

  2. Entrar en corto cuando el cierre está por encima de la banda superior de Bollinger y el K estocástico cruza por encima de D.

La estrategia establece dos objetivos de rentabilidad, el TP1 fijado en 200 puntos y el TP2 fijado en 500 puntos.

Cuando el precio se mueve y se activa TP1, la estrategia moverá el stop loss al precio de entrada. Esto bloquea la ganancia desde la primera etapa y evita la caza de stop loss.

La estrategia cierra todas las posiciones cuando se activa TP2 o stop loss.

Análisis de ventajas

La mayor ventaja de este enfoque de stop loss de dos etapas es que permite bloquear las ganancias al tiempo que evita la caza de stop loss.

Otra ventaja es la combinación de bandas de Bollinger para medir el rango de volatilidad y el estocástico para sobrecompras/sobreventos que permite entradas más precisas.

Análisis de riesgos

Los principales riesgos provienen de posibles señales falsas de las bandas de Bollinger y los indicadores estocásticos.

También existe el riesgo de que el stop loss vuelva a cazarse después de pasar al precio de entrada.

Estos riesgos pueden reducirse optimizando los parámetros de ambos indicadores y aumentando la distancia entre las pérdidas de parada.

Direcciones de optimización

Otras optimizaciones para esta estrategia:

  1. Prueba diferentes combinaciones de parámetros para encontrar parámetros óptimos de Bollinger y Estocástico.

  2. Prueba diferentes objetivos de ganancias/pérdidas para encontrar configuraciones ideales.

  3. Añadir otros indicadores como promedios móviles para crear sistemas de múltiples indicadores para una mayor precisión.

  4. Investiga la lógica alternativa de posicionamiento de stop loss, como la distancia fija desde la entrada en lugar del precio de entrada en sí.

  5. Aumentar las ocurrencias de movimiento de stop loss a 3 o más etapas.

Conclusión

Esta estrategia utiliza bandas de Bollinger y estocástico para las entradas, establece dos objetivos de toma de ganancias y mueve la stop loss a la entrada después de que se alcanza el primer objetivo para formar una stop loss de dos etapas. Esto bloquea efectivamente las ganancias y evita la caza de stop loss. La estrategia tiene claras ventajas, pero también margen para mejoras a través de la optimización de parámetros, sistemas de múltiples indicadores y ajustes de lógica 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)

Más.