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