我是QuickFIX的新手,我有一些关于QuickFix的基本问题:
1)考虑到一次,接受者和发起者之间只有一个修复会话.我不太了解ThreadedSocketInitiator和ThreadedSocketAcceptor类的目的.
或者这些类是否存在以促进多个会话,其中多个"发起者"可以与不同的接受者交谈,反之亦然?
2)QuickFIX是否具有某种消息持久性,例如,如果消息在传输过程中丢失会发生什么?引擎是否负责重新发送消息?
我正在使用QuickFIX和C#来创建一个FIX接受器(服务器).我希望客户端(FIX启动器)使用用户名和密码登录.但是,我不确定如何在QuickFIX中做到这一点.
通过调试QuickFIX源代码,我发现了以下事件序列:
Session::verify以验证登录.Session::verify 将执行各种检查,如comp ID和序列号,并在某些时候确定收到的登录是有效的.Session::verify然后将调用Application::fromAdmin回调,我认为这是自定义登录等内容的地方.如何在接受器中自定义FIX登录过程?修改QuickFIX代码是我唯一的选择吗?
我是比较新的使用python和quickfix,我想交易时间的消息是在UTC格式,这样的办理时间貌似YYYYMMDD-HH:MM:SS.mmm 所以基本上我想要的标签60的样子2012-02-13-08:15:35.435,例如
我做了以下代码
newSingle.getHeader().setField(fix.Transacttime(time.gmtime()))
Run Code Online (Sandbox Code Playgroud)
但是我遇到了与C / C ++原型不匹配的错误
newSingle.getHeader().setField(fix.TransactTime(time.gmtime()))
File "/usr/lib/python2.6/dist-packages/quickfix.py", line 41959, in __init__
quickfix.UtcTimeStampField.__init__(self, 60, data)
File "/usr/lib/python2.6/dist-packages/quickfix.py", line 764, in __init__
this = _quickfix.new_UtcTimeStampField(*args)
NotImplementedError: Wrong number of arguments for overloaded function 'new_UtcTimeStampField'.
Possible C/C++ prototypes are:
FIX::UtcTimeStampField(int,UtcTimeStamp const &,bool)
FIX::UtcTimeStampField(int,UtcTimeStamp const &)
FIX::UtcTimeStampField(int,bool)
FIX::UtcTimeStampField(int)
Run Code Online (Sandbox Code Playgroud)
关于如何获得所需结果的任何帮助。谢谢!
我从FIX服务器收到以下"W"消息:
8=FIX.4.2|9=141|35=W|34=98|49=CX|52=20150401-09:12:30.247|56=CACIB_MD2|55=608230|262=48|9883=IDB|268=2|269=0|58=No Bid Available|269=1|58=No Offer Available|10=249
Run Code Online (Sandbox Code Playgroud)
标签58两次
我的QuickFix应用程序自动将拒绝消息发送到服务器:
8=FIX.4.2|9=104|35=3|34=91|49=CACIB_MD2|52=20150401-09:12:29.661|56=CX|45=90|58=Tag appears more than once|371=58|372=W|10=008
Run Code Online (Sandbox Code Playgroud)
从互联网阅读中我了解到字典存在问题.
我的QuickFix配置文件中没有任何字典配置.我不确定默认字典所在的位置,但我发现(FIX42.xml)定义了标记58是"W"消息的组的一部分:
<message name='MarketDataSnapshotFullRefresh' msgcat='app' msgtype='W'>
<field name='MDReqID' required='N' />
<field name='Symbol' required='Y' />
<field name='SymbolSfx' required='N' />
<field name='SecurityID' required='N' />
<field name='IDSource' required='N' />
<field name='SecurityType' required='N' />
<field name='MaturityMonthYear' required='N' />
<field name='MaturityDay' required='N' />
<field name='PutOrCall' required='N' />
<field name='StrikePrice' required='N' />
<field name='OptAttribute' required='N' />
<field name='ContractMultiplier' required='N' />
<field name='CouponRate' required='N' />
<field name='SecurityExchange' required='N' />
<field name='Issuer' required='N' />
<field …Run Code Online (Sandbox Code Playgroud) 我一直在使用QuickFIX开发客户端API,我计划使用SSL和基于证书的身份验证.我通过以下方式为接受者和发起者生成自签名证书:
1)生成并导出服务器/接受者证书:
keytool -genkeypair -keyalg RSA -keysize 2048 -alias server -keystore server.jks
keytool -export -alias server -file server.cer -keystore server.jks
Run Code Online (Sandbox Code Playgroud)
2)生成并导出客户端/启动器证书:
keytool -genkeypair -keyalg RSA -keysize 2048 -alias client -keystore client.jks
keytool -export -alias client -file client.cer -keystore client.jks
Run Code Online (Sandbox Code Playgroud)
3)将服务器/接受者证书导入客户端密钥库:
keytool -import -v -trustcacerts -alias server -file server.cer -keystore client.jks
Run Code Online (Sandbox Code Playgroud)
4)将客户端/启动器证书导入服务器/接受者密钥库:
keytool -import -v -trustcacerts -alias client -file client.cer -keystore server.jks
Run Code Online (Sandbox Code Playgroud)
接受器配置:
SocketUseSSL=Y
SocketKeyStore=server.jks
SocketKeyStorePassword=password
Run Code Online (Sandbox Code Playgroud)
启动器配置:
SocketUseSSL=Y
SocketKeyStore=client.jks
SocketKeyStorePassword=password
Run Code Online (Sandbox Code Playgroud)
一切似乎都运行良好,数据正在加密.但是,如果我删除了启动器的client.jks密钥库文件,我将得到一个QuickFIX日志条目,说"找不到client.jks:keystore,使用空密钥库".奇怪的是,发起者仍然能够连接并建立有效的FIX会话.因为没有提供有效的证书,我希望立即删除连接.我错过了什么吗?
我正在尝试理解QuickFIX配置文件中的StartTime和EndTime设置.我正在使用QuickFIX .Net来实现买方FIX客户端,设置为发起方.
默认情况下,StartTime和EndTime都设置为00:00:00
因此,每次我的程序运行时(它调用initiator.start()),它都会自动向服务器发送登录消息.没问题.
然后我玩StartTime和EndTime设置.在QuickFIX文档中没有太多关于它的细节.我想当我运行程序时,应用程序将在StartTime发送Logon消息,而Endtime的Logout不是吗?
所以我将StartTime和EndTime设置为10:00和11:00
我在09:50启动了程序,该程序刚刚创建了会话并且没有发送登录消息.合理.然后在10点,什么也没发生......
下一次试验我在10:50启动了程序,该程序创建了会话并照常登录.比在11点,再也没有发生过.我想它会自动退出......
所以我的问题是StartTime和EndTime应该如何影响我的程序?
Quickfix/n 1.4 中提取此处定义的消息类型的最有效方法是什么:http : //www.fixprotocol.org/FIXimate3.0/en/FIX.5.0SP2/messages_sorted_by_type.html
我目前使用var msgType = Message.GetMsgType(message.ToString());结果为“A”的登录消息。有没有更好的办法?我尝试确定其中的消息类型ToAdmin(...)以捕获传出的登录请求消息,以便我可以添加用户名和密码。
我很想通过 MessageCracker 来做到这一点,但到目前为止,我还没有找到一种方法来实现捕获所有剩余消息类型,以防我没有实现所有 OnMessage 重载。(请参阅相关问题:Quickfix,是否有“全能”方法 OnMessage 来处理未由重载方法处理的传入消息?)。
谢谢
我有从服务提供商那里得到的样本响应。他们定义了已经定义的标签(我已经从FIXimate检查过)。
8=FIXT.1.19=108135=IB49=NSECM56=MTBM34=1924=1115=21828=61826=Nifty CPSE1815=2294.51816=2310.151817=2286.551818=2276.751819=2294.21820=1967852601488651821=262231822=257851823=0.771824=2799.551825=2139.51827=-1826=Nifty GrowSect 151815=7037.751816=7070.351817=7023.651818=6990.61819=7042.91820=7768216282514231821=782041822=750561823=0.751824=7354.551825=5942.151827= 1826=Nifty50 Value 201815=5444.71816=5465.61817=5417.41818=5413.61819=5425.91820=1.90667550936387E+151821=1348851822=1341791823=0.231824=5563.81825=4171.651827=-1826=Nifty Mid Liq 151815=4133.551816=4206.551817=4133.551818=4107.21819=4205.41820=1573956262705091821=428041822=442911823=2.391824=4677.051825=3770.551827=-1826=Nifty Pvt Bank1815=15385.21816=15415.51817=15339.751818=15248.81819=15377.71820=9015155094048031821=589741822=592681823=0.851824=16152.151825=13298.31827=+1826=NIFTY MIDCAP 1001815=19184.851816=19326.31817=19184.851818=19046.551819=19314.251820=7127426889917151821=1858871822=1884631823=1.411824=21840.851825=17700.91827=-10=174
问题是我无法阅读重复组。我创建一个自定义组
noIndexRecords = int(message.getField(1828))
if noIndexRecords > 0:
group = fix.Group(1828, 1826, )
message.getGroup(num=1, group=group)
Run Code Online (Sandbox Code Playgroud)
但这向我显示了一个FieldNotFound错误。我对规格文件进行了如下更改FIX50SP2.xml:
新增栏位:
<field number='1815' name="OpenIndex" type="PRICE"/>
<field number='1816' name="HighIndex" type="PRICE"/>
<field number='1817' name="LowIndex" type="PRICE"/>
<field number='1818' name="CloseIndex" type="PRICE"/>
<field number='1819' name="IndexValue" type="PRICE"/>
<field number='1820' name="MarketCapitalization" type="DOUBLE"/>
<field number='1821' name="NoOfDownMoves" type="INT"/>
<field number='1822' name="NoOfUpMoves" type="INT"/>
<field number='1823' name="PercentageChange" type="DECIMAL"/>
<field number='1824' name="YearlyHigh" type="PRICE"/> …Run Code Online (Sandbox Code Playgroud)