关于QuickFIX/n(.NET)运行时添加自定义FIX消息及手动处理自定义消息的技术咨询
QuickFIX/n(.NET)运行时添加自定义FIX消息及手动处理自定义消息的技术咨询
我完全懂你现在的困扰——QuickFIX/n默认那套改XML字典、生成类再重建库的流程,在CI/CD环境里简直是维护噩梦,太折腾人了。不过别担心,有两种靠谱的方式能绕开这个繁琐的步骤,实现运行时处理自定义消息:
一、直接用Message基类动态处理(无需修改字典/重建库)
这是最轻量化的解决方案,完全不用碰XML字典和代码生成工具,直接利用QuickFIX/n的基础消息类来处理自定义内容:
接收自定义消息时的处理
在你的Application实现类中,重写FromApp方法,通过消息类型(MsgType字段)识别自定义佣金消息,然后直接读取字段:
public void FromApp(Message message, SessionID sessionID) { string msgType = message.Header.GetString(Tags.MsgType); // 替换成你的自定义佣金消息类型,比如"Z1" if (msgType == "Z1") { // 读取自定义字段,这里的Tag值替换成你实际的字段编号 decimal commissionAmount = message.GetDecimal(1001); string commissionCurrency = message.GetString(1002); // 这里写你的业务逻辑处理代码 Console.WriteLine($"收到自定义佣金消息:金额{commissionAmount} {commissionCurrency}"); } else { // 标准消息交给基类处理(如果继承了MessageCracker) base.FromApp(message, sessionID); } }
发送自定义消息时的处理
同样不用预生成类,直接构造Message对象并设置必要字段:
// 构造自定义佣金消息 var commissionMsg = new Message(); // 设置自定义消息类型 commissionMsg.Header.SetField(new StringField(Tags.MsgType, "Z1")); // 添加自定义字段 commissionMsg.SetField(new DecimalField(1001, 12.35m)); commissionMsg.SetField(new StringField(1002, "USD")); // 补充标准必填字段(根据你的FIX版本和协议要求调整) commissionMsg.Header.SetField(new StringField(Tags.SenderCompID, "YOUR_FIX_ID")); commissionMsg.Header.SetField(new StringField(Tags.TargetCompID, "PROVIDER_FIX_ID")); // 发送消息到目标会话 Session.SendToTarget(commissionMsg, yourSessionID);
二、自定义消息工厂(更灵活的运行时扩展)
如果你的系统有大量自定义消息需要管理,希望引擎能自动识别这些类型,你可以实现自己的IMessageFactory,让它在运行时动态创建消息对象:
public class CustomMessageFactory : IMessageFactory { public Message Create(string beginString, string msgType) { // 处理你的自定义消息类型 if (msgType == "Z1") { // 可以返回Message基类,或者你自己定义的Message子类(无需预生成) return new Message(); } // 标准消息交给默认工厂处理 var defaultFactory = new DefaultMessageFactory(); return defaultFactory.Create(beginString, msgType); } // 接口其他方法直接复用默认工厂的实现 public Group Create(string beginString, string msgType, int correspondingFieldID) { var defaultFactory = new DefaultMessageFactory(); return defaultFactory.Create(beginString, msgType, correspondingFieldID); } }
然后在初始化SocketAcceptor/SocketInitiator时,传入这个自定义工厂:
var settings = new SessionSettings("your_fix_config.cfg"); var app = new YourApplication(); var storeFactory = new FileStoreFactory(settings); var logFactory = new FileLogFactory(settings); // 使用自定义消息工厂 var msgFactory = new CustomMessageFactory(); var acceptor = new ThreadedSocketAcceptor(app, storeFactory, settings, logFactory, msgFactory); acceptor.Start();
这样引擎在收到自定义消息时,会自动用你的工厂创建对应的消息对象,后续处理和动态方式一致。
总结
这两种方式都完全不需要修改XML字典、生成C#类或者重建QuickFIX/n库,完美适配CI/CD流程,再也不用头疼DLL版本维护的问题。如果只是处理少数自定义消息,直接用Message基类动态处理就足够;如果有大量自定义消息需要管理,自定义消息工厂会更灵活。
备注:内容来源于stack exchange,提问作者E.Benedos
相关产品推荐
相关产品推荐

