image thumbnail
from Order book simulation by Dimitri Shvorob
(a naive artificial stock market)

Exchange
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

Contact us at files@mathworks.com