QuickFixN:如何在 QuoteRequest 消息上按特定顺序设置字段?
QuickFixN: How to set fields in a specific sequence on a QuoteRequest message?
我们要求按照设置的顺序发送消息的前 3 个字段,即 QuoteReqID、OnBehalfOfCompID、Account。然而,当它们被添加到消息中时,它们会按数字升序重新排序,即 Account、OnBehalfOfCompID、QuoteReqID。通过组,我们可以定义字段顺序,但我看不到对消息执行此操作的选项。有人知道我们如何才能做到这一点吗?
var message = new QuoteRequest();
int[] fieldOrder = new[] {Tags.Currency, Tags.Symbol, Tags.SecurityType, Tags.CFICode, Tags.NoLegs, Tags.LegQty, Tags.LegFutSettDate, Tags.LegSecuritySubType};
message.SetField(new QuoteReqID(stream.QuoteRequestId));
message.SetField(new OnBehalfOfCompID(_compId));
message.SetField(new Account(_accountId));
var group = new Group(Tags.NoRelatedSym, 0, fieldOrder);
group.SetField(new Currency(stream.Ccy));
group.SetField(new Symbol(stream.Ccy1 + "/" + stream.Ccy2));
group.SetField(new SecurityType("FOR"));
group.SetField(new CFICode("FORWARD"));
group.SetField(new NoLegs(1));
group.SetField(new LegQty(stream.Amount));
group.SetField(new LegFutSettDate(stream.FutSettDate));
group.SetField(new LegSecuritySubType("TOD"));
message.AddGroup(group);
QuickFix.Session.SendToTarget(message, _ratesSession.SessionId);
我不熟悉 QuickFixN,但我知道 OnBehalfOfCompID
是消息 header 中的一个字段,而 QuoteReqID
和 Account
是消息的 body 中的字段。消息中使用的所有 header 字段 必须 出现在任何 body 字段之前。
这绝对不是指定 FIX 协议的行为方式。在规范中,Body 中不在重复组内的字段可以采用任何顺序。您的交易对手要求 non-FIX-compliant 行为(我看不出这样做有什么好处)。
因此,QuickFIX/n 不支持这个,因为...QF/n 实现 FIX,而不是你的交易对手想要的这种愚蠢的 non-FIX 行为。
很抱歉告诉你这个,但你必须以某种方式破解引擎才能实现这一点。
还有一个警告: OnBehalfOfCompID
是 header 字段,而不是 body 字段。 QF/n 将它添加到 外发 消息的 body 应该没有问题,但它可能会在传入时拒绝此类消息。 (感谢@ciaran-mchale 指出这一点的回答。)
“onbehalfcompid”(标签 115)在修复消息的 header 下,quoteReqID(标签 131)和帐户(标签 1)在修复消息的 body 下。所有 header 标签都应出现在 body 消息标签之前。这适用于所有修复 engines/simulator.
我们要求按照设置的顺序发送消息的前 3 个字段,即 QuoteReqID、OnBehalfOfCompID、Account。然而,当它们被添加到消息中时,它们会按数字升序重新排序,即 Account、OnBehalfOfCompID、QuoteReqID。通过组,我们可以定义字段顺序,但我看不到对消息执行此操作的选项。有人知道我们如何才能做到这一点吗?
var message = new QuoteRequest();
int[] fieldOrder = new[] {Tags.Currency, Tags.Symbol, Tags.SecurityType, Tags.CFICode, Tags.NoLegs, Tags.LegQty, Tags.LegFutSettDate, Tags.LegSecuritySubType};
message.SetField(new QuoteReqID(stream.QuoteRequestId));
message.SetField(new OnBehalfOfCompID(_compId));
message.SetField(new Account(_accountId));
var group = new Group(Tags.NoRelatedSym, 0, fieldOrder);
group.SetField(new Currency(stream.Ccy));
group.SetField(new Symbol(stream.Ccy1 + "/" + stream.Ccy2));
group.SetField(new SecurityType("FOR"));
group.SetField(new CFICode("FORWARD"));
group.SetField(new NoLegs(1));
group.SetField(new LegQty(stream.Amount));
group.SetField(new LegFutSettDate(stream.FutSettDate));
group.SetField(new LegSecuritySubType("TOD"));
message.AddGroup(group);
QuickFix.Session.SendToTarget(message, _ratesSession.SessionId);
我不熟悉 QuickFixN,但我知道 OnBehalfOfCompID
是消息 header 中的一个字段,而 QuoteReqID
和 Account
是消息的 body 中的字段。消息中使用的所有 header 字段 必须 出现在任何 body 字段之前。
这绝对不是指定 FIX 协议的行为方式。在规范中,Body 中不在重复组内的字段可以采用任何顺序。您的交易对手要求 non-FIX-compliant 行为(我看不出这样做有什么好处)。
因此,QuickFIX/n 不支持这个,因为...QF/n 实现 FIX,而不是你的交易对手想要的这种愚蠢的 non-FIX 行为。
很抱歉告诉你这个,但你必须以某种方式破解引擎才能实现这一点。
还有一个警告: OnBehalfOfCompID
是 header 字段,而不是 body 字段。 QF/n 将它添加到 外发 消息的 body 应该没有问题,但它可能会在传入时拒绝此类消息。 (感谢@ciaran-mchale 指出这一点的回答。)
“onbehalfcompid”(标签 115)在修复消息的 header 下,quoteReqID(标签 131)和帐户(标签 1)在修复消息的 body 下。所有 header 标签都应出现在 body 消息标签之前。这适用于所有修复 engines/simulator.