Example #1
0
    def cancel(self, message, sessionID):
        symbol = fix.Symbol()
        side = fix.Side()
        orderQty = fix.OrderQty()
        clOrdID = fix.ClOrdID()
        org = fix.OrigClOrdID()
        message.getField(symbol)
        message.getField(side)
        message.getField(orderQty)
        message.getField(clOrdID)
        message.getField(org)
        log.info("cancel:\nsymbol:{},side:{},orderQty:{},clOrdID:{},org:{} -----"\
            .format(symbol, side, orderQty, clOrdID, org))

        cancel = fix44.OrderCancelReject()
        cancel.setField(clOrdID)
        cancel.setField(fix.OrderID(self.genOrderID()))
        cancel.setField(fix.OrdStatus(fix.OrdStatus_NEW))
        cancel.setField(fix.OrigClOrdID(org.getValue()))
        cancel.setField(fix.Text('order completed'))
        cancel.setField(fix.TransactTime())
        cancel.setField(fix.CxlRejReason(fix.CxlRejReason_BROKER))
        cancel.setField(
            fix.CxlRejResponseTo(fix.CxlRejResponseTo_ORDER_CANCEL_REQUEST))

        fix.Session.sendToTarget(cancel, sessionID)
Example #2
0
    def queryNewOrderSingle42(self):
        ordType = fix.OrdType()

        message = fix.Message()
        message.setField(self.queryClOrdID())
        message.setField(fix.HandlInst('1'))
        message.setField(self.querySymbol())
        message.setField(self.querySide())
        message.setField(fix.TransactTime())
        ordType = self.queryOrdType()
        message.setField(ordType)
        message.setField(self.queryOrderQty())
        message.setField(self.queryTimeInForce())

        if abc.getValue() == fix.OrdType_LIMIT or abc.getValue(
        ) == fix.OrdType_STOP_LIMIT:
            message.setField(self.queryPrice())

        if abc.getValue() == fix.OrdType_STOP or abc.getValue(
        ) == fix.OrdType_STOP_LIMIT:
            message.setField(self.queryStopPx())

        header = message.getHeader()
        self.queryHeader(header)

        newOrderSingle = fix42.NewOrderSingle(message)

        return newOrderSingle
Example #3
0
    def newOrderSingle(self):
        try:
            LOG_EVENT("New Order Single")

            orderMsg = fix.Message()

            orderMsg.getHeader().setField(self.sessionID.getBeginString())
            orderMsg.getHeader().setField(
                fix.MsgType(fix.MsgType_NewOrderSingle))
            orderMsg.getHeader().setField(self.sessionID.getSenderCompID())
            orderMsg.getHeader().setField(self.sessionID.getTargetCompID())
            orderMsg.getHeader().setField(fix.MsgSeqNum(self.genOrderID()))
            sendingTime = fix.SendingTime()
            sendingTime.setString(
                datetime.utcnow().strftime("%Y%m%d-%H:%M:%S.%f"))
            orderMsg.getHeader().setField(sendingTime)

            orderMsg.setField(fix.Account("17018382"))
            orderMsg.setField(fix.ClOrdID(self.genExecID()))
            orderMsg.setField(fix.OrderQty(100))
            orderMsg.setField(fix.OrdType(fix.TriggerOrderType_LIMIT))
            orderMsg.setField(fix.Price(1.216))
            orderMsg.setField(fix.Symbol("X.US.OREURUSD"))
            orderMsg.setField(fix.Side(fix.Side_BUY))
            tranactionTime = fix.TransactTime()
            tranactionTime.setString(
                datetime.utcnow().strftime("%Y%m%d-%H:%M:%S.%f"))
            orderMsg.setField(tranactionTime)
            orderMsg.setField(fix.OpenClose(fix.OpenClose_OPEN))

            LOG_PACKET(orderMsg.toString())

            fix.Session.sendToTarget(orderMsg, self.sessionID)
        except Exception as e:
            print(e)
Example #4
0
 def __init__(self, symbol, maturity, qty):
     super(FutureOrder, self).__init__()
     self.CFICode = fix.CFICode('FXXXXS')
     self.Symbol = fix.Symbol(symbol)
     self.Maturity = fix.MaturityMonthYear(maturity)
     self.Quantity = fix.OrderQty(qty)
     self.TransactionTime = fix.TransactTime()
Example #5
0
    def cancel_order(self, execution_report):
        message = quickfix44.OrderCancelRequest()

        orig_cl_ord_id = quickfix.OrigClOrdID()
        order_id = quickfix.OrderID()
        symbol_field = quickfix.Symbol()

        security_exchange_field = quickfix.SecurityExchange()
        execution_report.getField(symbol_field)
        execution_report.getField(security_exchange_field)

        execution_report.getField(order_id)

        orig_cl_ord_id.setValue(order_id.getValue())

        message.setField(symbol_field)
        message.setField(security_exchange_field)

        message.setField(orig_cl_ord_id)
        message.setField(quickfix.ClOrdID(self.genExecID()))
        side = quickfix.Side()
        execution_report.getField(side)
        message.setField(side)

        trstime = quickfix.TransactTime()
        trstime.setString(
            datetime.utcnow().strftime("%Y%m%d-%H:%M:%S.%f")[:-3])
        message.setField(trstime)

        quickfix.Session.sendToTarget(message, self.sessionID)
    def makeOrder(self, snapshot):
        self.logger.info("FIXSIM-CLIENT Snapshot received %s", str(snapshot))
        quote = snapshot.getRandomQuote()

        self.logger.info("FIXSIM-CLIENT make order for quote %s", str(quote))
        order = self.fixVersion.NewOrderSingle()
        order.setField(
            quickfix.HandlInst(
                quickfix.
                HandlInst_AUTOMATED_EXECUTION_ORDER_PUBLIC_BROKER_INTERVENTION_OK
            ))
        order.setField(
            quickfix.SecurityType(
                quickfix.SecurityType_FOREIGN_EXCHANGE_CONTRACT))

        order.setField(quickfix.OrdType(quickfix.OrdType_PREVIOUSLY_QUOTED))
        order.setField(quickfix.ClOrdID(self.idGen.orderID()))
        order.setField(quickfix.QuoteID(quote.id))

        order.setField(quickfix.SecurityDesc("SPOT"))
        order.setField(quickfix.Symbol(snapshot.symbol))
        order.setField(quickfix.Currency(quote.currency))
        order.setField(quickfix.Side(quote.side))

        order.setField(quickfix.OrderQty(quote.size))
        order.setField(quickfix.FutSettDate("SP"))
        order.setField(quickfix.Price(quote.price))
        order.setField(quickfix.TransactTime())
        order.setField(
            quickfix.TimeInForce(quickfix.TimeInForce_IMMEDIATE_OR_CANCEL))
        self.sendToTarget(order, self.orderSession)
Example #7
0
    def put_new_order(self, instrument, side, price, size):
        """Request sample new order single"""
        message = quickfix44.NewOrderSingle()
        header = message.getHeader()

        print("Executing : " + str(instrument) + ":" + str(side) + ":" +
              str(price) + ":" + str(size))

        message.setField(quickfix.ClOrdID(self.genExecID()))
        message.setField(quickfix.Side(side))
        message.setField(quickfix.Symbol(instrument.symbol))
        message.setField(quickfix.SecurityExchange(instrument.exchange))
        message.setField(quickfix.OrderQty(size))
        message.setField(quickfix.Price(int(price)))
        message.setField(quickfix.OrdType(quickfix.OrdType_LIMIT))
        message.setField(quickfix.TimeInForce('0'))
        message.setField(quickfix.Text("NewOrderSingle"))
        trstime = quickfix.TransactTime()
        trstime.setString(
            datetime.utcnow().strftime("%Y%m%d-%H:%M:%S.%f")[:-3])
        message.setField(trstime)

        msg = message.toString().replace(__SOH__, "|")

        print("New Order Single: " + msg)

        quickfix.Session.sendToTarget(message, self.sessionID)
Example #8
0
def new_order(sender_comp_id, target_comp_id, symbol, quantity, price, side,
              order_type):
    if side.lower() == "buy":
        side = fix.Side_BUY
    else:
        side = fix.Side_SELL

    message = Message()
    header = message.getHeader()
    header.setField(fix.BeginString("FIX.4.2"))
    header.setField(fix.SenderCompID(sender_comp_id))
    header.setField(fix.TargetCompID(target_comp_id))
    header.setField(fix.MsgType("D"))
    ord_id = get_order_id(sender_comp_id, symbol)
    message.setField(fix.ClOrdID(ord_id))
    message.setField(fix.Symbol(symbol))
    message.setField(fix.Side(side))
    message.setField(fix.Price(float(price)))
    if order_type.lower() == "market":
        message.setField(fix.OrdType(fix.OrdType_MARKET))
    else:
        message.setField(fix.OrdType(fix.OrdType_LIMIT))
    message.setField(fix.HandlInst(fix.HandlInst_MANUAL_ORDER_BEST_EXECUTION))
    message.setField(fix.TransactTime())
    message.setField(fix.OrderQty(float(quantity)))
    message.setField(fix.Text(f"{side} {symbol} {quantity}@{price}"))

    return message
    def sendOrder(self, ticker, side, type, px, qty):
        nos = fix.Message()
        nos.getHeader().setField(fix.BeginString(fix.BeginString_FIX44))
        nos.getHeader().setField(fix.MsgType(fix.MsgType_NewOrderSingle))

        symbol = fix.Symbol(ticker)
        nos.setField(symbol)
        if side == "BUY":
            side = fix.Side(fix.Side_BUY)
        if side == "SELL":
            side = fix.Side(fix.Side_SELL)
        nos.setField(side)

        if type == "MARKET":
            ordType = fix.OrdType(fix.OrdType_MARKET)
            px = fix.Price(0)
        if type == "LIMIT":
            ordType = fix.OrdType(fix.OrdType_MARKET)
            px = fix.Price(px)
        nos.setField(ordType)
        nos.setField(px)

        orderQty = fix.OrderQty(qty)
        clOrdID = fix.ClOrdID(self.genOrderID())
        nos.setField(orderQty)
        nos.setField(clOrdID)

        TimeInForce = fix.TimeInForce(fix.TimeInForce_GOOD_TILL_CANCEL)
        TransactTime = fix.TransactTime()
        nos.setField(TimeInForce)
        nos.setField(TransactTime)

        fix.Session.sendToTarget(nos, self.sessionID)
Example #10
0
    def queryNewOrderSingle44(self):
        ordType = fix.OrdType()

        message = fix44.NewOrderSingle()
        message.setField(self.queryClOrdID())
        message.setField(fix.HandlInst('1'))
        message.setField(self.querySymbol())
        message.setField(self.querySide())
        message.setField(fix.TransactTime())
        ordType = self.queryOrdType()
        message.setField(ordType)
        message.setField(self.queryOrderQty())
        message.setField(self.queryTimeInForce())
        message.setField(self.querySecurityExchange())
        message.setField(self.queryAccount())

        if ordType.getValue() == fix.OrdType_LIMIT or ordType.getValue(
        ) == fix.OrdType_STOP_LIMIT:
            message.setField(self.queryPrice())

        if ordType.getValue() == fix.OrdType_STOP or ordType.getValue(
        ) == fix.OrdType_STOP_LIMIT:
            message.setField(self.queryStopPx())

        header = message.getHeader()
        self.queryHeader(header)

        return message
Example #11
0
 def start_new_message(self, msg_type):
     new_message = fix.Message()
     message_fields = [
         fix.BeginString(fix.BeginString_FIX44),
         fix.MsgType(msg_type),
         fix.TransactTime()
     ]
     for field in message_fields:
         new_message.getHeader().setField(field)
     return new_message
Example #12
0
	def fromApp(self, message, sessionID):
		beginString = fix.BeginString()
		msgType = fix.MsgType()
		message.getHeader().getField( beginString )
		message.getHeader().getField( msgType )

		symbol = fix.Symbol()
		side = fix.Side()
		ordType = fix.OrdType()
		orderQty = fix.OrderQty()
		price = fix.Price()
		clOrdID = fix.ClOrdID()

		message.getField( ordType )
		if ordType.getValue() != fix.OrdType_LIMIT:
			raise fix.IncorrectTagValue( ordType.getField() )

		message.getField( symbol )
		message.getField( side )
		message.getField( orderQty )
		message.getField( price )
		message.getField( clOrdID )

		executionReport = fix.Message()
		executionReport.getHeader().setField( beginString )
		executionReport.getHeader().setField( fix.MsgType(fix.MsgType_ExecutionReport) )

		executionReport.setField( fix.OrderID(str(self.genOrderID())) )
		executionReport.setField( fix.ExecID(str(self.genExecID())) )
		executionReport.setField( fix.OrdStatus(fix.OrdStatus_FILLED) )
		executionReport.setField( symbol )
		executionReport.setField( side )
		executionReport.setField( fix.CumQty(orderQty.getValue()) )
		executionReport.setField( fix.AvgPx(price.getValue()) )
		executionReport.setField( fix.LastShares(orderQty.getValue()) )
		executionReport.setField( fix.LastPx(price.getValue()) )
		executionReport.setField( clOrdID )
		executionReport.setField( orderQty )
		executionReport.setField( message.getField( price ))
		executionReport.setField( fix.TransactTime() )

		if beginString.getValue() == fix.BeginString_FIX40 or beginString.getValue() == fix.BeginString_FIX41 or beginString.getValue() == fix.BeginString_FIX42:
			executionReport.setField( fix.ExecTransType(fix.ExecTransType_NEW) )

		if beginString.getValue() >= fix.BeginString_FIX41:
			executionReport.setField( fix.ExecType(fix.ExecType_FILL) )
			executionReport.setField( fix.LeavesQty(0) )

		time.sleep(5)

		try:
			fix.Session.sendToTarget( executionReport, sessionID )
		except SessionNotFound as e:
			return
Example #13
0
def msgtofix_quote(quote_msg):
    """
    Converte Quote (message) para Quote (fix).
    """
    quoterequest_msg, quoterequest_fix = get_quoterequest(quote_msg.QuoteReqID)

    quote = fix44.Quote()
    quote.reverseRoute(quoterequest_fix.getHeader())

    if quoterequest_msg.SecurityType == messages.EnumSecurityType.SPOT:
        set_field(quote, fix.SecurityType, "FXSPOT")
    elif quoterequest_msg.SecurityType == messages.EnumSecurityType.NDF:
        set_field(quote, fix.SecurityType, "FXNDF")

    set_field(quote, fix.QuoteReqID, quote_msg.QuoteReqID)
    set_field(quote, fix.QuoteID, quote_msg.QuoteID)
    set_field(quote, fix.OfferPx, quote_msg.OfferPx)
    set_field(quote, fix.OfferSpotRate, quote_msg.OfferSpotRate)
    set_field(quote, fix.BidPx, quote_msg.BidPx)
    set_field(quote, fix.BidSpotRate, quote_msg.BidSpotRate)
    set_field(quote, fix.QuoteCondition, "A")
    quote.setField(5082, "2")

    set_field(quote, fix.Symbol, quoterequest_fix.getField(fix.Symbol().getField()))
    set_field(quote, fix.Account, quoterequest_fix.getField(fix.Account().getField()))

    copy_field(quoterequest_fix, quote, fix.FutSettDate)
    copy_field(quoterequest_fix, quote, fix.FutSettDate2)
    copy_field(quoterequest_fix, quote, 6215)
    copy_field(quoterequest_fix, quote, 6216)

    transact_time = fix.TransactTime()
    time_str = get_utc_time().strftime("%Y%m%d-%H:%M:%S.%f")[:-3]
    transact_time.setString(time_str)
    quote.setField(transact_time)
    quote_msg.TransactTime = time_str

    if quoterequest_msg.SecurityType == messages.EnumSecurityType.NDF:
        copy_field(quoterequest_fix, quote, fix.OrdType)
        copy_field(quoterequest_fix, quote, fix.TradeDate)
        copy_field(quoterequest_fix, quote, fix.SettlCurrency)

        copy_field(quoterequest_fix, quote, 5974)  # FixingSource
        copy_field(quoterequest_fix, quote, 6203)  # FixingDate

        taker_side = str(quoterequest_fix.getField(fix.Side().getField()))

        if taker_side == '1':
            set_field(quote, fix.OfferForwardPoints, quote_msg.Details.get('forward_points'))
        elif taker_side == '2':
            set_field(quote, fix.BidForwardPoints, quote_msg.Details.get('forward_points'))

    return quote
Example #14
0
    def test_order(self):
        cid = fix.ClOrdID('100')
        requestTime = fix.TransactTime()
        requestTime.setString('20170606-03:52:34.924')
        request = fix44.NewOrderSingle()
        request.setField(requestTime)
        request.setField(cid)

        responseTime = fix.TransactTime()
        responseTime.setString('20170606-03:52:14.824')
        response = fix44.ExecutionReport()
        response.setField(responseTime)
        response.setField(cid)
        currentLag = {}

        def receive(event):
            currentLag[0] = event.CurrentTimeLag

        self.Store.addTimeLagListener(receive)
        self.Store.addRequest(request)
        self.Store.addResponse(response)
        self.assertEqual(currentLag[0], 20.1)
Example #15
0
def replace_order(sender_comp_id, target_comp_id, quantity, price,
                  orig_client_order_id):
    symbol = ORDERS[orig_client_order_id][0].getValue()
    side = ORDERS[orig_client_order_id][3].getValue()

    message = fix42.OrderCancelReplaceRequest()
    header = message.getHeader()
    header.setField(fix.SenderCompID(sender_comp_id))
    header.setField(fix.TargetCompID(target_comp_id))
    ord_id = get_order_id(sender_comp_id, symbol)
    message.setField(fix.OrigClOrdID(orig_client_order_id))
    message.setField(fix.ClOrdID(ord_id))
    message.setField(fix.Symbol(symbol))
    message.setField(fix.Side(side))
    message.setField(fix.Price(float(price)))
    message.setField(fix.OrdType(fix.OrdType_LIMIT))
    message.setField(fix.HandlInst(fix.HandlInst_MANUAL_ORDER_BEST_EXECUTION))
    message.setField(fix.TransactTime())
    message.setField(fix.TransactTime())
    message.setField(fix.OrderQty(float(quantity)))
    message.setField(fix.Text(f"{side} {symbol} {quantity}@{price}"))

    return message
Example #16
0
def msgtofix_execreport(execreport_msg):
    """
    Converte ExecReport (message) para ExecReport (fix).
    """
    _, newordersingle_fix = get_newordersingle(execreport_msg.ClOrderID)

    execreport_fix = fix44.ExecutionReport()
    execreport_fix.reverseRoute(newordersingle_fix.getHeader())

    set_field(execreport_fix, fix.ExecID, execreport_msg.ExecID)
    set_field(execreport_fix, fix.OrderID, execreport_msg.OrderID)

    if execreport_msg.Type == messages.ExecReportType.ACCEPT:
        set_field(execreport_fix, fix.ExecType, "2")
        set_field(execreport_fix, fix.OrdStatus, "2")
    else:
        set_field(execreport_fix, fix.ExecType, "8")
        set_field(execreport_fix, fix.OrdStatus, "8")

    set_field(execreport_fix, fix.ExecTransType, "0")

    set_field(execreport_fix, fix.LeavesQty, 0)
    copy_field(newordersingle_fix, execreport_fix, fix.Price, fix.AvgPx)
    copy_field(newordersingle_fix, execreport_fix, fix.OrderQty, fix.CumQty)

    transact_time = fix.TransactTime()
    time_str = get_utc_time().strftime("%Y%m%d-%H:%M:%S.%f")[:-3]
    transact_time.setString(time_str)
    execreport_fix.setField(transact_time)
    execreport_msg.TransactTime = time_str

    def copy(field):
        copy_field(newordersingle_fix, execreport_fix, field)

    copy(fix.SecurityType)
    copy(fix.ClOrdID)
    copy(fix.Account)
    copy(fix.Symbol)
    copy(fix.OrderQty)
    copy(fix.Price)
    copy(fix.Side)
    copy(fix.Currency)
    copy(fix.LastSpotRate)
    copy(fix.FutSettDate)
    copy(fix.FutSettDate2)
    copy(6215)  # TenorValue
    copy(6216)  # TenorValue2

    return execreport_fix
 def startFIXString(self, orderID):
     message = quickfix.Message()
     message.getHeader().setField(quickfix.BeginString(quickfix.BeginString_FIX42))
     message.getHeader().setField(quickfix.MsgType(quickfix.MsgType_ExecutionReport))
     message.getHeader().setField(quickfix.SendingTime())
     message.getHeader().setField(quickfix.TransactTime())
     message.setField(quickfix.ClOrdID(self.orders[orderID]['clOrdID']))
     message.setField(quickfix.OrderQty(self.orders[orderID]['quantity']))
     message.setField(quickfix.Symbol(self.orders[orderID]['symbol']))
     message.setField(quickfix.Side(self.orders[orderID]['side']))
     message.setField(quickfix.ExecID(str(self.getNextExecID(self.orders[orderID]['target']))))
     if 'exchangeID' not in self.orders[orderID]:
         self.orders[orderID]['exchangeID'] = self.getNextExchangeID(self.orders[orderID]['target'])
     message.setField(quickfix.OrderID(str(self.orders[orderID]['exchangeID'])))
     return message
Example #18
0
    def new_order(self, message, beginString, sessionID):
        symbol = fix.Symbol()
        side = fix.Side()
        ordType = fix.OrdType()
        orderQty = fix.OrderQty()
        price = fix.Price(50)
        clOrdID = fix.ClOrdID()

        message.getField(ordType)
        message.getField(symbol)
        message.getField(side)
        message.getField(orderQty)
        message.getField(price)
        message.getField(clOrdID)
        log.info("new_order:\nordType:{},symbol:{},side:{},orderQty:{},price:{},clOrdID:{} -----"\
            .format(ordType, symbol, side, orderQty, price, clOrdID))

        executionReport = fix.Message()
        executionReport.getHeader().setField(beginString)
        executionReport.getHeader().setField(
            fix.MsgType(fix.MsgType_ExecutionReport))

        executionReport.setField(fix.TransactTime())
        executionReport.setField(fix.OrderID(self.genOrderID()))
        executionReport.setField(fix.ExecID(self.genExecID()))
        executionReport.setField(fix.OrdStatus(fix.OrdStatus_NEW))
        executionReport.setField(symbol)
        executionReport.setField(side)
        executionReport.setField(fix.CumQty(orderQty.getValue()))
        executionReport.setField(fix.AvgPx(price.getValue()))
        executionReport.setField(fix.LastShares(orderQty.getValue()))
        executionReport.setField(fix.LastPx(price.getValue()))
        executionReport.setField(clOrdID)
        executionReport.setField(orderQty)
        executionReport.setField(fix.ExecType(fix.ExecType_NEW))
        executionReport.setField(fix.LeavesQty(orderQty.getValue()))

        try:
            fix.Session.sendToTarget(executionReport, sessionID)
            time.sleep(1)
            if ordType.getValue() == fix.OrdType_MARKET:
                executionReport.setField(fix.OrdStatus(fix.OrdStatus_FILLED))
                executionReport.setField(fix.ExecType(fix.ExecType_TRADE))
                fix.Session.sendToTarget(executionReport, sessionID)

        except fix.SessionNotFound as e:
            return
Example #19
0
def delete_order(sender_comp_id, target_comp_id, orig_client_order_id):
    symbol = ORDERS[orig_client_order_id][0].getValue()
    side = ORDERS[orig_client_order_id][3].getValue()

    message = fix44.OrderCancelRequest()
    header = message.getHeader()
    header.setField(fix.SenderCompID(sender_comp_id))
    header.setField(fix.TargetCompID(target_comp_id))
    ord_id = get_order_id(sender_comp_id, symbol)
    message.setField(fix.OrigClOrdID(orig_client_order_id))
    message.setField(fix.ClOrdID(ord_id))
    message.setField(fix.Symbol(symbol))
    message.setField(fix.Side(side))
    message.setField(fix.TransactTime())
    message.setField(fix.Text(f"Delete {orig_client_order_id}"))

    return message
Example #20
0
    def requestForPositions(self):
        clrDate = datetime.now().strftime("%Y%m%d")
        inqId = self.SocketInitiator.application.genInquiryID()
        account = self.SocketInitiator.application.Settings.get().getString(
            'Account')
        message = fix44.RequestForPositions()
        message.setField(fix.Account(account))
        message.setField(fix.TransactTime())
        message.setField(
            fix.AccountType(
                fix.AccountType_ACCOUNT_IS_CARRIED_ON_CUSTOMER_SIDE_OF_BOOKS))
        message.setField(fix.ClearingBusinessDate(clrDate))
        message.setField(fix.PosReqType(fix.PosReqType_POSITIONS))
        message.setField(fix.PosReqID(inqId))

        self.SocketInitiator.application.send(message)

        return inqId
Example #21
0
 def __uncorkValue(message):
     msgType = fix.MsgType()
     message.getHeader().getField(msgType)
     val = msgType.getValue()
     if val == fix.MsgType_Logon or val == fix.MsgType_Logout or val == fix.MsgType_Heartbeat:
         sndTime = fix.SendingTime()
         message.getHeader().getField(sndTime)
         return sndTime.getString()
     if val == fix.MsgType_NewOrderSingle or val == fix.MsgType_ExecutionReport \
             or val == fix.MsgType_OrderCancelRequest or val == fix.MsgType_OrderCancelReject:
         transTime = fix.TransactTime()
         message.getField(transTime)
         return transTime.getString()
     if val == fix.MsgType_CollateralInquiry or val == fix.MsgType_CollateralReport \
             or val == fix.MsgType_RequestForPositions or val == fix.MsgType_PositionReport \
             or val == fix.MsgType_RequestForPositionsAck:
         return datetime.now().strftime("%Y%m%d-%H:%M:%S")
     return None
    def put_order(self):
        print("Creating the following order: ")
        trade = fix.Message()
        trade.getHeader().setField(fix.BeginString(fix.BeginString_FIX42))  #
        trade.getHeader().setField(fix.MsgType(
            fix.MsgType_NewOrderSingle))  #39=D
        trade.setField(fix.ClOrdID(self.genExecID()))  #11=Unique order

        trade.setField(fix.HandlInst(fix.HandlInst_MANUAL_ORDER_BEST_EXECUTION)
                       )  #21=3 (Manual order, best executiona)
        trade.setField(fix.Symbol('SMBL'))  #55=SMBL ?
        trade.setField(fix.Side(fix.Side_BUY))  #43=1 Buy
        trade.setField(fix.OrdType(fix.OrdType_LIMIT))  #40=2 Limit order
        trade.setField(fix.OrderQty(100))  #38=100
        trade.setField(fix.Price(10))
        trade.setField(fix.TransactTime(int(datetime.utcnow().strftime("%s"))))
        print(trade.toString())
        fix.Session.sendToTarget(trade, self.sessionID)
Example #23
0
    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)
Example #24
0
    def cancel(self, trade):
        orderId = self.SocketInitiator.application.genOrderID()
        account = self.SocketInitiator.application.Settings.get().getString(
            'Account')

        cancel = fix44.OrderCancelRequest()
        cancel.setField(fix.Account(account))
        cancel.setField(fix.ClOrdID(orderId))
        cancel.setField(fix.OrigClOrdID(trade.OrderId))

        cancel.setField(trade.CFICode)
        cancel.setField(fix.TransactTime())
        cancel.setField(fix.OrderQty(trade.Quantity))
        cancel.setField(
            fix.Side(fix.Side_BUY if trade.OrderSide ==
                     OrderSide.Buy else fix.Side_SELL))
        cancel.setField(fix.Symbol(trade.Symbol))
        cancel.setField(fix.MaturityMonthYear(trade.Maturity))

        self.SocketInitiator.application.send(cancel)
Example #25
0
    def send_order_cancel_request(self, order_cancel_request):
        """
        Args:
            order_cancel_request (TradingClass.OrderCancelRequest)
        Returns:
            None
        """
        # Create Fix Message for Order Cancel Request
        message = fix.Message()
        header = message.getHeader()
        header.setField(fix.MsgType(fix.MsgType_OrderCancelRequest))
        transact_time_fix = fix.TransactTime()
        transact_time_fix.setString(order_cancel_request.transact_time.__str__())

        message.setField(fix.OrigClOrdID(order_cancel_request.orig_cl_ord_id))
        message.setField(fix.ClOrdID(order_cancel_request.cl_ord_id))
        message.setField(fix.Symbol(order_cancel_request.symbol))
        message.setField(fix.Side(order_cancel_request.side))
        message.setField(transact_time_fix)
        message.setField(fix.OrderQty(order_cancel_request.order_qty))

        # Send Fix Message to Server
        fix.Session.sendToTarget(message, self.fix_application.sessionID)
Example #26
0
    def put_new_order(self):
        """Request sample new order single"""
        message = fix.Message()
        header = message.getHeader()

        header.setField(fix.MsgType(fix.MsgType_NewOrderSingle))  #39 = D

        message.setField(fix.ClOrdID(
            self.genExecID()))  #11 = Unique Sequence Number
        message.setField(fix.Side(fix.Side_BUY))  #43 = 1 BUY
        message.setField(fix.Symbol("MSFT"))  #55 = MSFT
        message.setField(fix.OrderQty(10000))  #38 = 1000
        message.setField(fix.Price(100))
        message.setField(fix.OrdType(fix.OrdType_LIMIT))  #40=2 Limit Order
        message.setField(
            fix.HandlInst(fix.HandlInst_MANUAL_ORDER_BEST_EXECUTION))  #21 = 3
        message.setField(fix.TimeInForce('0'))
        message.setField(fix.Text("NewOrderSingle"))
        trstime = fix.TransactTime()
        trstime.setString(
            datetime.utcnow().strftime("%Y%m%d-%H:%M:%S.%f")[:-3])
        message.setField(trstime)

        fix.Session.sendToTarget(message, self.sessionID)
Example #27
0
    def test_setString(self):
        strGood = "8=FIX.4.2\0019=45\00135=0\00134=3\00149=TW\00152=20000426-12:05:06\00156=ISLD\00110=218\001"
        strNull = "8=FIX.4.2\0019=46\00135=0\00134=3\00149=TW\00152=20000426-12:05:06\00156=ISLD\000\00110=219\001"
        strTrailingCharacter = "8=FIX.4.2\0019=45\00135=0\00134=3\00149=TW\00152=20000426-12:05:06\00156=ISLD\00110=218\001 "
        strNoChk = "8=FIX.4.2\0019=45\00135=0\00134=3\00149=TW\00152=20000426-12:05:06\00156=ISLD\001"
        strBadChk = "8=FIX.4.2\0019=45\00135=0\00134=3\00149=TW\00152=20000426-12:05:06\00156=ISLD\00110=000\001"
        strBad = "8=FIX.4.2\0019=45\00135=0\00134=3\00149garbled=TW\00152=20000426-12:05:06\00156=ISLD\00110=000\001"
        strBadHeaderOrder = "8=FIX.4.2\00135=0\0019=45\00134=3\00149=TW\00152=20000426-12:05:06\00156=ISLD\00110=218\001"
        strBodyFields = "8=FIX.4.2\0019=60\00135=D\00111=ORDERID\00121=3\00140=2\00154=1\00155=MSFT\00160=19000101-00:00:00\00110=226\001"
        strNoLengthAndChk = "8=FIX.4.2\00135=0\00134=3\00149=TW\00152=20000426-12:05:06\00156=ISLD\001";
        strJunk = "paste your FIX message here, then hit ENTER"
        strEmpty = ""

        try:
            self.object.setString( strGood )
            self.object.setString( strNull )
            self.object.setString( strNoLengthAndChk, False )
        except fix.InvalidMessage as e:
            self.assertTrue( 0 )

        try:
            self.object.setString( strTrailingCharacter )
            self.assertTrue(0)
        except fix.InvalidMessage as e:
            self.assertTrue(1)

        try:
            self.object.setString( strNoChk )
            self.assertTrue(0)
        except fix.InvalidMessage as e:
            self.assertTrue(1)

        try:
            self.object.setString( strBadChk )
            self.assertTrue(0)
        except fix.InvalidMessage as e:
            self.assertTrue(1)

        try:
            self.object.setString( strBad )
            self.assertTrue(0)
        except fix.InvalidMessage as e:
            self.assertTrue(1)

        try:
            self.object.setString( strBadHeaderOrder )
            self.assertTrue(0)
        except fix.InvalidMessage as e:
            self.assertTrue(1)

        try:
            self.object.setString( strNoLengthAndChk )
            self.assertTrue(0)
        except fix.InvalidMessage as e:
            self.assertTrue(1)

        try:
            self.object.setString( strJunk )
            self.assertTrue(0)
        except fix.InvalidMessage as e:
            self.assertTrue(1)

        try:
            self.object.setString( strEmpty )
            self.assertTrue(0)
        except fix.InvalidMessage as e:
            self.assertTrue(1)

        dataDictionary = fix.DataDictionary()
        dataDictionary.addHeaderField( 11, False )
        dataDictionary.addTrailerField( 60, False )

        clOrdID = fix.ClOrdID()
        transactTime = fix.TransactTime()
        symbol = fix.Symbol()

        try:
            self.object.setString( strBodyFields, True, dataDictionary )
        except fix.InvalidMessage as e:
            self.assertTrue( 0 )

        assert( self.object.getHeader().isSetField( clOrdID ) )
        assert( self.object.getTrailer().isSetField( transactTime ) )
        assert( self.object.isSetField( symbol ) )
Example #28
0
            header.setField(fix.MsgType(fix.MsgType_NewOrderSingle))
            header.setField(fix.SendingTime())
            header.setField(fix.SenderSubID("SG1"))
            header.setField(fix.TargetSubID("BARCA"))
            header.setField(fix.MsgSeqNum())
            header.setField(fix.DefaultApplVerID(fix.ApplVerID_FIX42))
            message.setField(fix.ClOrdID("ClOrdID"))
            message.setField(
                fix.AccountType(
                    fix.
                    AccountType_ACCOUNT_IS_CARRIED_ON_CUSTOMER_SIDE_OF_BOOKS))
            message.setField(fix.Symbol("APPL"))
            message.setField(
                fix.HandlInst(
                    fix.
                    HandlInst_AUTOMATED_EXECUTION_ORDER_PRIVATE_NO_BROKER_INTERVENTION
                ))
            message.setField(fix.ReceivedDeptID("I"))

            message.setField(fix.Side(fix.Side_BUY))
            message.setField(fix.TransactTime())
            message.setField(fix.OrderQty(1000))
            message.setField(fix.OrdType(fix.OrdType_MARKET))
            message.setField(fix.Price(2000))

            trailer.setField(fix.CheckSum())
            application.send(message)
            message_flag = False
except (fix.ConfigError, fix.RuntimeError) as e:
    print(e)
Example #29
0
    # Send an order
    m = fix44.NewOrderSingle()
    m.setField(fix.ClOrdID(str(uuid.uuid4())))
    m.setField(fix.SecurityID('25'))
    m.setField(
        fix.SecurityIDSource(
            fix.SecurityIDSource_MARKETPLACE_ASSIGNED_IDENTIFIER))
    m.setField(fix.Side(fix.Side_BUY))
    m.setField(fix.OrderQty(0.01))
    m.setField(fix.Price(123))
    m.setField(fix.OrdType(fix.OrdType_LIMIT))

    # Python QuickFIX UtcTimeStampField doesn't accept a `datetime` object, we
    # provide an easy helper function for you
    t = fix.TransactTime()
    t.setString(easyfix.fix_utctimestamp(datetime.datetime.utcnow()))
    m.setField(t)
    fix.Session.sendToTarget(m, app.session_id)

    # Some sort of main loop
    while m := app.incoming_messages.get():
        # Get field(s) by name
        #
        # Note that this does not consider repeating group hierarchies and dump
        # all fields matching the tag of the name
        print(app.get_fields_by_name(m, 'MsgType'))
        print(app.get_fields_by_name(m, 'Symbol'))

        # Get "nicely" formatted FIX message dump. Enums are automatically converted to descriptions
        #
Example #30
0
    def _process_execution_report(self, message):
        cl_ord_id = self._extract_field(fix.ClOrdID(), message)
        exec_type = self._extract_field(fix.ExecType(), message)
        market_order_id = self._extract_optional_field(fix.OrderID(), message)

        order = self.order_store.find_order(cl_ord_id, market_order_id)

        # We only update the market order if it's changed
        self.order_store.store_market_order_id(market_order_id, order.order_id)

        order.order_id = self.order_store.find_order_id(cl_ord_id)

        if exec_type == fix.ExecType_NEW:
            order.status = OrdStatus.NEW
            self.order_handler.on_new_ack(order)

        elif exec_type == fix.ExecType_DONE_FOR_DAY:
            pass

        elif exec_type == fix.ExecType_CANCELED:
            order.status = OrdStatus.CANCELED
            self.order_handler.on_cancel_ack(order)

        elif exec_type == fix.ExecType_REPLACE:
            order.status = OrdStatus.REPLACED
            self.order_handler.on_replace_ack(order)

        elif exec_type == fix.ExecType_PENDING_CANCEL:
            self.log.info(
                'Received pending cancel for order [order id: {}]'.format(
                    order.order_id))

        elif exec_type == fix.ExecType_STOPPED:
            pass

        elif exec_type == fix.ExecType_REJECTED:
            ord_rej_reason = self._extract_field(fix.OrdRejReason(), message)
            self.log.error('Submission rejected, ({}) {}'.format(
                OrdRejReason[ord_rej_reason], ord_rej_reason))
            order.status = OrdStatus.NEW_REJECT
            self.order_handler.on_new_rej(order)

        elif exec_type == fix.ExecType_SUSPENDED:
            pass

        elif exec_type == fix.ExecType_PENDING_NEW:
            self.log.info(
                'Received pending new for order [order id: {}]'.format(
                    order.order_id))

        elif exec_type == fix.ExecType_CALCULATED:
            pass

        elif exec_type == fix.ExecType_EXPIRED:
            pass

        elif exec_type == fix.ExecType_RESTATED:
            pass

        elif exec_type == fix.ExecType_PENDING_REPLACE:
            self.log.info(
                'Received pending replace for order [order id: {}]'.format(
                    order.order_id))

        elif exec_type == fix.ExecType_TRADE:
            exec_id = self._extract_field(fix.ExecID(), message)
            transact_time = self._extract_date_field(fix.TransactTime(),
                                                     message)
            remaining_qty = self._extract_field(fix.LeavesQty(), message)
            executed_qty = self._extract_field(fix.CumQty(), message)
            last_qty = self._extract_field(fix.LastQty(), message)
            last_px = self._extract_field(fix.LastPx(), message)

            order.executed_qty = executed_qty

            execution = Execution(order.order_id)
            execution.exec_id = exec_id
            execution.transact_time = transact_time
            execution.last_price = last_px
            execution.last_qty = last_qty

            if remaining_qty == 0:
                order.status = OrdStatus.FULLY_FILLED
            else:
                order.status = OrdStatus.PARTIALLY_FILLED

            self.order_store.store_exec_id(exec_id, execution)
            self.order_handler.on_execution(order, execution)

        elif exec_type == fix.ExecType_TRADE_CORRECT:
            pass

        elif exec_type == fix.ExecType_TRADE_CANCEL:
            pass

        elif exec_type == fix.ExecType_ORDER_STATUS:
            pass

        else:
            self.log.error('Unknown execType: {}'.format(exec_type))