quote_handler.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import logging
  2. from misc2.observer import Subscriber
  3. from misc2.helpers import ContractHelper
  4. from copy import deepcopy
  5. import traceback
  6. from finopt.instrument import Symbol
  7. class QuoteRESTHandler(Subscriber):
  8. '''
  9. self.symbols = {contract_key: Symbol, ...}
  10. '''
  11. def __init__(self, name, gw_parent):
  12. self.symbols = {}
  13. self.name = name
  14. self.gw_parent = gw_parent
  15. self.tws_event_handler = gw_parent.get_tws_event_handler()
  16. self.sub_mgr = gw_parent.get_subscription_manager()
  17. Subscriber.__init__(self, self.name)
  18. '''
  19. ask tws_event_handler to forward tick messages to
  20. this class
  21. '''
  22. for e in ['tickPrice', 'tickSize', 'tickOptionComputation', 'error']:
  23. self.tws_event_handler.register(e, self)
  24. def handle_tickprice(self, contract_key, field, price, canAutoExecute):
  25. logging.debug('QuoteHandler:tickPrice')
  26. try:
  27. s = self.symbols[contract_key]
  28. except KeyError:
  29. s = Symbol(ContractHelper.makeContractfromRedisKeyEx(contract_key))
  30. self.symbols[contract_key] = s
  31. s.set_tick_value(field, price)
  32. def handle_ticksize(self, contract_key, field, size):
  33. logging.debug('QuoteHandler:ticksize')
  34. try:
  35. s = self.symbols[contract_key]
  36. except KeyError:
  37. s = Symbol(ContractHelper.makeContractfromRedisKeyEx(contract_key))
  38. self.symbols[contract_key] = s
  39. s.set_tick_value(field, size)
  40. def handle_tickgreeks(self, **params):
  41. logging.debug('QuoteHandler:tickOptionComputation')
  42. try:
  43. contract_key = params['contract_key']
  44. s = self.symbols[contract_key]
  45. except KeyError:
  46. s = Symbol(ContractHelper.makeContractfromRedisKeyEx(contract_key))
  47. self.symbols[contract_key] = s
  48. greeks = deepcopy(params)
  49. del greeks['greeks']['field']
  50. del greeks['contract_key']
  51. s.set_ib_option_greeks(params['greeks']['field'], greeks['greeks'])
  52. def update(self, event, **param):
  53. if event == 'tickPrice':
  54. self.handle_tickprice(**param)
  55. elif event == 'tickSize':
  56. self.handle_ticksize(**param)
  57. elif event == 'tickOptionComputation':
  58. self.handle_tickgreeks(**param)
  59. elif event == 'error':
  60. try:
  61. if param['id'] >= 1000 and param['id'] < 1999:
  62. ckey = self.sub_mgr.get_contract_key_by_id(param['id']-1000)
  63. self.symbols[ckey] = {'error': param['errorMsg']}
  64. except:
  65. pass
  66. def get_symbol(self, contract):
  67. try:
  68. return self.symbols[ContractHelper.makeRedisKeyEx(contract)]
  69. except KeyError:
  70. return None