Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sreenivasdoosa
GitHub Repository: sreenivasdoosa/sdoosa-algo-trade-python
Path: blob/master/src/ordermgmt/ZerodhaOrderManager.py
301 views
1
import logging
2
3
from ordermgmt.BaseOrderManager import BaseOrderManager
4
from ordermgmt.Order import Order
5
6
from models.ProductType import ProductType
7
from models.OrderType import OrderType
8
from models.Direction import Direction
9
from models.OrderStatus import OrderStatus
10
11
from utils.Utils import Utils
12
13
class ZerodhaOrderManager(BaseOrderManager):
14
def __init__(self):
15
super().__init__("zerodha")
16
17
def placeOrder(self, orderInputParams):
18
logging.info('%s: Going to place order with params %s', self.broker, orderInputParams)
19
kite = self.brokerHandle
20
try:
21
orderId = kite.place_order(
22
variety=kite.VARIETY_REGULAR,
23
exchange=kite.EXCHANGE_NFO if orderInputParams.isFnO == True else kite.EXCHANGE_NSE,
24
tradingsymbol=orderInputParams.tradingSymbol,
25
transaction_type=self.convertToBrokerDirection(orderInputParams.direction),
26
quantity=orderInputParams.qty,
27
price=orderInputParams.price,
28
trigger_price=orderInputParams.triggerPrice,
29
product=self.convertToBrokerProductType(orderInputParams.productType),
30
order_type=self.convertToBrokerOrderType(orderInputParams.orderType))
31
32
logging.info('%s: Order placed successfully, orderId = %s', self.broker, orderId)
33
order = Order(orderInputParams)
34
order.orderId = orderId
35
order.orderPlaceTimestamp = Utils.getEpoch()
36
order.lastOrderUpdateTimestamp = Utils.getEpoch()
37
return order
38
except Exception as e:
39
logging.info('%s Order placement failed: %s', self.broker, str(e))
40
raise Exception(str(e))
41
42
def modifyOrder(self, order, orderModifyParams):
43
logging.info('%s: Going to modify order with params %s', self.broker, orderModifyParams)
44
kite = self.brokerHandle
45
try:
46
orderId = kite.modify_order(
47
variety=kite.VARIETY_REGULAR,
48
order_id=order.orderId,
49
quantity=orderModifyParams.newQty if orderModifyParams.newQty > 0 else None,
50
price=orderModifyParams.newPrice if orderModifyParams.newPrice > 0 else None,
51
trigger_price=orderModifyParams.newTriggerPrice if orderModifyParams.newTriggerPrice > 0 else None,
52
order_type=orderModifyParams.newOrderType if orderModifyParams.newOrderType != None else None)
53
54
logging.info('%s Order modified successfully for orderId = %s', self.broker, orderId)
55
order.lastOrderUpdateTimestamp = Utils.getEpoch()
56
return order
57
except Exception as e:
58
logging.info('%s Order modify failed: %s', self.broker, str(e))
59
raise Exception(str(e))
60
61
def modifyOrderToMarket(self, order):
62
logging.info('%s: Going to modify order with params %s', self.broker)
63
kite = self.brokerHandle
64
try:
65
orderId = kite.modify_order(
66
variety=kite.VARIETY_REGULAR,
67
order_id=order.orderId,
68
order_type=kite.ORDER_TYPE_MARKET)
69
70
logging.info('%s Order modified successfully to MARKET for orderId = %s', self.broker, orderId)
71
order.lastOrderUpdateTimestamp = Utils.getEpoch()
72
return order
73
except Exception as e:
74
logging.info('%s Order modify to market failed: %s', self.broker, str(e))
75
raise Exception(str(e))
76
77
def cancelOrder(self, order):
78
logging.info('%s Going to cancel order %s', self.broker, order.orderId)
79
kite = self.brokerHandle
80
try:
81
orderId = kite.cancel_order(
82
variety=kite.VARIETY_REGULAR,
83
order_id=order.orderId)
84
85
logging.info('%s Order cancelled successfully, orderId = %s', self.broker, orderId)
86
order.lastOrderUpdateTimestamp = Utils.getEpoch()
87
return order
88
except Exception as e:
89
logging.info('%s Order cancel failed: %s', self.broker, str(e))
90
raise Exception(str(e))
91
92
def fetchAndUpdateAllOrderDetails(self, orders):
93
logging.info('%s Going to fetch order book', self.broker)
94
kite = self.brokerHandle
95
orderBook = None
96
try:
97
orderBook = kite.orders()
98
except Exception as e:
99
logging.error('%s Failed to fetch order book', self.broker)
100
return
101
102
logging.info('%s Order book length = %d', self.broker, len(orderBook))
103
numOrdersUpdated = 0
104
for bOrder in orderBook:
105
foundOrder = None
106
for order in orders:
107
if order.orderId == bOrder['order_id']:
108
foundOrder = order
109
break
110
111
if foundOrder != None:
112
logging.info('Found order for orderId %s', foundOrder.orderId)
113
foundOrder.qty = bOrder['quantity']
114
foundOrder.filledQty = bOrder['filled_quantity']
115
foundOrder.pendingQty = bOrder['pending_quantity']
116
foundOrder.orderStatus = bOrder['status']
117
if foundOrder.orderStatus == OrderStatus.CANCELLED and foundOrder.filledQty > 0:
118
# Consider this case as completed in our system as we cancel the order with pending qty when strategy stop timestamp reaches
119
foundOrder.orderStatus = OrderStatus.COMPLETED
120
foundOrder.price = bOrder['price']
121
foundOrder.triggerPrice = bOrder['trigger_price']
122
foundOrder.averagePrice = bOrder['average_price']
123
logging.info('%s Updated order %s', self.broker, foundOrder)
124
numOrdersUpdated += 1
125
126
logging.info('%s: %d orders updated with broker order details', self.broker, numOrdersUpdated)
127
128
def convertToBrokerProductType(self, productType):
129
kite = self.brokerHandle
130
if productType == ProductType.MIS:
131
return kite.PRODUCT_MIS
132
elif productType == ProductType.NRML:
133
return kite.PRODUCT_NRML
134
elif productType == ProductType.CNC:
135
return kite.PRODUCT_CNC
136
return None
137
138
def convertToBrokerOrderType(self, orderType):
139
kite = self.brokerHandle
140
if orderType == OrderType.LIMIT:
141
return kite.ORDER_TYPE_LIMIT
142
elif orderType == OrderType.MARKET:
143
return kite.ORDER_TYPE_MARKET
144
elif orderType == OrderType.SL_MARKET:
145
return kite.ORDER_TYPE_SLM
146
elif orderType == OrderType.SL_LIMIT:
147
return kite.ORDER_TYPE_SL
148
return None
149
150
def convertToBrokerDirection(self, direction):
151
kite = self.brokerHandle
152
if direction == Direction.LONG:
153
return kite.TRANSACTION_TYPE_BUY
154
elif direction == Direction.SHORT:
155
return kite.TRANSACTION_TYPE_SELL
156
return None
157
158