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

TickerTape
classdef TickerTape < TimerDriven
           
   properties (SetAccess = private, Hidden)
      PeriodsToShow
      RecentTrades
      Figure
      AxesPrice
      AxesVolume
      PricesToShow
      VolumesToShow
   end  
   
   methods (Static)
       
       function[obj] = getInstance()
           persistent local
           if isempty(local) 
              local = TickerTape();
           end
           obj = local; 
       end 
 
   end  
        
   methods              
           
       function step(obj) 
           
           persistent X L
           if isempty(X)
              X = 1:obj.PeriodsToShow;
              L = [1 obj.PeriodsToShow];
           end           
                    
           if ~isempty(obj.RecentTrades)
              cutoff = now - obj.Period/1e5;  
              p = 0;
              v = 0; 
              k = 0;
              for i = 1:length(obj.RecentTrades)
                  t = obj.RecentTrades(i);
                  if t.Time >= cutoff
                     v = v + t.Size;
                     p = p + t.Size*t.Price;
                  else
                     k = k + 1; 
                  end   
              end   
              p = p/v;
              obj.RecentTrades(1:k) = [];
           else
              p = nan;
              v = 0;                  
           end
           
           obj.PricesToShow  = [obj.PricesToShow(2:end)  p];
           obj.VolumesToShow = [obj.VolumesToShow(2:end) v];
          
           bar(obj.AxesPrice,X,obj.PricesToShow)
           bar(obj.AxesVolume,X,obj.VolumesToShow)

           set(obj.AxesPrice, 'XLim',L,'YLim',[1 11], 'XTick',[])
           set(obj.AxesVolume,'XLim',L,'YLim',[0 50],'XTick',[]) 

           title(obj.AxesPrice,'Volume-weighted-average price')   
           title(obj.AxesVolume,'Volume')   
           
           drawnow
              
       end       
       
       function processTradeAnnouncement(obj,src,tanno)   %#ok
          if isempty(obj.RecentTrades)
             obj.RecentTrades = tanno.clone;
          else   
             obj.RecentTrades(end+1) = tanno.clone;
          end 
       end 
      
   end
   
   methods (Access = private)       
          
       function[obj] = TickerTape() 
           obj = obj@TimerDriven(Settings.DataVendorPeriod);
           addlistener(DataVendor.getInstance,'TradeAnnouncement',@(src,evt) processTradeAnnouncement(obj,src,evt));
           obj.Figure     = figure('Position',[600 450 400 400],'Color','white','NumberTitle','off','Name',class(obj));
           obj.AxesPrice  = axes('Parent',obj.Figure,'Position',[.1 .50 .85 .40],'Units','normalized');
           obj.AxesVolume = axes('Parent',obj.Figure,'Position',[.1 .05 .85 .37],'Units','normalized');  
           obj.PeriodsToShow = 20;           
           obj.RecentTrades  = [];   
           obj.PricesToShow  = nan(1,obj.PeriodsToShow);
           obj.VolumesToShow = nan(1,obj.PeriodsToShow); 
       end
             
   end
    
end

Contact us at files@mathworks.com