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

    function fixMessage = struct2fix(fixStruct)
%STRUCT2FIX MATLAB structure with FIX tags to FIX string.
%   FIXMESSAGE = STRUCT2FIX(FIXSTRUCT) converts the MATLAB structure, FIXSTRUCT,
%   with fieldnames that are FIX tags to the FIX message string, SFIX.
%   FIXMESSAGE is a cell array of FIX message strings.
%
%   See also fix2struct.

%   Copyright 2016 The MathWorks, Inc.

% Load fix tags
persistent fixtags
if isempty(fixtags)
 load fixtags5_0_2
end

% FIX string delimiter is SOH
sohChar = 1;

% Find header fields BeginString and MsgType input
fixFields = fieldnames(fixStruct);
iBeginString = strcmpi(fixFields,'BeginString');
if ~any(iBeginString)
  error(message('trading:fixloader:missingHeaderField','BeginString'))
end
iFIXBeginString = strcmpi(fixFields{iBeginString},fixtags(:,2));
iMsgType = strcmpi(fixFields,'MsgType');
if ~any(iMsgType)
  error(message('trading:fixloader:missingHeaderField','MsgType'))
end
iFIXMsgType = strcmpi(fixFields{iMsgType},fixtags(:,2));

% Get number of entries in structure
numMessages = length(fixStruct.(fixFields{iBeginString}));
sFIXHeader = cell(numMessages,1);

% Add BeginString and MsgType to beginning of FIX message headers
for j = 1:numMessages
  sFIXHeader{j} = [fixtags{iFIXBeginString,1} '=' fixStruct.(fixFields{iBeginString}){j} sohChar,...
                   fixtags{iFIXMsgType,1} '=' fixStruct.(fixFields{iMsgType}){j} sohChar]; 
end

% Remove BeginString and MsgType from input structure
fixStruct = rmfield(fixStruct,fixFields(iBeginString | iMsgType));

% Get fix tags from input structure
fixFields = fieldnames(fixStruct);
numTags = length(fixFields);
fixMessage = cell(numMessages,1);

% Create array of messages
for j = 1:numMessages
  sFIXBody = [];
  for i = 1:numTags
    iFIXTag = strcmpi(fixFields{i},fixtags(:,2)); 
    if ~any(iFIXTag) && ~any(strcmpi(fixFields{i},{'BodyFields','HeaderFields'}))
      error(message('trading:fixloader:unknownTag', fixFields{i}))
    end
    if strcmpi(fixFields{i},'HeaderFields')
      numAdditionalHeaderFields = size(fixStruct.HeaderFields{j},1);
      for k = 1:numAdditionalHeaderFields
        iFIXTag = strcmpi(fixStruct.HeaderFields{j}{k,1},fixtags(:,2)); 
        if ~any(iFIXTag) 
          error(message('trading:fixloader:unknownTag', fixStruct.HeaderFields{j}{k,1}))
        end
        sFIXHeader{j} = [sFIXHeader{j} fixtags{iFIXTag,1} '=' fixStruct.HeaderFields{j}{k,2} sohChar]; 
      end
    elseif strcmp(fixFields{i},'BodyFields')
      numAdditionalBodyFields = size(fixStruct.BodyFields{j},1);
      for k = 1:numAdditionalBodyFields
        iFIXTag = strcmpi(fixStruct.BodyFields{j}{k,1},fixtags(:,2)); 
        if ~any(iFIXTag) 
          error(message('trading:fixloader:unknownTag', fixStruct.BodyFields{j}{k,1}))
        end
        sFIXBody = [sFIXBody fixtags{iFIXTag,1} '=' fixStruct.BodyFields{j}{k,2} sohChar]; %#ok
      end
    elseif fix.validate.Message.isHeaderField(str2double(fixtags{iFIXTag,1}))
      sFIXHeader{j} = [sFIXHeader{j} fixtags{iFIXTag,1} '=' fixStruct.(fixFields{i}){j} sohChar];
    else
      sFIXBody = [sFIXBody fixtags{iFIXTag,1} '=' fixStruct.(fixFields{i}){j} sohChar];   %#ok
    end
  end
  fixMessage{j} = [sFIXHeader{j} sFIXBody];
end