www.gusucode.com > trading工具箱matlab源码程序 > trading/trading/@ibtws/getdata.m
function d = getdata(c,s,callback) %GETDATA Interactive Brokers current data. % GETDATA(C,S) requests Interactive Brokers current data given the % connection handle, C, and contract, S. The user can specify % an event handler, CALLBACK. If no event handler is specified, the data % will be returned as the first output argument. % % For example, % % ibContract = ib.Handle.createContract; % ibContract.symbol = 'XYZ'; % ibContract.secType = 'STK'; % ibContract.exchange = 'SMART'; % ibContract.currency = 'USD'; % d = ib.getdata(ibContract) % % To see all of the fields associated with the Interactive Brokers % contract object, type % % fieldnames(ibContract) % % See also IBTWS, CLOSE, CREATEORDER, HISTORY, TIMESERIES. % Copyright 2013-2015 The MathWorks, Inc. % Define event handlers for error and tick events reqID = floor(rand*10000); eventNames = {'tickSize','tickPrice','tickSnapshotEnd'}; if nargin < 3 for i = 1:length(eventNames) c.Handle.registerevent({eventNames{i},@(varargin)ibBuiltInGetDataEventHandler(varargin{:},c)}) end elseif ~isempty(callback) for i = 1:length(eventNames) c.Handle.registerevent({eventNames{i},callback}) end end % IB market data request API call c.DataRequest = true; try %Version 9.7+ API call c.Handle.reqMktDataEx(reqID,s,'',1,c.Handle.createTagValueList) catch %Version pre 9.7 API call c.Handle.reqMktDataEx(reqID,s,'',1) end % If user defined event handler, do not loop on DataRequest property if nargin > 2 d = reqID; return end while c.DataRequest drawnow end % Return data to method workspace and convert dates to date numbers try d = evalin('base','ibBuiltInCurrentData'); catch d = evalin('base','ibBuiltInErrMsg'); end % Clear temporary variables evalin('base','clear ibBuiltInCurrentData'); function ibBuiltInGetDataEventHandler(varargin) %IBBUILTINGETDATAEVENTHANDLER Interactive Brokers' Trader Workstation built in current data event handler. persistent ibBuiltInCurrentData % Trap event type switch varargin{end-1} case 'tickSize' switch varargin{6}.tickType case 0 % BID SIZE ibBuiltInCurrentData.BID_SIZE = varargin{6}.size; case 3 % ASK SIZE ibBuiltInCurrentData.ASK_SIZE = varargin{6}.size; case 5 % LAST SIZE ibBuiltInCurrentData.LAST_SIZE = varargin{6}.size; case 8 % VOLUME ibBuiltInCurrentData.VOLUME = varargin{6}.size; end case 'tickPrice' switch varargin{7}.tickType case 1 % BID PRICE ibBuiltInCurrentData.BID_PRICE = varargin{7}.price; case 2 % ASK PRICE ibBuiltInCurrentData.ASK_PRICE = varargin{7}.price; case 4 % LAST PRICE ibBuiltInCurrentData.LAST_PRICE = varargin{7}.price; end case 'tickSnapshotEnd' % Return data to base workspace assignin('base','ibBuiltInCurrentData',ibBuiltInCurrentData); % Clear persistent variables and event listeners clear ibBuiltInCurrentData evtListeners = varargin{1}.eventlisteners; i = strcmp(evtListeners(:,1),'tickPrice'); varargin{1}.unregisterevent({evtListeners{i,1} evtListeners{i,2}}); i = strcmp(evtListeners(:,1),'tickSize'); varargin{1}.unregisterevent({evtListeners{i,1} evtListeners{i,2}}); i = strcmp(evtListeners(:,1),'tickSnapshotEnd'); varargin{1}.unregisterevent({evtListeners{i,1} evtListeners{i,2}}); varargin{end}.DataRequest = false; %#ok return end