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