我正在开发使用 FIX 协议和 quickfixj 框架连接到金融市场的解决方案。具体来说,我正在实现一个发起者,我需要连接到接受者,指定用户名和密码。关于如何将 Logon 消息中的这些字段传递给服务器,quickfixj 文档在这方面不是很清楚。
经过我发现它是放在函数toAdmin中的,我在这个函数中放入了以下代码:
@Override
public void toAdmin(Message message, SessionID sessionId) {
Session.lookupSession(sessionId).setTargetDefaultApplicationVersionID(new ApplVerID("9"));
final Message.Header header = message.getHeader();
try {
if ( header.getField(new BooleanField(MsgType.FIELD)).equals(MsgType.LOGON) ) {
message.setField(new StringField(Username.FIELD, "user"));
message.setField( new StringField(Password.FIELD, "pass"));
System.out.println(">>> " + message.toRawString());
}
} catch (FieldNotFound e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
但是我仍然无法执行登录过程,并且在尝试登录时它会向我显示下一个日志。
<20190313-14:44:33, FIXT.1.1:aaa->bbb, outgoing> (8=FIXT.1.1 9=74 35=A 34=1 49=aaa 52=20190313-14:44:33.431 56=bbb 98=0 108=30 1137=9 10=131 )
<20190313-14:44:33, FIXT.1.1:aaa->bbb, event> (Initiated logon request)
<20190313-14:44:33, …
Run Code Online (Sandbox Code Playgroud) 当我尝试使用配置文件的URL调用SessionSettings的构造函数时,它只加载文件中存在的最后一个会话.
我试过打印我的代码从配置文件中读取的内容,但我得到了这个:
[DEFAULT]
StartTime=00:00:00
EndTime=23:59:59
ReconnectInterval=5
TargetCompID=Server
SenderCompID=Client
DataDictionary=C:\config\FIX42.xml
HeartBtInt=30
FileStorePath=C:\logsBadisInitiatorStore
UseDataDictionary=Y
FileLogPath=C:\logsBadisInitiator
[SESSION]
StartTime=00:00:00
ConnectionType=acceptor
EndTime=23:59:59
BeginString=FIX.4.2
SocketAcceptPort=9878
TargetCompID=server1
SessionName=badisAcc289
SenderCompID=client1
SocketAcceptAddress=localhost
UseDataDictionary=N
Run Code Online (Sandbox Code Playgroud)
但我的配置文件包含更多:
[default]
FileStorePath=data
SenderCompID=Client
TargetCompID=Server
FileLogPath=C:\logsBadisInitiator
StartTime=00:00:00
EndTime=23:59:59
HeartBtInt=30
ReconnectInterval=5
UseDataDictionary=Y
DataDictionary=C:\config\FIX42.xml
FileStorePath=C:\logsBadisInitiatorStore
[session]
SessionName=badisAcc2
BeginString=FIX.4.2
SenderCompID=client1
TargetCompID=server1
ConnectionType=acceptor
SocketAcceptPort=9878
SocketAcceptAddress=localhost
StartTime=00:00:00
EndTime=23:59:59
UseDataDictionary=N
[session]
SessionName=test211
BeginString=FIX.4.2
SenderCompID=client1
TargetCompID=server1
ConnectionType=initiator
SocketConnectPort=9878
SocketConnectHost=localhost
StartTime=00:00:00
EndTime=23:59:59
UseDataDictionary=N
[session]
SessionName=badisAcc3
BeginString=FIX.4.2
SenderCompID=client1
TargetCompID=server1
ConnectionType=acceptor
SocketAcceptPort=9878
SocketAcceptAddress=localhost
StartTime=00:00:00
EndTime=23:59:59
UseDataDictionary=N
[session]
SessionName=badisAcc4
BeginString=FIX.4.2
SenderCompID=client1
TargetCompID=server1
ConnectionType=acceptor
SocketAcceptPort=9878
SocketAcceptAddress=localhost
StartTime=00:00:00
EndTime=23:59:59 …
Run Code Online (Sandbox Code Playgroud) 我正在创建一个使用 FIX.5.0SP2 的发起者和接受者。"58":"Incorrect BeginString"
我在登录时、接受方(以及发起方的 fromAdmin)上收到错误。我相信我的配置是正确的:
发起人:
# 会话的默认设置 [默认] 连接类型=发起者 重新连接间隔=60 使用本地时间=Y 持久消息=Y 文件存储路径=./data 文件日志路径=./log HttpAcceptPort=9016 发件人CompID=X 开始字符串=FIXT.1.1 TransportDataDictionary=./support/FIXT11.xml [会议] 目标化合物 ID=Y 开始时间=00:00:00 结束时间=23:59:59 HeartBtInt=30 套接字连接端口=8599 SocketConnectHost=本地主机 DefaultApplVerID=FIX.5.0SP2 AppDataDictionary=./support/FIX50SP2.xml
受体:
# 会话的默认设置 [默认] 连接类型=接受者 重新连接间隔=60 使用本地时间=Y 持久消息=Y PostgreSQLStoreDatabase=quickfix PostgreSQLStoreUser=xx PostgreSQLStoreHost=本地主机 PostgreSQLStorePort=5432 PostgreSQLStoreUseConnectionPool=Y PostgreSQLLogDatabase=quickfix PostgreSQLLogUser=电子 PostgreSQLLogHost=本地主机 PostgreSQLLogPort=5432 PostgreSQLLogUseConnectionPool=Y 文件存储路径=./data 文件日志路径=./log HttpAcceptPort=9212 发件人CompID=Y 开始字符串=FIXT.1.1 TransportDataDictionary=./support/FIXT11.xml [会议] 目标化合物 ID=X 开始时间=00:00:00 结束时间=23:59:59 HeartBtInt=30 套接字接受端口=8599 DefaultApplVerID=FIX.5.0SP2 AppDataDictionary=./support/FIX50SP2.xml
我尝试了各种排列,但似乎都不起作用。
BeginString逻辑是否有错误?
谢谢,
马特
编辑:添加日志:
接受器事件日志:http://gist.github.com/mateodelnorte/167a83990801d7bb506e 接受者消息日志:http://gist.github.com/mateodelnorte/6d1f400a4e61875afee9 发起者事件日志:http://gist.github.com/mateodelnorte/a376c6cc0eb0f71bd222 发起者消息日志:http://gist.github.com/mateodelnorte/5c1b0c4ca2dda3e93b29
我收到 35=D (NewOrderSingle) 请求的拒绝响应。想知道可能是什么问题。我正在关注这个文件
FIX.4.4:Paragxxxx_FIX->CfhDemoPrices:Trade------client toApp-----------8=FIX.4.4 9=163 35=D 34=2 49=Paragxxxx_FIX 52=20200227-04:30:02.863 56=CfhDemoPrices 11=FGQ_MLM_01_20200225-08:48:28 21=1 38=10000 40=1 54=1 55=EURUSD 60=20200227-04:30:02.861 10=182
FIX.4.4:Paragxxxx_FIX->CfhDemoPrices:Trade------client else fromAdmin--------8=FIX.4.4 9=136 35=3 34=2 49=CfhDemoPrices 52=20200227-04:30:05.925 56=Paragxxxxx_FIX 45=2 58=Tag specified out of required order 371=50 372=D 373=14 10=042
Run Code Online (Sandbox Code Playgroud)
添加 SenderSubid ( 50 ) 后,下面是请求和响应
8=FIX.4.4 9=183 35=D 34=2 49=Paragxxxxxx_FIX 50=L6UtbRZvhwEFuZft 52=20200301-23:20:52.088 56=CfhDemoPrices 11=FGQ_MLM_01_20200225-08:48:28 21=1 38=10000 40=1 54=1 55=EURUSD 60=20200301-23:20:52.087 10=056
8=FIX.4.49=136 35=3 34=2 49=CfhDemoPrices 52=20200301-23:20:52.172 56=Paragxxxxxx_FIX 45=2 58=Tag specified out of required order 371=50 372=D 373=14 10=031
Run Code Online (Sandbox Code Playgroud) 当请求 ICE TradeCaptureReport 消息时,FIX 消息被“截断”。这导致我们没有使用消息的“重复组”(如派对、腿详细信息)。
我们还没有使用任何数据字典。解决此问题的任何解决方案。