Esta estrategia genera señales comerciales basadas en las rupturas de precios dentro de un período de tiempo especificado.
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.
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.
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
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)