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

    function createInstrument(x,varargin)
%CREATEINSTRUMENT Instruments for X_TRADER.
%   CREATEINSTRUMENT(X,S) creates the XTRDR instrument defined by the input
%   structure S.  X is the XTRDR object. 
%   
%   CREATEINSTRUMENT(X,'Property1','Value1','Property2','Value2',...)
%   creates the XTRDR instrument defined by the given name/value pairs.
%
%   See also XTRDR, CREATENOTIFIER, CREATEORDERPROFILE, CREATEORDERSET.

%   Copyright 2011-2012 The MathWorks, Inc. 

%Initialize instrument validation flag
x.ValidLastInstrument = [];

%Instantiate the X_TRADER XTAPI instrument object
ttInstrObj = actxserver('Xtapi.TTInstrObj');

%Get valid properties of instrument object
ttInstrProperties = fields(ttInstrObj);

%Create instrument from input structure
if ~isempty(varargin) && isstruct(varargin{1})
  
    %Get field names in structures
    structFields = fields(varargin{1});
    
    %Set properties of ttInstrObj
    for i = 1:length(structFields)
      
        if any(strcmp(structFields{i},ttInstrProperties))
          
          ttInstrObj.(structFields{i}) = varargin{1}.(structFields{i});
          
        end
        
    end
 
else   %Create instrument from name/value pairs
    
  numInputs = length(varargin);
  
  if mod(numInputs,2)
    error(message('trading:xtrdr:nameValuePairMismatch'))
  end
  
  for i = 1:2:numInputs
     
    ttInstrObj.(varargin{i}) = varargin{i+1};
    
  end
end

%Set up notifier to validate instruments
validateInstrNotify = actxserver('Xtapi.TTInstrNotify');

%Attach instrument to notifier
validateInstrNotify.AttachInstrument(ttInstrObj);

%Check that price server is up for the requested exchange
sExchange = char(ttInstrObj.Exchange);
x.Gate.OpenExchangePrices(sExchange);
bExchangeTest = false;
nExchangeTestCounter = 0;
pause(1)
while ~bExchangeTest
  bExchangeTest = x.Gate.Get(['Available.' sExchange '.Price']);
  nExchangeTestCounter = nExchangeTestCounter + 1;
  if nExchangeTestCounter > 10
    error(message('trading:xtrdr:exchangeDown',sExchange))
  end
  pause(1)
end

%Define event callbacks for instrument validation
validateInstrNotify.registerevent({'OnNotifyFound',@(varargin)x.validInstrument})
validateInstrNotify.registerevent({'OnNotifyNotFound',@(varargin)x.invalidInstrument})

%Make instrument Retrieve call to validate instruments
ttInstrObj.Retrieve;

%Validate instrument
while isempty(x.ValidLastInstrument)
  %Wait until instrument has been flagged valid or invalid
  pause(1)
end

%Trap invalid instrument
if ~x.ValidLastInstrument 
  error(message('trading:xtrdr:invalidInstrument'))
end

%Add instruments to xtrdr object Instruments property
nLengthInsts = length(x.Instrument);
if nLengthInsts
  x.Instrument(nLengthInsts + 1) = ttInstrObj;
else
  x.Instrument = ttInstrObj;
end