如何基于Quickfix/n 4.2实现多腿订单?解决重复标签覆盖问题
Quickfix/n 4.2 实现多腿订单(NEW_ORDER_MULTILEG)解决方案
核心方案:用Group类封装重复标签组
Quickfix/n的Group类专门用于处理重复标签场景,虽然4.2版本没有官方预制的多腿订单模板,但可以手动定义腿信息组,无需修改或重建库。
步骤1:定义LegGroup类
继承Group类,指定组的触发标签(选LegSymbol的标签号600),并注册组内需要重复的标签:
public class LegGroup : Group { // FIX 4.2对应标签号 private const int TagLegSymbol = 600; private const int TagLegCFICode = 601; private const int TagLegRatioQty = 602; private const int TagLegSide = 604; private const int TagLegStrikePrice = 605; private const int TagLegMaturityDate = 606; public LegGroup() : base(TagLegSymbol, new int[] { TagLegCFICode, TagLegRatioQty, TagLegSide, TagLegStrikePrice, TagLegMaturityDate }) { } // 封装标签读写方法 public void SetLegSymbol(string value) => SetString(TagLegSymbol, value); public void SetLegCFICode(string value) => SetString(TagLegCFICode, value); public void SetLegRatioQty(decimal value) => SetDecimal(TagLegRatioQty, value); public void SetLegSide(char value) => SetChar(TagLegSide, value); public void SetLegStrikePrice(decimal value) => SetDecimal(TagLegStrikePrice, value); public void SetLegMaturityDate(string value) => SetString(TagLegMaturityDate, value); }
步骤2:构建多腿订单消息
创建消息实例并设置类型为AB,然后添加多个LegGroup实例:
private const string LEG_EXPIRY_FORMAT = "yyyyMMdd"; // 初始化订单消息 var multiLegOrder = new Message(); multiLegOrder.Header.SetField(new MsgType("AB")); // 添加第一条腿 var leg1 = new LegGroup(); leg1.SetLegSymbol(symbol1); leg1.SetLegCFICode(futureOption1.OptionRight == OptionRight.Call ? "OCXXXX" : "OPXXXX"); leg1.SetLegRatioQty(ml1.Quantity); leg1.SetLegSide(ml1.TradeDirection.ToFixSide()); leg1.SetLegStrikePrice(futureOption1.StrikePrice); leg1.SetLegMaturityDate(futureOption1.ExpiryDate.ToString(LEG_EXPIRY_FORMAT)); multiLegOrder.AddGroup(leg1); // 添加第二条腿 var leg2 = new LegGroup(); leg2.SetLegSymbol(symbol2); leg2.SetLegCFICode(futureOption2.OptionRight == OptionRight.Call ? "OCXXXX" : "OPXXXX"); leg2.SetLegRatioQty(ml2.Quantity); leg2.SetLegSide(ml2.TradeDirection.ToFixSide()); leg2.SetLegStrikePrice(futureOption2.StrikePrice); leg2.SetLegMaturityDate(futureOption2.ExpiryDate.ToString(LEG_EXPIRY_FORMAT)); multiLegOrder.AddGroup(leg2); // 补充订单必填字段(示例) multiLegOrder.SetField(new ClOrdID("ORD-2024-001")); multiLegOrder.SetField(new HandlInst('1')); // ... 按需添加其他必填字段
关键说明
Group构造函数第一个参数是组触发标签(必须是组内第一个出现的标签),第二个参数是组内剩余标签的列表。- 调用
AddGroup()方法添加多个组后,Quickfix/n会自动按FIX协议生成重复标签序列,不会出现值覆盖问题。 - 该方案完全基于现有库扩展,无需修改源码。
内容的提问来源于stack exchange,提问作者E.Benedos
相关产品推荐
相关产品推荐

