An MT5 candle can have hundreds of ticks and a real-volume value of zero. That does not mean hundreds of lots traded, nor does it prove that nobody traded. The fields describe different measurements, and confusing them can quietly change the meaning of a volume-weighted indicator.
This guide explains MT5 tick volume versus real volume, then shows how to audit the fields returned through MetaKit. It focuses on data interpretation and a reproducible activity ratio. A high count is not, by itself, a directional signal or evidence that an indicator predicts future returns.
Two volume fields, two units
MetaQuotes' MqlRates structure separates tick_volume from real_volume. The platform's volume-indicator documentation describes forex volume in terms of ticks or price changes, while traded volume is relevant where the feed supplies executed-trade quantities.
Think of tick volume as an activity count for the observed feed and bar. It is not a count of contracts, lots or base-currency units. A feed with more quote updates can have a different tick count even when the underlying market conditions are similar.
Real volume is reported traded quantity. Its instrument and venue coverage matter: units and contract definitions must come from the provider's specification. Even a populated field should not automatically be described as the volume of the entire global forex market. The BIS conducts a separate OTC foreign-exchange turnover survey; an individual broker chart is a different data product.
Why real volume can be zero
A zero can mean that the field is not populated for the instrument/feed, or it can be a legitimate value within the feed's defined scope. Determine which interpretation applies by checking instrument documentation and a settled history sample. Do not replace every zero with tick volume just to make a chart nonempty.
Missing is another state. A response without the expected field is different from a numeric zero. Retain that distinction in ingestion. If your downstream model expects actual traded quantity and the source only supplies quote counts, mark that feature unavailable rather than changing its units silently.
The platform's price-data documentation explains the role of bid, ask, last price and volume in different market-data contexts. Use it to establish what your feed represents before designing a chart legend. A last-trade field on an exchange instrument and quote updates on a forex feed need not have the same interpretation.
What MetaKit currently returns
GET /v1/accounts/{id}/candles exposes tickVolume and realVolume with that exact camel-case spelling. The current terminal adapter maps them from native tick_volume and real_volume. Other candle fields include time, OHLC prices and spread. The route caps a response at 5,000 candles and reports truncated when a range exceeds that cap.
By contrast, /v1/accounts/{id}/ticks exposes a per-tick volume field. Do not sum that field and assume it reconstructs the candle's tick count. The current tick response omits native flags and volume_real, which limits what can be inferred about which component changed on each update.
The historical-data guide covers retrieval and field normalization. Keep source names or document your renaming map; realVolume, real_volume and a generic volume should not be treated as interchangeable without checking which resource supplied them.
Audit a completed-bar sample first
Choose a single account, exact symbol and timeframe. Fetch a settled date range, ensure the response is not truncated and inspect several ordinary sessions. For each field, count missing values, invalid values, zeros and positive observations. Preserve the time range and feed identity with the result.
Exclude a bar that is still forming. Comparing its partial count with full historical bars introduces a mechanical time bias. Also compare equivalent sessions: a quiet-hour H1 bar and a major-session H1 bar can have different typical activity even when both are valid.
If you resample, sum nonoverlapping volume counts only after checking that the component bars are complete and share the same source and definition. Do not sum overlapping ranges, repeated pages or duplicate timestamps. A correct aggregation formula cannot compensate for a duplicated input dataset.
A simple relative tick-activity calculation
For an explicitly labeled activity measure, compare a completed bar's tick count with the average of selected completed baseline bars from the same feed. The following JavaScript accepts counts, not candle objects. It does not choose sessions or check collection completeness for you.
function relativeTickActivity(current, baseline) {
const valid = value => Number.isSafeInteger(value) && value >= 0;
if (!valid(current) || !Array.isArray(baseline) || !baseline.length ||
!baseline.every(valid)) {
throw new Error("Expected nonnegative integer tick counts");
}
const mean = baseline.reduce((sum, value) => sum + value / baseline.length, 0);
if (!Number.isFinite(mean)) throw new Error("Invalid baseline mean");
if (mean === 0) return null;
return { ratio: current / mean, baselineBars: baseline.length };
}With synthetic baseline counts of 400, 600 and 800, the mean is 600. A completed bar with 1,200 ticks has a ratio of 2.0. It had twice the chosen baseline's observed tick activity. That is the complete conclusion; it does not say traded notional doubled or buyers outnumbered sellers.
If the baseline contains only zeros, the function returns null. A zero current count against a positive baseline returns a ratio of zero. Those cases were checked separately, together with missing, negative and noninteger inputs. Production code should still retain the underlying bar timestamps and data-quality audit.
Be precise about weighted prices
Suppose three synthetic bar closes are 1.1000, 1.1010 and 1.1020. Tick-count weights of 100, 200 and 100 give a close-weighted average of 1.1010. A separate synthetic set of trade-quantity weights, 10, 10 and 80, gives 1.1017. Changing the weights changes the result because they describe different quantities.
Neither calculation is a true transaction-level VWAP merely because it uses a volume field: weighting bar closes loses the prices at which the underlying trades occurred. If you build a bar-based proxy, label both the selected price and selected weight. “Tick-weighted close proxy” communicates more than a bare “VWAP” label.
For the same reason, do not combine brokers' tick counts to estimate aggregate traded quantity. A multi-account panel can compare feed activity separately, with source-specific baselines, but those counts are not a common monetary unit.
Before interpreting an activity spike, inspect spread and quote freshness as well. A high tick count does not guarantee tight execution conditions, and a low count does not establish a feed outage. The spread guide and quote-freshness guide cover those independent checks.
Confirm fields in the MetaKit API documentation, and keep indicator assumptions next to the displayed result. The examples here use synthetic counts and prices; no live volume measurement or trading performance is claimed.
Sources and verification
Verified 19 October 2026 against MetaKit's candle and tick serializers and route caps.
- MetaQuotes MqlRates, native bar fields.
- MetaTrader volume indicators and price data, measurement context.
- BIS OTC FX turnover survey, a separate market-level statistical source.
- MetaKit API reference, public data access.