Stratégie de rupture du nuage Ichimoku basée sur les forces longues et courtes du marché


Date de création: 2024-02-04 14:46:22 Dernière modification: 2024-02-04 14:46:22
Copier: 0 Nombre de clics: 685
1
Suivre
1617
Abonnés

Stratégie de rupture du nuage Ichimoku basée sur les forces longues et courtes du marché

Aperçu

La stratégie est une stratégie de suivi des tendances, combinant la configuration de l’indicateur de nuage d’Ichimoku pour juger de la force multi-zones du marché afin de détecter les opportunités de percée potentielles. Les composants clés comprennent le cadre de jugement basé sur le nuage d’Ichimoku, les arrêts ATR, les arrêts en pourcentage et les mécanismes d’arrêt optionnels.

Principe de stratégie

Le jugement central de la stratégie est composé de deux parties: un signal de tendance basé sur l’indicateur de nuage d’Ichimoku pour juger de la force de la volatilité du marché, et un signal de force basé sur une éventuelle rupture.

Pour le jugement de la tendance, il faut satisfaire à la fois à la condition que la traversée de la ligne de base sur la ligne de conversion indique la création d’une tendance à plusieurs têtes, que la durée de retard supérieure à la ligne K indique la force actuelle à plusieurs têtes, que le prix est supérieur au prix le plus élevé du nuage indique la rupture de la voie.

Pour les signaux puissants, il faut satisfaire à la fois aux conditions suivantes: le prix est supérieur au prix le plus bas dans le nuage pour afficher la puissance supérieure, la ligne de conversion et la ligne de base sont les mêmes que pour indiquer que la puissance est pleine.

Lorsqu’un ensemble quelconque de ces deux types de conditions est déclenché, il est possible d’ouvrir une position plus élevée en fonction du prix du marché; un suivi de stop-loss est ensuite mis en place en fonction des règles de l’indicateur ATR, du pourcentage ou de l’indicateur Ichimoku Cloud, afin de verrouiller davantage les bénéfices.

Analyse des avantages

Le plus grand avantage de cette stratégie réside dans le fait qu’elle utilise à la fois le jugement de tendance et l’évaluation de la force multi-espace du nuage d’Ichimoku. Par rapport à des indicateurs tels que les moyennes mobiles uniques, le nuage d’Ichimoku est plus capable de refléter les oppositions de forces du marché actuel, ce qui améliore la précision du signal.

En outre, la combinaison de l’ATR et du pourcentage de stop-loss pour gérer le risque permet de bien contrôler les pertes individuelles. En outre, le mécanisme de stop-loss optionnel rend également les gains stratégiques plus stables.

Analyse des risques

Le principal risque de la stratégie réside dans le fait que le nuage d’Ichimoku est lui-même un peu retardé. En outre, le signal puissant, en tant que caractéristique de la poursuite, peut également augmenter la probabilité d’être pris en charge par la stratégie.

Pour réduire le risque de problèmes de latence, il est possible de raccourcir de manière appropriée le cycle de paramètres du nuage d’Ichimoku; les risques liés aux signaux puissants nécessitent un renforcement des paramètres de suivi de l’arrêt des dommages.

Direction d’optimisation

La stratégie peut être optimisée dans les domaines suivants:

  1. Tester les données de différents marchés pour déterminer la solidité et l’adaptabilité des stratégies

  2. Optimiser les paramètres d’Ichimoku pour les rendre plus adaptés à un marché spécifique

  3. Les algorithmes d’apprentissage en profondeur, tels que LSTM, peuvent aider à déterminer l’intensité du signal de rupture.

  4. Ajout d’indicateurs quantitatifs pour éviter la probabilité d’une chute

Résumer

La stratégie intègre l’utilisation de la configuration de l’Ichimoku Cloud pour juger de la force de la surchauffe du marché, tout en prenant en compte la gestion des risques tout en capturant les tendances potentielles. La stratégie équilibre efficacement les gains et la maîtrise. Bien qu’il y ait encore de la place pour l’optimisation, dans l’ensemble, c’est une stratégie de suivi des tendances très pratique.

Code source de la stratégie
/*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