image thumbnail
from Scrolling display by Dimitri Shvorob
(price/volume chart)

TradeMonitor
classdef TradeMonitor < handle
    
   properties (Constant)
      Period = 2;   % length of a period, sec
      PeriodsToShow = 20; 
   end 
   
   properties (SetAccess = private)
      Running = false;
   end 
    
   properties (SetAccess = private, Hidden)
      Timer
      Trades
      Figure
      AxesPrice
      AxesVolume
      PricesToShow
      VolumesToShow
   end  
   
   methods (Static)
       
       function[obj] = getInstance()
           persistent a
           if isempty(a) 
              a = TradeMonitor();
           end
           obj = a; 
       end 
 
   end  
        
   methods 
       
       function attach(obj,source)
           addlistener(source,'NewTrade',@(src,evt) updateData(obj,src,evt));
       end
       
       function updateData(obj,src,trade)   %#ok
           if obj.Running
              if isempty(obj.Trades)
                 obj.Trades = trade;
              else   
                 obj.Trades(end+1) = trade;
              end 
           end   
       end 
       
       function updateDisplay(obj) 
           
           persistent X L
           if isempty(X)
              X = 1:obj.PeriodsToShow;
              L = [1 obj.PeriodsToShow];
           end
           
           if obj.Running 
              
              if ~isempty(obj.Trades)
                  cutoff = now - obj.Period/1e5;  
                  p = 0;
                  v = 0; 
                  k = 0;
                  for i = 1:length(obj.Trades)
                      t = obj.Trades(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.Trades(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 10], 'XTick',[])
              set(obj.AxesVolume,'XLim',L,'YLim',[0 200],'XTick',[]) 
              
              title(obj.AxesPrice,'Volume-weighted-average price')   
              title(obj.AxesVolume,'Volume')   
              
           end
       end
             
       function start(obj)
           obj.Running = true;  
           clearData(obj) 

           set(obj.AxesPrice ,'Visible','on')
           set(obj.AxesVolume,'Visible','on') 
           
           obj.Timer = timer('TimerFcn','TradeMonitor.getInstance().updateDisplay', ...
                             'Period',obj.Period, ...
                             'ExecutionMode','fixedRate'); 
           start(obj.Timer)             
       end  
       
       function stop(obj)
           obj.Running = false;
           deleteTimer(obj)
       end
       
       function delete(obj) 
          deleteTimer(obj)
          deleteFigure(obj)          
       end
       
       function clearData(obj) 
          obj.Trades = [];   
          obj.PricesToShow  = nan(1,obj.PeriodsToShow);
          obj.VolumesToShow = nan(1,obj.PeriodsToShow);       
       end
       
       function deleteTimer(obj)
          try
              stop(obj.Timer)
              delete(obj.Timer)
          catch     %#ok  
          end
       end
       
       function deleteFigure(obj)
          try
              close(obj.Figure)
          catch     %#ok         
          end
       end
       
   end
   
   methods (Access = private)       
          
       function[obj] = TradeMonitor()                     
           obj.Figure = figure('Position',[600 450 400 400], ...
                               'Color','white', ...
                               'NumberTitle','off', ...
                               'Name',class(obj));
           obj.AxesPrice  = axes('Parent',obj.Figure, ...
                                 'Position',[.1 .5 .85 .4],'Units','normalized', ...
                                 'Visible','off');
           obj.AxesVolume = axes('Parent',obj.Figure, ...
                                 'Position',[.1 .05 .85 .37],'Units','normalized', ...
                                 'Visible','off');  
       end
             
   end
    
end

Contact us at files@mathworks.com