tws_event_handler.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from misc2.helpers import ContractHelper
  4. import logging
  5. import traceback
  6. from ib.ext.EWrapper import EWrapper
  7. class TWS_event_handler(EWrapper):
  8. TICKER_GAP = 1000
  9. producer = None
  10. def __init__(self, producer):
  11. self.producer = producer
  12. def set_subscription_manager(self, subscription_manager):
  13. self.subscription_manger = subscription_manager
  14. def broadcast_event(self, message, mapping):
  15. try:
  16. dict = self.pre_process_message(message, mapping)
  17. logging.info('broadcast_event %s:%s' % (message, dict))
  18. self.producer.send_message(message, self.producer.message_dumps(dict))
  19. except:
  20. logging.error('broadcast_event: exception while encoding IB event to client: [%s]' % message)
  21. logging.error(traceback.format_exc())
  22. def pre_process_message(self, message_name, items):
  23. t = items.copy()
  24. try:
  25. del(t['self'])
  26. except (KeyError, ):
  27. pass
  28. for k,v in t.iteritems():
  29. #print k, v, type(v)
  30. #if type(v) in [Contract, Execution, ExecutionFilter, OrderState, Order, CommissionReport]:
  31. if 'ib.ext.' in str(type(v)):
  32. t[k] = v.__dict__
  33. elif 'exceptions.' in str(type(v)):
  34. t[k] = '%s:%s' % (str(type(v)), str(v))
  35. else:
  36. t[k] = v
  37. return t
  38. def tickPrice(self, tickerId, field, price, canAutoExecute):
  39. logging.info('TWS_event_handler:tickPrice. %d<->%s' % (tickerId,self.subscription_manger.get_contract_by_id(tickerId) ))
  40. self.broadcast_event('tickPrice', {'contract_key': self.subscription_manger.get_contract_by_id(tickerId),
  41. 'field': field, 'price': price, 'canAutoExecute': canAutoExecute})
  42. #pass
  43. def tickSize(self, tickerId, field, size):
  44. logging.info('TWS_event_handler:tickSize. %d<->%s' % (tickerId,self.subscription_manger.get_contract_by_id(tickerId) ))
  45. self.broadcast_event('tickSize', {'contract_key': self.subscription_manger.get_contract_by_id(tickerId),
  46. 'field': field, 'size': size})
  47. #pass
  48. def tickOptionComputation(self, tickerId, field, impliedVol, delta, optPrice, pvDividend, gamma, vega, theta, undPrice):
  49. #self.broadcast_event('tickOptionComputation', self.pre_process_message(vars())) #vars())
  50. pass
  51. def tickGeneric(self, tickerId, tickType, value):
  52. #self.broadcast_event('tickGeneric', vars())
  53. pass
  54. def tickString(self, tickerId, tickType, value):
  55. #self.broadcast_event('tickString', vars())
  56. pass
  57. def tickEFP(self, tickerId, tickType, basisPoints, formattedBasisPoints, impliedFuture, holdDays, futureExpiry, dividendImpact, dividendsToExpiry):
  58. #self.broadcast_event('tickEFP', vars())
  59. pass
  60. def orderStatus(self, orderId, status, filled, remaining, avgFillPrice, permId, parentId, lastFillPrice, clientId, whyHeId):
  61. pass
  62. def openOrder(self, orderId, contract, order, state):
  63. pass
  64. def openOrderEnd(self):
  65. pass
  66. def updateAccountValue(self, key, value, currency, accountName):
  67. logging.info('TWS_event_handler:updateAccountValue. [%s]:%s' % (key.ljust(40), value))
  68. self.broadcast_event('updateAccountValue', {'key': key,
  69. 'value': value, 'currency': currency, 'account':accountName})
  70. def updatePortfolio(self, contract, position, marketPrice, marketValue, averageCost, unrealizedPNL, realizedPNL, accountName):
  71. contract_key= ContractHelper.makeRedisKeyEx(contract)
  72. logging.info('TWS_event_handler:updatePortfolio. [%s]:position= %d' % (contract_key, position))
  73. self.broadcast_event('updatePortfolio', {
  74. 'contract_key': contract_key,
  75. 'position': position, 'market_price': marketPrice,
  76. 'market_value': marketValue, 'average_cost': averageCost,
  77. 'unrealized_PNL': unrealizedPNL, 'realized_PNL': realizedPNL,
  78. 'account': accountName
  79. })
  80. def updateAccountTime(self, timeStamp):
  81. self.broadcast_event('updateAccountTime', {'timestamp': timeStamp})
  82. def accountDownloadEnd(self, accountName):
  83. self.broadcast_event('accountDownloadEnd', {'account':accountName})
  84. def nextValidId(self, orderId):
  85. self.broadcast_event('nextValidId', vars())
  86. def contractDetails(self, reqId, contractDetails):
  87. self.broadcast_event('contractDetails', vars())
  88. def contractDetailsEnd(self, reqId):
  89. self.broadcast_event('contractDetailsEnd', vars())
  90. def bondContractDetails(self, reqId, contractDetails):
  91. self.broadcast_event('bondContractDetails', vars())
  92. def execDetails(self, reqId, contract, execution):
  93. self.broadcast_event('execDetails', vars())
  94. def execDetailsEnd(self, reqId):
  95. self.broadcast_event('execDetailsEnd', vars())
  96. def connectionClosed(self):
  97. self.broadcast_event('connectionClosed', {})
  98. def error(self, id=None, errorCode=None, errorMsg=None):
  99. try:
  100. logging.error(self.pre_process_message('error', vars()))
  101. self.broadcast_event('error', {'id': id,
  102. 'errorCode': errorCode, 'errorMsg': errorMsg})
  103. except:
  104. pass
  105. def error_0(self, strvalue=None):
  106. logging.error(self.pre_process_message('error_0', vars()))
  107. self.broadcast_event('error_0', vars())
  108. def error_1(self, id=None, errorCode=None, errorMsg=None):
  109. logging.error(self.pre_process_message('error_1', vars()))
  110. self.broadcast_event('error_1', vars())
  111. def updateMktDepth(self, tickerId, position, operation, side, price, size):
  112. self.broadcast_event('updateMktDepth', vars())
  113. def updateMktDepthL2(self, tickerId, position, marketMaker, operation, side, price, size):
  114. self.broadcast_event('updateMktDepthL2', vars())
  115. def updateNewsBulletin(self, msgId, msgType, message, origExchange):
  116. self.broadcast_event('updateNewsBulletin', vars())
  117. def managedAccounts(self, accountsList):
  118. logging.info(self.pre_process_message('managedAccounts', vars()))
  119. self.broadcast_event('managedAccounts', vars())
  120. def receiveFA(self, faDataType, xml):
  121. self.broadcast_event('receiveFA', vars())
  122. def historicalData(self, reqId, date, open, high, low, close, volume, count, WAP, hasGaps):
  123. self.broadcast_event('historicalData', vars())
  124. def scannerParameters(self, xml):
  125. self.broadcast_event('scannerParameters', vars())
  126. def scannerData(self, reqId, rank, contractDetails, distance, benchmark, projection, legsStr):
  127. self.broadcast_event('scannerData', vars())
  128. def commissionReport(self, commissionReport):
  129. self.broadcast_event('commissionReport', vars())
  130. def currentTime(self, time):
  131. self.broadcast_event('currentTime', vars())
  132. def deltaNeutralValidation(self, reqId, underComp):
  133. self.broadcast_event('deltaNeutralValidation', vars())
  134. def fundamentalData(self, reqId, data):
  135. self.broadcast_event('fundamentalData', vars())
  136. def marketDataType(self, reqId, marketDataType):
  137. self.broadcast_event('marketDataType', vars())
  138. def realtimeBar(self, reqId, time, open, high, low, close, volume, wap, count):
  139. self.broadcast_event('realtimeBar', vars())
  140. def scannerDataEnd(self, reqId):
  141. self.broadcast_event('scannerDataEnd', vars())
  142. def tickSnapshotEnd(self, reqId):
  143. self.broadcast_event('tickSnapshotEnd', vars())
  144. def position(self, account, contract, pos, avgCost):
  145. contract_key= ContractHelper.makeRedisKeyEx(contract)
  146. logging.info('TWS_event_handler:position. [%s]:position= %d' % (contract_key, pos))
  147. self.broadcast_event('position', {
  148. 'account': account,
  149. 'contract_key': contract_key,
  150. 'position': pos, 'average_cost': avgCost
  151. })
  152. def positionEnd(self):
  153. self.broadcast_event('positionEnd', {})
  154. def accountSummary(self, reqId, account, tag, value, currency):
  155. self.broadcast_event('accountSummary', vars())
  156. def accountSummaryEnd(self, reqId):
  157. self.broadcast_event('accountSummaryEnd', vars())