QuickFIX 1.13.3 용 Python API를 사용하여 개시 프로그램을 작성했습니다.Python을 사용하여 QuickFIX에서 TradeCaptureReport를 보내지 만 TradeCaptureReportAck를 수신 할 수 없음
단순히 TradeCaptureReport
(코드 : AE
) 유형의 메시지를 수락 자에게 보냅니다. TradeCaptureReportAck
을 받아야합니다 (실제로 다른 클라이언트를 사용하는 경우받습니다).하지만 아무 것도 돌아 오지 않습니다.
Wireshark를 사용하면 로그온 및 로그 아웃이 올바르게 수행되고 하트 비트가 올바르게 유지되는 것을 확인할 수 있습니다.
다음과 같이 내가 정의 쓴 Application
:
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()
업데이트
메시지 goeas의 교환 등 : 다음 코드 덕분에 실행
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)
다음 (I = Initiator, A = 수락 자) :
1. I ---------- LOGON -----------> A
2. I <--------- LOGON ------------ A
3. I ---- TradeCaptureReport ----> A
4. I ---------- LOGOFF ----------> A
5. I <--------- LOGOFF ----------- A
3과 4 사이의 값을 찾을 수 있으므로 TradeCaptureReportAck 유형의 메시지가 누락되었습니다.
모든 힌트를 환영합니다!
왜 메시지를 보내고 ACK를 기다리지 않고 로그 오프합니까? ACK를받지 못하는 이유는 무엇입니까? – DumbCoder
저는 5 초가 ACK를 받기에 충분하다고 생각합니다. 로그온 및 로그 오프 절차에 대한 ACK가 거의 즉시 올바르게 수신되었다고 생각합니다. 그러나, 나는 35 초로 시간을 늘 렸고, 나는 또한 하트 비트를 보내고받는 것을 관리한다. 아직 TradeCaptureReportAck이 돌아 오지 않습니다. – Jir