Отправка 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.

Другие вопросы по тегам