Struct TradeMsg
- Namespace
- DatabentoDotNet.Dbn
- Assembly
- DatabentoDotNet.Dbn.dll
A trade. The record of the Trades schema, and market-by-price with a book depth of 0.
public readonly struct TradeMsg : IRecord<TradeMsg>
- Implements
- Inherited Members
Examples
if (record.TryGet(out TradeMsg trade))
{
// Prices are fixed-point integers at a 1e-9 scale, not floating point. Dividing through
// decimal keeps the exact value; dividing through double would not.
decimal price = (decimal)trade.Price / DbnConstants.FixedPriceScale;
// IndexTs, not Header.TsEvent: trades index on ts_recv, and the two can fall on opposite
// sides of UTC midnight — which is how a symbol lookup returns the wrong day with nothing
// looking broken.
Instant when = DbnTime.ToInstant(trade.IndexTs);
// ActionChar and SideChar are the raw ASCII the wire carries; Action and Side are the same
// bytes as enums, and a venue may send a value neither enum names.
Console.WriteLine($"{when} {price} x {trade.Size} {trade.ActionChar}{trade.SideChar}");
}
Remarks
Field order is transcribed from the #[repr(C)] Rust declaration, not from its
encode_order attributes. Note that it differs from MboMsg: here
RawAction and RawSide precede Flags, whereas in
MboMsg they follow it.
Fields
Depth
The book level where the update event occurred.
public readonly byte Depth
Field Value
Flags
A bit field indicating event end, message characteristics, and data quality.
public readonly FlagSet Flags
Field Value
Header
The common header.
public readonly RecordHeader Header
Field Value
Price
The trade price, where every 1 unit corresponds to 1e-9.
public readonly long Price
Field Value
RawAction
The raw wire byte behind Action. Always 'T' for this schema. Not
validated on decode — pass it to
TryFromAction(byte, out Action) for a checked conversion.
public readonly byte RawAction
Field Value
RawSide
The raw wire byte behind Side. Not validated on decode — pass it to TryFromSide(byte, out Side) for a checked conversion.
public readonly byte RawSide
Field Value
Sequence
The message sequence number assigned at the venue.
public readonly uint Sequence
Field Value
Size
The trade quantity.
public readonly uint Size
Field Value
TsInDelta
The matching-engine-sending timestamp, in nanoseconds before TsRecv.
public readonly int TsInDelta
Field Value
TsRecv
The capture-server-received timestamp, in nanoseconds since the UNIX epoch. This, not TsEvent, is the record's index timestamp.
public readonly ulong TsRecv
Field Value
Properties
Action
The event action. Undefined wire bytes cast through to an unnamed value rather than throwing; see RawAction.
public Action Action { get; }
Property Value
ActionChar
The event action as its raw ASCII character.
public char ActionChar { get; }
Property Value
IndexTs
The record's index timestamp: the one to sort by, and the one to key a symbol map with. Nanoseconds since the UNIX epoch.
public ulong IndexTs { get; }
Property Value
Remarks
This is usually ts_recv, not TsEvent. Fourteen of
the twenty-one record structs carry a ts_recv and index on it; the rest have no
ts_recv at all and fall back to the header's ts_event. Port of upstream's
Record::raw_index_ts (record/traits.rs:52-54), whose default body is
ts_event and which the #[dbn(index_ts)] field attribute overrides per struct
(record.rs, compat.rs).
The distinction is not cosmetic: ts_event and ts_recv can fall on opposite
sides of UTC midnight, so resolving a symbol by the wrong one silently returns the
previous day's symbol, or nothing, with no error anywhere.
This is a raw timestamp and can be UndefTimestamp. Convert it with ToUtcDate(ulong) or TryToUtcDate(ulong, out LocalDate), which check the sentinel.
Side
The aggressor side. Undefined wire bytes cast through to an unnamed value rather than throwing; see RawSide.
public Side Side { get; }
Property Value
SideChar
The aggressor side as its raw ASCII character.
public char SideChar { get; }
Property Value
WireSize
The struct's exact size on the wire, in bytes, excluding any trailing ts_out.
public static int WireSize { get; }
Property Value
Methods
HasRType(RType)
Reports whether TradeMsg is the layout for records carrying
rtype.
public static bool HasRType(RType rtype)
Parameters
rtypeRTypeThe record type read from a record header.
Returns
- bool
true if
rtypeis one of the record types this struct decodes. This is necessary but not sufficient to identify the record — see the remarks on IRecord<TSelf>.