我正在尝试订阅价格流,使用以下代码:
Using l_msg As New QuickFix42.MarketDataRequest(New MDReqID(Date.Now.Ticks.ToString), New SubscriptionRequestType(SubscriptionRequestType.SNAPSHOT_PLUS_UPDATES), New MarketDepth(1))
l_msg.setField(New MDUpdateType(1))
l_msg.setField(New AggregatedBook(False))
l_msg.setField(New NoMDEntryTypes(2))
l_msg.setField(New MDEntryType("0"c))
l_msg.setField(New MDEntryType("1"c))
l_msg.setField(New Symbol("EUR/USD"))
l_msg.setField(New NoRelatedSym(1))
Session.sendToTarget(l_msg, SENDER_COMP_ID.Value, TARGET_COMP_ID.Value)
End Using
生成的FIX消息为:
8=FIX.4.2 9=140 35=V 34=2 49=SENDER_COMP_ID 52=20110909-15:44:02.85556= target_comp_id 55= eur/usd 146=1 262=634511906383686907 263=1 264=1265=1 266= 2 269=1 10=079
我需要重新排序标签,所以55在标签146之后。我尝试以不同的顺序调用setField
,但每次都给出相同的结果。
处理消息标签顺序的正确方法是什么?
编辑-问题解决:
我遵循DumbCoder的建议,并使用addGroup
而不是setField
来构建消息。下面的代码示例也帮助了我:http://forexforums.dailyfx.com/fix-api-support/411090-fix-api-example.html
AFAIK quickfix使用映射读取标记,然后填充它们的值,因此标记的位置由语言决定,而不是由库决定。
将ValidateFieldsOutOfOrder设置为接收器上的N,这样即使标签乱序,您的消息也不会被拒绝。这给我带来了很多工作,因为无论我尝试什么,标签都不会结束,我不得不放松把标签按顺序排列。如果标签没有按顺序排列,则拒绝消息的接受器不是一个好的选择。你不能依赖每个修复库来完成你的任务。