All notable changes will be documented in this file.
- Upgrade the
format_str
helper class to work withfmt 11.1
(#488)
- Control enabled/disabled state (#484)
- Support MassQuote (#483)
- Add quantity type to order management (#469)
- Add settlement currency to reference data (#468)
cache::MarketByPrice::impact_price
to accept an optional number of orders (#462)Fill
to support quote quantity and commission (#458)
- Issues with create limited depth updates (#453)
utils::compare<double>
could incorrectly compare values in the [0;1] range (#446)
RateLimitsUpdate
to support exchange rate-limit updates
- Renamed
{price|quantity}_precision
(from{price_quantity}_decimals
- Moved several header files to the roq-server library (from the roq::oms namespace here)
- UUID now using C++23 features
- Moved several header files to the roq-cache library (from the roq::cache namespace here)
- Moved several header files to the roq-utils library (from the roq::utils namespace here)
- Promote Decimal to API (from utils::Number) and rename Precision (from Decimals) (#439)
- Adding exchange time, exchange sequence and sending time to ReferenceData and MarketStatus
- Adding
PositionEffect
toOrderAck
- Adding
MarginMode
toCreateOrder
,OrderAck
,OrderUpdate
,TradeUpdate
- OMS validate quantity and price against reference data (#432)
- Added
MarginMode
toFundsUpdate
andPositionUpdate
(#430)
- The position cache would treat zero as a missing value and therefore not update (#419)
exchange_sequence
is nowuint64_t
(wasint64_t
)RoutingId
now 64 bytesGatewaySettings.oms_cancel_all_orders
has been added (#414)CancelAllOrders
now includes some filters (#414)oms::OrderUpdate
now includes the max request/response/accepted versions
Fill.exchange_time_utc
CancelAllOrdersAck
(#414)- EXPERIMENTAL: messages for managing dynamic routes
- The FlatBuffers schema and auto-generated is no longer needed (replaced by the roq-codec library)
oms::OrderUpdate::routing_id
to support FIX
order_id
must beuint64_t
(#377)
OrderAck.client_order_id
andTradeUpdate.client_order_id
(#389)CancelAllOrders.strategy_id
CreateOrder.strategy_id
,OrderAck.strategy_id
,OrderUpdate.strategy_id
,TradeUpdate.strategy_id
(#375)OrderAck.user
to support drop-copy and risk management
- Using
std::source_location
(clang16) - Using fmt10
Error.RISK_LIMIT_REACHED
- New
Ready
event to indicate the completion of the intial download phase - Risk exposure and change added to
OrderAck
andOrderUpdate
(EXPERIMENTAL) cache::MarketByPrice::impact_price()
(#372)RiskLimits
andRiskLimitsUpdate
(EXPERIMENTAL)client::Dispatcher.broadcast(CancelAllOrders)
- The
Mask<E>
template had to be changed to work with magic_enum 0.9.0
OrderUpdate.client_order_id
(#366)OrderAck.traded_quantity
(#359)
oms::TradeUpdate
was unnecessary (TradeUpdate
is sufficient for the gateways)
- Review
PositionUpdate
andFundsUpdate
to better correlate withOrderUpdate
andTradeUpdate
(#340) cache::MarketByOrder::OrderUpdate
now includes the final update actionStreamStatus
should include connection details (#337)- [BREAKING CHANGE]
CreateOrder::request_template
(renamed fromorder_template
) - All order requests must support
request_template
(#329)
- Drop
OrderUpdate.order_template
(#330)
CustomMatrix
(#344)PortfolioUpdate
andPosition
to support a position manager (#343)
sending_time_utc
to market data messages (#326)oms::TradeUpdate
(#254)client::Settings.drop_copy
(#254)
- [BREAKING CHANGE]
MarketByOrderUpdate
andMBOUpdate
has been changed to support CME's TradeSummary (#322)
- utils::invert(side)
didn't work for
side == UNDEFINED` (#325)
MBOUpdate.reason
+UpdateReason
cache::MarketByOrder
fbs::MarketByOrderUpdate.max_depth
was inserted (should not be an issue since it was never used before)MBOUpdate
:priority
nowuint64_t
,order_id
length 36 (UUID), re-ordering
- New
Protocol
andEncoding
to support Roq's UDP transport (#307)
- Move
Category
(from the core and adapter libraries) (#297)
Parameter
now includes theaccount
,exchange
,symbol
tupleParametersUpdate
was renamed (fromParameterUpdate
)TraceInfo
now default initializing to current timeclock
promoted (from core library)
RequestStatus.ERROR
(#292)TradeSummary
to include exchange sequence and taker/maker order id's (#279)CustomMetrics.update_type
andCustomMetricsUpdate.update_type
GatewaySettings.mbp_checksum
- Preparing to drop C++17 compatibility
cache::MarketByPrice::max_depth
now returnsuint16_t
MarketByPriceUpdate.checksum
from the FlatBuffers schema- Optimize the
cache::MarketByPrice
interface (#267)
client::EventLogMultiplexer
(#266)- Cache objects for Create/Modify/CancelOrder (#26)
ParameterUpdate
(#258)
- Optimize the
cache::MarketByPrice
interface (#267) - An optional
is_last
field has been added toclient::Dispatcher::send
(#26) - Move
RateLimiter
(from roq-server) (#259) - API changes needed to support drop-copy (#254)
- Add notional fields to
ReferenceData
(#252) - Add new fields to
RateLimitTrigger
(#251)
OrderUpdateAction
(replaced withUpdateAction
)
utils::safe_cast
now usingstd::numeric_limist::lowest()
(instead ofmin()
)
- fmt v9 requires custom formatters to be const
- Prevent copy/move of
Event<>
andTrace<>
(#247) - return
span<MBPUpdate>
fromcache::MarketByPrice
(#241) - Flatbuffers auto-generated code now using C++17
client::EventLogReader
now expose more metadataMBPUpdate
now supportsUpdateAction
(#236)
cache::Manager::get_market_with_id
andcache::Manager::get_market_id
ReferenceData::discard
(#225)
- Promote
utils::DateTime_iso8601
formatter to API (from core) - Make
cache::Manager
a non-template (#230) cache::MarketByPrice::stream_id()
cache::MarketByPrice::find_index
cache::MarketByPrice::compute_vwap
- RequestIdType added to GatewaySettings (from server)
- Increase
Symbol
fixed-length size to 48 (#214) Event<>
andTrace<>
formatting has move the value to the front- C++17 compatibility (std::span and "using enum" workarounds)
Trace
now supports non-const (and retains const-safety when const)TopOfBook
now includes an exhange sequence number (to correlate with MbP updates)StreamStatus
now provides more detailed information- Promote
debug::hex::Message
anddebug::fix::Message
(from core library) - Comparisons now use (or return)
std::strong_ordering
(instead ofint
) - Simplify enums (#199)
- Proper bit-mask support (#198)
- Promote Trace and TraceInfo to API (from server)
- Enforce fixed-length strings for standard use-cases (account, exchange, symbol, ...)
- Rename
string
(fromstring_buffer
) - Promote Mask to API (from utils)
- Rename headers to .hpp (#195)
- Conda packaging should pin versions to match x.x.x (#189)
- Added
update_type
toOrderUpdate
andTradeUpdate
(#39)
- Added account to ExternalLatency (#170)
- Source file name are now evaluated and stored at compile time (#160)
- Upgrade to C++20 (#158)
cache::MarketByPrice::exists
(#153)SecurityType::SWAP
- Capture
origin_create_time
for externally triggered events (#140)
- Increase
MAX_LENGTH_CURRENCY
ReferenceData::margin_currency
(#150)- Support macOS/ARM64 (#149)
client::DepthBuilder
(#152)
- Align oms with new use of Decimals enum
MarketByPriceUpdate
now include max-depth (#123)MarketByPriceUpdate
andMarketByOrderUpdate
now include checksum (#74)MarketByPriceUpdate
andMarketByOrderUpdate
now include price/quantity decimals (#119)
- Capture request round-trip latency (#130)
- Starting to move object cache logic into API (#128)
- Move cache utilities to API (#111)
- Promoted
server::TraceInfo
to API - Add exchange sequence number to
MarketByPrice
andMarketByOrder
(#101) - Add
max_trade_vol
andtrade_vol_step_size
to ReferenceData (#100) - New method to update
market::MarketByPrice
(#17) - Price/quantity decimal digits added to
oms::Order
(#46) - Conversion to/from internal price used by
market::MarketByPrice
(#21) - Interface to extract bid/ask
MBPUpdate
frommarket::MarketByPrice
- New
UpdateType
(will eventually be used withMarketByPriceUpdate
) (#93) - Add
StatisticsType::TRADE_VOLUME
(#88)
- Remove custom literals (#110)
- ReferenceData currencies should follow FX conventions (#99)
- Replace
snapshot
(bool) withupdate_type
(UpdateType) (#97) - Align type used to represent decimal digits (#46)
- Adding more
MAX_LENGTH
constants (#91) - Align
PositionUpdate
with the FIX protocol (#89)
- Utility functions did not correctly handle
RequestStatus::FAILED
(#82)
- New
market::MarketByPrice
interface (#56)
RequestStatus::TIMEOUT
should not be a final order request state (#59)GatewaySettings
has changed structure and new fields (#56)client::DepthBuilder
now derives frommarket::MarketByPrice
(#56)string_buffer
did not have O(1)length()
(#53)- Move OMS interfaces to API (#51)
RateLimitTrigger
must support const members (#34)
- API exceptions should compile with C++14 (#69)
Error::INSUFFICIENT_FUNDS
(#32)RateLimitTrigger
replacesRateLimitUsage
(#34)- Promoting
RateLimitType
to API (#34) NotSupported
exception (clean-up)CustomMetrics
(publish) andCustomMetricsUpdate
(receive) (#8)NotImplemented
exception (clean-up)Error::CONDITIONAL_REQUEST_HAS_FAILED
andError::UNKNOWN_ORDER_ID
(#25)utils::was_order_received
andutils::to_request_status
(#25)OrderAck::side
(#11)client::EventLogReader
interface (#10)
- The various interfaces used for simulation has been updated (#7)
Subscribe
has been removed from API (#14)
Error
has been extended to communicate certain exchange errorsRequestStatus
now includesDISCONNECTED
,TIMEOUT
, andFAILED
OrderAck
now includesexchange
andsymbol
CustomMessage
now usesspan
to represent the message
DepthBuilder
was unsafe because the constructor cached a pointer to a span ofLayer
s, aka. the depth. This has been changed and applying aMarketByPriceUpdate
will now require you to also pass a reference to the depth.
Error::REQUEST_RATE_LIMIT_REACHED
StatisticsType::FUNDING_RATE_PREDICTION
- Dropped all wrappers for fmt. (Reason:
fmt::format_string
is now a template solution -- previously it was a macro).
- The exception hierarchy no longer tries to mirror
std
.
OrderManagement
used to instruct a gateway of the order management styleMAX_ORDER_ID
andMAX_REQUEST_VERSION
to reflect 24 bit limits
OrderAck
,OrderUpdate
,ModifyOrder
andCancelOrder
now useuint32_t
for all version fields- The format functions no longer require use of the
_fmt
literal - Reduced
MAX_LENGTH_ROUTING_ID
to 16 GatewaySettings
now includesoms_download_has_state
andoms_download_has_routing_id
- The
_fmt
literal - The
format_str
wrapper class has been moved to the roq-logging library
Error
has been updatedOrderAck
has been updated and extended withversion
OrderUpdate
has been updated and extended withmax_request_version
,max_response_version
andmax_accepted_version
ModifyOrder
andCancelOrder
has been updated withversion
andconditional_on_version
CreateOrder
andOrderUpdate
has changed field ordering to better group constant vs. possibly changing fieldsTradeUpdate
andFill
has changed field ordering andFill
has dropped artificially generatedtrade_id
'sMBPUpdate
has been updated withimplied_quantity
,price_level
andnumber_of_orders
RateLimitUsage
to allow strategy to back off when it high-water mark on rate-limiting has been detectedCancelAllOrders
when all orders must be cancelled immediatelyGatewaySettings.mbp_allow_remove_non_existing
to indicate if an exchange could possibly send updates to unknown price levelsStatisticsType::FUNDING_RATE
andStatisticsType::DAILY_FUNDING_RATE
routing_id
toModifyOrder
andCancelOrder
SupportType.ORDER_STATE
to indicate if gateway supports FIX 4.4 style order state management (through ClOrdId/OrigClOrdId transitions)GatewaySettings.supports
to allow users to detect what is supported- Added
Liquidity
to indicate if last fill was as maker or taker - Extend
OrderUpdate
with more fields (required for FIX bridge and download) TradingStatus
has been completely reviewed to match the trading session state changes which can occur on most exchangesExecutionInstruction
will now support bit-masks (future change)- The layout of many structs have changed
client::Config::Handler
now includes a method to configurclient::Settings
. This makes it possible to overridecancel_policy
(on disconnect)Disconnected
now adds a flag useful to detect if disconnect could trigger an order cancellation requestOrderStatus
better aligned with FIX enum, but excluding state transitionsTimeInForce
better aligned with FIX enum
- Promoted a number of generic utilities to the
roq::utils
namespace. Although these are useful, they should not be considered "API". - The
routing_id
field has been added to the relevant order management structures.
- All server (gateway) originated structs now include
stream_id
to indicate the origin of a message.MarketDataStatus
andOrderManagerStatus
have been replaced withStreamUpdate
. Clients must use thesupports
bit-mask fromStreamUpdate
to maintain availability of cached objects. This change was done to allow gateways to manage load balance e.g. by maintaining multiple connections. - Replaced
Connection
withConnected
andDisconnected
- Renamed
GatewayStatus
toConnectionStatus
- Python API (this is not the right place)
- Removed
name
fromExternalLatency
- Removed
MarketDataStatus
andOrderManagerStatus
- Convenience functions making it easy to encode Flatbuffers objects
- Consistent use string literals
- Enforce usage of the
_fmt
literal when formatting
- Enumerations no longer include
MAX
-
Repo now includes the auto-generated header files (for better discoverability)
-
Miniforge (instead of Miniconda)
-
MessageInfo.source_session_id
now using a more efficient UUID representation -
Now using span-lite (instead of own implementation, C++20 preparation)
Settings
ExternalLatency
User
andAccount
removed (not public interfaces)
-
Time management has been changed
std::chrono::nanoseconds
used for all precision timestampsstd::chrono::seconds
used for all date-timesstd::chrono::days
(usingroq::chrono::days
until C++20 is supported) used for all dates
-
ReferenceData
description
,underlying
,time_zone
,issue_date
,settlement_date
,expiry_datetime
, `expiry_datetime_utc
-
ReferenceData::limit_{up|down}
- Upper and lower trading limits belongs to daily session statistics,
not reference data.
These fields were anyway already managed by
StatisticsUpdate
.
- Upper and lower trading limits belongs to daily session statistics,
not reference data.
These fields were anyway already managed by
client::Collector
interface now implements default handlers instead of having pure virtual functions.is_{order|request}_completed
replacingis_completed
.
client::Collector::{extract|write}
were too specific.
- Automake support
Note! CMake is now the default build system for all Roq solutions. This makes it significantly easier to integrate with other CMake based solutions.
- CMake is now the default build system for all Roq solutions
- Replace ROQ_PREDICT_{TRUE,FALSE} with ROQ_LIKELY and ROQ_UNLIKLEY to better match c++20 naming
- Removed (again) the use of FMT_STRING since it will not be compatible with c++20
roq/format.h
Note! FlatBuffers has been introduced to compliment the C++ interface for non-latency sensitive use-cases. Event-logs are now using FlatBuffers for all encoding. This allows for backwards compatibility and thereby dropping the requirement for decoding to be binary compatible with encoding. An upcoming release will introduce a FlatBuffers interface into the gateways thereby allowing other languages than C++ languages to communicate with the gateway.
- FlatBuffers schema (experimental!)
StatisticsUpdate
(to replaceDailyStatistics
andSessionStatistics
)
- Events are now wrapped with the
Event
template - Replaced
MarketByPrice
andMarketByOrder
withMarketByPriceUpdate
andMarketByOrderUpdate
to more clearly reflect changes being communicated
roq::event_value<ConnectionStatusEvent>
was broken in release 0.3.8
- Metrics interfaces and utilities have been moved into the
roq::metrics
namespace - Metric collectors now using std::atomic variables
- Logging has been moved into a separate library
roq-logging
- Auto-generate enums, structs, classes, formatting, etc.
- Major parts of the client API have been moved here
- Dependency on FlatBuffers
SessionsStatistics::index_value
andSessionsStatistics::margin_rate
- Inherit all network-related exceptions from
NetworkError
TimedOut
(exception)
ExecutionInstruction
(enum) similar to FIXExecInst
Error::EXECUTION_INSTRUCTION_NOT_SUPPORTED
Account::user
OrderUpdate::execution_instruction
,OrderUpdate::stop_price
andOrderUpdate::max_show_quantity
- Ensure all enums have an
UNDEFINED
OrderUpdate::commissions
- Log non-zero application exit codes as warning
- Prefer C++ raw strings
Fill
(struct)TopOfBook
(struct)price_from_side
(function)span
(struct)
MBOUpdate::side
TradeUpdate
(struct) now containing an array ofFill
's (struct)- Logging now requires
FMT_STRING
to better formatting errors at compile time MarketByPrice
(struct) now maintainingbids
andasks
separatelyMBOUpdate::order_id
(string) replacesorder_id_ext
(integer)- Use
roq::span
everywhere