Estrategia de backtesting dinámico de múltiples marcos temporales


Fecha de creación: 2023-11-21 17:07:17 Última modificación: 2023-11-21 17:07:17
Copiar: 1 Número de Visitas: 698
1
Seguir
1617
Seguidores

Estrategia de backtesting dinámico de múltiples marcos temporales

Descripción general

La estrategia utiliza un mecanismo de retroceso dinámico de múltiples marcos temporales para determinar la tendencia de los precios y lograr un riesgo de arbitraje bajo al comparar los precios máximos y mínimos de diferentes períodos de tiempo.

Principio de estrategia

La estrategia obtiene los precios máximos nhigh y mínimos nlow de diferentes períodos de tiempo mediante la invocación de la función f_get_htfHighLow. Específicamente, la función security obtiene los precios máximos y mínimos de diferentes períodos de tiempo de acuerdo con la resolución de los períodos de tiempo, el multiplicador de los períodos de tiempo HTFMultiplier, los parámetros de retroceso lookahead y gaps, y la compensación de la desviación.

Por ejemplo, cuando la offset es 0, se obtiene el precio más alto y el precio más bajo de la línea K actual; cuando la offset es 1, se obtiene el precio más alto y el precio más bajo de la línea K anterior. Para determinar la dirección de la tendencia, compare los cambios de precio entre las dos líneas K.

Si el precio más alto sube y el precio más bajo sube, se juzga como una tendencia alcista; si el precio más alto baja y el precio más bajo baja, se juzga como una tendencia bajista. De acuerdo con la dirección de la tendencia, se hace un largo o corto, se realiza una negociación de arbitraje.

Ventajas estratégicas

  1. El uso de análisis de múltiples marcos de tiempo para mejorar la precisión de los juicios
  2. Aplicación de un mecanismo de retroceso dinámico para evitar el repainting
  3. Flexibilidad para ajustar diferentes combinaciones de parámetros y adaptarse a los cambios del mercado
  4. La estrategia es tomar posiciones solo cuando la tendencia es clara y controlar el riesgo.

Riesgo estratégico

  1. El riesgo de error en el juicio de múltiples marcos de tiempo
  2. La configuración incorrecta de los parámetros de regresión puede causar repainting
  3. La frecuencia de las transacciones puede ser excesiva, aumentando los costos de las transacciones y el riesgo de deslizamiento

La solución:

  1. Optimización de los parámetros del ciclo de tiempo para una mayor precisión de juicio
  2. Prueba rigurosa de los parámetros de retroceso y evita el repainting
  3. Ajuste adecuado de las condiciones de apertura de posiciones y control de la frecuencia de las operaciones

Dirección de optimización de la estrategia

  1. Añadir módulos de aprendizaje automático para evaluar las tendencias de la IA
  2. Ajuste dinámico de posiciones combinado con la volatilidad de los precios de las acciones
  3. Adherirse al mecanismo de suspensión de pérdidas para controlar el riesgo de pérdidas

Resumir

La estrategia tiene una idea general clara, utiliza un marco de tiempo múltiple para determinar la tendencia de los precios de las acciones de forma retroactiva y minimizar los errores de juicio humano. Es una estrategia de negociación programada típica.

Código Fuente de la Estrategia
/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-20 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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("HTF High/Low Repaint Strategy", overlay=true, initial_capital = 20000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01)

i_startTime = input(defval = timestamp("01 Jan 2010 00:00 +0000"), title = "Start Time", type = input.time)
i_endTime = input(defval = timestamp("01 Jan 2099 00:00 +0000"), title = "End Time", type = input.time)
inDateRange = true

resolution = input("3M", type=input.resolution)
HTFMultiplier = input(22, minval=1, step=1)
offset = input(0, minval=0, step=1)
lookahead = input(true)
gaps = false

f_secureSecurity_on_on(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_on, gaps=barmerge.gaps_on)
f_secureSecurity_on_off(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_on, gaps=barmerge.gaps_off)
f_secureSecurity_off_on(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_off, gaps=barmerge.gaps_on)
f_secureSecurity_off_off(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_off, gaps=barmerge.gaps_off)

f_multiple_resolution(HTFMultiplier) => 
    target_Res_In_Min = timeframe.multiplier * HTFMultiplier * (
      timeframe.isseconds   ? 1. / 60. :
      timeframe.isminutes   ? 1. :
      timeframe.isdaily     ? 1440. :
      timeframe.isweekly    ? 7. * 24. * 60. :
      timeframe.ismonthly   ? 30.417 * 24. * 60. : na)

    target_Res_In_Min     <= 0.0417       ? "1S"  :
      target_Res_In_Min   <= 0.167        ? "5S"  :
      target_Res_In_Min   <= 0.376        ? "15S" :
      target_Res_In_Min   <= 0.751        ? "30S" :
      target_Res_In_Min   <= 1440         ? tostring(round(target_Res_In_Min)) :
      tostring(round(min(target_Res_In_Min / 1440, 365))) + "D"

f_get_htfHighLow(resolution, HTFMultiplier, lookahead, gaps, offset)=>
    derivedResolution = resolution == ""?f_multiple_resolution(HTFMultiplier):resolution
    nhigh_on_on = f_secureSecurity_on_on(syminfo.tickerid, derivedResolution, high, offset) 
    nlow_on_on = f_secureSecurity_on_on(syminfo.tickerid, derivedResolution, low, offset)
    
    nhigh_on_off = f_secureSecurity_on_off(syminfo.tickerid, derivedResolution, high, offset) 
    nlow_on_off = f_secureSecurity_on_off(syminfo.tickerid, derivedResolution, low, offset)
    
    nhigh_off_on = f_secureSecurity_off_on(syminfo.tickerid, derivedResolution, high, offset) 
    nlow_off_on = f_secureSecurity_off_on(syminfo.tickerid, derivedResolution, low, offset)
    
    nhigh_off_off = f_secureSecurity_off_off(syminfo.tickerid, derivedResolution, high, offset) 
    nlow_off_off = f_secureSecurity_off_off(syminfo.tickerid, derivedResolution, low, offset)
    
    nhigh = lookahead and gaps ? nhigh_on_on :
             lookahead and not gaps ? nhigh_on_off :
             not lookahead and gaps ? nhigh_off_on :
             not lookahead and not gaps ? nhigh_off_off : na
    nlow = lookahead and gaps ? nlow_on_on :
             lookahead and not gaps ? nlow_on_off :
             not lookahead and gaps ? nlow_off_on :
             not lookahead and not gaps ? nlow_off_off : na
    [nhigh, nlow]
    
[nhigh, nlow] = f_get_htfHighLow(resolution, HTFMultiplier, lookahead, gaps, offset)
[nhighlast, nlowlast] = f_get_htfHighLow(resolution, HTFMultiplier, lookahead, gaps, offset+1)
plot(nhigh , title="HTF High",style=plot.style_circles, color=color.green, linewidth=1) 
plot(nlow , title="HTF Low",style=plot.style_circles, color=color.red, linewidth=1)

buyCondition = nhigh > nhighlast and nlow > nlowlast
sellCondition = nhigh < nhighlast and nlow < nlowlast

strategy.entry("Buy", strategy.long, when= buyCondition and inDateRange, oca_name="oca_buy")
strategy.entry("Sell", strategy.short, when= sellCondition and inDateRange, oca_name="oca_sell")