MatchingEngineAdapter
Message-based matching engine adapter. Contains pure matching logic without emulation (no random, no candle matching, no commissions). Implements IMessageTransport for message-based integration.
Implements: IMessageTransport
Constructors
public MatchingEngineAdapter()
matchingEngineAdapter = MatchingEngineAdapter()
Initializes a new instance.
Properties
public IncrementalIdGenerator OrderIdGenerator { get; set; }
value = matchingEngineAdapter.OrderIdGenerator
matchingEngineAdapter.OrderIdGenerator = value
Order ID generator.
public virtual EmulatedPortfolioManager PortfolioManager { get; }
value = matchingEngineAdapter.PortfolioManager
Portfolio manager for handling portfolio state.
public IEnumerable<SecurityMessage> Securities { get; }
value = matchingEngineAdapter.Securities
Every security the venue has stated a definition for.
public MatchingEngineSettings Settings { get; }
value = matchingEngineAdapter.Settings
Matching engine settings.
public IStopOrderManager StopOrderManager { get; }
value = matchingEngineAdapter.StopOrderManager
Stop order manager (read-only access).
public IncrementalIdGenerator TradeIdGenerator { get; set; }
value = matchingEngineAdapter.TradeIdGenerator
matchingEngineAdapter.TradeIdGenerator = value
Trade ID generator.
public IdGenerator TransactionIdGenerator { get; set; }
value = matchingEngineAdapter.TransactionIdGenerator
matchingEngineAdapter.TransactionIdGenerator = value
Transaction id generator for internal use (group cancel, close positions).
Methods
public void AddPositionRevaluations(DateTime time, List<Message> results)
matchingEngineAdapter.AddPositionRevaluations(time, results)
Report again every open position whose floating profit the market has moved since it was last reported.
- time
- Time of the move.
- results
- Messages to add the reports to.
private void AdoptActiveOrder(ExecutionMessage execMsg, Sides side, List<Message> results)
matchingEngineAdapter.AdoptActiveOrder(execMsg, side, results)
Takes an order that is already standing somewhere else into this book, exactly as it is.
public void CheckStopOrders(SecurityId securityId, decimal price, DateTime time, List<Message> results)
matchingEngineAdapter.CheckStopOrders(securityId, price, time, results)
Check stop orders against a price and process triggered orders.
public static PositionChangeMessage CreatePortfolioUpdate(EmulatedPortfolio portfolio, DateTime time)
result = MatchingEngineAdapter.CreatePortfolioUpdate(portfolio, time)
The money row stating what an account holds: its realized and unrealized result, what its working orders hold, and what it can trade with now.
- portfolio
- The account the row is about.
- time
- Time to stamp the row with.
Returns: The row.
public PositionChangeMessage CreatePositionUpdate(EmulatedPortfolio portfolio, SecurityId securityId, DateTime serverTime, DateTime localTime)
result = matchingEngineAdapter.CreatePositionUpdate(portfolio, securityId, serverTime, localTime)
Create the message that reports one position of an account: its size, entry price and floating profit.
- portfolio
- The account.
- securityId
- Security ID.
- serverTime
- Server time.
- localTime
- Local time.
Returns: The position update.
private StopOrderInfo CreateStopInfo(OrderRegisterMessage regMsg, string error)
result = matchingEngineAdapter.CreateStopInfo(regMsg, error)
Reads the stop the registration's condition describes, or when it describes none and the order is an ordinary one.
- regMsg
- Registration to read.
- error
- Why the condition describes a stop that cannot be placed, or when it describes one that can, or none at all.
Returns: The stop to rest, or .
public void EmitRegistrationResult(OrderRegisterMessage regMsg, EmulatorOrder order, MatchResult matchResult, ExecutionMessage replyMsg, Func<ExecutionMessage, decimal?> chargeCommission, List<Message> results)
matchingEngineAdapter.EmitRegistrationResult(regMsg, order, matchResult, replyMsg, chargeCommission, results)
Turn a match into the messages it owes: the order rows, the trades, the maker side of each fill, the positions and the portfolio updates.
- regMsg
- The registration this is answering.
- order
- The order as the matcher saw it.
- matchResult
- What the matcher decided.
- replyMsg
- The acceptance row already published, mutated when the order ends here.
- chargeCommission
- Prices a trade before the position is booked from it, or null.
- results
- Where the messages go.
public void ForgetBook(SecurityId securityId)
matchingEngineAdapter.ForgetBook(securityId)
Forgets the book stated so far for , so an incremental feed has to state a whole one again before its increments are folded in. Used when a venue has gone quiet on depth: what it sends after the break describes a market its old base no longer holds.
- securityId
- Security whose stated book is forgotten.
private static decimal? GetChargedPrice(OrderRegisterMessage regMsg, SecurityState state)
result = MatchingEngineAdapter.GetChargedPrice(regMsg, state)
Price the order will be charged at: its own price when it names one, the opposite best for a market order.
public SecurityState GetSecurityState(SecurityId securityId)
result = matchingEngineAdapter.GetSecurityState(securityId)
Get or create security state for the given security.
private static void NameAccountOn(List<Message> results, int from, OrderRegisterMessage regMsg)
MatchingEngineAdapter.NameAccountOn(results, from, regMsg)
States the account and the instrument on each transactional row from onwards that is missing them.
public void ProcessMessage(Message message, List<Message> results)
matchingEngineAdapter.ProcessMessage(message, results)
Process a message and collect results. Can be called directly (without async dispatch).
public void ProcessOrderCancel(OrderCancelMessage cancelMsg, List<Message> results)
matchingEngineAdapter.ProcessOrderCancel(cancelMsg, results)
Process order cancellation.
public void ProcessOrderRegister(OrderRegisterMessage regMsg, List<Message> results)
matchingEngineAdapter.ProcessOrderRegister(regMsg, results)
Process order registration.
public void ProcessTime(DateTime time, List<Message> results)
matchingEngineAdapter.ProcessTime(time, results)
Retire orders whose expiry has been reached and release the reservation held by their balance.
- time
- Current engine time.
- results
- Where generated lifecycle and portfolio messages are added.
private static decimal ResolveActivationPercent(decimal marketPrice, decimal percent, Sides side, bool invertTrigger)
result = MatchingEngineAdapter.ResolveActivationPercent(marketPrice, percent, side, invertTrigger)
The level a stop rests at when its activation price states a distance from the market rather than a price of its own: that far above the market for one that fires on a rise, that far below it for one that fires on a fall.
- marketPrice
- Price the instrument is at.
- percent
- Distance from it, in percent.
- side
- Order side.
- invertTrigger
- Whether the stop fires on the opposite move, as a take-profit does.
Returns: The absolute level.
public ValueTask SendOutMessageAsync(Message message, CancellationToken cancellationToken)
result = matchingEngineAdapter.SendOutMessageAsync(message, cancellationToken)
Send out message.
private decimal? TryGetLastTradePrice(SecurityId securityId)
result = matchingEngineAdapter.TryGetLastTradePrice(securityId)
The price the instrument last traded at, as far as this engine has been told.
- securityId
- Instrument to read.
Returns: The price, or when the venue has stated none.
public InvalidOperationException ValidateRegistration(OrderRegisterMessage regMsg, decimal? chargedPrice)
result = matchingEngineAdapter.ValidateRegistration(regMsg, chargedPrice)
Check whether the registration is allowed: the instrument is trading, there is a market to price the order at, and the account can afford it.
- regMsg
- Registration to check.
- chargedPrice
- Price the order will actually be charged at, or when the book offers none.
Returns: The reason the registration must be refused, or when it is allowed.
Events
public event Func<Message, CancellationToken, ValueTask> NewOutMessageAsync
matchingEngineAdapter.NewOutMessageAsync += handler
New message event.