Estrategia de suspensión de pérdidas basada en las brechas de precios

El autor:¿ Qué pasa?, Fecha: 2023-11-28 13:53:16
Las etiquetas:

img

Resumen general

Esta estrategia adopta el principio de diferencia de precios para ir largo cuando el precio rompe los mínimos recientes, con órdenes de stop loss y take profit para seguir el precio más bajo para obtener ganancias.

Estrategia lógica

Identifica las brechas cuando el precio se rompe por debajo del precio más bajo en N horas recientes, va largo basado en el porcentaje configurado, con órdenes de stop loss y take profit.

  1. Calcular el precio más bajo en N horas recientes como precio vinculante
  2. Ir largo cuando el precio en tiempo real está por debajo del precio vinculante * comprar el porcentaje
  3. Se establecen las ganancias basadas en el precio de entrada * el porcentaje de venta
  4. El importe de las pérdidas de liquidación se calcula en función de las pérdidas de liquidación.
  5. El tamaño de la posición es el porcentaje del capital de la estrategia
  6. Línea de pérdida de trazado con el precio más bajo
  7. Posiciones cerradas cuando se activa la opción de obtener ganancias o stop loss

Análisis de ventajas

Las ventajas de esta estrategia:

  1. Utilice el concepto de diferencia de precios, mejore la tasa de ganancia
  2. Detención automática de pérdidas para obtener la mayor parte de las ganancias
  3. Porcentaje de pérdida de detención y ganancia personalizable para diferentes mercados
  4. Funciona bien para instrumentos con rebotes obvios
  5. Lógica sencilla y fácil de implementar

Análisis de riesgos

También hay algunos riesgos:

  1. La ruptura de brechas puede fallar con mínimos más bajos
  2. Las configuraciones incorrectas de stop loss o take profit pueden causar una salida prematura
  3. Requerir ajustes periódicos de parámetros para los cambios del mercado
  4. Los instrumentos limitados de aplicación pueden no funcionar para algunos
  5. Intervención manual necesaria de vez en cuando

Direcciones de optimización

La estrategia puede mejorarse en los siguientes aspectos:

  1. Añadir modelos de aprendizaje automático para ajuste automático de parámetros
  2. Añadir más tipos de órdenes de stop loss/take profit, por ejemplo, órdenes de stop loss de seguimiento, órdenes entre paréntesis
  3. Optimizar la lógica stop loss/take profit para salidas más inteligentes
  4. Incorpore más indicadores para filtrar señales falsas
  5. Extensión a más instrumentos para mejorar la universalidad

Conclusión

En conclusión, esta es una estrategia de stop loss simple y efectiva basada en las brechas de precios. Reduce las entradas falsas y bloquea las ganancias de manera efectiva. Todavía hay mucho espacio para mejoras en la sintonización de parámetros y el filtrado de señales. Merece más investigación y refinamiento.


/*backtest
start: 2022-11-21 00:00:00
end: 2023-11-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title="Squeeze Backtest by Shaqi v1.0", overlay=true, pyramiding=0, currency="USD", process_orders_on_close=true, commission_type=strategy.commission.percent, commission_value=0.075, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, backtest_fill_limits_assumption=0)
strategy.risk.allow_entry_in(strategy.direction.long)

R0 = "6 Hours"
R1 = "12 Hours"
R2 = "24 Hours"
R3 = "48 Hours"
R4 = "1 Week"
R5 = "2 Weeks"
R6 = "1 Month"
R7 = "Maximum"


buyPercent = input( title="Buy, %",         type=input.float,   defval=3,       minval=0.01,                        step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
sellPercent = input(title="Sell, %",        type=input.float,   defval=1,       minval=0.01,                        step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
stopPercent = input(title="Stop Loss, %",   type=input.float,   defval=1,       minval=0.01,        maxval=100,     step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
isMaxBars = input(  title="Max Bars To Sell",               type=input.bool,    defval=true ,                                   inline="MaxBars",   group="Squeeze Settings")
maxBars = input(    title="",       type=input.integer, defval=2,     minval=0,           maxval=1000, step=1,                  inline="MaxBars",   group="Squeeze Settings")
bind = input(       title="Bind",           type=input.source,  defval=close,                                                                       group="Squeeze Settings")
isRange = input(    title="Fixed Range",               type=input.bool,    defval=true,                                         inline="Range",     group="Backtesting Period")
rangeStart = input( title="",                       defval=R4,      options=[R0, R1, R2, R3, R4, R5, R6, R7],                   inline="Range",     group="Backtesting Period")
periodStart = input(title="Backtesting Start", type=input.time,    defval=timestamp("01 Aug 2021 00:00 +0000"),                                     group="Backtesting Period")
periodEnd = input(  title="Backtesting End",   type=input.time,    defval=timestamp("01 Aug 2022 00:00 +0000"),                                     group="Backtesting Period")

int startDate = na
int endDate = na
if isRange
    if rangeStart == R0
        startDate := timenow - 21600000
        endDate := timenow
    else if rangeStart == R1
        startDate := timenow - 43200000
        endDate := timenow
    else if rangeStart == R2
        startDate := timenow - 86400000
        endDate := timenow
    else if rangeStart == R3
        startDate := timenow - 172800000
        endDate := timenow
    else if rangeStart == R4
        startDate := timenow - 604800000
        endDate := timenow
    else if rangeStart == R5
        startDate := timenow - 1209600000
        endDate := timenow
    else if rangeStart == R6
        startDate := timenow - 2592000000
        endDate := timenow
    else if rangeStart == R7
        startDate := time
        endDate := timenow
else 
    startDate := periodStart
    endDate := periodEnd

afterStartDate = (time >= startDate)
beforeEndDate = (time <= endDate)
notInTrade = strategy.position_size == 0
inTrade = strategy.position_size > 0

barsFromEntry = barssince(strategy.position_size[0] > strategy.position_size[1])
entry = strategy.position_size[0] > strategy.position_size[1]
entryBar = barsFromEntry == 0
notEntryBar = barsFromEntry != 0
buyLimitPrice = bind - bind * buyPercent
buyLimitFilled = low <= buyLimitPrice
sellLimitPriceEntry = buyLimitPrice * (1 + sellPercent)
sellLimitPrice = strategy.position_avg_price * (1 + sellPercent)

stopLimitPriceEntry = buyLimitPrice - buyLimitPrice * stopPercent
stopLimitPrice = strategy.position_avg_price - strategy.position_avg_price * stopPercent

if afterStartDate and beforeEndDate and notInTrade
    strategy.entry("BUY", true, limit = buyLimitPrice)
    strategy.exit("INSTANT", limit = sellLimitPriceEntry, stop = stopLimitPriceEntry)
strategy.cancel("INSTANT", when = inTrade)
if isMaxBars
    strategy.close("BUY", when = barsFromEntry >= maxBars, comment = "Don't Sell")
strategy.exit("SELL", limit = sellLimitPrice, stop = stopLimitPrice)

showStop = stopPercent <= 0.03

plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", style=plot.style_linebr, color=color.red, linewidth=1)
plot(sellLimitPrice, title="Take Profit Limit Order", style=plot.style_linebr, color=color.purple, linewidth=1)
plot(strategy.position_avg_price, title="Buy Order Filled Price", style=plot.style_linebr, color=color.blue, linewidth=1)
plot(buyLimitPrice, title="Trailing Buy Limit Order", style=plot.style_stepline, color=color.new(color.blue, 30), offset=1)



Más.