order_manager.py 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import logging
  4. from time import strftime
  5. import json
  6. from misc2.helpers import ContractHelper
  7. from ib.ext.Contract import Contract
  8. from comms.ibgw.base_messaging import BaseMessageListener
  9. from comms.ibgw.tws_event_handler import TWS_event_handler
  10. from __main__ import name
  11. from _ast import Name
  12. class OrderBook():
  13. def __init__(self, name):
  14. '''
  15. orderbook:
  16. contains orders which is a dict that maps tws orderId
  17. each order has an order_status map
  18. each order has an order_status_hist which is a list to previous order_status
  19. each order has an exec_status_hist which is a list of executions
  20. '''
  21. self.name = name
  22. self.orders = {}
  23. def update_order_status(self, orderId, status, filled, remaining, avgFillPrice, permId, parentId, lastFillPrice, clientId, whyHeld):
  24. if orderId in self.orders:
  25. self.orders[orderId]['order_status']['status'] = status
  26. self.orders[orderId]['order_status']['filled'] = filled
  27. self.orders[orderId]['order_status']['remaining'] = remaining
  28. self.orders[orderId]['order_status']['avgFillPrice'] = avgFillPrice
  29. self.orders[orderId]['order_status']['permId'] = permId
  30. self.orders[orderId]['order_status']['parentId'] = parentId
  31. self.orders[orderId]['order_status']['lastFillPrice'] = lastFillPrice
  32. self.orders[orderId]['order_status']['clientId'] = clientId
  33. self.orders[orderId]['order_status']['whyHeld'] = whyHeld
  34. else:
  35. logging.warn('OrderBook:update_order_status. orderId %d key not found in the dict.' % orderId)
  36. class OrderManager(BaseMessageListener):
  37. def __init__(self, name, tws_connection, producer, rs_conn, kwargs):
  38. self.name = name
  39. self.tws_connect = tws_connection
  40. self.order_book = OrderBook(self.name)
  41. self.order_id = self.load_order_id()
  42. def load_order_id(self):
  43. return -1
  44. def get_next_order_id(self):
  45. self.order_id = self.order_id + 1
  46. return self.order_id
  47. def place_order(self, event, client_order_id, contract_key, side, quantity, price):
  48. logging.info('OrderManager:place_order. client_order_id %d, contract %s, side %s, qty %d, price %8.2f' %
  49. (client_order_id, contract_key, side, quantity, price))
  50. '''
  51. insert a new entry into the orderbook
  52. get the next order id
  53. submit order request to tws
  54. '''
  55. try:
  56. vals = json.loads(value)
  57. except ValueError:
  58. logging.error('TWS_gateway - placeOrder Exception %s' % traceback.format_exc())
  59. return
  60. # c = ContractHelper.kvstring2contract(vals[1])
  61. o = OrderHelper.kvstring2object(vals[2], Order)
  62. o.__dict__['transmit'] = self.ib_order_transmit
  63. # print c.__dict__
  64. # print o.__dict__
  65. # print '---------------------'
  66. #self.connection.placeOrder(vals[0], ContractHelper.kvstring2contract(vals[1]), OrderHelper.kvstring2object(vals[2], Order))
  67. self.tws_connect.placeOrder(vals[0], ContractHelper.kvstring2object(vals[1], Contract), OrderHelper.kvstring2object(vals[2], Order))
  68. # self.connection.placeOrder(orderId, contract, newOptOrder)