gw_ex_request_exit.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from time import sleep, strftime
  4. import logging
  5. import json
  6. import sys
  7. from ib.ext.Contract import Contract
  8. from optparse import OptionParser
  9. from misc2.helpers import ContractHelper, HelperFunctions
  10. from comms.ibgw.base_messaging import Prosumer
  11. from comms.tws_protocol_helper import TWS_Protocol
  12. from comms.ibc.tws_client_lib import TWS_client_manager, AbstractGatewayListener
  13. from QuantLib._QuantLib import VanillaOption_priceCurve
  14. from rethink.tick_datastore import TickDataStore
  15. from finopt.instrument import Symbol
  16. class MessageListener(AbstractGatewayListener):
  17. def __init__(self, name, tick_ds):
  18. AbstractGatewayListener.__init__(self, name)
  19. self.tick_ds = tick_ds
  20. def position(self, event, account, contract_key, pos, avg_cost):
  21. """ generated source for method position """
  22. logging.info('%s [[ %s ]]' % (event, vars()))
  23. def positionEnd(self, event): #, message_value):
  24. """ generated source for method positionEnd """
  25. logging.info('%s [[ %s ]]' % (event, vars()))
  26. def error(self, event, id, errorCode, errorMsg):
  27. logging.info('MessageListener:%s. val->[%s]' % (event, vars()))
  28. def updateAccountValue(self, event, key, value, currency, account): # key, value, currency, accountName):
  29. """ generated source for method updateAccountValue """
  30. logging.info('%s [[ %s ]]' % (event, vars()))
  31. def updatePortfolio(self, event, contract_key, position, market_price, market_value, average_cost, unrealized_PNL, realized_PNL, account):
  32. """ generated source for method updatePortfolio """
  33. logging.info('%s [[ %s ]]' % (event, vars()))
  34. def updateAccountTime(self, event, timestamp):
  35. """ generated source for method updateAccountTime """
  36. logging.info('%s [[ %s ]]' % (event, vars()))
  37. def accountDownloadEnd(self, event, account): # accountName):
  38. """ generated source for method accountDownloadEnd """
  39. logging.info('%s [[ %s ]]' % (event, vars()))
  40. def tickPrice(self, event, contract_key, field, price, canAutoExecute):
  41. #logging.info('MessageListener:%s. %s %d %8.2f' % (event, contract_key, field, price))
  42. self.tick_ds.set_symbol_tick_price(contract_key, field, price, canAutoExecute)
  43. def tickSize(self, event, contract_key, field, size):
  44. self.tick_ds.set_symbol_tick_price(contract_key, field, size, 0)
  45. #logging.info('MessageListener:%s. %s: %d %8.2f' % (event, contract_key, field, size))
  46. def test_client(kwargs):
  47. ts = TickDataStore(kwargs['name'])
  48. cm = TWS_client_manager(kwargs)
  49. cl = MessageListener('gw_client_message_listener', ts)
  50. cm.add_listener_topics(cl, kwargs['topics'])
  51. cm.start_manager()
  52. contractTuples = [('HSI', 'FUT', 'HKFE', 'HKD', '20170330', 0, ''),
  53. ('USD', 'CASH', 'IDEALPRO', 'JPY', '', 0, ''),
  54. ('AUD', 'CASH', 'IDEALPRO', 'USD', '', 0, ''),
  55. ('QQQ', 'STK', 'SMART', 'USD', '', 0, ''),
  56. ('YM', 'IND', 'ECBOT', 'USD', '', 0, ''),
  57. ]
  58. map(lambda x: cm.reqMktData(ContractHelper.makeContract(x), False), contractTuples)
  59. syms = map(lambda x: Symbol(ContractHelper.makeContract(x)), contractTuples)
  60. map(lambda x: ts.add_symbol(x), syms)
  61. #cm.reqPositions()
  62. #cm.reqMktData(ContractHelper.makeContract(contractTuples[1]), False)
  63. try:
  64. logging.info('TWS_gateway:main_loop ***** accepting console input...')
  65. while not cm.is_stopped():
  66. sleep(.45)
  67. read_ch = raw_input("Enter command:")
  68. ts.dump()
  69. except (KeyboardInterrupt, SystemExit):
  70. logging.error('TWS_client_manager: caught user interrupt. Shutting down...')
  71. cm.gw_message_handler.set_stop()
  72. logging.info('TWS_client_manager: Service shut down complete...')
  73. print 'end of test_client function'
  74. def test_client2(kwargs):
  75. ts = TickDataStore(kwargs['name'])
  76. cm = TWS_client_manager(kwargs)
  77. cl = MessageListener('gw_client_message_listener', ts)
  78. cm.add_listener_topics(cl, kwargs['topics'])
  79. cm.start_manager()
  80. #cm.reqPositions()
  81. cm.reqAccountUpdates(True, 'U8379890')
  82. try:
  83. logging.info('TWS_gateway:main_loop ***** accepting console input...')
  84. while not cm.is_stopped():
  85. sleep(.45)
  86. read_ch = raw_input("Enter command:")
  87. except (KeyboardInterrupt, SystemExit):
  88. logging.error('TWS_client_manager: caught user interrupt. Shutting down...')
  89. cm.gw_message_handler.set_stop()
  90. logging.info('TWS_client_manager: Service shut down complete...')
  91. print 'end of test_client function'
  92. if __name__ == '__main__':
  93. kwargs = {
  94. 'name': 'simple_request',
  95. 'bootstrap_host': 'localhost',
  96. 'bootstrap_port': 9092,
  97. 'redis_host': 'localhost',
  98. 'redis_port': 6379,
  99. 'redis_db': 0,
  100. 'tws_host': 'localhost',
  101. 'tws_api_port': 8496,
  102. 'tws_app_id': 38868,
  103. 'group_id': 'EX_REQUEST',
  104. 'session_timeout_ms': 10000,
  105. 'clear_offsets': False,
  106. 'logconfig': {'level': logging.INFO},
  107. 'topics': ['tickSize', 'tickPrice', 'position', 'positionEnd'],
  108. 'seek_to_end': ['tickPrice', 'tickSize','position', 'positionEnd'],
  109. }
  110. usage = "usage: %prog [options]"
  111. parser = OptionParser(usage=usage)
  112. parser.add_option("-c", "--clear_offsets", action="store_true", dest="clear_offsets",
  113. help="delete all redis offsets used by this program")
  114. parser.add_option("-g", "--group_id",
  115. action="store", dest="group_id",
  116. help="assign group_id to this running instance")
  117. parser.add_option("-n", "--name",
  118. action="store", dest="name",
  119. help="assign an identifier to this running instance")
  120. (options, args) = parser.parse_args()
  121. if options.name == None or options.group_id == None:
  122. print "Name or Group id was not specified. Use -h to see all options. Exiting..."
  123. sys.exit()
  124. for option, value in options.__dict__.iteritems():
  125. if value <> None:
  126. kwargs[option] = value
  127. print kwargs
  128. logconfig = kwargs['logconfig']
  129. logconfig['format'] = '%(asctime)s %(levelname)-8s %(message)s'
  130. logging.basicConfig(**logconfig)
  131. test_client2(kwargs)