Estrategia de stop loss dinámico basada en la brecha de precios


Fecha de creación: 2023-11-28 13:53:16 Última modificación: 2023-11-28 13:53:16
Copiar: 0 Número de Visitas: 655
1
Seguir
1617
Seguidores

Estrategia de stop loss dinámico basada en la brecha de precios

Descripción general

La estrategia utiliza el principio de intervalo de precios, comprando y estableciendo órdenes de stop loss y stop sell cuando se rompe el punto más bajo para rastrear el mínimo precio de stop loss y obtener ganancias.

Principio de estrategia

Cuando el precio cae por debajo del punto más bajo en las últimas N horas, el intervalo de posicionamiento se realiza de acuerdo con el porcentaje establecido, mientras que el stop loss y el stop order se establecen. Luego, se mueve la línea de stop loss y la línea de stop stop según el mercado. La lógica específica es la siguiente:

  1. Calcula el punto más bajo en N horas como precio de la fijación
  2. El precio en tiempo real es inferior al precio fijo multiplicado por el porcentaje de configuración de compra para hacer más entrada
  3. El precio de entrada multiplicado por el porcentaje de venta de la fijación de la parada
  4. Establezca el Stop Loss solo como el precio de entrada menos el precio de entrada multiplicado por el porcentaje de Stop Loss
  5. Número múltiple como porcentaje de participación en la estrategia
  6. Seguimiento de la línea de stop loss móvil en el precio mínimo
  7. Detener el cierre o el cierre de la posición

Análisis de las ventajas estratégicas

La estrategia tiene las siguientes ventajas:

  1. La idea de la brecha de precios para entrar en el juego cuando se rompen los puntos bajos y aumentar la ganancia
  2. El seguimiento automático del stop loss puede bloquear la mayor parte de las ganancias
  3. Porcentaje de Stop Loss Configurable para adaptarse a diferentes mercados
  4. Aplicable a las variedades con características de retroceso evidentes
  5. Funcionalidad simple y fácil de implementar

Análisis de riesgos estratégicos

La estrategia también tiene sus riesgos:

  1. La brecha no siempre es exitosa, puede que se vuelva a explorar
  2. La configuración inadecuada de la parada o el frenado puede causar una parada prematura o una mayor pérdida de frenado.
  3. Optimizar periódicamente los parámetros para adaptarse a los cambios en el mercado
  4. Variedades limitadas, puede no ser eficaz para algunas variedades
  5. Existe cierta necesidad de intervención humana

Dirección de optimización de la estrategia

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

  1. Aumento de algoritmos de aprendizaje automático para optimizar los parámetros
  2. Aumentar el número de paradas de pérdidas, como paradas móviles y paradas de suspensión.
  3. Optimización de la lógica de la parada de pérdidas para una parada de pérdidas más inteligente y fluida
  4. Combinado con más indicadores para determinar la fiabilidad de la señal, se filtran las señales falsas.
  5. Ampliar el uso de más variedades y mejorar la universalidad de las estrategias

Resumir

En general, esta estrategia es una estrategia simple y efectiva de seguimiento y detención de pérdidas basada en la idea de la brecha de precios. Reduce la probabilidad de entrada errónea, puede bloquear los beneficios de manera efectiva, y hay mucho espacio para optimización en términos de optimización de parámetros y filtración, que vale la pena investigar y mejorar.

Código Fuente de la Estrategia
/*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)