使用Python在QuickFIX中发送TradeCaptureReport,但无法接收任何TradeCaptureReportA

2024-10-01 09:41:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我用pythonapi为quickfix1.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)

这得益于以下代码片段:

^{pr2}$

更新

消息交换如下(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类型的消息。在

任何暗示都是最受欢迎的!在


Tags: importselfmessagedatetimeapplicationdefgroupfix
2条回答

尝试实现fromAdmin和fromApp方法,您应该会在这里看到返回修复消息。检查您的TradeCaptureReportAck是否到达此处,并确认它们遵循与登录、注销和心跳相同的调用。并实现onMessage方法,或检查是否在此处收到任何修复消息。这应该是您应该看到ACK返回消息的地方。在

如果你的消息序列号不是我们的同步,那么他们永远不会发送你正在寻找的行为!在注销之前,您应该至少等待心跳来检查序列号,而不是注销。在

相关问题 更多 >