This repository is an article-derived reference project based on the original MQL5 article. It does not claim to reproduce the full original source code unless files are explicitly attached.
## Overview
This project is a reference reconstruction of an MQL5 custom indicator that implements an EquiVolume-style visualization. Instead of fixed-width candles, it draws volume-weighted rectangles in a separate indicator window, where candle height represents price range and candle width represents relative trading activity over a configurable lookback period.
The article describes the implementation incrementally and provides code fragments for key parts of the indicator logic.
## Original Article
- **Article ID:** 22742
- **Author:** Abioye Israel Pelumi
- **Publication date:** 2026.05.31
- **Category:** MQL5 / Indicators
- **URL:** https://www.mql5.com/en/articles/22742
## Repository Purpose
The purpose of this repository is to preserve and document the article’s EquiVolume indicator design as a technical reference project.
Based on the processed material, the indicator aims to:
- choose between real volume and tick volume automatically;
- find the maximum volume in a lookback range;
- normalize candle volumes against that maximum;
- convert normalized volume into horizontal box width;
- draw candle range and candle body as rectangle objects;
- render the result in a separate indicator subwindow;
- remove outdated objects to keep the display limited to the active range.
## Key Concepts
- **EquiVolume visualization:** candle width reflects volume rather than being fixed.
- **Volume source fallback:** use real volume when available, otherwise tick volume.
- **Lookback-based scaling:** maximum volume is determined only within the selected historical window.
- **Dynamic vertical scaling:** indicator window min/max are set from the highest high and lowest low in the range.
- **Object-based rendering:** rectangles are used instead of standard indicator buffers.
- **Incremental redraw control:** calculations are run once per new candle using a stored bar timestamp.
- **Bullish/bearish body coloring:** candle body fill depends on close vs. open.
## Algorithm / Architecture Summary
The article describes the following architecture:
1.**Indicator setup**
- Declare a separate-window indicator with no standard plots.
- Define inputs such as lookback, bull/bear colors, outline color, and maximum width scaling.
- Store the indicator subwindow index with `ChartWindowFind()`.
2.**Execution timing**
- In `OnCalculate()`, limit processing to the configured lookback.
- Run the main logic only once per new candle using a `lastTradeBarTime` check.
3.**Volume source selection**
- Detect whether broker-provided real volume is available.
- Fall back to tick volume if real volume is unavailable.
4.**Reference range scan**
- Scan the lookback range to determine:
- maximum volume;
- highest high;
- lowest low.
5.**Indicator scale update**
- Set `INDICATOR_MAXIMUM` and `INDICATOR_MINIMUM` from the observed price extremes.
6.**Volume normalization**
- For each closed candle in the range, compute a width factor:
-`width = volume / maxVolume * InpMaxWidthPct`
- Skip zero-volume candles.
7.**Rectangle drawing**
- Draw one rectangle for the candle’s full high-low range.
- Draw a second filled rectangle for the open-close body.
- Reuse existing objects when possible rather than recreating them.
8.**Horizontal chaining**
- Use time coordinates to place each rectangle.
- Move the next candle’s starting point to the previous candle’s endpoint so boxes connect sequentially.
9.**Cleanup**
- Delete old rectangle objects outside the active display range.
- Clear box objects during initialization and deinitialization.
## Mentioned or Attached Files
### Explicitly attached files
No attached source files were available in the processed input.
### Files mentioned in the article text
The article provides inline MQL5 code fragments for an indicator implementation, including:
- an indicator source containing:
-`OnInit()`
-`OnCalculate()`
-`OnDeinit()`
-`DrawBox(...)`
-`BoxEmptyName(...)`
-`BoxFillName(...)`
No concrete filename was provided in the processed input.
## Statistics
- **Code availability:** Partial, from article excerpts only
- **Implementation type:** Custom indicator
- **Rendering method:** Chart rectangle objects in a separate indicator window
- **Primary data inputs:** Open, high, low, close, tick volume, real volume
- chart object APIs such as `ObjectCreate`, `ObjectMove`, and `ObjectsDeleteAll`;
- subwindow rendering and indicator scaling.
## Limitations
- The full original source code is **not available** in the processed input.
- The article content includes **incremental code excerpts**, not a clearly attached complete project file.
- Because no explicit repository file list was attached, this README presents the project as a **reference/reconstruction** rather than a verified full reproduction.
- Some implementation details may require validation in a real `.mq5` file, especially object cleanup behavior and subwindow object management.
## Reference
This README is based solely on the processed article text describing an MQL5 EquiVolume indicator implemented with rectangle objects, dynamic price scaling, and volume-normalized candle widths.