2012-03-22 17 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 =イニシエータ、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

あなたが言及したすべての方法を実装しました。スチル、戻ってくるものは見えない。しかし、それは変です。私が送る 'TradeCaptureReport'メッセージはTCPによって承認されます(サーバによって正しく受信されます)。 – Jir

+0

@ Jir - つまり、相手側からあなたのメッセージのACKメッセージが送信されていますか?できる場合は、相手側で何が起きているか確認してください。あなたの終わりには、ACKか拒否のどちらかで何らかのメッセージが受信されるはずです。 – DumbCoder

+0

交換したメッセージ(FIXレベル)を追加して元の投稿を更新しました。あなたの質問に答えるために、いいえ、ACK /拒否はイニシエータによって受信されません。 – Jir

0

あなたのメッセージシーケンス番号が私たちの同期でない場合は、あなたが探している行為を送信したことはありません!ログオフする代わりに、ログオフする前にシーケンス番号を確認するために少なくともハートビートを待つ必要があります。

+0

私は35秒に時間を増やそうとしました(上記のコメントを参照)。ハートビートは正しく送受信されますが、TradeCaptureReportAckの兆候はありません。 – Jir

関連する問題