Il s'agit d'une stratégie de backtesting Ichimoku avec prise de profit, stop loss et confirmation cloud.
Le noyau de cette stratégie consiste à construire les composantes Ichimoku basées sur les paramètres d'entrée de l'utilisateur - Tenkan-Sen, Kijun-Sen, Senkou Span A & B et Chikou Span. Il identifie les signaux haussiers (longs) et baissiers (courts) lorsque le prix traverse ces lignes d'équilibre.
En outre, il implémente un stop loss et un take profit basé sur le prix d'entrée pour gérer le risque et la récompense. Il existe également une option pour attendre la confirmation du cloud, à savoir Senkou Span A > B pour les longs et Senkou Span A < B pour les courts. Cela aide à éviter de fausses ruptures.
Les principaux avantages de cette stratégie sont triple:
Ichimoku est doué pour identifier les tendances et l'élan.
Les fonctionnalités stop loss et take profit maximisent la récompense tout en minimisant le risque.
La confirmation dans le nuage filtre les faux signaux, assurant des entrées à forte probabilité.
Cependant, il y a aussi quelques risques clés à prendre en considération:
Ichimoku est sujette à des fléchettes sur les marchés à courte portée sans tendance claire.
Le nuage est un indicateur de retard, et au moment de la confirmation du nuage, une grande partie du mouvement a peut-être déjà eu lieu.
Optimiser les niveaux de stop loss et de take profit est difficile et sensible.
Certaines façons d'améliorer cette stratégie:
Combinez Ichimoku avec les principaux indicateurs comme le RSI pour une confirmation supplémentaire et une entrée anticipée.
Adapter le stop loss et le profit basé sur la volatilité au lieu d'utiliser des pourcentages fixes.
Testez les paramètres optimaux sur divers actifs et délais pour identifier les meilleures configurations pour la stratégie.
Incorporer l'apprentissage automatique pour optimiser en permanence les paramètres et les règles de stratégie sur la base de données mises à jour.
Il s'agit d'un système Ichimoku solide avec de bonnes fonctionnalités de capture de tendance et de gestion des risques. Avec quelques améliorations, il peut être un excellent ajout à l'approche globale du trading. Il fonctionne bien sur les marchés des changes, des matières premières et des crypto-monnaies.
/*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))