| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- import logging
- from misc2.observer import Subscriber
- from misc2.helpers import ContractHelper
- from copy import deepcopy
- import traceback
- from finopt.instrument import Symbol
- class QuoteRESTHandler(Subscriber):
- '''
-
- self.symbols = {contract_key: Symbol, ...}
-
- '''
-
- def __init__(self, name, gw_parent):
-
- self.symbols = {}
- self.name = name
- self.gw_parent = gw_parent
- self.tws_event_handler = gw_parent.get_tws_event_handler()
- self.sub_mgr = gw_parent.get_subscription_manager()
-
- Subscriber.__init__(self, self.name)
-
- '''
- ask tws_event_handler to forward tick messages to
- this class
-
- '''
- for e in ['tickPrice', 'tickSize', 'tickOptionComputation', 'error']:
- self.tws_event_handler.register(e, self)
-
- def handle_tickprice(self, contract_key, field, price, canAutoExecute):
- logging.debug('QuoteHandler:tickPrice')
- try:
- s = self.symbols[contract_key]
- except KeyError:
- s = Symbol(ContractHelper.makeContractfromRedisKeyEx(contract_key))
- self.symbols[contract_key] = s
- s.set_tick_value(field, price)
-
-
-
-
- def handle_ticksize(self, contract_key, field, size):
- logging.debug('QuoteHandler:ticksize')
- try:
- s = self.symbols[contract_key]
- except KeyError:
- s = Symbol(ContractHelper.makeContractfromRedisKeyEx(contract_key))
- self.symbols[contract_key] = s
- s.set_tick_value(field, size)
- def handle_tickgreeks(self, **params):
- logging.debug('QuoteHandler:tickOptionComputation')
- try:
- contract_key = params['contract_key']
- s = self.symbols[contract_key]
- except KeyError:
- s = Symbol(ContractHelper.makeContractfromRedisKeyEx(contract_key))
- self.symbols[contract_key] = s
- greeks = deepcopy(params)
- del greeks['greeks']['field']
- del greeks['contract_key']
- s.set_ib_option_greeks(params['greeks']['field'], greeks['greeks'])
-
- def update(self, event, **param):
- if event == 'tickPrice':
- self.handle_tickprice(**param)
- elif event == 'tickSize':
- self.handle_ticksize(**param)
- elif event == 'tickOptionComputation':
- self.handle_tickgreeks(**param)
- elif event == 'error':
- try:
-
- if param['id'] >= 1000 and param['id'] < 1999:
- ckey = self.sub_mgr.get_contract_key_by_id(param['id']-1000)
- self.symbols[ckey] = {'error': param['errorMsg']}
-
- except:
- pass
-
-
- def get_symbol(self, contract):
- try:
- return self.symbols[ContractHelper.makeRedisKeyEx(contract)]
- except KeyError:
- return None
-
|