Path: blob/master/src/ordermgmt/ZerodhaOrderManager.py
301 views
import logging12from ordermgmt.BaseOrderManager import BaseOrderManager3from ordermgmt.Order import Order45from models.ProductType import ProductType6from models.OrderType import OrderType7from models.Direction import Direction8from models.OrderStatus import OrderStatus910from utils.Utils import Utils1112class ZerodhaOrderManager(BaseOrderManager):13def __init__(self):14super().__init__("zerodha")1516def placeOrder(self, orderInputParams):17logging.info('%s: Going to place order with params %s', self.broker, orderInputParams)18kite = self.brokerHandle19try:20orderId = kite.place_order(21variety=kite.VARIETY_REGULAR,22exchange=kite.EXCHANGE_NFO if orderInputParams.isFnO == True else kite.EXCHANGE_NSE,23tradingsymbol=orderInputParams.tradingSymbol,24transaction_type=self.convertToBrokerDirection(orderInputParams.direction),25quantity=orderInputParams.qty,26price=orderInputParams.price,27trigger_price=orderInputParams.triggerPrice,28product=self.convertToBrokerProductType(orderInputParams.productType),29order_type=self.convertToBrokerOrderType(orderInputParams.orderType))3031logging.info('%s: Order placed successfully, orderId = %s', self.broker, orderId)32order = Order(orderInputParams)33order.orderId = orderId34order.orderPlaceTimestamp = Utils.getEpoch()35order.lastOrderUpdateTimestamp = Utils.getEpoch()36return order37except Exception as e:38logging.info('%s Order placement failed: %s', self.broker, str(e))39raise Exception(str(e))4041def modifyOrder(self, order, orderModifyParams):42logging.info('%s: Going to modify order with params %s', self.broker, orderModifyParams)43kite = self.brokerHandle44try:45orderId = kite.modify_order(46variety=kite.VARIETY_REGULAR,47order_id=order.orderId,48quantity=orderModifyParams.newQty if orderModifyParams.newQty > 0 else None,49price=orderModifyParams.newPrice if orderModifyParams.newPrice > 0 else None,50trigger_price=orderModifyParams.newTriggerPrice if orderModifyParams.newTriggerPrice > 0 else None,51order_type=orderModifyParams.newOrderType if orderModifyParams.newOrderType != None else None)5253logging.info('%s Order modified successfully for orderId = %s', self.broker, orderId)54order.lastOrderUpdateTimestamp = Utils.getEpoch()55return order56except Exception as e:57logging.info('%s Order modify failed: %s', self.broker, str(e))58raise Exception(str(e))5960def modifyOrderToMarket(self, order):61logging.info('%s: Going to modify order with params %s', self.broker)62kite = self.brokerHandle63try:64orderId = kite.modify_order(65variety=kite.VARIETY_REGULAR,66order_id=order.orderId,67order_type=kite.ORDER_TYPE_MARKET)6869logging.info('%s Order modified successfully to MARKET for orderId = %s', self.broker, orderId)70order.lastOrderUpdateTimestamp = Utils.getEpoch()71return order72except Exception as e:73logging.info('%s Order modify to market failed: %s', self.broker, str(e))74raise Exception(str(e))7576def cancelOrder(self, order):77logging.info('%s Going to cancel order %s', self.broker, order.orderId)78kite = self.brokerHandle79try:80orderId = kite.cancel_order(81variety=kite.VARIETY_REGULAR,82order_id=order.orderId)8384logging.info('%s Order cancelled successfully, orderId = %s', self.broker, orderId)85order.lastOrderUpdateTimestamp = Utils.getEpoch()86return order87except Exception as e:88logging.info('%s Order cancel failed: %s', self.broker, str(e))89raise Exception(str(e))9091def fetchAndUpdateAllOrderDetails(self, orders):92logging.info('%s Going to fetch order book', self.broker)93kite = self.brokerHandle94orderBook = None95try:96orderBook = kite.orders()97except Exception as e:98logging.error('%s Failed to fetch order book', self.broker)99return100101logging.info('%s Order book length = %d', self.broker, len(orderBook))102numOrdersUpdated = 0103for bOrder in orderBook:104foundOrder = None105for order in orders:106if order.orderId == bOrder['order_id']:107foundOrder = order108break109110if foundOrder != None:111logging.info('Found order for orderId %s', foundOrder.orderId)112foundOrder.qty = bOrder['quantity']113foundOrder.filledQty = bOrder['filled_quantity']114foundOrder.pendingQty = bOrder['pending_quantity']115foundOrder.orderStatus = bOrder['status']116if foundOrder.orderStatus == OrderStatus.CANCELLED and foundOrder.filledQty > 0:117# Consider this case as completed in our system as we cancel the order with pending qty when strategy stop timestamp reaches118foundOrder.orderStatus = OrderStatus.COMPLETED119foundOrder.price = bOrder['price']120foundOrder.triggerPrice = bOrder['trigger_price']121foundOrder.averagePrice = bOrder['average_price']122logging.info('%s Updated order %s', self.broker, foundOrder)123numOrdersUpdated += 1124125logging.info('%s: %d orders updated with broker order details', self.broker, numOrdersUpdated)126127def convertToBrokerProductType(self, productType):128kite = self.brokerHandle129if productType == ProductType.MIS:130return kite.PRODUCT_MIS131elif productType == ProductType.NRML:132return kite.PRODUCT_NRML133elif productType == ProductType.CNC:134return kite.PRODUCT_CNC135return None136137def convertToBrokerOrderType(self, orderType):138kite = self.brokerHandle139if orderType == OrderType.LIMIT:140return kite.ORDER_TYPE_LIMIT141elif orderType == OrderType.MARKET:142return kite.ORDER_TYPE_MARKET143elif orderType == OrderType.SL_MARKET:144return kite.ORDER_TYPE_SLM145elif orderType == OrderType.SL_LIMIT:146return kite.ORDER_TYPE_SL147return None148149def convertToBrokerDirection(self, direction):150kite = self.brokerHandle151if direction == Direction.LONG:152return kite.TRANSACTION_TYPE_BUY153elif direction == Direction.SHORT:154return kite.TRANSACTION_TYPE_SELL155return None156157158