Bläddra i källkod

market up - day coding

bobhk 9 år sedan
förälder
incheckning
0eaa576eb9

+ 26 - 6
src/misc2/helpers.py

@@ -218,18 +218,38 @@ class ContractHelper(BaseHelper):
 #change strike format to 2 dp     
 
 # 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 = ''
             
         if contract.m_expiry == None:
             contract.m_expiry = ''
             
+                        
         s = '%s-%s-%.2f-%s-%s-%s-%s-%d' % (contract.m_symbol,
                                                            contract.m_expiry,
                                                            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)
+        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)
-        #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:
             return OptionsChain.EMPTY_GREEKS
         o = option.get_contract()
@@ -240,12 +242,12 @@ class OptionsChain(Publisher):
             
             
         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, 
                                   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:
             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))

+ 8 - 3
src/rethink/portfolio_item.py

@@ -133,8 +133,9 @@ class PortfolioItem():
     
         try:
             assert contract_key == self.contract_key
+            spot_px = self.instrument.get_tick_value(4)
             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']
                 
                 pos_delta = self.get_quantity() * self.instrument.get_tick_value(Option.DELTA) * multiplier                                
@@ -157,6 +158,7 @@ class PortfolioItem():
                     average_px = float('nan')
                             
             else:
+                
                 pos_delta = self.get_quantity() * 1.0 * \
                                PortfolioRules.rule_map['option_structure'][self.get_symbol_id()]['multiplier'] 
                 pos_theta = 0
@@ -288,7 +290,8 @@ class Portfolio(AbstractTableModel):
                   ('avgpx', 'Avg Price', 'number'), ('spotpx', 'Spot Price', 'number'), ('pos', 'Quantity', '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'), 
-                  ('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):
         
@@ -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_GAMMA))},
              {'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     
     
     

+ 7 - 6
src/rethink/portfolio_monitor.py

@@ -24,8 +24,8 @@ class PortfolioMonitor(AbstractGatewayListener, AbstractPortfolioTableModelListe
     def __init__(self, kwargs):
         self.kwargs = copy.copy(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.register_listener(self)
@@ -38,13 +38,13 @@ class PortfolioMonitor(AbstractGatewayListener, AbstractPortfolioTableModelListe
             portfolios: {<account>: <portfolio>}
         '''
         self.portfolios = {}
-        
+        self.starting_engine = {}
         
     
     def start_engine(self):
         self.twsc.start_manager()
         self.twsc.reqPositions()
-        self.starting_engine = {}
+        
         try:
             logging.info('PortfolioMonitor:main_loop ***** accepting console input...')
             menu = {}
@@ -59,7 +59,8 @@ class PortfolioMonitor(AbstractGatewayListener, AbstractPortfolioTableModelListe
                 choices.sort()
                 for entry in choices: 
                     print entry, menu[entry]            
-
+                
+                sleep(0.15)
                 selection = raw_input("Enter command:")
                 if selection =='1':
                     self.twsc.reqPositions()
@@ -81,7 +82,7 @@ class PortfolioMonitor(AbstractGatewayListener, AbstractPortfolioTableModelListe
                 else: 
                     pass                
                 
-                sleep(0.15)
+                
             
         except (KeyboardInterrupt, SystemExit):
             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.helpers import ContractHelper
 from comms.ibc.base_client_messaging import AbstractGatewayListener
-import symbol
+import symbol, traceback
 
 class TickDataStore(Publisher):
     """
@@ -167,7 +167,7 @@ class TickDataStore(Publisher):
         except:
             # 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(traceback.format_exc())
             #self.dump()
             pass
         finally:

+ 3 - 3
src/ws/client_g.html

@@ -105,9 +105,9 @@
 			console.log(d1);
 			data = new google.visualization.DataTable(d1.value);
 			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});
 			output('number of rows: ' + data.getNumberOfRows());