新しい注文メッセージ (メッセージ タイプ「D」) を FIX サーバーに送信していますが、サーバー上の「事前検証」からキックバックされ、指定されたメッセージ本文の長さが実際のメッセージと一致しないという応答が返されます。
テキスト エディターでは、宣言された本文の長さがメッセージの長さと一致しているように見えます (bodylength タグの値とチェックサムの前の区切り文字の間で測定)。
以下は私が送信しているメッセージです (機密データは同じ数の「x」文字に置き換えられています):
8=FIX.4.4^9=183^35=D^34=2^49=xxxxxxxxxxx^52=20130927-19:57:35.771^56=xxx^1=xxxxxxxx^11=123^21=1^38=10^40=1^52=20130927-19:57:35.770^54=1^55=MSFT^59=1^60=20130927-19:57:35.771^100=xxxx^553=xxxxxxxxxx^10=234^
これは、すぐに返されるビジネス拒否メッセージ (タイプ「j」) です。
8=FIX.4.4^9=126^35=j^49=xxx^56=xxxxxxxxxxx^34=3^52=20130927-16:09:05.888^43=N^372=D^58=PreValidate Failed body lengh problem^380=4^379=2^45=0^10=007^
(タイプミスは私のものではなく、彼らのものです)
メッセージの作成に使用されるコードは次のとおりです。
message = fix.Message()
header = message.getHeader()
header.setField(fix.BeginString('FIX.4.4'))
header.setField(fix.SenderCompID('xxxxxxxxxxx'))
header.setField(fix.TargetCompID('xxx'))
header.setField(fix.MsgType('D'))
message.setField(fix.Account(DEMO_Account_Number))
message.setField(fix.HandlInst('1')) #only valid value is '1'
message.setField(fix.OrderQty(int(Test_Order_Qty)))
message.setField(fix.OrdType('1')) #1=Market, 2=Limit, 3=Stop,4=StopLimit, P=TrailingStop, T=TTO
message.setField(fix.SendingTime(1))
message.setField(fix.Side('1')) #1=Buy, 2=Sell, 5=Sell Short, and 6=Sell Short Exempt.
message.setField(fix.Symbol('MSFT'))
message.setField(fix.TimeInForce('1')) # 0 = Day , 1 = GTC.................
message.setField(fix.TransactTime(1))
message.setField(fix.ExDestination('xxxx'))
message.setField(fix.Username(UserName))
fix.Session_sendToTarget(message)
ここで何がうまくいかないのでしょうか?サーバーがそれをキックバックするのはなぜですか?
ありがとう。