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