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

Trader
classdef Trader < TimerDriven
   
   properties (SetAccess = private)
       Name
       Strategy
       ArchivedOrders
       ArchivedTradeConfirmations
       ArchivedTradeAnnouncements
   end
   
   properties (Hidden)
       TradeConfirmationsToReview
       TradeAnnouncementsToReview
   end
        
   methods (Static)
       
       function[obj] = getInstance(name,varargin)
           persistent local
           if isempty(local)
              local = CharKeyHashtable();
           end
               
           if local.iskey(name)
              obj = local.get(name);
           else    
              obj = Trader(name,varargin{1});
              local.put(name,obj)
           end
       end 
 
   end  
        
   methods 
            
       function step(obj)
           obj.Strategy.eval(obj) 
       end   
       
       function processOrder(obj,order)
           if Settings.Verbose
              fprintf('%s submitted by trader\n',char(order))
           end
           OrderQueue.put(order);
           obj.ArchivedOrders.put(order);
       end       
                  
       function processTradeConfirmation(obj,order,tconf)      
           if Settings.Verbose
              fprintf('%s for %s acknowledged by trader\n',char(tconf),char(order))
           end
           obj.TradeConfirmationsToReview.put(tconf);
       end 

       function processTradeAnnouncement(obj,src,tanno)  %#ok
           obj.TradeAnnouncementsToReview.put(tanno.clone);
       end 
       
       function[out] = char(obj)             
           out = sprintf('Trader %s',obj.Name);
       end
       
   end 
   
   methods (Access = private)
       
      function[obj] = Trader(name,strategy)           
           obj = obj@TimerDriven(Settings.TraderPeriod);
           set(obj.Timer,'TimerFcn',['Trader.getInstance(''' name ''').step'])

           obj.Name     = name;
           obj.Strategy = strategy;
           
           obj.ArchivedOrders = Queue();
           obj.ArchivedTradeConfirmations = Queue();
           obj.ArchivedTradeAnnouncements = Queue();
           
           obj.TradeConfirmationsToReview = Queue(); 
           obj.TradeAnnouncementsToReview = Queue();          
          
           v = DataVendor.getInstance;
           addlistener(v,'TradeAnnouncement',@(src,evt) processTradeAnnouncement(obj,src,evt))          
      end
      
   end
       
end

Contact us at files@mathworks.com