2012-03-22 2 views
1

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 유형의 메시지가 누락되었습니다.

모든 힌트를 환영합니다!

+0

왜 메시지를 보내고 ACK를 기다리지 않고 로그 오프합니까? ACK를받지 못하는 이유는 무엇입니까? – DumbCoder

+0

저는 5 초가 ACK를 받기에 충분하다고 생각합니다. 로그온 및 로그 오프 절차에 대한 ACK가 거의 즉시 올바르게 수신되었다고 생각합니다. 그러나, 나는 35 초로 시간을 늘 렸고, 나는 또한 하트 비트를 보내고받는 것을 관리한다. 아직 TradeCaptureReportAck이 돌아 오지 않습니다. – Jir

답변

0

fromAdmin 및 fromApp 메소드를 구현하면 반환 FIX 메시지가 여기에 표시됩니다. TradeCaptureReportAck가 여기에 도달했는지 확인하고 로그온, 로그 아웃 및 하트 비트와 동일한 호출을 따르는 지 확인하십시오. onMessage 메소드를 구현하거나 여기에 FIX 메시지가 있는지 확인하십시오. 이것은 사용자가 ACK 리턴 메시지를보아야하는 곳이어야합니다.

+0

내가 언급 한 모든 방법을 구현했습니다. Stil, 나는 돌아 오는 것을 볼 수 없다. 그래도 이상 하네. 내가 보낸 'TradeCaptureReport' 메시지는 TCP에 의해 확인되어 서버에서 올바르게 수신됩니다. – Jir

+0

@ Jir - 즉, 상대방이 메시지에 대해 ACK 메시지를 보내는 중입니다. 할 수 있으면 다른 쪽에서 무슨 일이 일어나고 있는지 확인하십시오. 메시지 끝에 ACK 또는 거부 중 하나가 수신되어야합니다. – DumbCoder

+0

교환 된 메시지 (FIX 레벨)를 추가하여 원래 게시물을 업데이트했습니다. 귀하의 질문에 대답하기 위해, 아니, ACK/거부가 개시 자에 의해 수신되지 않습니다. – Jir

0

당신의 메시지 시퀀스 번호가 우리의 동기가 아니면, 당신이 찾고있는 행동을 보내지 않았습니다! 로그 오프하는 대신, 적어도 로그 오프하기 전에 하트 비트를 기다려 시퀀스 번호를 확인해야합니다.

+0

시간을 35 초로 늘리려고했습니다 (위의 주석 참조). 하트 비트가 제대로 보내고 받았지만 TradeCaptureReportAck의 흔적은 없습니다. – Jir