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