En la carga de los recursos... Cargando...

Transformador de prueba de retroceso v2.0

El autor:¿ Qué pasa?, Fecha: 2024-04-28 14:09:26
Las etiquetas:

img

Resumen general

Squeeze Backtest Transformer v2.0 es un sistema de negociación cuantitativo basado en una estrategia de compresión. Al establecer parámetros como entrada, stop loss, porcentajes de ganancias y tiempo máximo de retención, prueba la estrategia dentro de un intervalo de tiempo específico. La estrategia admite negociación multidireccional y puede establecer flexiblemente la dirección de negociación a largo o corto. Al mismo tiempo, la estrategia también proporciona opciones ricas para establecer el período de backtest, que puede seleccionar fácilmente un intervalo de tiempo fijo o el tiempo máximo de backtest.

Principio de la estrategia

  1. En primer lugar, se determinará la hora de inicio y de finalización de la prueba de retroceso en función de los parámetros del período de prueba de retroceso establecidos por el usuario.
  2. Durante el período de backtest, si no existe una posición actual y el precio alcanza el precio de entrada (calculado sobre la base del porcentaje de apertura), abrir una posición y establecer los precios de stop loss y take profit (calculados sobre la base de los porcentajes de stop loss y take profit) al mismo tiempo.
  3. Si una posición ya está mantenida, cancelar las órdenes anteriores de obtener ganancias y detener pérdidas y restablecer los nuevos precios de obtener ganancias y detener pérdidas (calculados sobre la base del precio promedio de la posición actual).
  4. Si el tiempo máximo de retención está establecido, cuando el tiempo de retención alcance el valor máximo, se cerrará la posición por fuerza.
  5. La estrategia apoya el comercio tanto en direcciones largas como cortas.

Ventajas estratégicas

  1. Los parámetros flexibles pueden ajustarse de acuerdo con las diferentes condiciones del mercado y las necesidades comerciales.
  2. Apoyar el comercio multidireccional para obtener beneficios en diferentes condiciones de mercado.
  3. Proporcionar opciones ricas para establecer el período de backtest, que puede llevar a cabo fácilmente la prueba y el análisis de datos históricos.
  4. Los ajustes de stop loss y take profit pueden controlar los riesgos de manera efectiva y mejorar la eficiencia de la utilización del capital.
  5. La fijación de la duración máxima de la tenencia puede evitar mantener posiciones durante demasiado tiempo y enfrentar riesgos de mercado.

Riesgos estratégicos

  1. La configuración del precio de entrada, el precio de stop loss y el precio de take profit tiene un gran impacto en el rendimiento de la estrategia.
  2. Cuando el mercado fluctúa violentamente, se puede activar un stop loss inmediatamente después de abrir una posición, lo que resulta en pérdidas.
  3. Si el tiempo máximo de retención desencadena el cierre de una posición, puede perder la oportunidad de obtener ganancias posteriores.
  4. La estrategia puede no funcionar bien en algunas condiciones especiales de mercado (como un mercado lateral).

Dirección de optimización de la estrategia

  1. Considere la posibilidad de introducir más indicadores técnicos o indicadores del sentimiento del mercado para optimizar las condiciones de entrada, stop loss y take profit para mejorar la estabilidad y la rentabilidad de la estrategia.
  2. Para la fijación del tiempo máximo de retención, puede ajustarse dinámicamente en función de la volatilidad del mercado y de las ganancias y pérdidas de la posición para evitar el coste de oportunidad que puede suponer un cierre a tiempo fijo.
  3. Para las características del mercado lateral, se puede agregar una lógica como la confirmación de un avance de rango lateral o una inversión de tendencia para reducir el costo de las operaciones frecuentes.
  4. Considerar la posibilidad de añadir estrategias de gestión de posiciones y gestión de capital para controlar la exposición al riesgo de una sola transacción y mejorar la eficiencia y la estabilidad de la utilización del capital.

Resumen de las actividades

Squeeze Backtest Transformer v2.0 es un sistema de negociación cuantitativo basado en una estrategia de compresión que puede operar en diferentes entornos de mercado a través de configuraciones de parámetros flexibles y soporte de negociación multidireccional. Al mismo tiempo, las opciones de configuración de período de prueba de retroceso y las configuraciones de toma de ganancias y pérdidas pueden ayudar a los usuarios a realizar análisis de datos históricos y control de riesgos. Sin embargo, el rendimiento de la estrategia se ve muy afectado por la configuración de parámetros y necesita ser optimizado y mejorado en función de las características del mercado y las necesidades comerciales para mejorar la estabilidad y rentabilidad de la estrategia.


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

//@version=5

strategy(title="Squeeze Backtest by Shaqi v2.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)
R0 = "6 Hours"
R1 = "12 Hours"
R2 = "24 Hours"
R3 = "48 Hours"
R4 = "1 Week"
R5 = "2 Weeks"
R6 = "1 Month"
R7 = "Maximum"

BL = "low"
BH = "high"
BO = "open"
BC = "close"
BHL= "mid (hl)"
BOC = "mid (oc)"

LONG = "LONG"
SHORT = "SHORT"

direction = input.string(title="Direction", defval=LONG, options=[LONG, SHORT], group="Squeeze Settings")
strategy.risk.allow_entry_in(direction == LONG ? strategy.direction.long : strategy.direction.short)
openPercent = input.float(1.4, "Open, %", minval=0.01, maxval=100, step=0.1, inline="Percents", group="Squeeze Settings") * 0.01
closePercent = input.float(0.6, "Close, %", minval=0.01, maxval=100, step=0.1, inline="Percents", group="Squeeze Settings") * 0.01
stopPercent = input.float(0.8, "Stop Loss, %", minval=0.01, maxval=100, step=0.1, inline="Percents", group="Squeeze Settings") * 0.01
isMaxBars = input.bool(true, "Max Bars To Sell", inline="MaxBars", group="Squeeze Settings")
maxBars = input.int(10, title="", minval=0, maxval=1000, step=1, inline="MaxBars", group="Squeeze Settings")
bind = input.string(BC, "Bind", options=[BL, BH, BO, BC, BHL, BOC], group="Squeeze Settings")
isRange = input.bool(true, "Fixed Range", inline="Range", group="Backtesting Period")
rangeStart = input.string(R2, "", options=[R0, R1, R2, R3, R4, R5, R6, R7], inline="Range", group="Backtesting Period")
periodStart = input(timestamp("12 Apr 2024 00:00 +0000"), "Backtesting Start", group="Backtesting Period")
periodEnd = input(timestamp("20 Apr 2024 00:00 +0000"), "Backtesting End", 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
    
float bindOption = na
if bind == BL
    bindOption := low
else if bind == BH
    bindOption := high
else if bind == BO
    bindOption := open
else if bind == BC
    bindOption := close
else if bind == BHL
    bindOption := hl2
else
    bindOption := ohlc4

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

barsFromEntry = ta.barssince(strategy.position_size[0] > strategy.position_size[1])
entry = strategy.position_size[0] > strategy.position_size[1]
entryBar = barsFromEntry == 0
notEntryBar = barsFromEntry != 0
openLimitPrice = direction == LONG ? (bindOption - bindOption * openPercent) : (bindOption + bindOption * openPercent)

closeLimitPriceEntry = openLimitPrice * (direction == LONG ? 1 + closePercent : 1 - closePercent)
closeLimitPrice = strategy.position_avg_price * (direction == LONG ? 1 + closePercent : 1 - closePercent)

stopLimitPriceEntry = direction == LONG ? openLimitPrice - openLimitPrice * stopPercent : openLimitPrice + openLimitPrice * stopPercent
stopLimitPrice = direction == LONG ? strategy.position_avg_price - strategy.position_avg_price * stopPercent : strategy.position_avg_price + strategy.position_avg_price * stopPercent

if periodCondition and notInTrade
    strategy.entry(direction == LONG ? "BUY" : "SELL", direction == LONG ? strategy.long : strategy.short, limit = openLimitPrice, stop = stopLimitPriceEntry)
    strategy.exit("INSTANT", limit = closeLimitPriceEntry, stop = stopLimitPriceEntry, comment_profit = direction == LONG ? 'INSTANT SELL' : 'INSTANT BUY', comment_loss = 'INSTANT STOP')
if inTrade 
    strategy.cancel("INSTANT")
    strategy.exit(direction == LONG ? "SELL" : "BUY", limit = closeLimitPrice, stop = stopLimitPrice, comment_profit = direction == LONG ? "SELL" : "BUY", comment_loss = "STOP")
if isMaxBars and barsFromEntry == maxBars
    strategy.close_all(comment = "TIMEOUT STOP", immediately = true)



showStop = stopPercent <= 0.20

// plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", force_overlay=true, style=plot.style_linebr, color=#c50202, linewidth=1, offset=1)
// plot(closeLimitPrice, title="Take Profit Limit Order", force_overlay=true, style=plot.style_linebr, color = direction == LONG ? color.red : color.blue, linewidth=1, offset=1)
// plot(strategy.position_avg_price, title="Buy Order Filled Price", force_overlay=true, style=plot.style_linebr, color=direction == LONG ? color.blue : color.red, linewidth=1, offset=1)
plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", force_overlay=true, style=plot.style_linebr, color=#c50202, linewidth=1, offset=0)
plot(closeLimitPrice, title="Take Profit Limit Order", force_overlay=true, style=plot.style_linebr, color = direction == LONG ? color.red : color.blue, linewidth=1, offset=0)
plot(strategy.position_avg_price, title="Buy Order Filled Price", force_overlay=true, style=plot.style_linebr, color=direction == LONG ? color.blue : color.red, linewidth=1, offset=0)

plot(openLimitPrice, title="Trailing Open Position Limit Order", style=plot.style_stepline, color=color.new(direction == LONG ? color.blue : color.red, 30), offset=1)
plot(closeLimitPriceEntry, title="Trailing Close Position Limit Order", style=plot.style_stepline, color=color.new(direction == LONG ? color.red : color.blue, 80), offset=1)
plot(stopLimitPriceEntry, title="Trailing Stop Position Limit Order", style=plot.style_stepline, color=color.new(#c50202, 80), offset=1)



Más.