Esta estrategia opera en base a los máximos del día de negociación anterior, trabajando en un modo de seguimiento de tendencias.
Utilice la función LucF para evitar el sesgo de la mirada en las pruebas de retroceso.
Identifique si es un nuevo día de negociación abierto. Registre el máximo de hoy y el mínimo de hoy.
Compare el máximo actual con max_today, actualice max_today si se supera.
Compare el mínimo actual con min_today, actualice min_today si se viola.
Graficar los niveles altos y bajos de los días de negociación anteriores.
Establecer el punto de entrada en la ruptura de los máximos del día anterior, el GAP se puede añadir para avanzar o retrasar la entrada.
Establezca el porcentaje de stop loss sl y el porcentaje de ganancias tp.
Ir largo cuando el precio rompe el día de negociación anterior.
Establezca el precio de stop loss y el precio de take profit.
Opcionalmente, habilitar el stop loss trasero, con nivel de activación y distancia de desplazamiento.
Opcionalmente cierre de operaciones basado en el cruce de la EMA.
Esta sencilla estrategia de seguimiento de tendencias tiene las siguientes ventajas:
Generación de señal clara y directa, fácil de implementar.
La ruptura de los máximos del día anterior proporciona la confirmación de la tendencia, reduciendo los golpes.
El parámetro GAP permite ajustar la sensibilidad de entrada.
El riesgo global se controla con un stop loss claro.
El trailing stop se puede usar para obtener más ganancias.
El cruce de la EMA evita quedar atrapado en tendencias a la baja.
Hay algunos riesgos a tener en cuenta:
Una fuga fallida puede causar pérdidas.
Requiere un mercado de tendencia, y probablemente en condiciones variables.
Una parada de arrastre incorrecta puede ser detenida prematuramente.
Una mala elección de parámetros de la EMA puede hacerla demasiado sensible o retrasada.
Varias variables necesitan ajuste como GAP, stop loss, trailing stop, etc.
Algunas maneras de optimizar aún más la estrategia:
Utilice un stop loss dinámico basado en ATR o tendencia.
Añadir un filtro para una ruptura válida utilizando la desviación estándar.
Añadir condiciones de volatilidad para evitar una falsa ruptura en mercados agitados.
Optimice el parámetro EMA para una señal más robusta.
Ajuste fino de los parámetros de parada para que coincidan con la volatilidad del mercado.
Prueba de la robustez de los parámetros en diferentes instrumentos.
Añadir un mecanismo dinámico de dimensionamiento de la posición.
La estrategia es simple y práctica como un sistema típico de seguimiento de tendencias basado en la alta ruptura del día anterior. La gestión del riesgo depende principalmente de la parada de pérdida. Con la ajuste adecuado de los parámetros, puede funcionar bien en condiciones de tendencia. Pero se necesitan una parada de pérdida y filtros adecuados para evitar los golpes. El marco se puede mejorar aún más como base para las estrategias de seguimiento de tendencias.
/*backtest start: 2023-09-30 00:00:00 end: 2023-10-07 00:00:00 period: 15m basePeriod: 5m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) // © TheSocialCryptoClub //@version=5 strategy("Yesterday's High", overlay=true, pyramiding = 1, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10, slippage=1, backtest_fill_limits_assumption=1, use_bar_magnifier=true, commission_type=strategy.commission.percent, commission_value=0.075 ) // ----------------------------------------------------------------------------- // ROC Filter // ----------------------------------------------------------------------------- // f_security function by LucF for PineCoders available here: https://www.tradingview.com/script/cyPWY96u-How-to-avoid-repainting-when-using-security-PineCoders-FAQ/ f_security(_sym, _res, _src, _rep) => request.security(_sym, _res, _src[not _rep and barstate.isrealtime ? 1 : 0])[_rep or barstate.isrealtime ? 0 : 1] high_daily = f_security(syminfo.tickerid, "D", high, false) roc_enable = input.bool(false, "", group="ROC Filter from CloseD", inline="roc") roc_threshold = input.float(1, "Treshold", step=0.5, group="ROC Filter from CloseD", inline="roc") closed = f_security(syminfo.tickerid,"1D",close, false) roc_filter= roc_enable ? (close-closed)/closed*100 > roc_threshold : true // ----------------------------------------------------------------------------- // Trigger Point // ----------------------------------------------------------------------------- open_session = ta.change(time('D')) price_session = ta.valuewhen(open_session, open, 0) tf_session = timeframe.multiplier <= 60 bgcolor(open_session and tf_session ?color.new(color.blue,80):na, title = "Session") first_bar = 0 if open_session first_bar := bar_index var max_today = 0.0 var min_today = 0.0 var high_daily1 = 0.0 var low_daily1 = 0.0 var today_open = 0.0 if first_bar high_daily1 := max_today low_daily1 := min_today today_open := open max_today := high min_today := low if high >= max_today max_today := high if low < min_today min_today := low same_day = today_open == today_open[1] plot( timeframe.multiplier <= 240 and same_day ? high_daily1 : na, color= color.yellow , style=plot.style_linebr, linewidth=1, title='High line') plot( timeframe.multiplier <= 240 and same_day ? low_daily1 : na, color= #E8000D , style=plot.style_linebr, linewidth=1, title='Low line') // ----------------------------------------------------------------------------- // Strategy settings // ----------------------------------------------------------------------------- Gap = input.float(1,"Gap%", step=0.5, tooltip="Gap di entrata su entry_price -n anticipa entrata, con +n posticipa entrata", group = "Entry") Gap2 = (high_daily1 * Gap)/100 sl = input.float(3, "Stop-loss", step= 0.5, group = "Entry") tp = input.float(9, "Take-profit", step= 0.5, group = "Entry") stop_loss_price = strategy.position_avg_price * (1-sl/100) take_price = strategy.position_avg_price * (1+tp/100) sl_trl = input.float(2, "Trailing-stop", step = 0.5, tooltip = "Attiva trailing stop dopo che ha raggiunto...",group = "Trailing Stop Settings")//group = "Trailing Stop Settings") Atrl= input.float(1, "Offset Trailing", step=0.5,tooltip = "Distanza dal prezzo", group = "Trailing Stop Settings") stop_trl_price_cond = sl_trl * high/syminfo.mintick/100 stop_trl_price_offset_cond = Atrl * high/syminfo.mintick/100 stop_tick = sl * high/syminfo.mintick/100 profit_tick = tp * high/syminfo.mintick/100 mess_buy = "buy" mess_sell = "sell" // ----------------------------------------------------------------------------- // Entry - Exit - Close // ----------------------------------------------------------------------------- if close < high_daily1 and roc_filter strategy.entry("Entry", strategy.long, stop = high_daily1 + (Gap2), alert_message = mess_buy) ts_n = input.bool(true, "Trailing-stop", tooltip = "Attiva o disattiva trailing-stop", group = "Trailing Stop Settings") close_ema = input.bool(false, "Close EMA", tooltip = "Attiva o disattiva chiusura su EMA", group = "Trailing Stop Settings") len1 = input.int(10, "EMA length", step=1, group = "Trailing Stop Settings") ma1 = ta.ema(close, len1) plot(ma1, title='EMA', color=color.new(color.yellow, 0)) if ts_n == true strategy.exit("Trailing-Stop","Entry",loss= stop_tick, stop= stop_loss_price, limit= take_price, trail_points = stop_trl_price_cond, trail_offset = stop_trl_price_offset_cond, comment_loss="Stop-Loss!!",comment_profit ="CASH!!", comment_trailing = "TRL-Stop!!", alert_message = mess_sell) else strategy.exit("TP-SL", "Entry",loss= stop_tick, stop=stop_loss_price, limit= take_price, comment_loss= "Stop-loss!!!", comment_profit = "CASH!!", alert_message = mess_sell) if close_ema == true and ta.crossunder(close,ma1) strategy.close("Entry",comment = "Close" , alert_message = mess_sell)