18 KiB
Heikin Ashi Pro (v4.00)
Ultra-Low Latency Synthetic Candlestick Stream & Trend-Filtering Engine
1. Summary (Introduction)
Heikin Ashi Pro is an institutional-grade chart overlay indicator designed to eliminate market microstructure noise, false breakouts, and high-frequency erratic price spikes by synthesizing modified volume-neutral candlesticks.
In high-density algorithmic trading workspaces—where traders frequently operate 13 to 14 active chart windows simultaneously, with over 10 indicators per window—standard Heikin Ashi implementations cause severe UI Thread Saturation and tick-lag. This latency causes chart candles to freeze momentarily before suddenly jumping to catch up with Market Watch ticks.
Heikin Ashi Pro (v4.00) introduces an Enterprise Fused O(1) Architecture:
- Eliminates legacy hidden buffer overhead, reducing memory footprint by 45%.
- Fuses candlestick math and directional color mapping into a single-pass vectorized execution loop.
- Completely frees the MetaTrader 5 DirectX rendering pipeline, guaranteeing instant, freeze-free chart refreshes across massive multi-chart setups.
┌────────────────────────────────────────────────────────────────────────┐
│ HEIKIN ASHI ARCHITECTURAL EVOLUTION │
├────────────────────────────────────────────────────────────────────────┤
│ │
│ LEGACY MODEL (v3.05): │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ 9 Buffers (4 HA + 1 Color + 4 Dummy OHLC) │ │
│ │ 3 Separate Iterative Loops per incoming tick │ │
│ │ 56 Redundant Dynamic Double Arrays across 14 charts │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ OPTIMIZED │
│ ENTERPRISE MODEL (v4.00): │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ 5 Buffers (4 HA + 1 Color) — Zero Dummy Arrays │ │
│ │ 1 Fused Vectorized Loop Pass (Multiplication Kernel) │ │
│ │ Zero Dynamic Heap Allocations (Static BSS Instantiation) │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │
└────────────────────────────────────────────────────────────────────────┘
Key Architectural Highlights
- 45% Immediate Memory Reduction: Buffers reduced from 9 to 5, eliminating 56 unused dynamic array allocations across a 14-chart workspace.
- Single-Pass Fused Execution Loop: Calculates HA Open, Close, High, Low, and Color Index within the same memory cache line in
O(1)incremental time. - SIMD-Pipelined Math: Replaces slow floating-point divisions (
/ 4.0,/ 2.0) with fast scalar multiplications (* 0.25,* 0.5). - Zero-Heap BSS Instantiation: Eliminates runtime pointer allocation (
new/delete), eliminating heap fragmentation and GC latency. - 100% Backward-Compatible Engine: Enhances
HeikinAshi_Tools.mqhwith a fused 11-parameter overload while preserving the legacy 10-parameter interface used by VWAP, RV-Score, and Moving Average engines.
2. Mathematical Foundations & Vectorized Smoothing
Real Bar (t) HA Synthetic Bar (t)
┌────────────────┐ ┌────────────────┐
│ High │ │ HA High │
│ ┌────────┐ │ │ ┌────────┐ │
│ │ Open │ │ │ │HA Close│ │
│ │ │ │ ───────────────▶ │ │ │ │
│ │ Close │ │ │ │HA Open │ │
│ └────────┘ │ │ └────────┘ │
│ Low │ │ HA Low │
└────────────────┘ └────────────────┘
2.1. Synthetic Heikin Ashi Close (\text{HA\_Close}_t)
The synthetic close is the arithmetic mean of the real bar's four core price components:
\text{HA\_Close}_t = \frac{\text{Open}_t + \text{High}_t + \text{Low}_t + \text{Close}_t}{4} = (\text{Open}_t + \text{High}_t + \text{Low}_t + \text{Close}_t) \cdot 0.25
2.2. Recursive Synthetic Heikin Ashi Open (\text{HA\_Open}_t)
The synthetic open is the midpoint of the previous Heikin Ashi candle, establishing recursive inertia:
\text{HA\_Open}_0 = (\text{Open}_0 + \text{Close}_0) \cdot 0.5
\text{HA\_Open}_t = (\text{HA\_Open}_{t-1} + \text{HA\_Close}_{t-1}) \cdot 0.5 \quad \text{for } t \ge 1
2.3. Synthetic Extreme Boundaries (\text{HA\_High}_t, \text{HA\_Low}_t)
\text{HA\_High}_t = \max \Big( \text{High}_t, \; \max(\text{HA\_Open}_t, \; \text{HA\_Close}_t) \Big)
\text{HA\_Low}_t = \min \Big( \text{Low}_t, \; \min(\text{HA\_Open}_t, \; \text{HA\_Close}_t) \Big)
2.4. Directional Color Indexing (\text{HA\_Color}_t)
\text{HA\_Color}_t = \begin{cases} 0.0 \; (\text{Bullish } \rightarrow \text{clrCornflowerBlue}), & \text{if } \text{HA\_Close}_t \ge \text{HA\_Open}_t \\ 1.0 \; (\text{Bearish } \rightarrow \text{clrChocolate}), & \text{if } \text{HA\_Close}_t < \text{HA\_Open}_t \end{cases}
2.5. Mathematical Proof of Price Scale Encompassment
Why the 4 legacy dummy OHLC buffers (DRAW_NONE) were redundant:
- By mathematical definition:
\text{HA\_High}_t = \max(\text{High}_t, \dots) \implies \text{HA\_High}_t \ge \text{High}_t\text{HA\_Low}_t = \min(\text{Low}_t, \dots) \implies \text{HA\_Low}_t \le \text{Low}_t - Consequently, the synthetic Heikin Ashi candle strictly covers or exceeds the vertical price extremes of the underlying asset:
[\text{Low}_t, \; \text{High}_t] \subseteq [\text{HA\_Low}_t, \; \text{HA\_High}_t] - The MetaTrader 5 vertical autoscaling engine derives chart boundaries exclusively from visible plotting geometry (
DRAW_COLOR_CANDLES). DummyDRAW_NONEbuffers never participated in autoscaling. Removing them causes zero scaling degradation while freeing massive memory blocks.
3. MQL5 Architecture & Computational Benchmarking
┌────────────────────────────────────────────────────────┐
│ HeikinAshi_Tools.mqh │
│ (Fused Single-Pass SIMD Kernel: O(1) Vectorized) │
└──────────────────────────┬─────────────────────────────┘
│ Outputs HA OHLC + Color in 1 Pass
▼
┌────────────────────────────────────────────────────────┐
│ Chart_HeikinAshi.mq5 │
│ (Thin GUI Overlay Wrapper: 5 Buffers Only) │
├────────────────────────────────────────────────────────┤
│ Buffer Layout (5) │
│ • Buffer 0: BufferHA_Open (INDICATOR_DATA) │
│ • Buffer 1: BufferHA_High (INDICATOR_DATA) │
│ • Buffer 2: BufferHA_Low (INDICATOR_DATA) │
│ • Buffer 3: BufferHA_Close (INDICATOR_DATA) │
│ • Buffer 4: BufferColor (INDICATOR_COLOR_INDEX) │
└────────────────────────────────────────────────────────┘
Engineering Benchmark: Legacy (v3.05) vs. Enterprise (v4.00)
| Metric | Legacy Implementation (v3.05) | Enterprise Refactor (v4.00) | Net Optimization |
|---|---|---|---|
| Allocated Buffers | 9 Buffers | 5 Buffers | -44.4% Memory Footprint |
| Active Plot Types | 2 (DRAW_COLOR_CANDLES, DRAW_NONE) |
1 (DRAW_COLOR_CANDLES) |
-50.0% Drawing Calls |
| Loops per Tick | 3 Independent For-Loops | 1 Fused Vectorized Loop | -66.7% Iteration Overhead |
| Division Operations | 2 Divisions (/ 4.0, / 2.0) |
0 Divisions (* 0.25, * 0.5) |
Hardware SIMD Pipelining |
| Dynamic Allocations | new CHeikinAshi_Calculator() |
Static BSS Global Object | Zero Heap Fragmentation |
| Workspace Overhead (14 Charts) | 126 Dynamic Array Buffers | 70 Dynamic Array Buffers | 56 Dynamic Buffers Eliminated |
4. Parameters Reference & Visual Palette
Inputs Reference
Chart_HeikinAshi.mq5 features a zero-parameter input signature, ensuring instant attachment without dialog prompts:
- Calculation Mode: Native
O(1)standard (only re-evaluates barrates_total - 1on live incoming ticks). - Array Indexing: Chronological non-series order (
ArraySetAsSeries = false), maintaining array index0as oldest historic bar.
Visual Styling Palette
| State | Plot Color | Color Name | Default Style | Visual Meaning |
|---|---|---|---|---|
| Color Index 0 | clrCornflowerBlue |
Cornflower Blue | STYLE_SOLID |
Bullish Trend Regime: Synthetic close \ge open. |
| Color Index 1 | clrChocolate |
Chocolate / Rust Orange | STYLE_SOLID |
Bearish Trend Regime: Synthetic close < open. |
Recommended Chart Setup: To prevent visual overlap with default MT5 black-and-white candlesticks, navigate to Chart Properties (F8) -> Common -> Chart Mode -> Line Chart, and set the line chart color to None in the Colors tab.
5. Quantitative Trading Playbooks
┌────────────────────────────────────────────────────────────────────────┐
│ HEIKIN ASHI QUANTITATIVE PLAYBOOKS │
├────────────────────────────────────────────────────────────────────────┤
│ 1. Flat-Base Momentum Expansion: Zero lower wick in bull trend; │
│ zero upper wick in bear trend. │
│ 2. Trend Persistence Filter: Hold positions as long as candle │
│ color remains strictly unchanged. │
│ 3. Wicking Exhaustion Warning: Emergence of opposing wicks signals │
│ momentum deceleration. │
└────────────────────────────────────────────────────────────────────────┘
5.1. Flat-Base Momentum Expansion (Institutional Trend Drive)
- Bullish Expansion Rule:
- A series of
clrCornflowerBluecandles print with no lower wick (\text{HA\_Open}_t \approx \text{HA\_Low}_t). - Meaning: Aggressive directional buying without intraday pullback below the open.
- Execution: Maintain aggressive trend-following long exposure; advance trailing stop behind the previous HA Low.
- A series of
- Bearish Markdown Rule:
- A series of
clrChocolatecandles print with no upper wick (\text{HA\_Open}_t \approx \text{HA\_High}_t). - Meaning: Aggressive institutional distribution without intraday bounce above the open.
- Execution: Maintain short trend-following exposure.
- A series of
5.2. Double-Wicked Indecision & Exhaustion Alert
- Context: A persistent bull run prints large
clrCornflowerBluecandles with flat bottoms. Suddenly, a candle prints with long upper and lower wicks, accompanied by a shrinking synthetic real body (|\text{HA\_Close} - \text{HA\_Open}| \to 0). - Meaning: Equilibrium re-established; directional conviction exhausted.
- Action: Scale out 50–75% of trend positions; prepare for consolidation or mean reversion to the Rolling VWAP.
6. Indicator Buffer Map (For Developers & EA Integration)
Buffer Allocation
| Buffer Index | Name | Type | Description |
|---|---|---|---|
| 0 | BufferHA_Open |
INDICATOR_DATA |
Synthetic Heikin Ashi Open price series. |
| 1 | BufferHA_High |
INDICATOR_DATA |
Synthetic Heikin Ashi High price series. |
| 2 | BufferHA_Low |
INDICATOR_DATA |
Synthetic Heikin Ashi Low price series. |
| 3 | BufferHA_Close |
INDICATOR_DATA |
Synthetic Heikin Ashi Close price series. |
| 4 | BufferColor |
INDICATOR_COLOR_INDEX |
Binary Directional Color Index (0.0 = Bullish, 1.0 = Bearish). |
All buffers maintain strict chronological indexing (ArraySetAsSeries = false), ensuring seamless integration in automated Expert Advisors via iCustom().
MQL5 EA Integration Interface Template
//+------------------------------------------------------------------+
//| EA_HeikinAshi_Interface.mq5 |
//| Copyright 2026, xxxxxxxx|
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, xxxxxxxx"
#property version "1.00"
#property strict
//--- Global Indicator Handle
int g_ha_handle = INVALID_HANDLE;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(g_ha_handle != INVALID_HANDLE)
IndicatorRelease(g_ha_handle);
// Instantiate handle to Chart_HeikinAshi via iCustom
g_ha_handle = iCustom(_Symbol, _Period, "Chart_HeikinAshi");
if(g_ha_handle == INVALID_HANDLE)
{
PrintFormat("EA Error: Failed to create handle for Chart_HeikinAshi. Error: %d", GetLastError());
return INIT_FAILED;
}
Print("EA Success: Chart_HeikinAshi handle initialized successfully.");
return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(g_ha_handle != INVALID_HANDLE)
{
IndicatorRelease(g_ha_handle);
g_ha_handle = INVALID_HANDLE;
}
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// Query completed closed candle (Shift = 1) across all HA buffers
double ha_open[1], ha_high[1], ha_low[1], ha_close[1], ha_color[1];
if(CopyBuffer(g_ha_handle, 0, 1, 1, ha_open) < 1 ||
CopyBuffer(g_ha_handle, 1, 1, 1, ha_high) < 1 ||
CopyBuffer(g_ha_handle, 2, 1, 1, ha_low) < 1 ||
CopyBuffer(g_ha_handle, 3, 1, 1, ha_close) < 1 ||
CopyBuffer(g_ha_handle, 4, 1, 1, ha_color) < 1)
{
return;
}
double o = ha_open[0];
double h = ha_high[0];
double l = ha_low[0];
double c = ha_close[0];
int col = (int)ha_color[0];
// Quantitative Signals
bool is_bullish = (col == 0); // CornflowerBlue
bool is_bearish = (col == 1); // Chocolate
// Flat-base institutional momentum confirmation
double tick_size = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
if(tick_size <= 0) tick_size = _Point;
bool is_flat_bottom = MathAbs(o - l) <= tick_size * 0.5; // No lower wick
bool is_flat_top = MathAbs(o - h) <= tick_size * 0.5; // No upper wick
// Telemetry Output
Comment(StringFormat("Heikin Ashi Telemetry [Bar 1]:\n"
"HA Open: %.*f | High: %.*f | Low: %.*f | Close: %.*f\n"
"Trend Regime: %s | Flat-Drive: %s",
_Digits, o, _Digits, h, _Digits, l, _Digits, c,
is_bullish ? "BULLISH FLOW" : "BEARISH FLOW",
(is_bullish && is_flat_bottom) ? "STRONG BULL DRIVE" :
((is_bearish && is_flat_top) ? "STRONG BEAR DRIVE" : "NORMAL")));
}
//+------------------------------------------------------------------+