This strategy is a multi-timeframe trend following system based on Heikin-Ashi candlesticks and Exponential Moving Average (EMA) crossovers. It combines the smoothing properties of Heikin-Ashi candlesticks with the trend-following capabilities of moving averages across different timeframes, using MACD as an additional filter to accurately capture market trends. The strategy employs a hierarchical timeframe design, calculating and validating signals across 60-minute, 180-minute, and 15-minute timeframes.
The core logic includes several key components:
This strategy constructs a complete trend following trading system using multi-timeframe Heikin-Ashi and EMA systems combined with MACD filtering. The design thoroughly considers signal reliability and system stability, capable of adapting to different market environments through parameter optimization and risk control mechanisms. The strategy’s core strengths lie in signal smoothing and multi-validation mechanisms, while attention must be paid to choppy market risks and parameter optimization issues.
/*backtest start: 2019-12-23 08:00:00 end: 2025-01-04 08:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © tradingbauhaus //@version=5 strategy("Heikin Ashi Candle Time Frame @tradingbauhaus", shorttitle="Heikin Ashi Candle Time Frame @tradingbauhaus", overlay=true) // Inputs res = input.timeframe(title="Heikin Ashi Candle Time Frame", defval="60") hshift = input.int(1, title="Heikin Ashi Candle Time Frame Shift") res1 = input.timeframe(title="Heikin Ashi EMA Time Frame", defval="180") mhshift = input.int(0, title="Heikin Ashi EMA Time Frame Shift") fama = input.int(1, title="Heikin Ashi EMA Period") test = input.int(1, title="Heikin Ashi EMA Shift") sloma = input.int(30, title="Slow EMA Period") slomas = input.int(1, title="Slow EMA Shift") macdf = input.bool(false, title="With MACD filter") res2 = input.timeframe(title="MACD Time Frame", defval="15") macds = input.int(1, title="MACD Shift") // Heikin Ashi calculation var float ha_open = na ha_close = (open + high + low + close) / 4 ha_open := na(ha_open[1]) ? (open + close) / 2 : (ha_open[1] + ha_close[1]) / 2 ha_high = math.max(high, math.max(ha_open, ha_close)) ha_low = math.min(low, math.min(ha_open, ha_close)) // Adjusted Heikin Ashi Close for different timeframes mha_close = request.security(syminfo.tickerid, res1, ha_close[mhshift]) // MACD calculation [macdLine, signalLine, _] = ta.macd(close, 12, 26, 9) macdl = request.security(syminfo.tickerid, res2, macdLine[macds]) macdsl = request.security(syminfo.tickerid, res2, signalLine[macds]) // Moving Averages fma = ta.ema(mha_close[test], fama) sma = ta.ema(ha_close[slomas], sloma) plot(fma, title="Heikin Ashi EMA", color=color.green, linewidth=2) plot(sma, title="Slow EMA", color=color.red, linewidth=2) // Strategy Logic golong = ta.crossover(fma, sma) and (macdl > macdsl or not macdf) goshort = ta.crossunder(fma, sma) and (macdl < macdsl or not macdf) // Plot Shapes for Buy/Sell Signals plotshape(golong, color=color.green, text="Buy", style=shape.triangleup, location=location.belowbar) plotshape(goshort, color=color.red, text="SELL", style=shape.triangledown, location=location.abovebar) // Strategy Orders strategy.entry("Long", strategy.long, when=golong) strategy.close("Long", when=goshort) strategy.entry("Short", strategy.short, when=goshort) strategy.close("Short", when=golong) // Alerts alertcondition(golong, "Heikin Ashi BUY", "") alertcondition(goshort, "Heikin Ashi SELL", "")