今晚花了几个小时,把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,搞不懂怎么转换这个。 请大家指点下啊! 非常感谢!
因为我没安装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 我觉得非常详细,可以试着改成自己的代码。