The name of this strategy is “Quantitative Trading Strategy Based on Ichimoku Cloud Breakout and ADX Index”. It combines Ichimoku cloud charting with Average Directional Movement Index (ADX) to determine when to take long or short positions. Specifically, it enters positions when price breaks through key areas of the cloud chart and ADX shows strong trend.
The strategy uses “Ichimoku Cloud” from Ichimoku Kinko Hyo indicators to identify key support and resistance areas. It also incorporates ADX index to judge trend strength. The specific trading rules are:
Long entry signals:
Short entry signals:
The strategy combines chart pattern analysis and trend analysis indicators, which can effectively determine market trends and strong areas. The main advantages are:
There are some risks with this strategy, mainly around instability in ADX trend determination. The risks and solutions are:
The strategy can be further optimized in the following ways:
This strategy combines Ichimoku cloud charting and ADX trend index to form a complete quantitative trading system. It identifies key support/resistance levels while also judging trend. It can effectively capture market opportunities. The strategy is easy to implement in live trading and also has room for optimization. Overall it is a quality quantitative strategy.
/*backtest start: 2023-01-26 00:00:00 end: 2024-02-01 00:00:00 period: 1d basePeriod: 1h 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/ // © Coinrule //@version=5 strategy('Ichimoku Cloud with ADX (By Coinrule)', overlay=true, initial_capital=1000, process_orders_on_close=true, default_qty_type=strategy.percent_of_equity, default_qty_value=30, commission_type=strategy.commission.percent, commission_value=0.1) showDate = input(defval=true, title='Show Date Range') timePeriod = time >= timestamp(syminfo.timezone, 2022, 1, 1, 0, 0) // Stop Loss and Take Profit for Shorting Stop_loss = input(1) / 100 Take_profit = input(5) / 100 longStopPrice = strategy.position_avg_price * (1 - Stop_loss) longTakeProfit = strategy.position_avg_price * (1 + Take_profit) // Inputs ts_bars = input.int(9, minval=1, title='Tenkan-Sen Bars') ks_bars = input.int(26, minval=1, title='Kijun-Sen Bars') ssb_bars = input.int(52, minval=1, title='Senkou-Span B Bars') cs_offset = input.int(26, minval=1, title='Chikou-Span Offset') ss_offset = input.int(26, minval=1, title='Senkou-Span Offset') long_entry = input(true, title='Long Entry') short_entry = input(true, title='Short Entry') middle(len) => math.avg(ta.lowest(len), ta.highest(len)) // Ichimoku Components tenkan = middle(ts_bars) kijun = middle(ks_bars) senkouA = math.avg(tenkan, kijun) senkouB = middle(ssb_bars) // Plot Ichimoku Kinko Hyo plot(tenkan, color=color.new(#0496ff, 0), title='Tenkan-Sen') plot(kijun, color=color.new(#991515, 0), title='Kijun-Sen') plot(close, offset=-cs_offset + 1, color=color.new(#459915, 0), title='Chikou-Span') sa = plot(senkouA, offset=ss_offset - 1, color=color.new(color.green, 0), title='Senkou-Span A') sb = plot(senkouB, offset=ss_offset - 1, color=color.new(color.red, 0), title='Senkou-Span B') fill(sa, sb, color=senkouA > senkouB ? color.green : color.red, title='Cloud color', transp=90) ss_high = math.max(senkouA[ss_offset - 1], senkouB[ss_offset - 1]) ss_low = math.min(senkouA[ss_offset - 1], senkouB[ss_offset - 1]) // ADX [pos_dm, neg_dm, avg_dm] = ta.dmi(14, 14) // Entry/Exit Signals tk_cross_bull = tenkan > kijun tk_cross_bear = tenkan < kijun cs_cross_bull = ta.mom(close, cs_offset - 1) > 0 cs_cross_bear = ta.mom(close, cs_offset - 1) < 0 price_above_kumo = close > ss_high price_below_kumo = close < ss_low bullish = tk_cross_bull and cs_cross_bull and price_above_kumo and avg_dm < 45 and pos_dm > neg_dm bearish = tk_cross_bear and cs_cross_bear and price_below_kumo and avg_dm > 45 and pos_dm < neg_dm strategy.entry('Long', strategy.long, when=bullish and long_entry and timePeriod) strategy.close('Long', when=bearish and not short_entry) strategy.entry('Short', strategy.short, when=bearish and short_entry and timePeriod) strategy.close('Short', when=bullish and not long_entry)