Estrategia de los ladrillos de impulso

El autor:¿ Qué pasa?, Fecha: 2024-02-19 15:32:17
Las etiquetas:

img

La estrategia juzga el cambio de impulso del mercado en función de la formación de ladrillos simulados y largo o corto en la dirección del ladrillo.

Estrategia lógica

La lógica central es simular la formación de ladrillos mediante el cálculo de la ATR y la relación de precio de cierre.

Brick1 se calcula de la siguiente manera: si el precio de cierre excede el valor anterior de Brick1 + ATR, Brick1 = valor anterior de Brick1 + ATR; si el precio de cierre está por debajo del valor anterior de Brick1 - ATR, Brick1 es el valor anterior de Brick1; de lo contrario, Brick1 hereda el valor anterior de Brick1.

Brick2 se calcula por: si Brick1 no es igual al valor anterior de Brick1, entonces Brick2 = Brick1 valor anterior; de lo contrario, heredar Brick2 valor anterior.

Esto simula la formación de ladrillos. Cuando el ladrillo 1 se eleva más de un ATR, se forma un ladrillo ascendente; cuando el ladrillo 1 cae más de un ATR, se forma un ladrillo descendente.

Cuando Brick1 y Brick2 se cruzan, significa que el ladrillo se expande hacia arriba, juzgado como largo.

Ventajas

  1. Utilice ATR para determinar la formación de ladrillos, evite el tamaño fijo de ladrillos, puede adaptarse dinámicamente a las fluctuaciones del mercado
  2. Identificar los cambios de impulso a través del cruce de ladrillos
  3. La sensibilidad al juicio del impulso del mercado puede ajustarse mediante diferentes ciclos ATR
  4. Visualizar la formación y el cruce de ladrillos para determinar intuitivamente las tendencias del mercado

Riesgo

  1. La selección del tamaño de ATR afectará los retornos de la estrategia. ATR demasiado pequeño resulta en demasiadas señales inválidas. ATR demasiado grande causa muy pocos ladrillos y pérdida potencial de oportunidad.
  2. La tendencia real puede no seguir el patrón de ladrillo. Las señales de cruce de ladrillo pueden ser anuladas por las inversiones del mercado.
  3. Deben ser muy sensibles a los costos de las transacciones.

Las soluciones incluyen la optimización de parámetros para encontrar el ciclo óptimo de ATR, ajustar la estrategia de stop profit loss para reducir las pérdidas por señales inválidas, aumentar adecuadamente las variedades de transacciones para reducir el impacto de los costos en los rendimientos.

Optimización

  1. Combinar con otros indicadores para el filtrado de señales para evitar señales no válidas, por ejemplo, indicadores de volumen y volatilidad
  2. Añadir filtro de tendencia, emitir señales sólo en la dirección de la tendencia para evitar la pérdida de inversión
  3. Adopte la optimización completa de parámetros de muestra durante el período de prueba para encontrar parámetros óptimos automáticamente

Resumen de las actividades

La estrategia juzga las tendencias a corto plazo y el impulso en los mercados a través de la simulación dinámica del cruce de ladrillos, con visualización intuitiva.


/*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 ////


Más.