fix示例TradeClient改写为c#的未解决问题求助

Discussion in 'FIX Protocol' started by laserhz, Nov 15, 2009.

  1. 今晚花了几个小时,把quickfix的示例中tradeclient从c++改写为c#了,但还有2个问题未能解决,其一crack,其二queryHeader
    部分代码如下:
    MessageCracker .crack(message, sessionID);
    public class MessageCracker : FIX40.MessageCracker, FIX41.MessageCracker, FIX42.MessageCracker, FIX43.MessageCracker, FIX44.MessageCracker
    {
    public static void crack(Message message, SessionID sessionID)
    {
    const FIXNameSpace .BeginString beginString = FIELD_GET_REF(message.getHeader(), BeginString);

    if (beginString == BeginString_FIX40)
    {
    ((FIX40.MessageCracker)(this)).crack(ref message, sessionID);
    }
    else if (beginString == BeginString_FIX41)
    {
    ((FIX41.MessageCracker)(this)).crack(ref message, sessionID);
    }
    else if (beginString == BeginString_FIX42)
    {
    ((FIX42.MessageCracker)(this)).crack(ref message, sessionID);
    }
    else if (beginString == BeginString_FIX43)
    {
    ((FIX43.MessageCracker)(this)).crack(ref message, sessionID);
    }
    else if (beginString == BeginString_FIX44)
    {
    ((FIX44.MessageCracker)(this)).crack(ref message, sessionID);
    }
    }

    public void crack(ref Message message, SessionID sessionID)
    {
    const FIX.BeginString beginString = FIELD_GET_REF(message.getHeader(), BeginString);

    if (beginString == BeginString_FIX40)
    {
    ((FIX40.MessageCracker)(this)).crack((FIX40.Message)message, sessionID);
    }
    else if (beginString == BeginString_FIX41)
    {
    ((FIX41.MessageCracker)(this)).crack((FIX41.Message)message, sessionID);
    }
    else if (beginString == BeginString_FIX42)
    {
    ((FIX42.MessageCracker)(this)).crack((FIX42.Message)message, sessionID);
    }
    else if (beginString == BeginString_FIX43)
    {
    ((FIX43.MessageCracker)(this)).crack((FIX43.Message)message, sessionID);
    }
    else if (beginString == BeginString_FIX44)
    {
    ((FIX44.MessageCracker)(this)).crack((FIX44.Message)message, sessionID);
    }
    }
    }
    这个类里多处转换有问题。
    其二是 public void queryHeader(ref FIXNameSpace.Header header)
    {
    header.setField(querySenderCompID());
    header.setField(queryTargetCompID());

    if (queryConfirm("Use a TargetSubID"))
    header.setField(queryTargetSubID());
    }
    这个地方函数参数在c++里是fieldMap,搞不懂怎么转换这个。
    请大家指点下啊!
    非常感谢!
     
  2. 因为我没安装VS2008,所以只能就代码来说:
    一、MessageCracker是quickfix类库已经定义的一个基础class,不需要你重新写(或者你参考源码)。你用的着MessageCracker.crack的地方只有FromApp这个方法,我的写法如下
    public void fromApp(QuickFix.Message message, SessionID sessionID)
    {
    base.crack(message, sessionID);//使用基础类的默认处理即可,除非有其他业务逻辑
    message.Dispose();//非常重要,手动处理,避免GC回收带来的性能下降
    }
    你可以看到这里没有ref的。

    二、queryHeader
    fieldMap是一个类,只有直接引用,只怕不能转换。

    三、QUICKFIX给的DEMO中executor(多语言)和ordermatch(c++)是服务端应用,banzai(java)和tradeclient(c++)是客户端应用,可以给不同的程序员以参考。实际上你目前只需要关注C#的客户端应用怎样写就OK了。由于quickfix没有给c#的DEMO,所以需要自己写一个。我自己写的相对复杂了些,你可以参考这个连接 http://staff.prosoftwarefactory.com.ar/blogs/julian/?p=11
    我觉得非常详细,可以试着改成自己的代码。
     
  3. 好的!非常感谢tom_sh,我再试下