Estrategia de bloques de impulso


Fecha de creación: 2024-02-19 15:32:17 Última modificación: 2024-02-19 15:32:17
Copiar: 1 Número de Visitas: 577
1
Seguir
1617
Seguidores

Estrategia de bloques de impulso

Esta estrategia determina los cambios en la dinámica del mercado a través de la simulación de la formación de las barras, haciendo más vacío en función de la dirección de la barra.

Principio de estrategia

El principio central de esta estrategia es simular la formación de bricks calculando la relación entre el ATR y el precio de cierre. En concreto, se definen dos variables Brick1 y Brick2.

Brick1 se calcula de la siguiente manera: si el precio de cierre es superior al valor de Brick1 ayer + ATR, entonces Brick1 es el valor de Brick1 ayer + ATR; si el precio de cierre es inferior al valor de Brick1 ayer + ATR, entonces Brick1 es el valor de Brick1 ayer - ATR; de lo contrario, Brick1 hereda el valor de Brick1 ayer.

Brick2 se calcula de la siguiente manera: si el valor de Brick1 no es igual al valor de Brick1 ayer, entonces Brick2 es el valor de Brick1 ayer; de lo contrario, hereda el valor de Brick2 ayer.

Así se simula la formación de la barra. Cuando Brick1 sube más de un ATR, se forma una barra hacia arriba; cuando Brick1 baja más de un ATR, se forma una barra hacia abajo. Brick2 es el registro de la posición de una barra.

Cuando Brick1 y Brick2 se cruzan hacia arriba, la columna se extiende hacia arriba y se juzga que tiene más cabeza; cuando Brick1 y Brick2 se cruzan hacia abajo, la columna se contrae hacia abajo y se juzga que tiene cabeza vacía.

Ventajas estratégicas

  1. El uso de ATR para determinar la formación de brotes, evitando el uso de brotes de tamaño fijo, puede adaptarse dinámicamente a las fluctuaciones del mercado
  2. Para determinar la dirección de la pluralidad de los espacios a través de la intersección de las columnas, identifica los cambios de potencia
  3. Se puede ajustar la sensibilidad a los juicios de la dinámica del mercado a través de diferentes ciclos de ATR
  4. Visualización de la formación y cruce de las barras para intuir el movimiento del mercado

Riesgo estratégico

  1. Si el ATR es demasiado pequeño, se forman demasiados cohetes y se producen más señales no válidas; si el ATR es demasiado grande, se forman demasiados cohetes y es fácil perder oportunidades.
  2. La tendencia real puede no seguir el patrón de las ramas, y las señales cruzadas de las ramas pueden ser rechazadas por la inversión del mercado.
  3. Se debe ser muy sensible a los costos de las transacciones, de lo contrario, la frecuencia de las transacciones cruzadas puede reducir considerablemente los ingresos netos.

Se puede encontrar el ciclo ATR óptimo mediante la optimización de parámetros; ajustar la estrategia de stop loss para reducir la pérdida producida por señales ineficaces; amplificar adecuadamente la variedad de operaciones para reducir el impacto de los costos en los beneficios.

Optimización de la estrategia

  1. Se puede combinar con otros indicadores para filtrar la señal, como indicadores de energía cuantitativa, indicadores de vibración, etc., para evitar señales no válidas
  2. Aumentar el filtro de tendencia para emitir señales solo en la dirección de la tendencia y evitar pérdidas por inversión
  3. Método de optimización de parámetros de toda la muestra durante el período de prueba para encontrar automáticamente los parámetros óptimos

Resumir

Esta estrategia se basa en la simulación dinámica de la barra de cruce para juzgar las tendencias y la dinámica a corto plazo en el mercado, la visualización de la forma intuitiva. La estrategia tiene un gran espacio de optimización, la optimización de parámetros y la filtración de señales pueden mejorar aún más la estabilidad.

Código Fuente de la Estrategia
/*backtest
start: 2023-02-12 00:00:00
end: 2024-02-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4


///Component Code Start
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(01, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(2025, "Backtest Stop Year")
testStopMonth = input(1, "Backtest Stop Month")
testStopDay = input(1, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)



/// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=input.bool, defval=false)
testPeriodBackgroundColor = testPeriodBackground and time >= testPeriodStart and time <= testPeriodStop ? 
   #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
/// Component Code Stop


//Zack_the_Lego (original AUTHOR) made into strategy by mkonsap
strategy("Flex Renko Emulator", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
margin = input(true, title="Margin?")
Margin = margin ? margin : false
res = input(type=input.resolution, defval="D", title="Resolution of ATR")
xATR = atr(14)
//TF = x78tf ? "78" : "39"
BrickSize = security(syminfo.tickerid, res, xATR)

//Brick1 =  close >  nz(Brick1[1]) + BrickSize ? nz(Brick1[1]) + BrickSize : close <
                    //nz(Brick1[1]) - BrickSize ?
                        //nz(Brick1[1]) - BrickSize
                            //: nz(Brick1[1]))


Brick1() =>
    s1 = 0.0
    s1 := close > nz(s1[1]) + BrickSize ? nz(s1[1]) + BrickSize : 
       close < nz(s1[1]) - BrickSize ? nz(s1[1]) - BrickSize : nz(s1[1])
    s1


Brick2() =>
    s2 = 0.0
    Brick1_1 = Brick1()
    s2 := Brick1() != Brick1()[1] ? Brick1_1[1] : nz(s2[1])
    s2

colorer = Brick1() > Brick2() ? color.green : color.red
p1 = plot(Brick1(), color=colorer, linewidth=4, title="Renko")
p2 = plot(Brick2(), color=colorer, linewidth=4, title="Renko")
fill(p1, p2, color=color.purple, transp=50)




mylong = crossover(Brick1(), Brick2())
myshort = crossunder(Brick1(), Brick2())

last_long = float(na)
last_short = float(na)
last_long := mylong ? time : nz(last_long[1])
last_short := myshort ? time : nz(last_short[1])

in_long = last_long > last_short ? 2 : 0
in_short = last_short > last_long ? 2 : 0

mylong2 = crossover(Brick1(), Brick2())
myshort2 = crossunder(Brick1(), Brick2())

last_long2 = float(na)
last_short2 = float(na)
last_long2 := mylong2 ? time : nz(last_long2[1])
last_short2 := myshort2 ? time : nz(last_short2[1])

in_long2 = last_long2 > last_short2 ? 0 : 0
in_short2 = last_short2 > last_long2 ? 0 : 0


condlongx = in_long + in_long2
condlong = crossover(condlongx, 1.9)
condlongclose = crossunder(condlongx, 1.9)

condshortx = in_short + in_short2
condshort = crossover(condshortx, 1.9)
condshortclose = crossunder(condshortx, 1.9)


// === STRATEGY - LONG POSITION EXECUTION WITH CLOSE ORDERS ===
//enterLong() => crossover(condlongx, 1.9) and testPeriod() and strategy.position_size <= 0
//exitLong()  => crossunder(condlongx, 1.9) and testPeriod() and strategy.position_size > 0
//strategy.entry(id = "Long", long = true, when = enterLong())
//strategy.close(id = "Long", when = exitLong())
// === STRATEGY - SHORT POSITION EXECUTION WITH CLOSE ORDER===
//enterShort() => crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0 and Margin
//exitShort() => crossunder(condshortx, 1.9)  and testPeriod() and strategy.position_size < 0
//strategy.entry(id = "Short", long = false, when = enterShort())
//strategy.close(id = "Short", when = exitShort())   
//END


///STRATEGY ONLY LONG AND SHORT/////
if crossover(condlongx, 1.9) and testPeriod() and strategy.position_size <= 0
    strategy.entry("Long", strategy.long, comment="Long")

if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0
    strategy.close("Long", when=not Margin)

if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0
    strategy.entry("Short", strategy.short, comment="Short", when=Margin)

/////// END ////