bobhk 9 лет назад
Родитель
Сommit
0eaa576eb9

+ 26 - 6
src/misc2/helpers.py

@@ -218,18 +218,38 @@ class ContractHelper(BaseHelper):
 #change strike format to 2 dp     
 #change strike format to 2 dp     
 
 
 # amend 2017/04/25
 # amend 2017/04/25
-        if contract.m_exchange == None or contract.m_exchange == '':
-            try:
-                contract.m_exchange = ContractHelper.map_rules['exchange'][contract.m_symbol]
-            except:
-                contract.m_exchange = '' 
+        #if contract.m_exchange == None or contract.m_exchange == '':
+        
+# amend 2017/05/10
+        # only symbols with type = HSI/MHI will have the exchange key assigned 
+        # any other symbols will have their exchange set to empty
+        # this is to handle US stocks which could be traded on different exchanges
+        # and thus result in different exchange key but in reality they also refer
+        # to the same stock        
+        #
+        # example: FXP--0.00-0-STK-USD--102
+        #          FXP--0.00--STK-USD-ARCA-102
+        #  
+        try:
+            contract.m_exchange = ContractHelper.map_rules['exchange'][contract.m_symbol]
+        except:
+            contract.m_exchange = '' 
+            
+        
+
+# amend 2017/05/10
    
    
-        if contract.m_right == None:
+        '''
+            the contract object returned by TWS/IB API is not consistent between
+            different messages (position message and account messages)
+        '''
+        if contract.m_right == None or contract.m_right == '0' or contract.m_right == 0:
             contract.m_right = ''
             contract.m_right = ''
             
             
         if contract.m_expiry == None:
         if contract.m_expiry == None:
             contract.m_expiry = ''
             contract.m_expiry = ''
             
             
+                        
         s = '%s-%s-%.2f-%s-%s-%s-%s-%d' % (contract.m_symbol,
         s = '%s-%s-%.2f-%s-%s-%s-%s-%d' % (contract.m_symbol,
                                                            contract.m_expiry,
                                                            contract.m_expiry,
                                                            float(contract.m_strike),
                                                            float(contract.m_strike),

+ 7 - 5
src/rethink/option_chain.py

@@ -230,8 +230,10 @@ class OptionsChain(Publisher):
         '''
         '''
         
         
         uspot = uspot if not math.isnan(uspot) else self.get_underlying().get_tick_value(4)
         uspot = uspot if not math.isnan(uspot) else self.get_underlying().get_tick_value(4)
+        logging.info('************* cal_option_greeks option= %s' % ContractHelper.makeRedisKeyEx(option.get_contract()))
         premium = premium if not math.isnan(premium) else option.get_tick_value(4)
         premium = premium if not math.isnan(premium) else option.get_tick_value(4)
-        #logging.info('*************after>>>>>>> uspot=%8.2f option last=%8.2f pass premium=%8.2f' % (uspot, option.get_tick_value(4), premium))
+        
+        logging.info('*************after>>>>>>> uspot=%8.2f option last=%8.2f pass premium=%8.2f' % (uspot, option.get_tick_value(4), premium))
         if uspot is None:
         if uspot is None:
             return OptionsChain.EMPTY_GREEKS
             return OptionsChain.EMPTY_GREEKS
         o = option.get_contract()
         o = option.get_contract()
@@ -240,12 +242,12 @@ class OptionsChain(Publisher):
             
             
             
             
         try:
         try:
-            #logging.info('OptionChain:cal_option_greeks. ulspot->%8.4f, premium last->%8.4f ' % (uspot_last, option.get_tick_value(4)))
-            #logging.info('OptionChain:cal_option_greeks. o.m_strike %8.4f, o.m_right %s, valuation_date %s, o.m_expiry %s, self.rate %8.4f , self.div  %8.4f, self.trade_vol %8.4f ' % 
-            #            (o.m_strike, o.m_right, valuation_date,  o.m_expiry, self.rate, self.div, self.trade_vol))
+            logging.info('OptionChain:cal_option_greeks. uspot->%8.4f, premium last->%8.4f ' % (uspot, option.get_tick_value(4)))
+            logging.info('OptionChain:cal_option_greeks. o.m_strike %8.4f, o.m_right %s, valuation_date %s, o.m_expiry %s, self.rate %8.4f , self.div  %8.4f, self.trade_vol %8.4f ' % 
+                        (o.m_strike, o.m_right, valuation_date,  o.m_expiry, self.rate, self.div, self.trade_vol))
             iv = cal_implvol(uspot, o.m_strike, o.m_right, valuation_date, 
             iv = cal_implvol(uspot, o.m_strike, o.m_right, valuation_date, 
                                   o.m_expiry, self.rate, self.div, self.trade_vol, premium)
                                   o.m_expiry, self.rate, self.div, self.trade_vol, premium)
-            #logging.info('OptionChain:cal_option_greeks. cal results:iv=> %s' % str(iv))
+            logging.info('OptionChain:cal_option_greeks. cal results:iv=> %s' % str(iv))
         except RuntimeError:
         except RuntimeError:
             logging.warn('OptionChain:cal_option_greeks. Quantlib threw an error while calculating implied vol: use intrinsic: uspot->%8.2f premium->%8.2f strike->%8.2f right->%s sym->%s' % 
             logging.warn('OptionChain:cal_option_greeks. Quantlib threw an error while calculating implied vol: use intrinsic: uspot->%8.2f premium->%8.2f strike->%8.2f right->%s sym->%s' % 
                          (uspot, premium, o.m_strike, o.m_right, o.m_symbol))
                          (uspot, premium, o.m_strike, o.m_right, o.m_symbol))

+ 8 - 3
src/rethink/portfolio_item.py

@@ -133,8 +133,9 @@ class PortfolioItem():
     
     
         try:
         try:
             assert contract_key == self.contract_key
             assert contract_key == self.contract_key
+            spot_px = self.instrument.get_tick_value(4)
             if self.get_instrument_type() == 'OPT':
             if self.get_instrument_type() == 'OPT':
-                spot_px = self.instrument.get_tick_value(4)
+                #spot_px = self.instrument.get_tick_value(4)
                 multiplier =  PortfolioRules.rule_map['option_structure'][self.get_symbol_id()]['multiplier']
                 multiplier =  PortfolioRules.rule_map['option_structure'][self.get_symbol_id()]['multiplier']
                 
                 
                 pos_delta = self.get_quantity() * self.instrument.get_tick_value(Option.DELTA) * multiplier                                
                 pos_delta = self.get_quantity() * self.instrument.get_tick_value(Option.DELTA) * multiplier                                
@@ -157,6 +158,7 @@ class PortfolioItem():
                     average_px = float('nan')
                     average_px = float('nan')
                             
                             
             else:
             else:
+                
                 pos_delta = self.get_quantity() * 1.0 * \
                 pos_delta = self.get_quantity() * 1.0 * \
                                PortfolioRules.rule_map['option_structure'][self.get_symbol_id()]['multiplier'] 
                                PortfolioRules.rule_map['option_structure'][self.get_symbol_id()]['multiplier'] 
                 pos_theta = 0
                 pos_theta = 0
@@ -288,7 +290,8 @@ class Portfolio(AbstractTableModel):
                   ('avgpx', 'Avg Price', 'number'), ('spotpx', 'Spot Price', 'number'), ('pos', 'Quantity', 'number'), 
                   ('avgpx', 'Avg Price', 'number'), ('spotpx', 'Spot Price', 'number'), ('pos', 'Quantity', 'number'), 
                   ('delta', 'Delta', 'number'), ('theta', 'Theta', 'number'), ('gamma', 'Gamma', 'number'), 
                   ('delta', 'Delta', 'number'), ('theta', 'Theta', 'number'), ('gamma', 'Gamma', 'number'), 
                   ('pos_delta', 'P. Delta', 'number'), ('pos_theta', 'P. Theta', 'number'), ('pos_gamma', 'P. Gamma', 'number'), 
                   ('pos_delta', 'P. Delta', 'number'), ('pos_theta', 'P. Theta', 'number'), ('pos_gamma', 'P. Gamma', 'number'), 
-                  ('unreal_pl', 'Unreal P/L', 'number'), ('percent_gain_loss', '% gain/loss', 'number')  
+                  ('unreal_pl', 'Unreal P/L', 'number'), ('percent_gain_loss', '% gain/loss', 'number'),
+                  ('symbolid', 'Sym Id', 'string')
                   ]  
                   ]  
     def update_ckey_row_xref(self, contract_key, port_item):
     def update_ckey_row_xref(self, contract_key, port_item):
         
         
@@ -354,7 +357,9 @@ class Portfolio(AbstractTableModel):
              {'v': handle_NaN(x[1].get_port_field(PortfolioItem.POSITION_THETA))},
              {'v': handle_NaN(x[1].get_port_field(PortfolioItem.POSITION_THETA))},
              {'v': handle_NaN(x[1].get_port_field(PortfolioItem.POSITION_GAMMA))},
              {'v': handle_NaN(x[1].get_port_field(PortfolioItem.POSITION_GAMMA))},
              {'v': handle_NaN(x[1].get_port_field(PortfolioItem.UNREAL_PL))},
              {'v': handle_NaN(x[1].get_port_field(PortfolioItem.UNREAL_PL))},
-             {'v': handle_NaN(x[1].get_port_field(PortfolioItem.PERCENT_GAIN_LOSS))}]
+             {'v': handle_NaN(x[1].get_port_field(PortfolioItem.PERCENT_GAIN_LOSS))},
+             {'v': x[1].get_symbol_id()}
+             ]
         return rf     
         return rf     
     
     
     
     

+ 7 - 6
src/rethink/portfolio_monitor.py

@@ -24,8 +24,8 @@ class PortfolioMonitor(AbstractGatewayListener, AbstractPortfolioTableModelListe
     def __init__(self, kwargs):
     def __init__(self, kwargs):
         self.kwargs = copy.copy(kwargs)
         self.kwargs = copy.copy(kwargs)
         self.twsc = TWS_client_manager(kwargs)
         self.twsc = TWS_client_manager(kwargs)
-        AbstractGatewayListener.__init__(self, kwargs['name'])
-        AbstractPortfolioTableModelListener.__init__(self, kwargs['name'])
+        #AbstractGatewayListener.__init__(self, kwargs['name'])
+        #AbstractPortfolioTableModelListener.__init__(self, kwargs['name'])
     
     
         self.tds = TickDataStore(kwargs['name'])
         self.tds = TickDataStore(kwargs['name'])
         self.tds.register_listener(self)
         self.tds.register_listener(self)
@@ -38,13 +38,13 @@ class PortfolioMonitor(AbstractGatewayListener, AbstractPortfolioTableModelListe
             portfolios: {<account>: <portfolio>}
             portfolios: {<account>: <portfolio>}
         '''
         '''
         self.portfolios = {}
         self.portfolios = {}
-        
+        self.starting_engine = {}
         
         
     
     
     def start_engine(self):
     def start_engine(self):
         self.twsc.start_manager()
         self.twsc.start_manager()
         self.twsc.reqPositions()
         self.twsc.reqPositions()
-        self.starting_engine = {}
+        
         try:
         try:
             logging.info('PortfolioMonitor:main_loop ***** accepting console input...')
             logging.info('PortfolioMonitor:main_loop ***** accepting console input...')
             menu = {}
             menu = {}
@@ -59,7 +59,8 @@ class PortfolioMonitor(AbstractGatewayListener, AbstractPortfolioTableModelListe
                 choices.sort()
                 choices.sort()
                 for entry in choices: 
                 for entry in choices: 
                     print entry, menu[entry]            
                     print entry, menu[entry]            
-
+                
+                sleep(0.15)
                 selection = raw_input("Enter command:")
                 selection = raw_input("Enter command:")
                 if selection =='1':
                 if selection =='1':
                     self.twsc.reqPositions()
                     self.twsc.reqPositions()
@@ -81,7 +82,7 @@ class PortfolioMonitor(AbstractGatewayListener, AbstractPortfolioTableModelListe
                 else: 
                 else: 
                     pass                
                     pass                
                 
                 
-                sleep(0.15)
+                
             
             
         except (KeyboardInterrupt, SystemExit):
         except (KeyboardInterrupt, SystemExit):
             logging.error('PortfolioMonitor: caught user interrupt. Shutting down...')
             logging.error('PortfolioMonitor: caught user interrupt. Shutting down...')

+ 2 - 2
src/rethink/tick_datastore.py

@@ -5,7 +5,7 @@ from misc2.observer import Publisher
 from misc2.observer import NotImplementedException
 from misc2.observer import NotImplementedException
 from misc2.helpers import ContractHelper
 from misc2.helpers import ContractHelper
 from comms.ibc.base_client_messaging import AbstractGatewayListener
 from comms.ibc.base_client_messaging import AbstractGatewayListener
-import symbol
+import symbol, traceback
 
 
 class TickDataStore(Publisher):
 class TickDataStore(Publisher):
     """
     """
@@ -167,7 +167,7 @@ class TickDataStore(Publisher):
         except:
         except:
             # contract not set up in the datastore, ignore message
             # contract not set up in the datastore, ignore message
             logging.error('tick_datastore:set_symbol_tick_price: exception occured to: %s. Exception could have been triggered due to the dispatched client processing logic' % contract_key)
             logging.error('tick_datastore:set_symbol_tick_price: exception occured to: %s. Exception could have been triggered due to the dispatched client processing logic' % contract_key)
-            
+            logging.error(traceback.format_exc())
             #self.dump()
             #self.dump()
             pass
             pass
         finally:
         finally:

+ 3 - 3
src/ws/client_g.html

@@ -105,9 +105,9 @@
 			console.log(d1);
 			console.log(d1);
 			data = new google.visualization.DataTable(d1.value);
 			data = new google.visualization.DataTable(d1.value);
 			view = new google.visualization.DataView(data);
 			view = new google.visualization.DataView(data);
-			view.setRows(view.getFilteredRows([{column: 6, test: function(value, row, column, table) {
-        return (value != 0) 
-    }}]));
+			/*view.setRows(view.getFilteredRows([{column: 14, test: function(value, row, column, table) {
+        return (value == 'HSI' || value == 'MHI') 
+    }}]));*/
 			table.draw(view, {sortColumn:1});
 			table.draw(view, {sortColumn:1});
 			output('number of rows: ' + data.getNumberOfRows());
 			output('number of rows: ' + data.getNumberOfRows());