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