我的机器上安装了 MT4 客户端,并且可以成功检索源。不过,我用java编写了一个程序,使用FIX协议来拉取数据。我想知道我的 java 程序如何提取我在 MT4 客户端上看到的数据。
我查看了 FIX v4.2 规范,我不清楚当 TCP 连接在会话中间丢失时应该是什么预期行为。
更具体地说,假设当前的序列号是 100 并且此时 TCP 连接丢失,当任何一方尝试恢复会话时,它重新发送消息号 100,或者启动一个新的登录会话?
在描述 FIX 会话时,规范说一个会话有一个登录和一个注销,但可以跨越多个物理连接。这让我认为当 TCP 连接丢失时,恢复过程不应该以登录消息开始,但我对此并不乐观。
提前致谢!
需要快速帮助。我是 QuickFixJ 的新手。我的 txt 文件中有一条 FIX 消息。我需要将其转换为 FIX50SP2 格式。我附上代码片段。
String fixMsg = "1128=99=25535=X49=CME34=47134052=20100318-03:21:11.36475=20120904268=2279=122=848=336683=607400107=ESU2269=1270=140575271=152273=121014000336=2346=521023=1279=122=848=336683=607401107=ESU2269=1270=140600271=206273=121014000336=2346=681023=210=159";
System.out.println("FixMsg String:"+fixMsg);
Message FIXMessage = new Message();
DataDictionary dd = new DataDictionary("FIX50SP2.xml");
FIXMessage.fromString(fixMsg, dd, false);
System.out.println("FIXMessage Output:" + FIXMessage.toString()); // Print message after parsing
MsgType msgType = new MsgType();
System.out.println(FIXMessage.getField(msgType));
Run Code Online (Sandbox Code Playgroud)
这是输出:
FixMsg String:1128=99=15835=X49=CME34=47164052=2012090312102051175=20120904268=1279=122=848=336683=607745107=ESU2269=1270=140575271=123273=121020000336=2346=501023=110=205
FIXMessage Output:9=6135=X34=47164049=CME52=2012090312102051175=20120904268=110=117
quickfix.FieldNotFound: Field [35] was not found in message.
at quickfix.FieldMap.getField(FieldMap.java:216)
at quickfix.FieldMap.getFieldInternal(FieldMap.java:353)
at quickfix.FieldMap.getField(FieldMap.java:349)
at MainApp.main(MainApp.java:52)
Run Code Online (Sandbox Code Playgroud)
我想提取 MsgType 字段(字段 35)。你能告诉我我错在哪里吗?我观察到的是,解析为 FIX50SP2 格式后,转换 FIX 消息缺少许多数据元素(有关详细信息,请参阅输出)
谢谢
假设我正在运行一个基于网络的交换并且有一个新客户注册。我为该客户提供了一个新的 CompID,现在我想将该 CompID 添加到我的接受方。我是否必须重新启动我的接受器或者可以动态完成吗?
必须提前就 CompID 达成一致,然后将其粘贴到某处的配置中,这似乎不太具有可扩展性。
我见过一些据说可以做到这一点的示例,但它们似乎只是通过将配置设置为*. 还有其他方法可以做到这一点吗?
我有一个 35=S(报价消息;“标签=值”)的 csv/日志文件,我需要将费率提取到适当的 CSV 文件中以进行数据挖掘。这不是严格的 FIX 相关,它更多是关于如何清理数据集的 R 相关问题。
原始消息如下所示:
190=1.1204 ,191=-0.000029,193=20141008,537=0 ,631=1.12029575,642=0.000145,10=56
190=7.20425,191=0.000141 ,537=0 ,631=7.2034485,10=140 , ,
190=1.26237,191=0 ,537=1 ,10=068 , , ,
Run Code Online (Sandbox Code Playgroud)
我首先需要获得一个看起来像这样的中间数据集,其中对齐了相同的标签。
190=1.1204 ,191=-0.000029,193=20141008,537=0,631=1.12029575,642=0.000145,10=56
190=7.20425,191=0.000141 , ,537=0,631=7.2034485 , ,10=140
190=1.26237,191=0 , ,537=1, , ,10=068
Run Code Online (Sandbox Code Playgroud)
反过来,这将需要转换为:
190 ,191 ,193 ,537,631 ,642 ,10
1.1204 ,-0.000029,20141008,0 ,1.12029575,0.000145,56
7.20425,0.000141 , ,0 ,7.2034485 , ,140
1.26237,0 , ,1 , , ,068
Run Code Online (Sandbox Code Playgroud)
我正在用 awk 开发一个 bash 脚本,但我想知道我是否可以在 R 中做到这一点。目前,我最大的挑战是到达中间表。从中间到决赛桌,我想到将 R 与 tidyr 包一起使用,特别是函数“separate”。如果有人可以提出更好的逻辑,我将不胜感激!
我正在编写一个使用QuickFIX/J作为FIX框架的应用程序.我的对手向我ExecutionReport发送了FIX版本4.4 的消息但是只有一些字段(Parties组件)是版本5.0
现在我试图实现我可以阅读这个组件.
这个
@Override
public void onMessage(quickfix.fix44.ExecutionReport message, SessionID sessionID)
throws FieldNotFound, UnsupportedMessageType, IncorrectTagValue {
quickfix.fix50.component.Parties parties = new Parties();
message.get(parties);
// ...
}
Run Code Online (Sandbox Code Playgroud)
不起作用!消息来自版本4.4,这就是为什么message.get(...)只需要quickfix.fix44.component.Parties一个版本5.0而不是版本5.0
如果我试试这个
@Override
public void onMessage(quickfix.fix50.ExecutionReport message, SessionID sessionID)
throws FieldNotFound, UnsupportedMessageType, IncorrectTagValue {
// ...
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Exception in thread "pool-2-thread-1" java.lang.VerifyError: Bad type on operand stack
Exception Details:
Location:
quickfix/fix44/ExecutionReport.get(Lquickfix/field/SettlType;)Lquickfix/field/SettlType; @2: invokevirtual
Reason:
Type 'quickfix/field/SettlType' (current frame, stack[1]) is not assignable to 'quickfix/CharField'
Current Frame: …Run Code Online (Sandbox Code Playgroud) 我正在使用带有 python 的 quickfix。查看此处的文档页面告诉我们如何获取字段。假设 a message = fix.message(with quickfix as fix) 来自交易对手。我可以通过调用获得 35 (MsgType) 字段
message.getHeader().getField(fix.MsgType())
例如,它返回 35=X.
我的问题是:是否有任何方法可以返回X?或者我是否必须切片所有内容(例如35=X[3:],返回X)并因此知道所有字符串的长度?
QuickFIX 是否提供在单个步骤中获取传入 FIX 消息的所有现有字段的可能性?(我为 Python 使用 1.14.3 版。)
根据 QuickFIX 文档,可以通过某种方式获取字段值:
price = quickfix.Price()
field = message.getField(price)
field.getValue()
Run Code Online (Sandbox Code Playgroud)
各种消息类型包含不同的字段,因此对每个字段都这样做会很尴尬。此外,有时不知道消息中是否存在某些字段。如何在不知道消息包含哪些字段的情况下获取消息的所有字段?
我使用 QuickFix/n 启动器。我的经纪人拒绝了我的登录消息,理由是消息标题中的字段(标签)顺序错误。顺序应该是 49、56、34、52,而不是 34、49、52、56。
QuickFix/n 似乎在将消息发送到会话时自动按标签号对消息的三个区域(标题、正文、尾部)内的各个字段进行排序。
有没有办法改变发送给接受者的消息中字段的顺序?有没有办法防止排序行为?(向消息添加组或更改数据字典不起作用。)
或者,如果 QuickFix/n 无法做到这一点,是否有 FIX 引擎允许更改消息中字段的顺序?
我在正则表达式中找到了Parsing FIX协议的第二个答案?非常好,所以我试了一下.
这是我的代码.
new_order_finder1 = re.compile("(?:^|\x01)(11|15|55)=(.*?)\x01")
new_order_finder2 = re.compile("(?:^|\x01)(15|55)=(.*?)\x01")
new_order_finder3 = re.compile("(?:^|\x01)(11|15|35|38|54|55)=(.*?)\x01")
if __name__ == "__main__":
line = "20150702-05:36:08.687 : 8=FIX.4.2\x019=209\x0135=D\x0134=739\x0149=PINE\x0152=20150702-05:36:08.687\x0156=CSUS\x011=KI\x0111=N09080243\x0115=USD\x0121=2\x0122=5\x0138=2100\x0140=2\x0144=126\x0148=AAPL.O\x0154=1\x0155=AAPL.O\x0157=DMA\x0158=TEXT\x0160=20150702-05:36:08.687\x01115=Tester\x016061=9\x0110=087\x01"
fields = dict(re.findall(new_order_finder1, line))
print(fields)
fields2 = dict(re.findall(new_order_finder2, line))
print(fields2)
fields3 = dict(re.findall(new_order_finder3, line))
print(fields3)
Run Code Online (Sandbox Code Playgroud)
这是输出
{'11': 'N09080243', '55': 'AAPL.O'}
{'55': 'AAPL.O', '15': 'USD'}
{'35': 'D', '38': '2100', '11': 'N09080243', '54': '1'}
Run Code Online (Sandbox Code Playgroud)
看起来有些字段与正则表达式没有正确匹配.
这有什么问题?