
La estrategia es una estrategia de seguimiento de tendencias que combina la configuración de los indicadores de la nube de Ichimoku para juzgar la fuerza del mercado para detectar posibles oportunidades de ruptura. Los componentes clave incluyen un marco de juicio basado en la nube de Ichimoku, un stop loss ATR, un stop loss porcentual y un mecanismo de parada opcional.
El criterio central de la estrategia consiste en dos partes, una es la señal de tendencia de la fuerza del mercado en el aire, basada en el indicador de la nube de Ichimoku, y otra es la señal de fuerza basada en la potencia de ruptura.
Para juzgar la tendencia, se debe satisfacer al mismo tiempo la línea de conversión sobre la línea de base que indica la creación de una tendencia múltiple, el lapso de retardo superior a la línea K de la entidad que indica la fuerza múltiple actual es fuerte, el precio es superior al precio más alto de la nube que muestra la ruptura de la vía.
Para una señal de fuerza, se debe cumplir al mismo tiempo con los requisitos de que el precio sea superior al precio máximo mínimo de la nube para mostrar la fuerza súper fuerte, la línea de conversión y la línea base sean múltiples para mostrar la fuerza llena.
Cuando se activa cualquier conjunto de condiciones de ambos tipos, se abre una posición en el precio de mercado; luego se establece un seguimiento de stop loss basado en las reglas de ATR, porcentaje o indicador de la nube de Ichimoku para bloquear aún más los beneficios.
La mayor ventaja de esta estrategia es que utiliza tanto el juicio de tendencias de la nube de Ichimoku como la evaluación de la fuerza multiespacial. En comparación con indicadores como las medias móviles individuales, la nube de Ichimoku refleja mejor el contraste de fuerzas de la situación actual, lo que mejora la precisión de la señal.
Además, la combinación de ATR y Stop Loss Percentage para administrar el riesgo permite un buen control de las pérdidas individuales. Además, el mecanismo de stop-loss opcional también hace que los beneficios de la estrategia sean más estables.
El principal riesgo de la estrategia reside en que la nube de Ichimoku en sí misma tiene cierta latencia. Además, la señal de fuerza como característica de la persecución también puede aumentar la probabilidad de que la estrategia se ajuste.
Para reducir el riesgo de problemas de retraso, se puede acortar adecuadamente el ciclo de parámetros de la nube de Ichimoku; para el riesgo de señales fuertes, se necesita fortalecer la configuración de seguimiento de deterioro para responder.
La estrategia se puede optimizar aún más en las siguientes direcciones:
Prueba de datos en diferentes mercados para determinar la solidez y adaptabilidad de las estrategias
Optimizar los parámetros de la nube Ichimoku para adaptarla a las necesidades de un mercado específico
Prueba algoritmos de aprendizaje profundo como LSTM para ayudar a determinar la intensidad de la señal de ruptura
Añadir indicadores de energía para evitar la probabilidad de caída de la matanza
La estrategia integra el aprovechamiento de la configuración de la nube Ichimoku para juzgar la fuerza del mercado de la volatilidad y, al mismo tiempo que captura las tendencias potenciales, también tiene en cuenta la gestión del riesgo. La estrategia equilibra eficazmente los beneficios y la controlabilidad.
/*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