You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 07:09:36