Esta es una estrategia de backtesting de Ichimoku con take profit, stop loss y confirmación en la nube.
El núcleo de esta estrategia es la construcción de los componentes Ichimoku basados en los parámetros de entrada del usuario - Tenkan-Sen, Kijun-Sen, Senkou Span A & B y Chikou Span.
Además, implementa stop loss y take profit basados en el precio de entrada para gestionar el riesgo y la recompensa. También hay una opción para esperar la confirmación de la nube, es decir, Senkou Span A > B para los comprados y Senkou Span A < B para los cortos. Esto ayuda a evitar falsos breakouts.
Las principales ventajas de esta estrategia son triples:
Ichimoku es bueno para identificar tendencias e impulso. Las líneas de equilibrio proporcionan sólidos apoyos y áreas de resistencia.
Las características de stop loss y take profit maximizan la recompensa y minimizan el riesgo, lo que optimiza el perfil riesgo-rendimiento.
La confirmación en la nube filtra las señales falsas, garantizando entradas de alta probabilidad.
Sin embargo, también hay algunos riesgos clave a tener en cuenta:
Ichimoku es propenso a los golpes en los mercados de rango sin una tendencia clara.
La nube es un indicador de retraso. Para cuando haya confirmación de la nube, gran parte del movimiento puede haber ocurrido ya.
La optimización de los niveles de stop loss y take profit es un reto y sensible.
Algunas maneras de mejorar esta estrategia:
Combine Ichimoku con indicadores líderes como el RSI para una confirmación adicional y una entrada temprana.
Ajuste adaptativo de stop loss y toma de ganancias basado en la volatilidad en lugar de utilizar porcentajes fijos.
Prueba los parámetros óptimos en varios activos y plazos para identificar las mejores configuraciones para la estrategia.
Incorporar el aprendizaje automático para optimizar continuamente los parámetros y las reglas de estrategia basadas en datos actualizados.
Este es un sistema Ichimoku sólido con buenas características de captura de tendencias y gestión de riesgos. Con algunas mejoras, puede ser una excelente adición al enfoque comercial general. Funciona bien en los mercados de divisas, materias primas y criptomonedas.
/*backtest start: 2022-11-17 00:00:00 end: 2023-11-23 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ strategy("Ichimoku Backtester with TP and SL", overlay=true, currency = currency.USD, default_qty_type = strategy.percent_of_equity, default_qty_value = 95) //@version=4 //Inputs ts_bars = input(9, minval=1, title="Tenkan-Sen Bars") ks_bars = input(26, minval=1, title="Kijun-Sen Bars") ssb_bars = input(52, minval=1, title="Senkou-Span B Bars") cs_offset = input(26, minval=1, title="Chikou-Span Offset") ss_offset = input(26, minval=1, title="Senkou-Span Offset") long_entry = input(true, title="Long Entry") short_entry = input(true, title="Short Entry") wait_for_cloud = input(true, title="Wait for Cloud Confirmation") use_short_stop_loss = input(true, title="Use Short Stop Loss") short_stop_loss = input(title="Short Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=5) * 0.01 use_long_stop_loss = input(true, title="Use Long Stop Loss") long_stop_loss = input(title="Long Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=5) * 0.01 use_short_take_profit = input(true, title="Use Short Take Profit") short_take_profit = input(title="Short Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval = 20) * .01 use_long_take_profit = input(true, title="Use Long Take Profit") long_take_profit = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval = 20) * .01 // === INPUT SHOW PLOT === showDate = input(defval = false, title = "Show Date Range", type = input.bool) // === INPUT BACKTEST RANGE === fromMonth = input(defval = 1, title = "From Month", type = input.integer, minval = 1, maxval = 12) fromDay = input(defval = 1, title = "From Day", type = input.integer, minval = 1, maxval = 31) fromYear = input(defval = 2020, title = "From Year", type = input.integer, minval = 1970) thruMonth = input(defval = 1, title = "Thru Month", type = input.integer, minval = 1, maxval = 12) thruDay = input(defval = 1, title = "Thru Day", type = input.integer, minval = 1, maxval = 31) thruYear = input(defval = 2112, title = "Thru Year", type = input.integer, minval = 1970) // === FUNCTION EXAMPLE === start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window finish = timestamp(thruYear, thruMonth, thruDay, 23, 59) // backtest finish window window() => time >= start and time <= finish ? true : false // create function "within window of time" middle(len) => avg(lowest(len), highest(len)) // Ichimoku Components tenkan = middle(ts_bars) kijun = middle(ks_bars) senkouA = avg(tenkan, kijun) senkouB = middle(ssb_bars) bgcolor(color = showDate and window() ? color.gray : na, transp = 90) // plot within time window // Plot Ichimoku Kinko Hyo plot(tenkan, color=#0496ff, title="Tenkan-Sen") plot(kijun, color=#991515, title="Kijun-Sen") plot(close, offset=-cs_offset+1, color=#459915, title="Chikou-Span") sa=plot(senkouA, offset=ss_offset-1, color=color.green, title="Senkou-Span A") sb=plot(senkouB, offset=ss_offset-1, color=color.red, title="Senkou-Span B") fill(sa, sb, color = senkouA > senkouB ? color.green : color.red, title="Cloud color") ss_high = max(senkouA[ss_offset-1], senkouB[ss_offset-1]) ss_low = min(senkouA[ss_offset-1], senkouB[ss_offset-1]) // Entry/Exit Signals tk_cross_bull = tenkan > kijun tk_cross_bear = tenkan < kijun cs_cross_bull = mom(close, cs_offset-1) > 0 cs_cross_bear = mom(close, cs_offset-1) < 0 price_above_kumo = close > ss_high price_below_kumo = close < ss_low senkou_green = senkouA > senkouB ? true : false bullish = tk_cross_bull and cs_cross_bull and price_above_kumo bearish = tk_cross_bear and cs_cross_bear and price_below_kumo if (wait_for_cloud) bullish := bullish and senkou_green bearish := bearish and not senkou_green longStopPrice = strategy.position_avg_price * (1 - long_stop_loss) shortStopPrice = strategy.position_avg_price * (1 + short_stop_loss) longLimitPrice = strategy.position_avg_price * (1 + long_take_profit) shortLimitPrice = strategy.position_avg_price * (1 - short_take_profit) in_long = false in_long := in_long[1] open_long = bullish and not in_long open_short = bearish and in_long if (open_long) in_long := true if (open_short) in_long := false strategy.entry("Long", strategy.long, when=open_long and long_entry and (showDate ? window() : true)) strategy.entry("Short", strategy.short ,when=open_short and short_entry and (showDate ? window() : true)) if (strategy.position_size > 0.0) if (use_long_stop_loss and not use_long_take_profit) strategy.exit("Long", stop = longStopPrice) if (use_long_take_profit and not use_long_stop_loss) strategy.exit("Long", limit = longLimitPrice) if (use_long_take_profit and use_long_stop_loss) strategy.exit("Long", stop = longStopPrice, limit=longLimitPrice) if (strategy.position_size < 0.0) if (use_short_stop_loss and not use_short_take_profit) strategy.exit("Short", stop = shortStopPrice) if (use_short_take_profit and not use_short_stop_loss) strategy.exit("Short", limit = shortLimitPrice) if (use_short_take_profit and use_short_stop_loss) strategy.exit("Short", stop = shortStopPrice, limit = shortLimitPrice) strategy.close("Long", when=bearish and not short_entry and (showDate ? window() : true)) strategy.close("Short", when=bullish and not long_entry and (showDate ? window() : true))