QuickFix技术咨询:如何在Java中创建自定义组
在Java中创建QuickFix自定义组(包含2101/2102/2103字段)
1. 定义自定义组类
先创建继承自quickfix.Group的组类,指定2100作为组计数器字段,组内第一个字段用2101(符合QuickFix组的定义规则):
import quickfix.Group; public class CustomStrategyParameters extends Group { // 构造函数:参数为组计数器字段(2100)、组内第一个字段(2101) public CustomStrategyParameters() { super(2100, 2101); } // 2101字段的setter/getter public void setStrategyName(String value) { setField(new StrategyName(value)); } public String getStrategyName() { StrategyName field = new StrategyName(); getField(field); return field.getValue(); } // 2102字段的setter/getter public void setStrategyParameter(String value) { setField(new StrategyParameter(value)); } public String getStrategyParameter() { StrategyParameter field = new StrategyParameter(); getField(field); return field.getValue(); } // 2103字段的setter/getter public void setStrategyParameterType(String value) { setField(new StrategyParameterType(value)); } public String getStrategyParameterType() { StrategyParameterType field = new StrategyParameterType(); getField(field); return field.getValue(); } // 自定义字段类(QuickFix默认无这些字段时需自行定义) public static class StrategyName extends quickfix.StringField { public static final int FIELD = 2101; public StrategyName() { super(FIELD); } public StrategyName(String data) { super(FIELD, data); } } public static class StrategyParameter extends quickfix.StringField { public static final int FIELD = 2102; public StrategyParameter() { super(FIELD); } public StrategyParameter(String data) { super(FIELD, data); } } public static class StrategyParameterType extends quickfix.StringField { public static final int FIELD = 2103; public StrategyParameterType() { super(FIELD); } public StrategyParameterType(String data) { super(FIELD, data); } } }
2. 在父消息中扩展组支持
以NewOrderSingle(35=D)为例,扩展消息类以支持自定义组,逻辑和内置的NoStrategyParameters一致:
import quickfix.fix44.NewOrderSingle; public class ExtendedNewOrderSingle extends NewOrderSingle { public ExtendedNewOrderSingle() { super(); addGroup(new CustomStrategyParameters()); } // 添加自定义组的快捷方法 public void addCustomStrategyParameters(CustomStrategyParameters group) { addGroup(group); } public CustomStrategyParameters getCustomStrategyParameters(int index) { CustomStrategyParameters group = new CustomStrategyParameters(); getGroup(index, group); return group; } }
3. 实例化并生成目标Fix消息
创建消息并设置字段值,生成符合要求的格式:
import quickfix.field.ClOrdID; import quickfix.field.HandlInst; import quickfix.field.OrderQty; import quickfix.field.Symbol; public class FixMessageBuilder { public static void main(String[] args) throws Exception { ExtendedNewOrderSingle order = new ExtendedNewOrderSingle(); // 设置主消息必填字段 order.set(new ClOrdID("ORD-7890")); order.set(new HandlInst('1')); order.set(new Symbol("AAPL")); order.set(new OrderQty(50)); // 创建并配置自定义组 CustomStrategyParams params = new CustomStrategyParams(); params.setStrategyName("ETRSJSD"); params.setStrategyParameter("ABCD"); params.setStrategyParameterType("5"); // 添加组到主消息(QuickFix自动维护2100计数器) order.addCustomStrategyParameters(params); // 输出以|分隔的Fix消息 System.out.println(order.toString().replace('\001', '|')); } }
运行后输出的消息格式如下:
35=D|11=ORD-7890|21=1|55=AAPL|38=50|2100=1|2101=ETRSJSD|2102=ABCD|2103=5|
关键注意点
- 组计数器
2100由QuickFix自动维护,添加N个组时会自动设置为N - 自定义字段类需继承对应类型的Field(如
StringField、IntField),要和Fix协议定义的字段类型匹配 - 若使用QuickFix代码生成器,可直接在消息XML配置中添加组规则,自动生成对应Java类,效果与手动编写一致
内容的提问来源于stack exchange,提问作者27P
相关产品推荐
相关产品推荐

