This strategy is called the “Heikin Ashi ROC Percentile Trading Strategy”. It aims to provide an easy-to-use trading framework based on the Heikin Ashi ROC and its percentiles.
The strategy calculates the ROC of Heikin Ashi close prices over the past rocLength periods. It then calculates the highest rocHigh and lowest rocLow values of ROC over the past 50 periods. The upper rail upperKillLine and lower rail lowerKillLine are generated based on certain percentiles of rocHigh and rocLow. When ROC crosses above lowerKillLine, a long position is opened. When ROC crosses below upperKillLine, the long position is closed. Conversely, when ROC crosses below upperKillLine, a short position is opened. When ROC crosses above lowerKillLine, the short position is closed.
The biggest advantage of this strategy is utilizing the ROC indicator’s strong trend tracking capability, combined with Heikin Ashi’s feature of smoothing price information. This allows the strategy to effectively identify trend changes and enter trades in a timely manner. Compared to simple moving averages, ROC responds more sensitively to price changes. Additionally, the upper and lower rails generated from percentiles can effectively filter out consolidations and avoid unnecessary trades from fake breakouts. Overall, this strategy combines both trend following and oscillation filtering to achieve good risk-reward ratios in major trends.
The main risk of this strategy is that improper parameter settings may lead to overtrading or insufficient sensitivity. The rocLength and percentile lookback periods need to be set prudently, otherwise the rails may become too dull or stiff, causing missed trades or unnecessary losses. In addition, the percentile settings need to be repeatedly backtested and adjusted for different markets to find optimal combinations. The strategy is also subject to certain losses when trends reverse, due to its reliance on trend-following indicators. Positions should be closed timely, or stop losses set to control risks.
The strategy can be optimized in the following ways: 1) Add filters with other indicators like RSI; 2) Dynamically optimize parameters with machine learning; 3) Set stop loss and take profit for automatic risk management; 4) Combine with non-trend strategies to balance risks.
In summary, this strategy utilizes the powerful trend tracking capability of the ROC indicator, combined with Heikin Ashi for trend identification and following. The upper and lower rails generated from ROC percentiles allow for effective loss filtering. This achieves good trend tracking performance. The advantages lie in its timely identification of trend changes and following of major trends, while filtering out consolidations with the rails. However, improper parameter settings may impact performance, and trend reversal risks remain. Further optimizing parameter selection and setting stops can help obtain more consistent results.
/*backtest start: 2023-09-22 00:00:00 end: 2023-10-22 00:00:00 period: 1h 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/ // © jensenvilhelm //@version=5 strategy("Heikin Ashi ROC Percentile Strategy", shorttitle="ROC ON" , overlay=false) // User Inputs zerohLine = input(0, title="Midline") // Zero line, baseline for ROC (customer can modify this to adjust midline) rocLength = input(100, title="roc Length") // Lookback period for SMA and ROC (customer can modify this to adjust lookback period) stopLossLevel = input(2, title="Stop Loss (%)") // Level at which the strategy stops the loss (customer can modify this to adjust stop loss level) startDate = timestamp("2015 03 03") // Start date for the strategy (customer can modify this to adjust start date) // Heikin Ashi values var float haClose = na // Define Heikin Ashi close price var float haOpen = na // Define Heikin Ashi open price haClose := ohlc4 // Calculate Heikin Ashi close price as average of OHLC4 (no customer modification needed here) haOpen := na(haOpen[1]) ? (open + close) / 2 : (haOpen[1] + haClose[1]) / 2 // Calculate Heikin Ashi open price (no customer modification needed here) // ROC Calculation roc = ta.roc(ta.sma(haClose, rocLength), rocLength) // Calculate Rate of Change (ROC) (customer can modify rocLength in the inputs) rocHigh = ta.highest(roc, 50) // Get the highest ROC of the last 50 periods (customer can modify this to adjust lookback period) rocLow = ta.lowest(roc, 50) // Get the lowest ROC of the last 50 periods (customer can modify this to adjust lookback period) upperKillLine = ta.percentile_linear_interpolation(rocHigh, 10, 75) // Calculate upper kill line (customer can modify parameters to adjust this line) lowerKillLine = ta.percentile_linear_interpolation(rocLow, 10, 25) // Calculate lower kill line (customer can modify parameters to adjust this line) // Trade conditions enterLong = ta.crossover(roc, lowerKillLine) // Define when to enter long positions (customer can modify conditions to adjust entry points) exitLong = ta.crossunder(roc, upperKillLine) // Define when to exit long positions (customer can modify conditions to adjust exit points) enterShort = ta.crossunder(roc, upperKillLine) // Define when to enter short positions (customer can modify conditions to adjust entry points) exitShort = ta.crossover(roc, lowerKillLine ) // Define when to exit short positions (customer can modify conditions to adjust exit points) // Strategy execution if(time >= startDate) // Start strategy from specified start date if (enterLong) strategy.entry("Long", strategy.long) // Execute long trades if (exitLong) strategy.close("Long") // Close long trades if (enterShort) strategy.entry("Short", strategy.short) // Execute short trades if (exitShort) strategy.close("Short") // Close short trades // Plotting plot(zerohLine,title="Zeroline") // Plot zero line plot(roc, "RSI", color=color.rgb(248, 248, 248)) // Plot ROC plot(rocHigh, "Roc High", color = color.rgb(175, 78, 76)) // Plot highest ROC plot(rocLow, "Roc Low", color = color.rgb(175, 78, 76)) // Plot lowest ROC plot(upperKillLine, "Upper Kill Line", color = color.aqua) // Plot upper kill line plot(lowerKillLine, "Lower Kill Line", color = color.aqua) // Plot lower kill line