2

QuickFIX 1.13.3 の Python API を使用してイニシエーターを作成しました。

TradeCaptureReportタイプ(code: )のメッセージを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 タイプのメッセージがありません。

どんなヒントでも大歓迎です!

4

2 に答える 2

0

fromAdmin および fromApp メソッドを実装してみてください。ここに FIX メッセージが返されるはずです。TradeCaptureReportAck がここに到達するかどうかを確認し、ログオン、ログアウト、およびハートビートと同じ呼び出しに従うことを確認します。onMessage メソッドを実装するか、ここで FIX メッセージを受信するかどうかを確認します。これは、ACK 返信メッセージが表示される場所です。

于 2012-03-23T08:38:53.637 に答える
0

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

于 2012-03-31T15:50:38.183 に答える