ores.marketdata.operations
Table of Contents
- 1. Includes
- 2. Messages
- 2.1. series_identity_field
- 2.2. resolve_series_identity_request
- 2.3. resolve_series_identity_response
- 2.4. oresmd_field_spec
- 2.5. oresmd_instrument
- 2.6. oresmd_index_field
- 2.7. oresmd_index_family
- 2.8. describe_oresmd_schema_request
- 2.9. describe_oresmd_schema_response
- 2.10. oresmd_uri_field
- 2.11. parse_oresmd_uri_request
- 2.12. parse_oresmd_uri_response
- 2.13. compose_oresmd_uri_request
- 2.14. compose_oresmd_uri_response
- 2.15. list_series_identities_request
- 2.16. listed_series
- 2.17. list_series_identities_response
- 2.18. crm_rate_item
- 2.19. get_crm_rate_request
- 2.20. get_crm_rate_response
- 2.21. get_crm_rates_request
- 2.22. get_crm_rates_response
- 2.23. republish_curve_request
- 2.24. republish_curve_response
- 2.25. compute_curve_request
- 2.26. computed_curve_point
- 2.27. compute_curve_response
- 2.28. series_slice_instant
- 2.29. get_series_slice_request
- 2.30. get_series_slice_response
- 2.31. evolution_node
- 2.32. evolution_instant
- 2.33. get_series_evolution_request
- 2.34. get_series_evolution_response
- 2.35. point_provenance
- 2.36. get_curve_snapshot_request
- 2.37. get_curve_snapshot_response
- 2.37.1. success
- 2.37.2. message
- 2.37.3. as_of
- 2.37.4. coordinate_fields
- 2.37.5. nodes
- 2.37.6. values
- 2.37.7. recorded_at
- 2.37.8. provenance
- 2.37.9. oldest_age_seconds
- 2.37.10. spread_seconds
- 2.37.11. warning
- 2.37.12. published_at
- 2.37.13. published_by
- 2.37.14. published_as_of
- 2.37.15. approval_request_id
- 2.38. import_market_data_request
- 2.39. import_market_data_response
- 2.40. feed_kind_counts
- 2.41. start_feeds_under_folder_request
- 2.42. start_feeds_under_folder_response
- 2.43. stop_feeds_under_folder_request
- 2.44. stop_feeds_under_folder_response
- 2.45. export_market_data_to_storage_request
- 2.46. export_market_data_to_storage_response
- 2.47. backfill_series_identity_request
- 2.48. backfill_series_identity_response
- 2.49. key_manual_point_request
- 2.50. key_manual_point_response
- 2.51. clear_manual_point_request
- 2.52. clear_manual_point_response
- 2.53. export_market_data_request
- 2.54. export_market_data_response
- 2.55. market_tick
- 2.56. get_series_ticks_request
- 2.57. get_series_ticks_response
- 2.58. store_market_state_request
- 2.59. store_market_state_response
- 3. See also
These are the component's messages that are not entity verbs. Each one acts
on an aggregate, a live computation or a whole-tenant export rather than on
one row of one resource, so none of them belongs in the common resource
grammar that ores.marketdata.market_series and its siblings drive. They
were hand-written headers until this model; the header and its TypeScript
twin now generate from here, so the two cannot drift.
Three groups share the file because they share the namespace and the wire conventions. The CRM group reads live rates from a rate engine. The curve group bootstraps, republishes and reads a curve's snapshot, its slice and its evolution. The import and export group moves whole ORE files in and out of the tenant.
1. Includes
#include <chrono> #include <cstdint> #include <map> #include <optional> #include <string> #include <string_view> #include <vector> #include "ores.marketdata.api/domain/market_observation.hpp" #include "ores.marketdata.api/domain/market_series.hpp" #include "ores.utility/domain/protocol.hpp"
2. Messages
2.1. series_identity_field
One typed identity field of a series, as the request gives it: the oresmd field name and the text the caller believes it holds.
/** * @brief One typed identity field of a series, as the caller gives it. * * The name is an oresmd field code, such as ccy or curve_id, and the text is * what the caller believes that field holds. The pair is the request's spelling * of the identity, not a URI: the server composes the URI through the codec. */
2.1.1. name
The field's oresmd name, the same name the identity URI writes it under.
2.1.2. text
The text the field holds, in the spelling the URI writes.
2.2. resolve_series_identity_request
Requests the series a typed identity names, so a caller never builds an
oresmd_uri by hand and never matches on one. The fields the URI grammar puts
in a fixed position are stated on their own – the asset class, the scope, the
instrument type and the quote type – and every remaining identity field
travels in fields.
/** * @brief Requests the series a typed identity names. * * The caller states the identity as typed fields and the server resolves it to * the series rows that carry it, so no caller builds an oresmd_uri and no * caller matches on one. The asset class, the scope, the instrument type and * the quote type are stated on their own because the URI grammar puts them in a * fixed position; every other identity field travels in `fields`. * * `party_id` states whose series is wanted. An empty one asks across the * parties the caller can see, which is why the answer is a list. * * `provider_code` states which provider's series is wanted. A party holds one * series of an identity for each provider, so an empty one can match several. */
2.2.1. asset
The asset class as the URI's authority writes it, such as fx or ir.
2.2.2. scope
The URI's subject field: what the series is about, such as the currency of a rate or the reference entity of a CDS.
2.2.3. instrument_type
The ORE instrument type, as the URI's instrument writes it, such as
fx_option.
2.2.4. quote_type
The ORE quote type, as the URI's quote writes it, such as rate_lnvol. It is
required, because every series URI carries a quote.
2.2.5. party_id
The owning party, or empty for every party the caller can see.
2.2.6. provider_code
The provider of the series, such as bloomberg or ore, or empty for every
provider. The same party can hold one series of an identity for each provider, so a
caller that wants one series states the provider.
2.2.7. fields
/** * @brief The identity's remaining fields, such as ccy or curve_id. * * The other fields the type's schema row declares. A field the caller does not * state is left unconstrained, so the read narrows by what it is given. */
2.3. resolve_series_identity_response
The series the identity resolves to. Empty when nothing carries it, which is not an error: a scope may hold no series of that kind yet.
/** * @brief The series the identity resolves to. * * One row per owning party that holds the identity. Empty when nothing carries * it, which is not an error: a scope may hold no series of that kind yet. */
2.3.1. series
2.3.2. success
2.3.3. message
2.4. oresmd_field_spec
One field of an instrument type's schema row, as a client needs it to draw an input for the field.
/** * @brief One field of a schema row. * * The role says whether the field names the series or a point within it. A field * that may be none can be left out of a URI. `codes` holds the tokens a code field * accepts and is empty for any other kind. */
2.4.1. name
The field's name, as a URI query key writes it: fwd_start, cap_floor.
2.4.2. role
Either identity or coordinate.
2.4.3. may_be_none
Whether a URI of this type may leave the field out.
2.4.4. kind
The kind of value the field holds: text, term, decimal, strike, code or strike_label.
2.4.5. codes
The tokens ORE accepts for a code field. Empty for a field that is not a code.
2.5. oresmd_instrument
One row of the schema: an instrument type, the asset class that is its URI's authority, the field that is its path, and its fields in the order a key writes them.
/** * @brief One instrument type of the schema, with its fields in key order. * * `code` is the text a URI writes under `instrument=`. `subject` is the field a * URI writes as its path. */
2.5.1. code
The text a URI writes under instrument=, such as ir_swap.
2.5.2. ore_name
The name ORE gives the type, such as IR_SWAP.
2.5.3. title
The words that name a series of this type, with the fields written as {subject} or {field_name}, such as {subject}/{ccy} spot. A reader fills the braces from the series identity. A quote label follows it.
2.5.4. asset
The asset class, which a URI writes as its authority.
2.5.5. subject
The field a URI writes as its path.
2.5.6. fields
The type's fields in the order its key writes them.
2.6. oresmd_index_field
One field of an index family's row.
/** @brief One field of an index family, which a fixing URI writes in the row's order. */
2.6.1. name
The field's name.
2.6.2. optional
Whether a fixing URI may leave the field out.
2.7. oresmd_index_family
One family of index a fixing is quoted against, with its asset class, its subject and its other fields.
/** * @brief One family of index. * * A fixing URI writes `type=fixing` and `index=` with the family's code. The path * is the subject and the query holds the other fields in the row's order. */
2.7.1. code
The family as a fixing URI writes it: ibor, bond_future.
2.7.2. asset
The asset class, which a URI writes as its authority.
2.7.3. subject
What the path of a fixing URI names.
2.7.4. fields
The family's other fields in the order an index name writes them.
2.8. describe_oresmd_schema_request
Asks what an oresmd URI may hold, so a client keeps no copy of the schema table.
/** * @brief Asks for the oresmd schema. * * The request carries nothing. The schema is the codec's own table, and it is the * same for every caller. */
2.9. describe_oresmd_schema_response
The schema: the asset classes, every instrument type with its fields, the quote types and the index families.
/** * @brief The oresmd schema, read from the codec's own tables. * * `instruments` follows the order of ORE's instrument types and each row's fields * follow the order its key writes them. Every list is in a stable order. */
2.9.1. assets
The asset classes a URI writes as its authority, in the schema's order.
2.9.2. instruments
Every instrument type, with its fields.
2.9.3. quotes
The quote types as a URI writes them under quote=.
2.9.4. quote_titles
The words for each quote type, such as rate or log-normal volatility, in the order of quotes. Empty for the quote type none.
2.9.5. indexes
Every family of index a fixing is quoted against.
2.9.6. success
2.9.7. message
2.10. oresmd_uri_field
One field of an oresmd URI, as a name and the text it holds.
/** * @brief One field of an oresmd URI: its name and the text it holds. * * The text is in the spelling a URI writes. The path of a URI is the subject, and * it is not one of these. */
2.10.1. name
The field's name, as a URI query key writes it.
2.10.2. text
The text the field holds.
2.11. parse_oresmd_uri_request
Asks the codec to read an oresmd URI into its parts, or to say why it refuses it.
/** * @brief Asks the codec to read an oresmd URI. * * The codec's reader is strict, so a URI that is not in its own spelling is * refused with the rule that failed. A URI longer than the codec's limit is * refused without being read. */
2.11.1. uri
The URI to read.
2.12. parse_oresmd_uri_response
The parts of a URI the codec accepts, or the codec's reason for refusing it.
/** * @brief The parts of an oresmd URI, or why the codec refuses it. * * `kind` is quote, series or fixing. For a quote or a series `instrument` is the * text under `instrument=` and `quote` is the text under `quote=`. For a fixing * `instrument` is the index family and `quote` is empty. `subject` is the path. * `fields` holds the other fields the URI states, in schema order, and leaves * out one the URI leaves out. */
2.12.1. kind
Quote, series or fixing.
2.12.2. instrument
The instrument type of a quote or series, or the index family of a fixing.
2.12.3. quote
The quote type of a quote or series. Empty for a fixing.
2.12.4. asset
The asset class, which the URI writes as its authority.
2.12.5. subject
The text of the URI's path.
2.12.6. fields
The other fields the URI states, in schema order.
2.12.7. success
Whether the codec accepted the URI.
2.12.8. message
Why the codec refuses the URI, in the codec's words. Empty on success.
2.13. compose_oresmd_uri_request
Asks the codec to write an oresmd URI from its parts, or to say why the parts make none.
/** * @brief Asks the codec to write an oresmd URI from its parts. * * A field with no text is a field the URI leaves out. The codec decides whether * the parts make a URI: a required field that is missing, a field the row does * not list, a field given twice and a value of the wrong form are each refused. */
2.13.1. kind
Quote, series or fixing.
2.13.2. instrument
The instrument type of a quote or series, or the index family of a fixing.
2.13.3. quote
The quote type of a quote or series. Empty for a fixing.
2.13.4. subject
The text of the URI's path.
2.13.5. fields
The other fields. A field with no text is left out.
2.14. compose_oresmd_uri_response
The URI in the codec's own spelling, or the reason the parts make none.
/** * @brief The oresmd URI the codec writes, or why the parts make none. * * The URI is the codec's canonical text, so a stored URI compares as text. */
2.14.1. uri
The URI in the codec's spelling. Empty on failure.
2.14.2. success
Whether the codec wrote a URI.
2.14.3. message
Why the parts make no URI. Empty on success.
2.15. list_series_identities_request
Requests the typed identity of every series the caller can see, so a screen can
offer the series as a choice and pass the choice back to the curve reads without
building or parsing an oresmd_uri.
/** * @brief Requests the typed identity of each series the caller can see. * * A party reads only its own series, so the list is the caller's view and not the * tenant's. An empty `party_id` asks across the parties the caller can see. */
2.15.1. party_id
Whose series are wanted. Empty asks across the parties the caller can see.
2.16. listed_series
One series in the list, with the identity that names it to the curve reads.
/** * @brief One series in the list, with the typed identity that names it. * * The identity carries the owning party, so passing it to the snapshot, slice or * evolution read names this series and no other party's series of the same kind. */
2.16.1. series_id
The series' id.
2.16.2. identity
The typed identity of the series, with its party stated.
2.16.3. axes
The coordinate fields the series declares, in order. Empty when the series declares no shape, which the evolution and slice reads refuse.
/** The declared coordinate fields in order. Empty when no shape is declared. */
2.17. list_series_identities_response
The series the caller can see, in a stable order.
/** * @brief The series the caller can see, in a stable order. * * Only series a curve read can name are listed: a series whose URI carries an * instrument type and a quote type. A fixing series is not. */
2.17.1. series
2.17.2. truncated
True when the caller can see more series than the list holds.
2.17.3. success
2.17.4. message
2.18. crm_rate_item
One CRM rate: direct or triangulated, indistinguishable to the caller – see
ores.analytics.quant::domain::derived_rate. A party may run several
concurrently-enabled, independently-named CRMs (such as "majors" and
"exotics"); crm_name says which one this rate came from.
2.18.1. crm_name
The name of the CRM that produced this rate.
2.18.2. base_currency_code
2.18.3. quote_currency_code
2.18.4. rate
2.18.5. status
/** "fresh" | "stale" | "unavailable" -- see
* ores.analytics.quant::domain::rate_status.
*/
2.18.6. as_of
/** ISO-8601 UTC, empty when status is "unavailable". */
2.18.7. reciprocal
/** True when this pair has no direct quote and rate is computed as
* 1/rate from the reverse pair -- only ever set when the request's own
* `reciprocal` flag was true.
*/
2.18.8. delta_pct
/** %-change vs. the last value served for this exact pair (as displayed,
* i.e. post-reciprocal) within this (tenant, party, crm_name) scope --
* shared across every session polling that same CRM, not per-connection.
* Unset for the first observation of a pair, or when status is
* "unavailable".
*/
2.19. get_crm_rate_request
Request a single CRM rate (direct or derived) for a party from one specific
named CRM. party_id is explicit rather than derived from the session,
because a tenant may have many parties and no single "current party" concept
exists at the request-context layer. crm_name is required rather than
defaulted, because a party may have more than one enabled CRM and the same
pair can resolve to a different rate in each.
/** * @brief Request a single CRM rate (direct or derived) for a party from * one specific named CRM. * * Pull-only, computed on demand from that CRM's live rate_engine -- see * the CRM story's architecture decision to never broadcast the full * derived set. party_id is explicit (not derived from session) because * a tenant may have many parties and no single "current party" concept * exists at the request-context layer today. crm_name is required (not * optional/defaulted) because a party may have more than one enabled * CRM and the same pair can resolve to a different rate in each. */
2.19.1. party_id
2.19.2. crm_name
2.19.3. base_currency_code
2.19.4. quote_currency_code
2.20. get_crm_rate_response
2.20.1. success
2.20.2. message
2.20.3. rate
2.21. get_crm_rates_request
Request every currently-configured CRM rate for a party in one call: the
union of that party's enabled driver pairs and enabled derived pairs,
resolved through one atomic snapshot load rather than N single-pair round
trips. When crm_name is empty, the answer carries rates from every enabled
CRM the party has, each item tagged with the CRM it came from.
/** * @brief Request every currently-configured CRM rate for a party in one * call -- the union of that party's enabled driver pairs and enabled * derived pairs, resolved via a single rate_engine::rates() batch (one * atomic snapshot load, not N single-pair round trips). * * When crm_name is empty, returns rates from *every* enabled CRM the * party has, each item tagged with which CRM it came from. When * crm_name is set, scopes to just that one CRM. */
2.21.1. party_id
2.21.2. crm_name
2.21.3. reciprocal
/** When true, a configured pair with no direct quote but whose reverse
* pair *is* configured is backfilled with the reverse's computed
* reciprocal (1/rate) -- see
* ores.analytics.quant::service::rate_reciprocator. When the reverse
* pair is itself also directly configured, its own direct rate is
* served instead of a synthesised reciprocal.
*/
2.22. get_crm_rates_response
2.22.1. success
2.22.2. message
2.22.3. rates
2.23. republish_curve_request
The on-demand trigger for curve_republish_service::republish(), callable
identically from the shell, an HTTP caller or a scheduler job. There is no
review or approval gate here; that is a separate, later layer on top of this
always-auto-publishing mechanism.
/** * @brief Request to bootstrap and republish an ir_curve_bootstrap_config's * output as of a given snapshot -- the on-demand trigger for * curve_republish_service::republish(), callable identically from the shell, * an HTTP caller, or a scheduler job. No review/approval gate here; that is a * separate, later layer on top of this always-auto-publishing mechanism. */
2.23.1. bootstrap_config_id
The bootstrap configuration whose output is republished.
2.23.2. as_of
The snapshot whose market observations the bootstrap reads.
2.24. republish_curve_response
2.24.1. success
2.24.2. message
2.25. compute_curve_request
The preview half of the compute/publish split: it bootstraps the curve but does not publish it. The shape is the republish request's, and the two stay separate requests rather than one request with an options flag, because they are different actions with different permission codes.
/** * @brief Request to bootstrap (but not publish) an * ir_curve_bootstrap_config's output as of a given snapshot -- the on-demand * trigger for curve_republish_service::compute(), the preview half of the * compute/publish split. Same shape as republish_curve_request; kept as its * own request/subject rather than an "options" flag on that one, since the * two are genuinely different actions with different permission codes (a * compute-only preview vs. a write that publishes new market_observations). */
2.25.1. bootstrap_config_id
2.25.2. as_of
2.26. computed_curve_point
One computed point, echoed back from curve_republish_service::compute().
Unlike a published market observation, it never touches the database.
/** * @brief One computed point, echoed back from * curve_republish_service::compute() -- unlike a published * market_observation, this never touches the database. */
2.26.1. point_id
2.26.2. date
2.26.3. discount_factor
2.27. compute_curve_response
2.27.1. success
2.27.2. message
2.27.3. points
2.28. series_slice_instant
One instant of a slice: the object as it stood then, one value per declared coordinate of the axis the component varies over.
/** * @brief One instant of a slice: the object as it stood then. */
2.28.1. as_of
The market instant this row is the object at.
2.28.2. values
Index for index with the response's coordinates.
/** * @brief The value at each declared coordinate, index for index with the * response's coordinates. * * The empty string is a hole: the shape declares the coordinate and no point * holds a value for it at this instant. A short vector would be read as a * shorter object, which is the mistake the aligned shape exists to prevent. */
2.29. get_series_slice_request
Requests one component of a composite object as a term structure over a range of instants: the ATM ladder of a volatility surface, say. The object is named by a typed identity and the component by an axis field and a value, so no caller builds an oresmd URI.
/** * @brief Requests one component of a composite object over a range of * instants. * * The object is named the way the resolver names one, so no caller builds an * oresmd URI and no caller matches on one. The component is the value the * object holds on one of its axes; an object with a single axis has one * component, the whole object, and leaves the component field empty. */
2.29.1. identity
The object, as the typed identity the resolver already takes.
/** The object, as the typed identity the resolver already takes. */
2.29.2. component_field
The axis the component fixes, an oresmd field code such as strike_label.
Empty for an object with one coordinate axis, whose one component is the whole
object.
/** * @brief The axis the component fixes, an oresmd field code such as * strike_label. * * Empty for an object with one coordinate axis, whose one component is the * whole object. */
2.29.3. component_value
The value the component fixes on that axis, such as ATM, in the spelling the
shape stores.
/** * @brief The value the component fixes on that axis, such as ATM, in the * spelling the shape stores. */
2.29.4. from_instant
The first market instant of the range, inclusive.
/** The first market instant of the range, inclusive. */
2.29.5. to_instant
The last market instant of the range, inclusive.
/** The last market instant of the range, inclusive. */
2.30. get_series_slice_response
The component at each instant in the range, drawn against one ladder.
/** * @brief The component at each instant in the range. * * The ladder is stated once, because it belongs to the shape and not to the * points: coordinates holds the declared values of the axis the component * varies over, in the order the shape stores them, and every instant's values * are index for index with it. */
2.30.1. success
2.30.2. message
Why the read was refused, when it was. A component the shape does not declare is refused here, naming the axis or the value that is missing.
/** * @brief Why the read was refused, when it was. * * A component the shape does not declare is refused here, naming the axis or * the value that is missing. */
2.30.3. coordinate_field
The axis the component varies over, an oresmd field code such as expiry.
Empty when the response holds no instant.
/** * @brief The axis the component varies over, an oresmd field code such as * expiry. * * Empty when the response holds no instant. */
2.30.4. coordinates
The declared values of coordinate_field, in the order the shape stores them.
/** * @brief The declared values of the coordinate field, in the order the shape * stores them. * * Every instant's values are index for index with this. */
2.30.5. instants
Oldest first, one entry per distinct market instant the object holds in the range.
/** Oldest first, one entry per distinct market instant in the range. */
2.31. evolution_node
One node of a composite object: its coordinate labels, one per declared axis, and the change it shows over the range.
/** * @brief One node of a composite object: its coordinate labels and the change * it shows over the range. */
2.31.1. coordinates
One label per declared axis, index for index with the response's
coordinate_fields.
/** * @brief One label per declared axis, index for index with the response's * coordinate_fields. */
2.31.2. status
The change the node shows over the range, which is the first of these that holds:
never_quoted: no instant carries it.persistent: every instant carries it.added: the last instant carries it and the first does not.dropped: the first instant carries it and the last does not.intermittent: some instant carries it and the rules above do not.
/** * @brief The change the node shows over the range. * * One of never_quoted, persistent, added, dropped or intermittent, which is * the first of those that holds. never_quoted is a node the shape declares and * no instant in the range carries, which is what tells it apart from a node the * object does not have: that node is not in the response at all. */
2.32. evolution_instant
One instant of the evolution: the object as it stood then, one value per node.
/** * @brief One instant of the evolution: the object as it stood then. */
2.32.1. as_of
The market instant this row is the object at.
2.32.2. values
Index for index with the response's nodes.
/** * @brief The value at each node, index for index with the response's nodes. * * The empty string is a hole: the shape declares the node and no point held a * value for it at this instant. */
2.33. get_series_evolution_request
Requests a whole composite object as instants by nodes over a range or a set of instants. The object is named by a typed identity, so no caller builds an oresmd URI.
/** * @brief Requests a whole composite object as instants by nodes. * * The object is named the way the resolver names one, so no caller builds an * oresmd URI and no caller matches on one. The instants are either the ones the * object holds between two instants or the set the caller states. */
2.33.1. identity
The object, as the typed identity the resolver already takes.
/** The object, as the typed identity the resolver already takes. */
2.33.2. from_instant
The first market instant of the range, inclusive. Used when instants is empty.
/** The first market instant of the range, inclusive, when instants is empty. */
2.33.3. to_instant
The last market instant of the range, inclusive. Used when instants is empty.
/** The last market instant of the range, inclusive, when instants is empty. */
2.33.4. instants
The instants the caller states, which replace the range when the vector is not empty. Each one is read as the object stood at it, whether or not the object holds a point at exactly that instant.
/** * @brief The instants the caller states, which replace the range when the * vector is not empty. * * Each one is read as the object stood at it, whether or not the object holds a * point at exactly that instant. A caller that wants the object at the month * ends states them; a caller that wants everything it holds between two * instants states the range and leaves this empty. */
2.34. get_series_evolution_response
The object at each instant, against one grid of declared nodes.
/** * @brief The object at each instant, against one grid of declared nodes. * * The grid is stated once, because it belongs to the shape and not to the * points: nodes holds every combination of the declared axis values, each with * its labels and the change it shows over the range, and every instant's values * are index for index with it. A node the shape declares and no instant carries * is a cell all the same, which is what tells it apart from a node the object * does not have. */
2.34.1. success
2.34.2. message
Why the read was refused, when it was.
/** Why the read was refused, when it was. */
2.34.3. coordinate_fields
The axis names, in the order the shape stores them. Every node's coordinates are index for index with this.
/** * @brief The axis names, in the order the shape stores them. * * Every node's coordinates are index for index with this. */
2.34.4. nodes
The declared grid, with the last axis varying fastest.
/** * @brief The declared grid, with the last axis varying fastest. * * Every combination of the declared axis values is a node, whether or not any * instant carries it. */
2.34.5. instants
Oldest first, one entry per distinct market instant read.
/** Oldest first, one entry per distinct market instant read. */
2.35. point_provenance
Where one value of a snapshot came from: its source kind and, for a point with an annex row, who set it, when and why. For a derived point it also names the recipe, the recipe's version and the as-of of the data the recipe read.
/** * @brief Where one value of a snapshot came from. */
2.35.1. source_kind
One of quoted, derived or manual. A point with no annex row is quoted. The
empty string marks a hole: no point stands at the node, so it has no source.
/** * @brief One of quoted, derived or manual. * * A point with no annex row is quoted. The empty string marks a hole, which has * no source. */
2.35.2. modified_by
Who set the point, from its annex row. Empty for a quoted point and for a hole.
/** Who set the point. Empty for a quoted point and for a hole. */
2.35.3. change_reason_code
Why the point was set, from its annex row. Empty for a quoted point and for a hole.
/** Why the point was set. Empty for a quoted point and for a hole. */
2.35.4. change_commentary
The free-text reason for a manual point.
/** The free-text reason for the change. Empty when none was given. */
2.35.5. recorded_at
When the annex row was recorded, which for a manual point is when it was keyed. The epoch for a quoted point and for a hole.
/** When the annex row was recorded. The epoch for a quoted point and for a hole. */
2.35.6. derivation_config_id
The recipe that built a derived point: the id of its derivation config. Empty for a quoted point, a manual point and a hole, none of which a recipe built.
/** The recipe that built a derived point. Empty unless the point is derived. */
2.35.7. derivation_config_version
The version of that recipe the point was built under. Zero when no recipe built the point.
/** The recipe version the point was built under. Zero unless the point is derived. */
2.35.8. source_as_of
The as-of of the upstream data the derivation read. The epoch when no derivation built the point.
/** The as-of of the upstream data the derivation read. The epoch unless the point is derived. */
2.36. get_curve_snapshot_request
Requests a composite object as it stands now, as one instant by nodes. The object is named by a typed identity, as the slice read and the evolution read name it, so the three cannot disagree about what the object is. The instant is always now; the evolution read answers a question about the past.
/** * @brief Requests a composite object as it stands now, as one instant by nodes. * * The object is named the way the resolver names one, as the slice read and the * evolution read name it, so the three cannot disagree about what the object is. * The instant is always now; there is no as-of-in-the-past parameter, because the * evolution read answers that question. */
2.36.1. identity
The object, as the typed identity the resolver already takes.
/** The object, as the typed identity the resolver already takes. */
2.36.2. include_provenance
Whether the response states where each value came from. The annex is cold and holds only the derived and manual points, so a caller that does not ask pays nothing for it. The provenance is the current annex row of each point shown, the same generation the values come from, not the row as it stood at the instant.
/** * @brief Whether the response states where each value came from. * * The annex is read only when this is set, so a caller that does not ask pays * nothing for it. The provenance is the current annex row of each point shown, the * same generation the values come from, not the row as it stood at the instant. */
2.37. get_curve_snapshot_response
The object at one instant, against the same grid of declared nodes the evolution read states. What the snapshot adds is the age of each value, because a composite of several market states must not be taken for one.
/** * @brief The object at one instant, against the same grid of declared nodes the * evolution read states. * * The evolution read of that object gives the same coordinate fields and the same * nodes. The snapshot carries the latest value of a node forward from before the * instant, which the evolution does not, and adds the age of each value, because a * composite of several market states must not be taken for one. */
2.37.1. success
2.37.2. message
Why the read was refused, when it was.
/** Why the read was refused, when it was. */
2.37.3. as_of
The instant the read is relative to, and therefore the instant an age is
measured from. It is sent because the reader has its own clock: a client that
subtracted its own now() would report a curve as stale by the skew between
the two, and a skewed client would report a fresh curve as stitched.
/** * @brief The instant the snapshot is as of, which is what an age is measured * from. * * Without it a reader measures an age from its own clock, so clock skew shows * up as staleness that is not in the curve. */
2.37.4. coordinate_fields
The axis names, in the order the shape stores them.
/** The axis names, in the order the shape stores them. */
2.37.5. nodes
The declared grid, with the last axis varying fastest. The status of a node is empty: one instant shows no change.
/** * @brief The declared grid, with the last axis varying fastest. * * The status of a node is empty: one instant shows no change. */
2.37.6. values
The value at each node, index for index with nodes. The empty string is a hole:
the shape declares the node and no point held a value for it.
/** * @brief The value at each node, index for index with nodes. * * The empty string is a hole: the shape declares the node and no point held a * value for it. */
2.37.7. recorded_at
When each point's row was recorded, index-for-index with observations: the
valid_from of the row the point was read from. A point read from a manual
row carries that row's own record time, not the time of the value it replaced.
/** When each point was recorded, index-for-index with observations: the
* bitemporal valid_from of the row it was read from. Two ages are readable
* from a point and they answer different questions: the snapshot instant
* minus the point's instant is market staleness, the age of the market state
* it belongs to; now minus its record time is record staleness, how long ago
* the value arrived.
*/
2.37.8. provenance
Index for index with nodes when the request asked for it, and empty when it
did not.
/** * @brief Where each value came from, index for index with nodes. * * Empty when the request did not ask for provenance. */
2.37.9. oldest_age_seconds
The age of the oldest point of the snapshot, in seconds: the snapshot instant minus that point's instant. Zero for an empty snapshot, which holds no point and so mixes nothing.
/** * @brief The age of the snapshot's oldest point, in seconds. * * Market staleness, not record staleness: the age of the market state the * point belongs to, which is what decides whether a drawn curve is one market * read or a stitching of several. Zero for an empty snapshot. */
2.37.10. spread_seconds
The oldest point's age minus the newest point's age, in seconds. This is the number that measures the mixing: a curve whose points share one instant has a spread of zero however old that instant is, and one stitched across market horizons does not.
/** * @brief The spread between the oldest and the newest point, in seconds. * * The number that measures the mixing: points that share one instant have a * spread of zero however old that instant is, and a curve stitched across * market horizons does not. A point whose instant is after the snapshot * instant carries no age at all, and one exactly at it is age zero and counts. */
2.37.11. warning
Whether the spread is wide enough that a view must not draw the snapshot silently, because it is a composite of several market states rather than one. The threshold is stated by the evolution journey; the read only reports it.
/** * @brief Whether the snapshot is mixed enough that a view must not draw it * silently. * * The threshold is stated by the evolution journey, not by this message: the * read reports the crossing, and the view decides what to show. */
2.37.12. published_at
When a person last published this series, or absent when nobody has. The snapshot serves whatever the observations hold; this says whether what it serves is a published set or a set that nobody has approved yet.
/** * @brief When a person last published this series, or absent when nobody has. * * The values the snapshot serves are the latest observations, published or * not. This is what tells a reader which of the two it is looking at, and a * series no person published answers absent rather than a plausible instant. */
2.37.13. published_by
The account that published that set, or empty when nobody has. The decider and the publisher are two people: the approval records who answered, and this records who applied the answer.
/** * @brief The account that published the set, or empty when nobody has. * * The decider and the publisher are two people: the approval records who * answered the request, and this records who applied the answer. */
2.37.14. published_as_of
The market instant the published set was bootstrapped against, and the epoch when nobody has published the series. A curve published at one as-of and read at another is the change this read lets a reader see.
/** * @brief The market instant the published set was bootstrapped against. * * The epoch when nobody has published the series. The snapshot's own instant * is now, and the values carry their own ages; this is the as-of the published * set was built at, which is what a delta against the live set is measured * from. */
2.37.15. approval_request_id
The approval request that authorised the published set, or empty when nobody has published it. It is the request a decider answered, so the read says which decision the set in use stands on.
/** * @brief The approval request that authorised the published set, or empty. * * The request a decider answered, so a reader sees which decision the set in * use stands on and can read its decisions, its reason and its state. */
2.38. import_market_data_request
Request to import ORE market.txt and/or fixings.txt content. The service
parses both files, names each key and index through the ORE codecs, upserts
market series catalog entries, and bulk-inserts observations and fixings.
Either content field may be empty when only one file type is imported.
/** * @brief Request to import ORE market.txt and/or fixings.txt content. * * The service parses both files, names each key and index through the ORE * codecs, upserts market series catalog entries, and bulk-inserts * observations and fixings. Either content field may be empty if only one * file type is being imported. */
2.38.1. market_data_content
/** * @brief Full text content of an ORE market.txt file. * * Supports both YYYYMMDD and YYYY-MM-DD date formats, and whitespace or * comma delimiters. Empty string means no market observations to import. */
2.38.2. fixings_content
/** * @brief Full text content of an ORE fixings.txt file. * * Same format rules as market_data_content. Empty string means no fixings * to import. */
2.38.3. source
/** * @brief Tag stamped on every imported market_observation's source field. * * Distinguishes where an observation came from (e.g. "ore.reference" for a * named ORE example vintage) so downstream consumers can query for a specific * import rather than an untagged mix. Empty string (the default) preserves * the pre-existing untagged behaviour. */
2.38.4. duplicates_are_errors
/** * @brief How a (date, key) pair repeated within market_data_content or * fixings_content is handled. * * false (default): the later occurrence wins (last-line-wins), each repeat is * reported in @c warnings, and the import proceeds -- it matches real ORE * example data, which does contain such repeats. * * true: same de-duplication, but each repeat is reported in @c errors * instead, and the affected content (market data and/or fixings, whichever * contained repeats) is not persisted -- a strict mode for callers that want * repeats treated as a hard failure. */
2.39. import_market_data_response
2.39.1. success
2.39.2. message
2.39.3. series_count
2.39.4. observation_count
2.39.5. fixing_count
2.39.6. warnings
/** * @brief Non-fatal issues from de-duplicating repeated (date, key) pairs. * * One string per repeat, e.g. "market data line 12: duplicate key '...' -- * superseded by line 34". Populated regardless of duplicates_are_errors; * which of warnings/errors they land in depends on it. */
2.39.7. errors
/** * @brief Same shape as warnings, populated only when duplicates_are_errors * is true. * * A non-empty errors means the content with repeats (market data and/or * fixings) was not persisted. */
2.40. feed_kind_counts
Per-kind outcome counts of one folder start or stop request, keyed by the
producer kind string (such as "fx_spot" or "ir_curve") – see
ores.synthetic.api's feed_factory kind constants. The protocol names no
asset class: a new producer kind appears as a new map key.
/** * @brief Per-kind outcome counts of one folder start/stop request, keyed * by the producer kind string (e.g. "fx_spot", "ir_curve") -- see * ores.synthetic.api's feed_factory kind constants. The protocol names no * asset class: a new producer kind appears as a new map key. */
2.40.1. started
2.40.2. already_running
2.40.3. skipped
2.41. start_feeds_under_folder_request
Request to start every feed under a synthetic folder subtree. folder_id
may name a Root, Collection, asset-class or instrument-type folder; the
service resolves the whole subtree server-side and starts every feed row
whose folder_id falls anywhere in it, of every asset class, dispatching
through the producer factory.
/** * @brief Request to start every feed under a synthetic folder subtree. * * folder_id may name a Root, Collection, asset-class, or instrument-type * folder -- the service resolves the whole subtree server-side (via * ores.synthetic.folder's hierarchy_fn) and starts every feed row whose * folder_id falls anywhere in it, of every asset class, dispatching through * the producer factory. One request starts the subtree, so a caller need * not enumerate every pair; it works the same from ores.shell, an HTTP * caller, or a workflow step. */
2.41.1. folder_id
2.42. start_feeds_under_folder_response
2.42.1. success
2.42.2. message
2.42.3. started
2.42.4. already_running
2.42.5. skipped
2.42.6. by_kind
/** The per-kind breakdown of the three counts above, which aggregate across
* every kind and are the summary clients print. Both are always populated.
*/
2.43. stop_feeds_under_folder_request
Request to stop every running feed under a synthetic folder subtree. Same
folder_id semantics as start_feeds_under_folder_request.
/** * @brief Request to stop every running feed under a synthetic folder * subtree. Same folder_id semantics as start_feeds_under_folder_request. */
2.43.1. folder_id
2.44. stop_feeds_under_folder_response
2.44.1. success
2.44.2. message
2.44.3. stopped
2.44.4. stopped_by_kind
2.45. export_market_data_to_storage_request
Exports the tenant's market data to object storage as the text an ORE run reads, so the engine can be handed the file its run document names.
/** * @brief Exports the tenant's market data to object storage as ORE text. * * The engine reads a market data file its run document names, and nothing else * can fill that file, so what is written here is that body and no other form * of the data. */
2.45.1. storage_bucket
2.45.2. storage_key
/** * @brief Where the market data body goes. */
2.45.3. fixings_storage_key
/** * @brief Where the fixings body goes. * * The engine reads fixings from a file of their own, so the body goes to an * object of its own. An empty body is written too, because a run whose run * document names the file must find it. */
2.45.4. valuation_date
/** * @brief The valuation date, as an ISO 8601 date, or empty for the whole stored history. * * A date adds one line for each datum, dated at it, with the value the datum had at the * close of that day, and the history of the other dates stays. The ticks of a live feed are * in that line. They are not in the history. */
2.45.5. max_age_days
/** * @brief The oldest value, in days before the valuation date, that the line of that date * may carry forward. Empty means the service default. * * A datum whose latest value is older than this has no line of its own at the date, so the * run does not use a stale quote as a current one. Its history lines stay. The answer counts * these datums. */
2.46. export_market_data_to_storage_response
2.46.1. success
2.46.2. message
2.46.3. series_count
2.46.4. storage_key
2.46.5. fixings_storage_key
/** * @brief Where the fixings body was written. */
2.46.6. carried_forward_count
/** * @brief The datums whose line at the valuation date carries a value from an earlier day. */
2.46.7. stale_count
/** * @brief The datums left out of the valuation date because their latest value is older * than the limit. */
2.47. backfill_series_identity_request
Projects the identity of every series the tenant holds whose stored row is not what the current projector would write, so a series written before the projection existed, or one an earlier projector left with a fixing's fields empty, becomes joinable. A series whose row already matches is left alone, so running this again finds nothing to do.
/** * @brief Projects the identity of every series whose stored row is stale. * * The projection is written by the series write path, so only rows that * predate it, that were written outside it, or that an earlier projector * spelled differently are stale. This compares each series' fresh projection * with the stored row and writes only the difference. */
2.47.1. party_id
/** * @brief The owning party to narrow to, or empty for every party the caller * can see. */
2.48. backfill_series_identity_response
2.48.1. success
2.48.2. message
2.48.3. projected_count
/** * @brief How many series were projected by this call. * * A series whose stored row already matched the fresh projection is not * counted: only the rows this call wrote are. */
2.48.4. already_projected_count
/** * @brief How many current series already carried the projection this call * would write. */
2.48.5. unreadable_count
/** * @brief How many of the projected series carried a URI neither codec reads. * * Their rows are written with their kind and no field value, so the series is * findable and never mistaken for one whose identity was read. The count is * what says how many identities the database could not state. */
2.49. key_manual_point_request
Keys a manual point on one node of a composite object. The object is named by its typed identity, as the reads name it. The node is named by its coordinates, one for each declared axis, in the order the shape declares them. The point owns its coordinate until it is cleared. Each key is stamped when the server receives it and writes a new observation row, so a node adjusted twice holds two. That is intended: the history keeps every correction, and a clear releases them all.
/** * @brief Keys a manual point on a node of a named object. * * The coordinates are checked against the shape the object declares, so a node * the shape does not hold is refused. The point is stamped at the instant the * server receives the request, and the caller is its author. */
2.49.1. identity
The object, as the typed identity the reads take.
/** The object, as the typed identity the reads take. */
2.49.2. coordinates
The node, one coordinate for each declared axis, in the order the shape declares them.
/** The node: one coordinate per declared axis, in the shape's order. */
2.49.3. value
The value to key, as a number written in text.
/** The value to key, as a number written in text. */
2.49.4. change_reason_code
The change reason code that says why the point is keyed.
/** The change reason code that says why the point is keyed. */
2.49.5. change_commentary
The free-text reason for the correction.
/** The free-text reason for the correction. */
2.50. key_manual_point_response
2.50.1. success
2.50.2. message
2.51. clear_manual_point_request
Clears the manual point on one node of a composite object, so the feed value shows again. The object and the node are named as for keying.
/** * @brief Clears the manual point on a node of a named object. * * Every manual point the node holds is released, whatever instant it was keyed * at. The history keeps the value it replaced. */
2.51.1. identity
The object, as the typed identity the reads take.
/** The object, as the typed identity the reads take. */
2.51.2. coordinates
The node, one coordinate for each declared axis, in the order the shape declares them.
/** The node: one coordinate per declared axis, in the shape's order. */
2.52. clear_manual_point_response
2.52.1. success
2.52.2. message
2.53. export_market_data_request
Request to write the tenant's market data back out as ORE text. The export is the
whole tenant's, because that is the scope the files have. An ORE market.txt is a
snapshot of everything a run needs, not a slice of one series, and an export that
could name a subset would produce a file that reproduces nothing. The one thing a
caller states is the date.
/** * @brief Request to write the tenant's market data back out as ORE text. * * The export is the whole tenant's, because that is the scope the files have. * An ORE market.txt is a snapshot of everything a run needs, not a slice of * one series, and an export that could name a subset would produce a file that * does not reproduce anything. The one thing a caller states is the date. */
2.53.1. valuation_date
/** * @brief The valuation date, as an ISO 8601 date, or empty for the whole stored history. * * A date adds one line for each datum, dated at it, with the value the datum had at the * close of that day, and the history of the other dates stays. The ticks of a live feed are * in that line. They are not in the history. */
2.53.2. max_age_days
/** * @brief The oldest value, in days before the valuation date, that the line of that date * may carry forward. Empty means the service default. * * A datum whose latest value is older than this has no line of its own at the date, so the * run does not use a stale quote as a current one. Its history lines stay. The answer counts * these datums. */
2.54. export_market_data_response
The two file bodies, as the caller's own text to write. The service returns content rather than writing it: the caller owns the file system, and the same bodies are what the round-trip test compares against the file it imported.
/** * @brief The two file bodies, as the caller's own text to write. * * The service returns content rather than writing it: the caller owns the file * system, and the same bodies are what the round-trip test compares against * the file it imported. */
2.54.1. success
2.54.2. message
2.54.3. market_data_content
/** * @brief The market.txt body: one DATE<TAB>KEY<TAB>VALUE line per * observation, empty when the tenant has no observations. */
2.54.4. fixings_content
/** * @brief The fixings.txt body: one DATE<TAB>INDEX<TAB>VALUE line per * fixing, empty when the tenant has no fixings. */
2.54.5. series_count
2.54.6. observation_count
2.54.7. fixing_count
2.54.8. carried_forward_count
/** * @brief The datums whose line at the valuation date carries a value from an earlier day. */
2.54.9. stale_count
/** * @brief The datums left out of the valuation date because their latest value is older * than the limit. */
2.55. market_tick
One live observation of one market datum, whatever its asset class. A producer
publishes it on its own feed subject, and the ingest loop stores it and
republishes it to each consumer under this subject, extended with the
consumer's tenant and party and the datum's canonical ORE key. The
tick carries no owner: its source finds the consumers through their feed
bindings.
/** * @brief One live observation of one market datum. * * The datum is named by its oresmd quote URI, which carries the asset class, * the instrument and every field, so no asset class has a tick type of its * own. A curve is the set of ticks one producer publishes with one * observation time. */
2.55.1. oresmd_uri
/** The quote URI of the datum observed, under the strict contract. */
2.55.2. value
/** The observed value as decimal text, so it keeps the producer's digits. */
2.55.3. observation_time
/** When the value was observed. */
2.55.4. source
/** The producer, unique within a tenant; its routes name the consumers. */
2.56. get_series_ticks_request
Asks for every tick of one series in a span of time, in one reply. A client that plots a live series makes this call once for the span it shows and subscribes to the live subject for the ticks that follow; it merges the two itself.
/** * @brief Asks for every tick of one series in a span of time. * * The span is half open: it holds a tick at from_instant and none at to_instant. The * request has no count and no page, because a span of time means the same on every tier * that answers it. A span that holds more ticks than the ceiling is refused, never cut. */
2.56.1. identity
The series, as the typed identity the resolver already takes. An identity that matches the series of more than one party is refused, so a caller states the party to name one.
2.56.2. from_instant
The first instant of the span, inclusive.
2.56.3. to_instant
The end of the span, exclusive. Null means now.
2.56.4. coordinates
The coordinate URIs to read, or empty for every coordinate of the series. A client that plots one pillar of a curve names it.
2.57. get_series_ticks_response
Every tick of the span, as parallel arrays that state the coordinates and the first instant once.
/** * @brief Every tick of a span of one series. * * The coordinates come first, once each. The times follow as the first instant and a gap in * microseconds from the previous tick, because every instant has one wire shape and a text * instant for each tick would take more than twice the bytes of a gap. The three arrays have * the same length, and the order is by time and then by coordinate. */
2.57.1. result
How the call ended. The refusals of a span are outcomes here: a session with no party, a span that ends before it starts, and a span over the ceiling, which names the ceiling.
2.57.2. coordinates
The coordinate URIs that the ticks use, once each. A tick names one by its index.
2.57.3. first_instant
The time of the first tick, or null when the span holds none.
2.57.4. gaps_us
For each tick, the microseconds since the previous tick. The gap of the first tick is zero.
2.57.5. coordinate_indexes
For each tick, the index of its coordinate in coordinates.
2.57.6. values
For each tick, its value.
2.58. store_market_state_request
Keeps the market state a run priced against: the output files the run wrote, which are far too large for a message, so the caller names each result's manifest and lends the token that reads them.
/** * @brief Asks this component to keep the market state a run priced against. * * The state is the output files the run wrote, and those files are far too * large for a message: a cube states a column for every curve and tenor the run * built. The node uploads each file as its own object with a manifest that names * them, so the caller names each result's manifest and lends the token that reads * them — the run's own, the same one the run's other steps use — and this fetches * the market-state files rather than receiving them. * * A manifest names each file by its storage location, so this learns no other * component's layout. A file whose family is not a market state is not fetched: * the run's results belong to reporting. */
2.58.1. party_id
The party that owns the run, so every value carries it.
2.58.2. report_instance_id
The run that priced against this state.
2.58.3. report_definition_id
The report the run came from.
2.58.4. as_of
The date the run priced at, as an ISO 8601 date. It is the observation date of the state, and the time column of the table.
2.58.5. storage_token
The run's storage token, which reads the manifests it names and the files they name. Scoped to the one run and short-lived, like the token a workunit is assigned with. It is carried here rather than minted, because the run's grant is the reporting service's to hold.
2.58.6. manifest_uris
Where the manifest of each result of the run is, as bucket and key. A manifest names the result that wrote the files and where each file is, so the store fetches the market-state files by name and never unpacks an archive.
2.58.7. skipped_families
The market-state families the run does not store as rows, as its definition names them. A skipped file is not fetched and is named in the reply as left alone; it stays in the object store.
2.59. store_market_state_response
2.59.1. result
How the call ended. A file of market state that cannot be read refuses the whole run's state, because a partial state reads as a complete one.
2.59.2. families
The families rows were stored for, in the order they were read.
2.59.3. files
The files whose family states a market state and which were read.
2.59.4. rows
The values stored, across every file, so a caller can account for them.
2.59.5. left_alone
The files the run wrote that are not market state, so the caller can see that they were not forgotten.
2.59.6. refusals
The reasons a market-state file could not be read.
3. See also
- Clean ores.marketdata to the component clean standard — the story that models these operations.