从无效的QuickFix库方法获取价值

时间:2019-01-02 07:24:04

标签: c# quickfixn

我在C#中有一个QuickFix应用程序:

await

public class MyQuickFixApp : IApplication { ... public void ToApp(Message msg, SessionID sessionID) { string s = msg.GetString(Tags.ClOrdID); ... } public void FromApp(Message msg, SessionID sessionID) { } } 发送到其他Fix Server的消息,而回复则来自ToApp
我需要存储已发送邮件(FromApp)的标签值以选择相应的回复。 s方法返回void。我试图将值存储在公共静态文件中,但失败。

看起来如下:

ToApp

我在 public class MyQuickFixApp : IApplication { ... public static string currClOrdID = ""; public void ToApp(Message msg, SessionID sessionID) { string s = msg.GetString(Tags.ClOrdID); currClOrdID = s; ... } public void FromApp(Message msg, SessionID sessionID) { if (Equals(currClOrdID)) ... } } 上得到NullreferenceException。这样做的一般策略是什么?请给我一些提示。

1 个答案:

答案 0 :(得分:1)

根据QuickFix/n Tutorial

  

编写应用程序的最佳方法是使用特定的强类型Message和Field类

因此您可以在Crack(...);中使用FromApp

using QuickFix;

public class MyApplication : MessageCracker, IApplication
{
    public void FromApp(Message msg, SessionID sessionID)
    {
        Crack(msg, sessionID);
    }
    //...
}

关于ClOrdID,您可以从消息中提取它并将其直接传递给处理函数,这比在多线程消息处理中将ClOrdID保留在静态变量中更为安全。

例如(假设您需要处理ExecutionReport消息):

public void OnMessage(QuickFix.FIX44.ExecutionReport msgReport, SessionID sessionID)
{
    string clOrdID = msgReport.ClOrdID.getValue();
    ...
    YourProcessing(clOrdID, ...);
}

请注意,将从OnMessage(...)中调用Crack(msg, sessionID);

如果您需要存储其他数据来处理收到的消息,我将使用字典,因为您可能有几条待处理的消息,并且响应可能会以不可预测的顺序到达。同样,将这样的数据存储在调用Send之前(和之前)而不是在ToApp中存储逻辑,就像下面这样(假设您正在发送执行命令,希望得到ExecutionReport的回复) :

private ConcurrentDictionary<string, ...> _orderData = 
    new ConcurrentDictionary<string, ...>();

public bool PlaceNewOrder(...)
    {
        string clOrdID = ...;
        QuickFix.FIX44.NewOrderSingle msgOrder = 
            new QuickFix.FIX44.NewOrderSingle(new ClOrdID(clOrdID), ...);
        ...;
        _orderData.TryAdd(clOrdID, <data required for later processing>);
        // Notice the data is stored before sending the message
        // so it will be available to process a response
        Session.SendToTarget(msgOrder, sessionID);
    }

在处理响应消息时,您可以检索为此特定clOrdID存储的数据:

private void YourProcessing(clOrdID, ...)
{
    ...;
    _orderData.TryGetValue(clOrdID, out ...);
    // You may want to check return value to make sure the data was stored for this clOrdID...
    ...;
}

还要注意,您应该在某些时候清理字典,例如,当您从已处理的消息中知道它是最后一个字典时,不要再为此ClOrdID收到消息了。