Esempio n. 1
0
    def getOrderCancelReject(self, message):

        beginString = fix.BeginString()
        message.getHeader().getField(beginString)

        clOrdID = fix.ClOrdID()
        orderID = fix.OrderID()
        origClOrdID = fix.OrigClOrdID()

        message.getField(clOrdID)
        message.getField(orderID)
        message.getField(origClOrdID)

        orderCancelReject = fix.Message()
        orderCancelReject.getHeader().setField(beginString)
        orderCancelReject.getHeader().setField(
            fix.MsgType(fix.MsgType_OrderCancelReject))

        orderCancelReject.setField(clOrdID)
        orderCancelReject.setField(orderID)
        orderCancelReject.setField(origClOrdID)
        orderCancelReject.setField(fix.OrdStatus(
            fix.OrdStatus_FILLED))  #39 = 2 FILLED
        orderCancelReject.setField(
            fix.CxlRejReason(0))  #102=0 TOO_LATE_TO_CANCEL
        orderCancelReject.setField(
            fix.CxlRejResponseTo(1))  #434=1  ORDER_CANCEL_REQUEST

        return orderCancelReject
Esempio n. 2
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)
Esempio n. 3
0
    def _process_order_cancel_reject(self, message):
        cl_ord_id = self._extract_field(fix.ClOrdID(), message)
        market_order_id = self._extract_field(fix.OrderID(), message)
        cxl_rej_response_to = self._extract_field(fix.CxlRejResponseTo(),
                                                  message)

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

        if cxl_rej_response_to == \
                CxlRejResponseTo.ORDER_CANCEL_REPLACE_REQUEST:
            order.status = OrdStatus.REPLACE_REJECT
            self.order_handler.on_replace_rej(order)
        elif cxl_rej_response_to == CxlRejResponseTo.ORDER_CANCEL_REQUEST:
            order.status = OrdStatus.CANCEL_REJECT
            self.order_handler.on_cancel_rej(order)
        else:
            self.log.error('Unknown CxlRejResponseTo value: {}'.format(
                cxl_rej_response_to))
Esempio n. 4
0
    def getExecutionReportForCancelOrder2(self, message):

        beginString = fix.BeginString()
        message.getHeader().getField(beginString)

        symbol = fix.Symbol()
        side = fix.Side()
        clOrdID = fix.ClOrdID()
        orderID = fix.OrderID()
        origClOrdID = fix.OrigClOrdID()

        message.getField(symbol)
        message.getField(side)
        message.getField(clOrdID)
        message.getField(orderID)
        message.getField(origClOrdID)

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

        data = {}
        data['id'] = orderID.getValue()
        response = cancelOrder(self.accessKey, self.secretKey,
                               orderID.getValue())

        jResponse = json.loads(response)

        executionReport.setField(fix.OrderID(orderID.getValue()))
        # todo get client order id
        executionReport.setField(clOrdID)
        executionReport.setField(fix.ExecID(self.genExecID()))

        if 'error' in jResponse and jResponse['error']:
            orderCancelReject = fix.Message()
            orderCancelReject.getHeader().setField(beginString)
            orderCancelReject.getHeader().setField(
                fix.MsgType(fix.MsgType_OrderCancelReject))

            orderCancelReject.setField(clOrdID)
            orderCancelReject.setField(orderID)
            orderCancelReject.setField(origClOrdID)
            # todo reject reason
            orderCancelReject.setField(fix.OrdStatus(
                fix.OrdStatus_FILLED))  #39 = 2 FILLED
            orderCancelReject.setField(
                fix.CxlRejReason(0))  #102=0 TOO_LATE_TO_CANCEL

            orderCancelReject.setField(
                fix.CxlRejResponseTo(1))  #434=1  ORDER_CANCEL_REQUEST
            orderCancelReject.setField(fix.Text(jResponse['error']['message']))

            return orderCancelReject
        else:
            executionReport.setField(fix.OrderID(str(jResponse['id'])))
            # todo check trades_count from json response and set FILL status?
            executionReport.setField(fix.OrdStatus(fix.OrdStatus_CANCELED))
            executionReport.setField(
                fix.Side(fix.Side_BUY if jResponse['side'] ==
                         'buy' else fix.Side_SELL))
            executionReport.setField(
                fix.OrdType(
                    fix.OrdType_LIMIT if jResponse['ord_type'] ==
                    'limit' else fix.OrdType_MARKET))  #40=2 Limit order
            executionReport.setField(fix.Symbol(jResponse['market']))
            executionReport.setField(fix.Price(float(jResponse['price'])))  #44
            executionReport.setField(fix.OrderQty(float(
                jResponse['volume'])))  #38
            executionReport.setField(
                fix.CumQty(float(jResponse['executed_volume'])))  #14=100
            executionReport.setField(fix.AvgPx(float(
                jResponse['avg_price'])))  #6
            executionReport.setField(fix.Text("Order cancelled!"))

        # Since FIX 4.3, ExecTransType values are moved to ExecType
        if beginString.getValue(
        ) == fix.BeginString_FIX40 or beginString.getValue(
        ) == fix.BeginString_FIX41 or beginString.getValue(
        ) == fix.BeginString_FIX42:
            executionReport.setField(
                fix.ExecTransType(fix.ExecTransType_CANCEL))

        # ExecType and LeavesQty fields only existsince FIX 4.1
        if beginString.getValue() >= fix.BeginString_FIX41:
            executionReport.setField(fix.ExecType(
                fix.ExecType_CANCELED))  #150=4 CANCELED
            executionReport.setField(fix.LeavesQty(0))  #151=0

        return executionReport