BarSeries Base/Quote Symbol Metadata (TODO PRD)
Status Snapshot (2026-03-06)
Status: still proposed, not implemented in ta4j-core.
What exists today:
BarSeriesdoes not exposegetBaseSymbol()/getQuoteSymbol().BaseBarSeriesBuilderandConcurrentBarSeriesBuilderdo not providewithBaseSymbol(...)/withQuoteSymbol(...).- Instrument identity currently appears on
Trade(org.ta4j.core.Trade#getInstrument), not series-level metadata.
Overview
Add optional symbol metadata to BarSeries so a series can explicitly carry its
instrument identity without coupling ta4j to any external exchange library.
This PRD proposes two new fields:
baseSymbol(e.g.,BTC,AAPL)quoteSymbol(e.g.,USD,USDT,EUR)
These values are simple String fields stored on the series (not on each bar),
and are intended to be optional and purely informational.
Goals
- Provide explicit series-level instrument identity without external dependencies.
- Preserve the current
BarSeriesname semantics (no forced renaming). - Keep changes backward-compatible (null/absent values are valid).
- Ensure metadata flows through builders, sub-series, and serialization.
Non-Goals
- No parsing or validation against exchange-specific schemas.
- No automatic inference from
BarSeries#getName(). - No per-bar symbol metadata.
- No hard dependency on XChange or any other market library.
Proposed API
BarSeries (interface)
Add two optional getters:
String getBaseSymbol();
String getQuoteSymbol();
Default behavior: null if not set.
BaseBarSeries
Add fields:
private final String baseSymbol;
private final String quoteSymbol;
Builders
Extend the builders to capture metadata:
BaseBarSeriesBuilderwithBaseSymbol(String baseSymbol)withQuoteSymbol(String quoteSymbol)- (Optional convenience)
withSymbolPair(String base, String quote)
ConcurrentBarSeriesBuilder- Same methods, delegated to the base builder.
- Any other builder that creates a
BarSeriesshould forward these values.
Serialization
BaseBarSeries and ConcurrentBarSeries serialization should include the new
fields so round-trips preserve them.
Design Decisions
- Strings, not types: Strings avoid coupling to external symbol types.
- Optional: Null is valid; no migration required.
- No inference: Do not parse symbols out of the series name.
- Series-level: Bars remain data points, not metadata containers.
Implementation Plan
- Add getters to
BarSeries- Update interface and any implementations.
- Add fields to
BaseBarSeries- Thread through constructors.
- Update builders
- Add
withBaseSymbol/withQuoteSymbol(and optionalwithSymbolPair). - Pass into
BaseBarSeriesconstructors.
- Add
- Propagate to sub-series
- Ensure
getSubSeries(...)retains metadata.
- Ensure
- Serialization updates
- Ensure any serialization logic (Java or JSON) preserves fields.
- Documentation
- Update javadocs in
BarSeriesandBaseBarSeriesBuilder.
- Update javadocs in
- Tests
- Add unit tests for builder, sub-series, and serialization round-trip.
File Impact (Expected)
ta4j-core/src/main/java/org/ta4j/core/BarSeries.javata4j-core/src/main/java/org/ta4j/core/BaseBarSeries.javata4j-core/src/main/java/org/ta4j/core/BaseBarSeriesBuilder.javata4j-core/src/main/java/org/ta4j/core/ConcurrentBarSeries.javata4j-core/src/main/java/org/ta4j/core/ConcurrentBarSeriesBuilder.java- Tests under
ta4j-core/src/test/java/org/ta4j/core/...
Backward Compatibility
- Existing code continues to work with
nullsymbols. - No breaking changes to constructors if defaults are applied in builders.
- The new getters are additive.
Testing Strategy
- Builder metadata: Create a series via builder and assert symbols.
- Sub-series propagation:
getSubSeries()preserves symbols. - Serialization: Java serialization round-trip retains symbols.
- Null handling: Explicitly verify
nullis allowed and does not fail.
Acceptance Criteria
BarSeriesexposes base/quote symbol getters.- Builders set and preserve symbols.
- Sub-series retains symbols.
- Serialization round-trip retains symbols.
- All tests pass.
Open Questions
- Should
withSymbolPair(base, quote)be included for convenience? - Should symbols be normalized (e.g., uppercase) or stored verbatim?
Rationale Notes (2026-03-06)
- Verified current API surface in
org.ta4j.core.BarSeries,BaseBarSeries,BaseBarSeriesBuilder,ConcurrentBarSeries, andConcurrentBarSeriesBuilder. - Verified recent core branch history through commit
6cce8809with no landed series-level symbol metadata.