Estrategia de inversión de rango de hibernación


Fecha de creación: 2023-10-30 10:54:00 Última modificación: 2023-10-30 10:54:00
Copiar: 1 Número de Visitas: 569
1
Seguir
1617
Seguidores

Estrategia de inversión de rango de hibernación

Descripción general

La estrategia de reversión de la franja de reposo utiliza los períodos de baja volatilidad de los precios como una señal para construir posiciones y obtener posiciones de equilibrio de ganancias cuando la volatilidad de los precios vuelve a subir. Identifica situaciones en las que los precios están limitados a una franja de reposo de estrecha oscilación para capturar una tendencia de precios que está a punto de estallar.

Principio de estrategia

La estrategia identifica primero el rango de inactividad, es decir, cuando el precio se encuentra dentro del rango de precios del día anterior. Esto indica que la volatilidad actual ha disminuido en los días anteriores. Comparamos el precio más alto del día de negociación actual con el precio más alto de n días antes (generalmente 4 días) y comparamos el precio más bajo del día de negociación actual con el precio más bajo de n días antes para determinar si cumple con los requisitos del rango de inactividad.

Una vez que se ha confirmado el rango de inactividad, la estrategia abre dos ofertas simultáneas: una de compra cerca de la cima del rango y una de venta cerca de la baja del rango. Luego se espera que el precio rompa el rango de inactividad y continúe su carrera hacia arriba o hacia abajo. Si el precio rompe hacia arriba, la compra se activa para crear una posición de varios titulares; si se rompe hacia abajo, la venta se activa para crear una posición de titulares.

Una vez establecida la posición, la estrategia establece una orden de parada y una orden de parada. La orden de parada limita el riesgo a la baja y la orden de parada se utiliza para cerrar una posición después de obtener ganancias. La orden de parada está a una distancia proporcional del precio de entrada, esta proporción está establecida por los parámetros de gestión de riesgo. La orden de parada está a una distancia proporcional del precio de entrada en reposo, ya que esperamos que la magnitud del movimiento de precios sea equivalente a la tasa de fluctuación anterior.

Finalmente, la estrategia también incluye un módulo de gestión de fondos: ajustar el volumen de capital de los pedidos de negociación a través de un método de multiplicador fijo, aumentar la utilización de fondos en caso de ganancias y reducir el riesgo en caso de pérdidas.

Análisis de las ventajas

Esta estrategia tiene las siguientes ventajas:

  1. Utiliza el tiempo de baja volatilidad como una señal para construir posiciones, para capturar oportunidades antes de que se produzca una tendencia de precios.

  2. Al mismo tiempo, se puede establecer una orden de negociación bidireccional multi-espacio para capturar tendencias al alza o a la baja.

  3. El uso de una estrategia de stop-loss para controlar el riesgo de una sola transacción.

  4. La aplicación de la gestión de fondos de multiplicador fijo puede mejorar la eficiencia en el uso de los fondos.

  5. La lógica de la estrategia es simple, clara y fácil de implementar.

Análisis de riesgos

La estrategia también tiene algunos riesgos a tener en cuenta:

  1. Riesgo de error en la determinación de la dirección de la ruptura de la franja de reposo. El precio puede no tener una ruptura ascendente o descendente clara, lo que lleva a errores en la dirección de entrada.

  2. Riesgo de no poder continuar con la operación de dirección después de la ruptura. La ruptura es solo una reversión a corto plazo.

  3. Riesgo de que se rompa el límite de pérdidas.

  4. El método de multiplicador fijo aumenta el riesgo de pérdidas y expansión de la hipoteca. Se puede reducir el valor del multiplicador fijo para reducir el riesgo.

  5. Los parámetros mal configurados pueden hacer que la estrategia no funcione bien.

Dirección de optimización

La estrategia también puede ser optimizada en los siguientes aspectos:

  1. Aumentar las señales de filtro de brecha y desviación para evitar errores de brecha.

  2. Mejorar las estrategias de stop loss, como el stop loss móvil, el stop loss en línea, etc.

  3. Aumentar los indicadores de tendencia y evitar el cambio de tendencia.

  4. Optimización de los valores de las multiplicadoras fijas para equilibrar el ratio de ganancias y pérdidas.

  5. Combinado con análisis de varios períodos de tiempo, mejora la probabilidad de ganancias.

  6. Optimización automática de los parámetros mediante métodos de aprendizaje automático.

Resumir

La estrategia de reversión de la tendencia en reposo tiene una idea general clara y un cierto potencial de ganancias. Se puede mejorar aún más la estabilidad de la estrategia a través de la optimización de parámetros, la gestión de riesgos y el filtrado de señales. Sin embargo, cualquier estrategia de reversión de tendencia conlleva ciertos riesgos.

Código Fuente de la Estrategia
/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 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/
// © gsanson66


//This code is based on the Narrow Range strategy
//Interactive Broker fees are applied on this strategy
//@version=5
strategy("NARROW RANGE BACKTESTING", shorttitle="NR BACKTESTING", overlay=true, initial_capital=1000, default_qty_type=strategy.fixed, commission_type=strategy.commission.percent, commission_value=0.18)


//--------------------------------FUNCTIONS------------------------------------//

//@function to print label
debugLabel(txt, color) =>
    label.new(bar_index, high, text = txt, color=color, style = label.style_label_lower_right, textcolor = color.black, size = size.small)

//@function which looks if the close date of the current bar falls inside the date range
inBacktestPeriod(start, end) => (time >= start) and (time <= end)


//--------------------------------USER INPUTS------------------------------------//

//Narrow Range Length 
nrLength = input.int(4, minval=2, title="Narrow Range Length", group="Strategy parameters")
//Risk Management
stopLossInput = input.float(0.5, title="Stop Loss (in percentage of reference range)", group="Strategy parameters")
//Money Management
fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management")
increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management")
//Backtesting period
startDate = input(title="Start Date", defval=timestamp("1 Janv 2020 00:00:00"), group="Backtesting Period")
endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period")


//--------------------------------VARIABLES INITIALISATION--------------------------//
strategy.initial_capital = 50000
bool nr = na
var bool long = na
var bool short = na
var float stopPriceLong = na
var float stopLossLong = na
var float takeProfitLong = na
var float stopPriceShort = na
var float stopLossShort = na
var float takeProfitShort = na
var float takeProfit = na
var float stopLoss = na
bool inRange = na
int closedtrades = strategy.closedtrades
equity = math.abs(strategy.equity - strategy.openprofit)
var float capital_ref = strategy.initial_capital
var float cashOrder = strategy.initial_capital * 0.95


//------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------//

//Checking if the date belong to the range
inRange := true

//Checking performances of the strategy
if equity > capital_ref + fixedRatio
    spread = (equity - capital_ref)/fixedRatio
    nb_level = int(spread)
    increasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder + increasingOrder
    capital_ref := capital_ref + nb_level*fixedRatio
if equity < capital_ref - fixedRatio
    spread = (capital_ref - equity)/fixedRatio
    nb_level = int(spread)
    decreasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder - decreasingOrder
    capital_ref := capital_ref - nb_level*fixedRatio

//We check if a trade has been closed to cancel all previous orders
if closedtrades > closedtrades[1]
    strategy.cancel("Long")
    strategy.cancel("Short")
    stopPriceLong := na
    stopPriceShort := na

//Checking if we close all trades in case where we exit the backtesting period
if strategy.position_size!=0 and not inRange
    debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116))
    strategy.close_all()
    long := na
    short := na
    stopPriceLong := na
    stopLossLong := na
    takeProfitLong := na
    stopPriceShort := na
    stopLossShort := na
    takeProfitShort := na
    takeProfit := na
    stopLoss := na

//----------------------------------FINDING NARROW RANGE DAY------------------------------------------//

// We find the Narrow Range Day
if low > low[nrLength] and high < high[nrLength]
    nr := true 


//------------------------------------STOP ORDERS--------------------------------------------//

// We handle plotting of stop orders and cancellation of other side order if one order is triggered
if strategy.position_size > 0 and not na(stopPriceLong) and not na(stopPriceShort)
    long := true
    strategy.cancel("Short")
    stopPriceLong := na
    stopPriceShort := na
    takeProfit := takeProfitLong
    stopLoss := stopLossLong
if strategy.position_size < 0 and not na(stopPriceLong) and not na(stopPriceShort)
    short := true
    strategy.cancel("Long") 
    stopPriceLong := na
    stopPriceShort := na
    takeProfit := takeProfitShort
    stopLoss := stopLossShort


//------------------------------------STOP LOSS & TAKE PROFIT--------------------------------//

// If an order is triggered we plot TP and SL
if not na(takeProfit) and not na(stopLoss) and long
    if high >= takeProfit and closedtrades == closedtrades[1] + 1
        takeProfit := na
        stopLoss := na
        long := na
    if low <= stopLoss and closedtrades == closedtrades[1] + 1
        takeProfit := na
        stopLoss := na
        long := na
if not na(takeProfit) and not na(stopLoss) and short
    if high >= stopLoss and closedtrades == closedtrades[1] + 1
        takeProfit := na
        stopLoss := na
        short := na
    if low <= takeProfit and closedtrades == closedtrades[1] + 1
        takeProfit := na
        stopLoss := na
        short := na


//-----------------------------LONG/SHORT CONDITION-------------------------//

// Conditions to create two stop orders (one for Long and one for Short) and SL & TP calculation
if nr and inRange and strategy.position_size == 0
    stopPriceLong := high[4]
    takeProfitLong := high[4] + (high[4] - low[4])
    stopLossLong := high[4] - (high[4] - low[4])*stopLossInput
    qtyLong = cashOrder/stopPriceLong
    strategy.entry("Long", strategy.long, qtyLong, stop=stopPriceLong)
    strategy.exit("Exit Long", "Long", limit=takeProfitLong ,stop=stopLossLong)
    stopPriceShort := low[4]
    takeProfitShort := low[4] - (high[4] - low[4])
    stopLossShort := low[4] + (high[4] - low[4])*stopLossInput
    qtyShort = cashOrder/stopPriceShort
    strategy.entry("Short", strategy.short, qtyShort, stop=stopPriceShort)
    strategy.exit("Exit Short", "Short", limit=takeProfitShort ,stop=stopLossShort)


//--------------------------PLOTTING ELEMENT----------------------------//

plotshape(nr, "NR", shape.arrowdown, location.abovebar, color.rgb(255, 132, 0), text= "NR4", size=size.huge)
plot(stopPriceLong, "Stop Order", color.blue, 3, plot.style_linebr)
plot(stopPriceShort, "Stop Order", color.blue, 3, plot.style_linebr)
plot(takeProfit, "Take Profit", color.green, 3, plot.style_linebr)
plot(stopLoss, "Stop Loss", color.red, 3, plot.style_linebr)