当检索QuoteReqID作为字符串时,以下代码片段(在来自quickfix.Application的类中)coredumps / SIGSEGV。我一直在处理QuoteReqID的大小,并注意到对值小于16个字符的字符串字段进行了很好的处理,但是对值大于该限制的字符串字段进行了处理,这最终导致了SIGSEGV或UnicodeEncodeError。看来这是Quickfix使用的SWIG层的问题,尤其是python3。我只是想看看我做错了什么,还是已经有解决方法了。
line.numbers <- rep(1:13,table2.10[,"freq"])
q.b <- rep(NA,B)
table2.10b <- table2.10
for (b in 1:B){
line.numbers.b <- sample(line.numbers,size=217,replace=TRUE)
table2.10b[,"freq"] <- table(factor(line.numbers.b,levels=1:13))
m.b <- optim(m$par,loglik,hessian=T,control=list(fnscale=-1),
d=table2.10b)
q.b[b] <- qgamma(0.95,m.b$par[1],m.b$par[2])
}
q.npb <- q.b
quantile(q.b,c(0.025,0.975))
我似乎无法复制coredump与UnicodeEncodeError所需的条件。确实发生UnicodeEncodeError时,这就是FIX日志中的样子:
import quickfix as fix
...
def fromApp(self, message, session_id):
msg_type = fix.MsgType()
message.getHeader().getField(msg_type)
if msg_type.getString() is fix.MsgType_QuoteRequest:
quote_req_id_field = message.getField(fix.QuoteReqID())
quote_req_id = quote_req_id_field.getString()
print(quote_req_id)
在第二个示例中,它不是'otereqs1'之前的空格,而是白色透明垂直unicode块字符,我认为是U + 25AF。
答案 0 :(得分:0)
我访问字段的方式不正确。这是正确的方法:
def fromApp(self, message, session_id):
msg_type = fix.MsgType()
message.getHeader().getField(msg_type)
if msg_type.getString() is fix.MsgType_QuoteRequest:
quote_req_id = fix.QuoteReqID()
message.getField(quote_req_id)
print(quote_req_id.getValue())