www.gusucode.com > trading工具箱matlab源码程序 > trading/trading/@ibtws/executions.m

    function d = executions(c,f,callback)
%EXECUTIONS Interactive Brokers execution data.
%   D = EXECUTIONS(C,F) returns Interactive Brokers execution data given the 
%   connection handle, C, and the execution filter, F.  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,
% 
%   f = ib.Handle.createExecutionFilter
%   f.side = 'BUY'
%   f.secType = 'STK'
%   f.exchange = 'SMART'
%   f.symbol = 'XYZ'
%   d = ib.executions(f)
%
%   See also IBTWS, CLOSE, CREATEORDER, GETDATA,HISTORY, TIMESERIES.

%   Copyright 2015 The MathWorks, Inc. 
   
% Define event handlers for error and tick events
eventNames = {'execDetailsEx','execDetailsEnd'};
if nargin < 3
  for i = 1:length(eventNames)
    c.Handle.registerevent({eventNames{i},@(varargin)ibBuiltInExecutionEventHandler(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;
c.Handle.reqExecutionsEx(1,f)

% If user defined event handler, do not loop on DataRequest property
if nargin > 2
  if nargout == 1
    d = [];
  end
  return
end

while c.DataRequest
  drawnow
end

% Return data to method workspace and convert dates to date numbers
try
  d = evalin('base','ibBuiltInExecutionData');
catch
  d = evalin('base','ibBuiltInErrMsg');
end

% Clear temporary variables
evalin('base','clear ibBuiltInExecutionData');

function ibBuiltInExecutionEventHandler(varargin)
%IBBUILTINEXECUTIONEVENTHANDLER Interactive Brokers' Trader Workstation built in executions data event handler.

persistent ibBuiltInExecutionData 

numEls = size(ibBuiltInExecutionData,1);

% Trap event type
switch varargin{end-1}
  
  case {'execDetailsEx'}
    
    if numEls == 1
      ibBuiltInExecutionData.contract = get(varargin{6}.contract);
      ibBuiltInExecutionData.execution = get(varargin{6}.execution);
    else
      ibBuiltInExecutionData(numEls+1).contract = get(varargin{6}.contract);
      ibBuiltInExecutionData(numEls+1).execution = get(varargin{6}.execution);
    end
    assignin('base','ibBuiltInExecutionData',ibBuiltInExecutionData);
    
  case {'execDetailsEnd'}
    
    if numEls == 1
      ibBuiltInExecutionData.enddetails = varargin{4};
    else
      ibBuiltInExecutionData(numEls+1).enddetails = varargin{4};
    end
    
    % Return data to base workspace
    assignin('base','ibBuiltInExecutionData',ibBuiltInExecutionData);
    clear ibBuiltInExecutionData
    evtListeners = varargin{1}.eventlisteners;
    i = strcmp(evtListeners(:,1),'execDetailsEx');
    varargin{1}.unregisterevent({evtListeners{i,1} evtListeners{i,2}});
    i = strcmp(evtListeners(:,1),'execDetailsEnd');
    varargin{1}.unregisterevent({evtListeners{i,1} evtListeners{i,2}});
    varargin{end}.DataRequest = false; %#ok
    
end