Отправка TradeCaptureReport в QuickFIX с использованием Python, но не может получить TradeCaptureReportAck
Я написал инициатор, используя Python API для QuickFIX 1.13.3.
Он просто отправляет сообщение типа TradeCaptureReport
(код: AE
) к акцептору. Я должен получить TradeCaptureReportAck
(действительно, я получаю его, если использую другой клиент), но ничего не возвращается.
Используя Wireshark, я мог видеть, что вход в систему и выход из нее выполнены правильно, а сердцебиение также сохраняется должным образом.
Application
Я написал это определяется следующим образом:
import sys
import time
import thread
import quickfix as fix
import quickfix44 as fix44
from datetime import datetime
class Application (fix.Application):
orderID = 0
execID = 0
tradeID = 0
global settings
def onCreate (self, sessionID):
self.sessionID = sessionID
print ("Application created - session: " + sessionID.toString ())
def onLogon (self, sessionID):
print ("Logon")
def onLogout (self, sessionID):
print ("Logout")
def onMessage (self, message, sessionID):
print (message)
def toAdmin (self, message, sessionID):
msgType = fix.MsgType ()
message.getHeader ().getField (msgType)
if (msgType.getValue () == fix.MsgType_Logon):
message.setField (fix.Password (settings.get (self.sessionID).getString ("Password")))
message.setField (fix.ResetSeqNumFlag (True))
def fromAdmin (self, message, sessionID):
pass
def toApp (self, message, sessionID):
pass
def fromApp (self, message, sessionID):
pass
def genOrderID (self):
self.orderID += 1
return repr (self.orderID)
def genTradeReportID (self):
self.tradeID += 1
return repr (self.tradeID)
def genExecID (self):
self.execID += 1
return repr (self.execID)
def run (self):
time.sleep (5)
self.queryEnterOrder ()
time.sleep (5)
def queryEnterOrder (self):
print ("\nTradeCaptureReport (AE)\n")
trade = fix.Message ()
trade.getHeader ().setField (fix.BeginString (fix.BeginString_FIX44))
trade.getHeader ().setField (fix.MsgType (fix.MsgType_TradeCaptureReport))
trade.setField (fix.TradeReportTransType (fix.TradeReportTransType_NEW)) # 487
trade.setField (fix.TradeReportID (self.genTradeReportID ())) # 571
trade.setField (fix.TrdSubType (4)) # 829
trade.setField (fix.SecondaryTrdType (2)) # 855
trade.setField (fix.Symbol ("MYSYMBOL")) # 55
trade.setField (fix.LastQty (22)) # 32
trade.setField (fix.LastPx (21.12)) # 31
trade.setField (fix.TradeDate ((datetime.now ().strftime ("%Y%m%d")))) # 75
trade.setField (fix.TransactTime ((datetime.now ().strftime ("%Y%m%d-%H:%M:%S.%f"))[:-3])) # 60
trade.setField (fix.PreviouslyReported (False)) # 570
group = fix44.TradeCaptureReport ().NoSides ()
group.setField (fix.Side (fix.Side_SELL)) # 54
group.setField (fix.OrderID (self.genOrderID ())) # 37
group.setField (fix.NoPartyIDs (1)) # 453
group.setField (fix.PartyIDSource (fix.PartyIDSource_PROPRIETARY_CUSTOM_CODE)) # 447
group.setField (fix.PartyID ("CLEARING")) # 448
group.setField (fix.PartyRole (fix.PartyRole_CLEARING_ACCOUNT)) # 452
trade.addGroup (group)
group.setField (fix.Side (fix.Side_BUY)) # 54
group.setField (fix.OrderID (self.genOrderID ())) # 37
group.setField (fix.NoPartyIDs (1)) # 453
group.setField (fix.PartyIDSource (fix.PartyIDSource_PROPRIETARY_CUSTOM_CODE)) # 447
group.setField (fix.PartyID ("CLEARING")) # 448
group.setField (fix.PartyRole (fix.PartyRole_CLEARING_ACCOUNT)) # 452
trade.addGroup (group)
fix.Session.sendToTarget (trade, self.sessionID)
Который запускается благодаря следующему фрагменту:
file = sys.argv[1]
settings = fix.SessionSettings (file)
application = Application ()
storeFactory = fix.FileStoreFactory (settings)
initiator = fix.SocketInitiator (application, storeFactory, settings)
initiator.start ()
application.run ()
initiator.stop ()
Обновить
Обмен сообщениями происходит следующим образом (I = инициатор, A = акцептор):
1. I ---------- LOGON -----------> A
2. I <--------- LOGON ------------ A
3. I ---- TradeCaptureReport ----> A
4. I ---------- LOGOFF ----------> A
5. I <--------- LOGOFF ----------- A
Как вы можете заметить, между 3. и 4. отсутствует сообщение типа TradeCaptureReportAck.
Любая подсказка приветствуется!
2 ответа
Если ваш порядковый номер сообщения не соответствует нашей синхронизации, он никогда не отправлял иск, который вы ищете! Вместо выхода из системы вы должны, по крайней мере, подождать сердцебиение, чтобы проверить порядковый номер, прежде чем выйти из системы.
Попробуйте реализовать свой метод fromAdmin и fromApp, здесь вы должны увидеть свои возвращаемые сообщения FIX. Проверьте, достигает ли ваш TradeCaptureReportAck здесь, и подтвердите, что они выполняют те же вызовы, что и вход в систему, выход из системы и сердцебиение. И реализуйте свой метод onMessage, или проверьте, получаете ли вы какое-либо сообщение FIX здесь. Это должно быть ваше место, где вы должны увидеть ответное сообщение ACK.