Estrategia de ruptura del pivote intradiario

El autor:¿ Qué pasa?, Fecha: 2023-11-03 16:35:15
Las etiquetas:

img

Resumen general

Esta estrategia genera señales comerciales basadas en las rupturas de precios dentro de un período de tiempo especificado.

Estrategia lógica

La estrategia calcula el máximo máximo y el mínimo mínimo del precio dentro de un cierto período de tiempo, conocido como pivot high y pivot low, para medir los movimientos de precios.

Específicamente, calcula el máximo más alto de las N barras pasadas como el máximo de pivote y el mínimo más bajo de las barras pasadas M como el mínimo de pivote.

Después de la entrada, la estrategia utiliza ATR para stop loss e intraday stop loss. También cierra todas las posiciones en un marco de tiempo específico (por ejemplo, 14:55).

La estrategia captura de manera efectiva las tendencias utilizando breakouts de precios simples durante ciertos períodos, por lo que es ideal para el comercio intradiario.

Ventajas

  • Captura de forma fiable las variaciones de tendencia utilizando las variaciones de precios
  • Implementación sencilla con datos OHLC básicos
  • Gestión de los riesgos de pérdida por parada razonable y pérdida por parada intradiaria
  • Evita los riesgos a un día adecuados para la negociación intradiaria
  • Pocos parámetros fáciles de optimizar

Riesgos y mitigaciones

  • Posible retraso, puede perder el inicio temprano de la tendencia

    Ajustar el plazo o combinar otros indicadores para la entrada

  • Más señales falsas cuando la tendencia no es clara

    Ajusta los parámetros, agrega filtros como indicadores, volumen, etc.

  • Costos de capital más elevados para operaciones intradiarias activas

    Ajustar el tamaño de la posición, extender el período de retención

  • Confianza en la optimización de parámetros

    Adaptar los parámetros a las condiciones cambiantes del mercado mediante el aprendizaje automático, etc.

Oportunidades de mejora

  • Prueba otros datos de precios como el precio típico, el precio mediano, etc.

  • Añadir filtros como volumen, volatilidad

  • Prueba diferentes combinaciones de parámetros

  • Incorporar indicadores de tendencia para determinar la dirección

  • Optimización automática de parámetros mediante aprendizaje automático

  • Ampliar a múltiples marcos de tiempo para una mejor entrada

Conclusión

La estrategia tiene una lógica clara y concisa, aprovechando efectivamente las rupturas de precios para capturar tendencias a corto plazo con buenos factores de ganancia. Con pocos parámetros sintonizables fáciles de probar y optimizar, es muy adecuado para el comercio intradiario. Si bien existen retrasos y señales falsas, se pueden abordar mediante el ajuste de parámetros, la adición de filtros, etc. La estrategia proporciona un marco comercial robusto basado en rupturas con un amplio espacio de optimización.


/*backtest
start: 2022-10-27 00:00:00
end: 2023-11-02 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//   ____________        _________           _____________
//  |____________|      ||________|          ||__________|
//       ||             ||        ||         ||
//       ||             ||________||         ||
//       ||     H E     ||________   U L L   ||       H A R T I S T
//       ||             ||        ||         ||
//       ||             ||________||         ||__________
//       ||             ||________|          ||__________|
  
//@version=5
// strategy("PIVOT STRATEGY [5MIN TF]",overlay=true ,commission_type = strategy.cash, commission_value = 30 , slippage = 2, default_qty_value = 60, currency = currency.NONE, pyramiding = 0)
leftbars = input(defval = 10)
rightbars = input(defval = 15)

// ═══════════════════════════ //
// ——————————> INPUTS <——————— //
// ═══════════════════════════ //

EMA1 = input.int(title='PRICE CROSS EMA', defval = 150, minval = 10 ,maxval = 400)
factor1 = input.float(title='_ATR LONG',defval = 3.2 , minval = 1 , maxval = 5 , step = 0.1, tooltip = "ATR TRAIL LONG")
factor2 = input.float(title='_ATR SHORT',defval = 3.2 , minval = 1 , maxval = 5 , step = 0.1, tooltip = "ATR TRAIL SHORT")
risk = input.float(title='RISK',defval = 200 , minval = 1 , maxval = 5000 , step = 50, tooltip = "RISK PER TRADE")

var initialCapital = strategy.equity
t = time(timeframe.period, '0935-1400:1234567')
time_cond = true

// ══════════════════════════════════ //
// ———————————> EMA DATA <——————————— //
// ══════════════════════════════════ //
ema1 = ta.ema(close, EMA1)

plot(ema1, color=color.new(color.yellow, 0), style=plot.style_linebr, title='ema1')

// ══════════════════════════════════ //
// ————————> TRAIL DATA <———————————— //
// ══════════════════════════════════ //
// *******Calculate LONG TRAIL data*****
ATR_LO = ta.atr(14)*factor1

// *******Calculate SHORT TRAIL data*****
ATR_SH = ta.atr(14)*factor2

longStop = close - ATR_LO
shortStop = close + ATR_SH

// Plot atr data
//plot(longStop, color=color.new(color.green, 0), style=plot.style_linebr, title='Long Trailing Stop')
//plot(shortStop , color=color.new(color.red, 0), style=plot.style_linebr, title='Short Trailing Stop')

// ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ //
// ————————————————————————————————————————————————————————> PIVOT DATA <———————————————————————————————————————————————————————————————————————————————————————————————————— //
// ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ //

ph = ta.pivothigh(close,leftbars, rightbars)
pl = ta.pivotlow(close,leftbars, rightbars)

pvt_condition1 = not na(ph)

upper_price = 0.0
upper_price := pvt_condition1 ? ph : upper_price[1]

pvt_condition2 = not na(pl)

lower_price = 0.0
lower_price := pvt_condition2 ? pl : lower_price[1]

// Signals
long  = ta.crossover(high, upper_price + syminfo.mintick)
short = ta.crossunder(low, lower_price - syminfo.mintick)

plot(upper_price, color= close > ema1  ? color.green : na, style=plot.style_line, title='PH')

plot(lower_price,  color= close <  ema1  ? color.red : na, style=plot.style_line, title='PL')


// ══════════════════════════════════//
// ————————> LONG POSITIONS <————————//
// ══════════════════════════════════//
//******barinstate.isconfirmed used to avoid repaint in real time*******

if ( long and strategy.opentrades==0 and barstate.isconfirmed and time_cond and close >= ema1 )
    strategy.entry(id= "Long" ,direction = strategy.long, comment = "B")
    
//plot(longStop , color=color.new(color.blue, 0), style=plot.style_linebr, title='long Stop')

if strategy.position_size > 0 
    strategy.exit("long tsl", "Long" , stop = longStop ,comment='S')
 

// ═════════════════════════════════════//
// ————————> SHORT POSITIONS <————————— //
// ═════════════════════════════════════//
if ( short and strategy.opentrades==0 and barstate.isconfirmed and time_cond and close <= ema1 )
    strategy.entry(id = "Short" ,direction = strategy.short,  comment = "S") 

if strategy.position_size < 0
    strategy.exit("short tsl", "Short" ,  stop = shortStop ,comment='B')

// ════════════════════════════════════════════════//
// ————————> CLOSE ALL POSITIONS BY 3PM <————————— //
// ════════════════════════════════════════════════//
strategy.close_all(when = hour == 14 and minute == 55)

// ════════════════════════════════════════//
// ————————> MAX INTRADAY LOSS  <————————— //
// ════════════════════════════════════════//
// strategy.risk.max_intraday_loss(type = strategy.cash, value = risk)



Más.