classdef Exchange < TimerDriven
properties (SetAccess = private)
ArchivedOrders
ArchivedTradeRecords
Book
end
properties (SetAccess = private, Hidden)
TradeRecordsToReview
end
methods (Access = private)
function[obj] = Exchange
obj = obj@TimerDriven(Settings.ExchangePeriod);
obj.ArchivedOrders = Queue();
obj.ArchivedTradeRecords = Queue();
obj.TradeRecordsToReview = Queue();
b = OrderBook();
addlistener(b,'TradeRecord',@(src,evt) processTradeRecord(obj,src,evt));
obj.Book = b;
end
end
methods (Static)
function[obj] = getInstance()
persistent local
if isempty(local)
local = Exchange();
end
obj = local;
end
end
methods
function step(obj)
while true % process orders retrieved from order queue
order = OrderQueue.get;
if ~isempty(order)
if Settings.Verbose
fprintf('%s accepted by exchange\n',char(order))
end
obj.ArchivedOrders.put(order);
obj.Book.put(order);
else
break
end
end
while true % process trade records reported by order book
treco = obj.TradeRecordsToReview.get;
if ~isempty(treco)
for i = 1:2
o = treco.Orders(i);
t = o.Trader;
tconf = TradeConfirmation(o.Side,treco.Size,treco.Price,treco.Time);
t.processTradeConfirmation(o,tconf);
end
tanno = TradeAnnouncement(treco.Size,treco.Price,treco.Time);
notify(obj,'TradeAnnouncement',tanno)
obj.ArchivedTradeRecords.put(treco);
else
break
end
end
end
function processTradeRecord(obj,src,treco) %#ok
obj.TradeRecordsToReview.put(treco);
end
end
events
TradeAnnouncement % listened to by data vendor
end
end