Esta estrategia combina los indicadores de Ichimoku Cloud para medir el sentimiento del mercado e identificar oportunidades potenciales de ruptura.
Hay dos componentes principales: las señales de la nube de Ichimoku para determinar el impulso alcista / bajista y las señales de explosión de fuerza para capturar posibles rupturas.
La señal de tendencia requiere que la Línea de Conversión cruce por encima de la Línea de Base para señalar una tendencia alcista, Lagging Span por encima de las barras de precios que indican un fuerte impulso, y el precio rompiendo la banda superior de Ichimoku Cloud.
Las señales de explosión de fuerza para oportunidades de entrada adicionales requieren que el precio rompa los mínimos y máximos recientes de Cloud
Las entradas largas se activan cuando una de las señales dispara. Las salidas se detendrán según las reglas ATR, porcentaje o Ichimoku para obtener ganancias.
La mayor ventaja proviene del uso de la Nube Ichimoku tanto para el análisis de tendencia como de impulso, haciendo que las señales sean más precisas que los indicadores solitarios como las medias móviles.
La gestión del riesgo de ATR / porcentaje de paradas de seguimiento también mantiene pequeñas las pérdidas por operación.
Las señales de fuerza también aumentan la posibilidad de perseguir el impulso.
Para abordar el riesgo de retraso, optimizar la configuración más rápida de la nube.
Las posibles mejoras incluyen:
Prueba de robustez con más datos de mercado.
Optimizar los parámetros de la nube para instrumentos específicos.
Prueba ML como LSTM para una mejor calificación de la señal.
Añadir análisis de volumen para evitar trampas.
Este sistema de Ichimoku mide eficazmente el sentimiento del mercado para el comercio de tendencias. El enfoque equilibrado en la captura de impulso y la gestión del riesgo también lo hace práctico.
/*backtest start: 2024-01-04 00:00:00 end: 2024-02-03 00:00:00 period: 3h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © mikul_se //@version=5 strategy("mikul's Ichimoku Cloud Strategy v 2.0", shorttitle="mikul's Ichi strat", overlay=true, margin_long=100, margin_short=100, default_qty_type = strategy.percent_of_equity, default_qty_value = 100) // Strategy settings strategySettingsGroup = "Strategy settings" trailSource = input.string(title="Trail Source", defval="Lows/Highs", options=["Lows/Highs", "Close", "Open"], confirm=true, group=strategySettingsGroup) trailMethod = input.string(title="Trail Method", defval="ATR", options=["ATR", "Percent", "Ichi exit"], confirm=true, tooltip="Ichi rules means it follows the rules of the Ichimoku cloud for exiting the trade.", group=strategySettingsGroup) trailPercent = input.float(title="Trail Percent", defval=10, minval=0.1, confirm=true, group=strategySettingsGroup) swingLookback = input.int(title="Lookback", defval=7, confirm=true, group=strategySettingsGroup) atrPeriod = input.int(title="ATR Period", defval=14, confirm=true, group=strategySettingsGroup) atrMultiplier = input.float(title="ATR Multiplier", defval=1.0, confirm=true, group=strategySettingsGroup) addIchiExit = input.bool(false, "Add Ichimoku exit", "You can use this to add Ichimoku cloud exit signals on top of Percent or ATR", group=strategySettingsGroup) useTakeProfit = input.bool(false, "Use Take Profit", confirm=true, group=strategySettingsGroup) takeProfitPercent = input.float(title="Take Profit Percentage", defval=5, minval=0.1, confirm=true, group=strategySettingsGroup) // Ichimoku settings ichimokuSettingsGroup = "Ichimoku settings" conversionPeriods = input.int(9, minval=1, title="Conversion Line Length", group=ichimokuSettingsGroup) basePeriods = input.int(26, minval=1, title="Base Line Length", group=ichimokuSettingsGroup) laggingSpan2Periods = input.int(52, minval=1, title="Leading Span B Length", group=ichimokuSettingsGroup) displacement = input.int(26, minval=1, title="Lagging Span", group=ichimokuSettingsGroup) delta = input.int(26, minval=1, title="Delta", group=ichimokuSettingsGroup) donchian(len) => math.avg(ta.lowest(len), ta.highest(len)) conversionLine = donchian(conversionPeriods) baseLine = donchian(basePeriods) leadLine1 = math.avg(conversionLine, baseLine) leadLine2 = donchian(laggingSpan2Periods) uppercloud = leadLine1[displacement-1] bottomcloud = leadLine2[displacement-1] // Ichi exit variables and calculations delta2 = delta-3 average(len) => math.avg(ta.lowest(len), ta.highest(len)) conversion_line = average(conversionPeriods) base_line = average(basePeriods) lead_line_a = math.avg(conversion_line, base_line) lead_line_b = average(laggingSpan2Periods) lagging_span = close lead_line_a_delta = lead_line_a[delta] lead_line_b_delta = lead_line_b[delta] lagging_span_delta = lagging_span[delta] prisgris = hlc3[delta] prisgris2 = hlc3[delta2] // Declare trailing price variable (stores our trail stop value) var float trailPrice = na float next_trailPrice = na // Get required trailing stop variables atrValue = ta.atr(atrPeriod) * atrMultiplier swingLow = ta.lowest(low, swingLookback) swingHigh = ta.highest(high, swingLookback) // Ichi plotting plot(conversionLine, color=#2962FF, title="Conversion Line") plot(baseLine, color=#B71C1C, title="Base Line") plot(close, offset=-displacement + 1, color=#43A047, title="Lagging Span") p1 = plot(leadLine1, offset=displacement - 1, color=#A5D6A7, title="Leading Span A") p2 = plot(leadLine2, offset=displacement - 1, color=#EF9A9A, title="Leading Span B") fill(p1, p2, color=leadLine1 > leadLine2 ? color.rgb(67, 160, 71, 90) : color.rgb(244, 67, 54, 90)) // Plotting ichi crossover signals ichiup = ta.crossover(conversionLine, baseLine) ichidown = ta.crossover(baseLine, conversionLine) plotshape(ichiup ? conversionLine : na, 'Ichi long 1', style=shape.circle, location=location.absolute, offset=0, color=#00ff00b0, size=size.tiny) plotshape(ichidown ? conversionLine : na, 'Ichi short 1', style=shape.circle, location=location.absolute, offset=0, color=#ff1100c7, size=size.tiny) // Pamp signal signal5 = close > bottomcloud[displacement] and close > uppercloud[displacement] and close > high[displacement] signal5b = close[1] <= bottomcloud[displacement+1] or close[1] <= uppercloud[displacement+1] or close <= high[displacement+1] signal6 = close > bottomcloud and close > uppercloud and close > open signal6b = close[1] <= bottomcloud[1] or close[1] <= uppercloud[1] signal7 = leadLine1 > leadLine2 signal7b = leadLine1[1] <= leadLine2[1] signal8 = conversionLine > baseLine pamp = signal5 and signal6 and signal7 and signal8 and strategy.position_size == 0 and (signal5b or signal6b or signal7b) // Trend signal nsignal5 = close > close[displacement] nsignal6 = close > bottomcloud and close > uppercloud and close > open nsignal8 = ta.crossover(conversionLine, baseLine) and conversionLine > bottomcloud and conversionLine > uppercloud and baseLine > bottomcloud and baseLine > uppercloud trend = nsignal5 and nsignal6 and nsignal8 and strategy.position_size == 0 plotshape(trend, style=shape.triangleup, location=location.belowbar, color=color.green) if (trend or pamp) trailPrice := na strategy.entry(trend ? "Trend" : "Pamp", direction = strategy.long) // Get trailing stop price if trailMethod == "ATR" next_trailPrice := switch trailSource "Close" => strategy.position_size > 0 ? close - atrValue : close + atrValue "Open" => strategy.position_size > 0 ? open - atrValue : open + atrValue => strategy.position_size > 0 ? swingLow - atrValue : swingHigh + atrValue else if trailMethod == "Percent" float percentMulti = strategy.position_size > 0 ? (100 - trailPercent) / 100 : (100 + trailPercent) / 100 next_trailPrice := switch trailSource "Close" => close * percentMulti "Open" => open * percentMulti => strategy.position_size > 0 ? swingLow * percentMulti : swingHigh * percentMulti else short_signal = (ta.crossunder(lagging_span, prisgris)) or ta.crossover(base_line, conversion_line) and ((close)) < ((lead_line_a)) or ta.crossunder(lagging_span, prisgris) or (ta.crossover(base_line, conversion_line) and ((lagging_span) < (lead_line_a)) and ((lagging_span) < (lead_line_b))) if short_signal strategy.close("Trend", "Ichi trend over") strategy.close("Pamp", "Ichi pamp over") alert("Sell") if (addIchiExit) short_signal = (ta.crossunder(lagging_span, prisgris)) or ta.crossover(base_line, conversion_line) and ((close)) < ((lead_line_a)) or ta.crossunder(lagging_span, prisgris) or (ta.crossover(base_line, conversion_line) and ((lagging_span) < (lead_line_a)) and ((lagging_span) < (lead_line_b))) if short_signal strategy.close("Trend", "Ichi trend over") strategy.close("Pamp", "Ichi pamp over") alert("Sell") // Check for trailing stop update if strategy.position_size != 0 and barstate.isconfirmed if (next_trailPrice > trailPrice or na(trailPrice)) and strategy.position_size > 0 trailPrice := next_trailPrice alert(message="Trailing Stop updated for " + syminfo.tickerid + ": " + str.tostring(trailPrice, "#.#####"), freq=alert.freq_once_per_bar_close) if (next_trailPrice < trailPrice or na(trailPrice)) and strategy.position_size < 0 trailPrice := next_trailPrice alert(message="Trailing Stop updated for " + syminfo.tickerid + ": " + str.tostring(trailPrice, "#.#####"), freq=alert.freq_once_per_bar_close) // Draw data to chart plot(strategy.position_size != 0 ? trailPrice : na, color=color.red, title="Trailing Stop") // Take Profit float profitTarget = strategy.position_avg_price * (1 + takeProfitPercent / 100) // Exit trade if stop is hit strategy.exit(id="trend Exit", from_entry="Trend", stop=trailPrice, limit=useTakeProfit ? profitTarget : na) strategy.exit(id="pamp Exit", from_entry="Pamp", stop=trailPrice, limit=useTakeProfit ? profitTarget : na) if strategy.position_size == 0 trailPrice = 0