Отправка TradeCaptureReport в QuickFIX с использованием Python, но не может получить TradeCaptureReportAck - PullRequest
2 голосов
/ 22 марта 2012

Я написал инициатор, используя 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 ]

0 голосов
/ 31 марта 2012

Если ваш порядковый номер сообщения не соответствует нашей синхронизации, то они никогда не отправляли иск, который вы ищете! Вместо выхода из системы вы должны, по крайней мере, подождать сердцебиение, чтобы проверить порядковый номер, прежде чем выйти из системы.

0 голосов
/ 23 марта 2012

Попробуйте реализовать метод fromAdmin и fromApp, здесь вы должны увидеть свои возвращаемые сообщения FIX. Проверьте, достигает ли ваш TradeCaptureReportAck здесь, и подтвердите, что они выполняют те же вызовы, что и вход в систему, выход из системы и сердцебиение. И реализуйте свой метод onMessage, или проверьте, если вы получаете какое-либо сообщение FIX здесь. Это должно быть ваше место, где вы должны увидеть ответное сообщение ACK.

...