Crypto market data is fresh enough only relative to a defined decision and a verified feed state. Check the observation timestamp, local arrival time, instrument, completeness and connection continuity. A recent page refresh proves none of those things. A heartbeat can show that a connection is alive while the price needed for a decision remains old or incomplete.
At 14:02, a dashboard can correctly show a 14:00 candle, incorrectly label an old quote as live, or display an unfinished 14:00–15:00 candle. The right response depends on which object the number describes. This guide gives a reproducible way to distinguish them without pretending that one universal age threshold makes trading safe.
Give every value a meaning and a clock
Record four items beside an observation: exact market identity, event meaning, source timestamp and local receive timestamp. Store the decision time separately. For candles, also retain the interval boundaries and whether the candle is complete.
Market identity includes venue, symbol and instrument type. BTC/USDT spot and a BTC perpetual contract are not interchangeable observations. Neither are two venues' order books. If a provider supplies a composite price, label it as a composite instead of silently treating it as an executable venue quote.
Event meaning matters just as much. A last trade records a transaction. A best bid and ask describes quoted liquidity. A candle summarizes a period. A heartbeat reports feed activity. A strategy that needs one of these cannot substitute another simply because both contain timestamps.
Binance's spot candlestick stream distinguishes event time, candle boundaries and an explicit closed-candle field. Those fields permit a more precise check than the phrase “latest candle.” Binance spot stream documentation.
Separate three different ages
Use an explicitly synchronized clock for source-to-local comparisons, and document the remaining uncertainty. The following definitions are useful working measures, not guaranteed exchange latency metrics.
| Measure | Calculation | Main question |
|---|---|---|
| Arrival delay | Local receive time − source event time | How late did this event reach the application? |
| Local idle age | Decision time − last relevant receive time | How long has the application waited for relevant data? |
| Observation age | Decision time − source event time | How old is the observation being considered? |
If the local clock is ahead by 500 milliseconds, apparent arrival delay includes that offset. A negative result is a diagnostic clue, not proof of faster-than-instant transmission. Preserve raw timestamps and clock status before deriving precise conclusions.
Use a local monotonic duration source for elapsed waiting where the application supports it, while retaining wall-clock timestamps for correlation. A wall clock adjustment can otherwise make an idle timer jump. The design should state which timers use which clock rather than burying that choice in a chart label.
The measures answer different questions. A quote can arrive quickly but remain unchanged for a while. A burst of delayed trades can make a receive timer look busy while the underlying observations are old. Neither situation is resolved by repainting the dashboard every second.
A fictional feed incident, reconstructed
Assume a strategy needs a completed hourly candle and a contemporaneous quote from the same spot market. Its invented policy requires the relevant quote's observation age to be at most two seconds, no unresolved book gap, and a completed candle. These are example choices, not KLINEO defaults or recommended trading limits.
| Record | Source time UTC | Local arrival UTC | What it establishes |
|---|---|---|---|
| Completed hourly candle | 14:00:00.000 | 14:00:00.300 | A particular hour has finished, subject to source semantics |
| Quote update | 14:00:04.000 | 14:00:04.200 | A quoted state arrived 200 ms after its source timestamp |
| Heartbeat | 14:00:05.000 | 14:00:05.150 | Connection activity; not a new quote |
| Decision check | 14:00:06.500 | Same local instant | Quote observation age is 2.5 seconds |
At the decision check, local quote idle age is 2.3 seconds: 06.500 minus 04.200. Observation age is 2.5 seconds: 06.500 minus 04.000. The heartbeat does not reset either quote-specific measure. The example policy rejects new action even though the connection recently spoke.
Now suppose a delayed quote with source time 14:00:03.500 arrives at 14:00:06.700. Its arrival delay is 3.2 seconds, and it is older than the quote already retained. A system that overwrites state using arrival order alone can move backward in source time. The policy should define treatment of out-of-order events and preserve a diagnostic record.
This does not mean all older messages should be discarded indiscriminately. Some feeds require sequence-aware processing or recovery. Use the documented protocol for the specific channel; timestamp ordering is not a universal substitute for sequence rules.
A live socket can still contain an incomplete market view
Coinbase Exchange's heartbeat channel includes sequence numbers and last trade IDs that can help identify missed messages. Its documentation also describes cases where channel consumers need to handle gaps. A heartbeat is useful evidence about a stream, not a guarantee that an application's derived state is correct. Coinbase Exchange WebSocket channels.
For a locally maintained order book, define the recovery procedure before the first disconnect. Binance documents combining buffered depth events with a depth snapshot and update identifiers. Reconnection alone does not recreate all missing book changes. Binance local order-book management.
A useful state model has at least ready, degraded and recovering states. Ready means the specific requirements for a decision are satisfied. Degraded means one or more requirements are not. Recovering means a documented rebuild or backfill is in progress. None should imply a guarantee of profitable or loss-limited execution.
Keep data readiness separate from account readiness. A healthy quote feed does not establish an order's status after a timeout. The order reconciliation guide explains why an uncertain submission still needs exchange-side inspection.
Check timestamp units before measuring milliseconds
Preserve the field's documented unit. A timestamp encoded in seconds and one encoded in milliseconds can refer to the same instant while their raw numbers differ by a factor of 1,000. Formatting both as dates after the wrong conversion can produce a plausible-looking but unrelated history.
Add a fixture with a known instant and assert the decoded time before testing age thresholds. Also test source and arrival values that cross a second or day boundary. These checks concern parser correctness; they do not measure network latency. Store normalized values alongside enough original context to investigate a conversion mistake.
Choose a policy for the decision, not for the animation
A short-lived execution condition may need stricter freshness than a long-horizon research note. A thinly traded market may have long gaps between trades while its feed remains healthy. An hourly indicator can legitimately use a completed candle that is many minutes old, provided its definition and evaluation schedule say so.
Write the policy in terms of required objects. For example: completed hourly candle ending at the scheduled boundary, sufficient contiguous lookback, quote readiness under a specified measure, and no unresolved connection or sequence condition. Record what happens when any requirement fails.
Avoid filling missing prices with zero. Avoid carrying an old value forward without a visible age and status. If a calculation requires 15 completed observations and only 14 are verified, mark it unavailable unless the chosen method explicitly defines another treatment. The RSI context guide shows how candle selection affects an indicator calculation.
A freshness threshold can also produce a false sense of safety. A quote measured one second ago may change before an order arrives. Readiness is a condition for considering action, not a promise about the fill.
Make the diagnosis reproducible
For each rejected decision, store the market identity, source and arrival times, last relevant sequence information, required lookback, clock status, policy version and reason for rejection. Retain a small bounded sample around a gap rather than logging credentials or unnecessary personal information.
Test the policy with constructed faults: delayed data, an alive connection with no relevant updates, missing candles, a clock offset, out-of-order records and reconnect without a valid snapshot. Confirm that visible status and action eligibility agree. A red badge with an active execution path is not a completed control.
Volume comparisons deserve their own readiness check. A current partial period compared with a completed historical period can create a misleading ratio even with accurate timestamps. The volume confirmation worksheet makes that denominator explicit. Likewise, multiple-timeframe analysis needs a consistent as-of boundary across every interval.
What to ask of an AI explanation
Ask the analysis to name the observation time and exact source used, distinguish incomplete candles and state which inputs are missing. A newly generated paragraph cannot make its source data newer. If it cannot supply the underlying record, leave its freshness claim unverified.
KLINEO's AI analysis overview describes analysis as support for review. This article does not claim that KLINEO implements every diagnostic or policy described here; the worksheet is a general evaluation aid. Check actual application behavior and environment before relying on a readiness label.
This AI-assisted article follows the editorial policy. Its incident timeline and thresholds are invented. Source documentation establishes specific feed fields and recovery procedures, not a measured latency result for KLINEO, another application or the reader's connection.
