Browse Source

replace tick value indices with constant names

laxaurus 6 năm trước cách đây
mục cha
commit
fa422e942a

+ 3 - 0
src/finopt/options_chain.py

@@ -518,7 +518,10 @@ class OptionsCalculationEngine(SimpleTWSClient):
                 o.set_tick_value(field, items.__dict__['price'])
 
                 try:
+			
                     spot = self.get_underlying_in_chain(tick2oc_slot[0]).get_tick_value(4)
+					   
+			
                     
                     # the underlying price may not be available when we receive tick price for options
                     if spot <> None:

+ 1 - 0
src/html/client_g.html

@@ -320,6 +320,7 @@ table.minimalistBlack tfoot td {
 			  		tableChart.chart = new google.visualization.Table(document.getElementById('table_div'));
 			  		tableChart.chart.draw(tableChart.view, tableChart.options);
 					output('number of rows: ' + tableChart.data.getNumberOfRows());
+					console.log(d1.value);
 					
 				} else if (d1.source.class == 'PortfolioColumnChartTM'){
 					columnChart.data = new google.visualization.DataTable(d1.value);

+ 9 - 4
src/rethink/option_chain.py

@@ -307,13 +307,13 @@ class OptionsChain(Publisher):
         
         
         # if uspot is not a number, try to get its last px
-        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(Symbol.LAST)
         # if px is still invalid, try close px
-        uspot = uspot if not uspot is None else self.get_underlying().get_tick_value(6)
+        uspot = uspot if not uspot is None else self.get_underlying().get_tick_value(Symbol.CLOSE)
         
         #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 premium is None else option.get_tick_value(6)
+        premium = premium if not math.isnan(premium) else option.get_tick_value(Symbol.LAST)
+        premium = premium if not premium is None else option.get_tick_value(Symbol.CLOSE)
         
         
         
@@ -358,6 +358,11 @@ class OptionsChain(Publisher):
         return greeks
      
     def pretty_print(self):
+        '''
+        
+            pretty print will fail if either the put or call of the same strike is not in the chain 
+        
+        '''
         sorted_opt = sorted(map(lambda i: (self.options[i].get_contract().m_strike, self.options[i]) , range(len(self.options))))
         
         def format_tick_val(val, fmt):

+ 1 - 1
src/rethink/portfolio_column_chart.py

@@ -186,7 +186,7 @@ class PortfolioColumnChart():
             return 1
         
         map(update_ijv, ijv_dist)
-        #print xy_arr
+        print xy_arr
         logging.info('PortfolioColumnChart: JSON array->\n%s' % xy_arr)
         
         def gen_datatable():

+ 11 - 2
src/rethink/portfolio_item.py

@@ -137,8 +137,8 @@ class PortfolioItem():
     
         try:
             assert contract_key == self.contract_key
-            spot_px = self.instrument.get_tick_value(4)
-            spot_px = spot_px if not spot_px is None else self.instrument.get_tick_value(6)
+            spot_px = self.instrument.get_tick_value(Symbol.LAST)
+            spot_px = spot_px if not spot_px is None else self.instrument.get_tick_value(Symbol.CLOSE)
             qty = self.get_quantity()
             if qty == 0:
                 self.set_port_field(PortfolioItem.POSITION_DELTA, 0.0)
@@ -274,6 +274,13 @@ class Portfolio(AbstractTableModel):
     def get_account(self):
         return self.account
     
+    def get_strikes(self):
+        strikes = []
+        for x in self.port['port_items'].iteritems():
+            strikes.append(x)
+        
+        return strikes
+    
     def is_contract_in_portfolio(self, contract_key):
         return self.get_portfolio_port_item(contract_key)
             
@@ -330,6 +337,8 @@ class Portfolio(AbstractTableModel):
             self.port['port_items'][contract_key].calculate_pl(contract_key)
         except:
             logging.error('PortfolioItem:calculate_item_pl *** ERROR: port a/c [%s], contract_key [%s]' % (self.get_account(), contract_key))
+
+    
         
     def calculate_port_pl(self):
 

+ 15 - 10
src/rethink/portfolio_monitor.py

@@ -20,7 +20,7 @@ from rethink.portfolio_item import PortfolioItem, PortfolioRules, Portfolio, Por
 from rethink.portfolio_column_chart import PortfolioColumnChart,PortfolioColumnChartTM
 from rethink.table_model import AbstractTableModel, AbstractPortfolioTableModelListener
 from comms.ibc.tws_client_lib import TWS_client_manager, AbstractGatewayListener
-from pip._internal.req.constructors import deduce_helpful_msg
+#from pip._internal.req.constructors import deduce_helpful_msg
 
 
 
@@ -104,6 +104,8 @@ class PortfolioMonitor(AbstractGatewayListener, AbstractPortfolioTableModelListe
                 
                 if response[0] is not None:
                     selection = response[0]
+		    if selection =='':
+			continue
                     if selection =='1':
                         self.twsc.reqPositions()
                     elif selection == '2': 
@@ -130,23 +132,22 @@ class PortfolioMonitor(AbstractGatewayListener, AbstractPortfolioTableModelListe
                             pc = PortfolioColumnChart(self.portfolios[acct])
                             print pc.get_JSON()
                             print pc.get_xy_array()
-                    elif selection == '8':
+                    elif selection[0] == '8':
                         try:
-                            
-                            contract_key = response[1]
-                            field = int(response[2])
+                            params = selection.split(' ')
+                            contract_key = params[1]
+                            field = int(params[2])
                             if field not in (InstrumentIdMap.idmap.keys()):
                                 raise Exception('invalid field')
-                            price = float(response[3])
+                            price = float(params[3])
                             logging.info('PortfolioMonitor: manual adjustment to tds table')
                             logging.info('PortfolioMonitor: [%s] field[%s]:%s')
-                            self.tds.set_symbol_tick_price(self, contract_key, field, price)
+                            self.tds.set_symbol_tick_price(contract_key, field, price, None)
                         except:
                             print "error in input values"
                             continue
                     elif selection == 'a':
                         today = datetime.now()
-                        month = int(today.strftime('%m'))
                         past =  today + relativedelta(months=-1)
                         exec_filter = ExecutionFilterHelper.kv2object({'m_time': past.strftime('%Y%m%d %H:%M:%S')}, ExecutionFilter)
                         self.twsc.reqExecutions(exec_filter)
@@ -313,6 +314,7 @@ class PortfolioMonitor(AbstractGatewayListener, AbstractPortfolioTableModelListe
                     oc = self.get_portfolio_option_chain(account, underlying)
                     instrument.set_extra_attributes(OptionsChain.CHAIN_IDENTIFIER, oc.get_name())
                     oc.add_option(instrument)
+                    logging.info('PortfolioMonitor:process_position. adding [%s] to oc [%s]' % (contract_key, oc.get_name()))
                 else:
                     logging.error('PortfolioMonitor:process_position. **** Error in adding the new position %s' % contract_key)
 
@@ -579,7 +581,10 @@ class PortfolioMonitor(AbstractGatewayListener, AbstractPortfolioTableModelListe
     def event_request_port_summary(self, event, request_id, account):
         try:
             port = self.portfolios[account]
-            self.notify_port_values_updated(account, port)
+                        
+            self.twsc.reqAccountUpdates(True, account)
+            self.notify_port_values_updated(account, port)            
+            
         except:
             logging.error('PortfolioMonitor:event_request_port_summary failed to request port summary for [%s]' % account)
     
@@ -652,4 +657,4 @@ if __name__ == '__main__':
     server.start_engine()
     
           
-        
+        

+ 1 - 1
src/rethink/table_model.py

@@ -76,7 +76,7 @@ class AbstractTableModelListener(BaseMessageListener):
     def event_tm_table_row_updated(self, event, source, row, row_values):   
         logging.info("[%s] received %s content:[%s]" % (self.name, event, vars()))
     
-    def event_tm_table_structure_changed(self, event, source, origin_request_id, account, data_table_json):
+    def event_tm_table_structure_changed(self, event, source, origin_request_id, account, data_table_json, strikes):
         logging.info("[%s] received %s content:[%s]" % (self.name, event, vars()))
         
     def event_tm_request_table_structure(self, event, request_id, target_resource, account):

+ 2 - 2
src/sh/pm.sh

@@ -13,5 +13,5 @@ else
 				
 fi
 export PYTHONPATH=$FINOPT_HOME:$PYTHONPATH
-#python $FINOPT_HOME/rethink/portfolio_monitor.py  -c -g PM1  
-python $FINOPT_HOME/rethink/portfolio_monitor.py -g PM1
+python $FINOPT_HOME/rethink/portfolio_monitor.py  -c -g PM1  
+#python $FINOPT_HOME/rethink/portfolio_monitor.py -g PM1

+ 27 - 0
src/sh/weekly__download.sh

@@ -0,0 +1,27 @@
+#!/bin/bash
+
+echo "This script downloads daily market statistics from hkex website"
+
+HOST=$(hostname)
+if [ $HOST == 'hkc-larryc-vm1' ]; then
+	FINOPT_HOME=~/ironfly-workspace/finopt/src
+elif [ $HOST == 'astron' ]; then
+	FINOPT_HOME=~/workspace/finopt/src
+else
+	FINOPT_HOME=~/l1304/workspace/finopt-ironfly/finopt/src
+fi
+
+
+export PYTHONPATH=$FINOPT_HOME:$PYTHONPATH
+
+python $FINOPT_HOME/hkex/daily_download.py -f ../config/daily_download.cfg --day 190301 --download_types abcdefghijklm 
+python $FINOPT_HOME/hkex/daily_download.py -f ../config/daily_download.cfg --day 190304 --download_types abcdefghijklm 
+python $FINOPT_HOME/hkex/daily_download.py -f ../config/daily_download.cfg --day 190305 --download_types abcdefghijklm 
+python $FINOPT_HOME/hkex/daily_download.py -f ../config/daily_download.cfg --day 190306 --download_types abcdefghijklm 
+python $FINOPT_HOME/hkex/daily_download.py -f ../config/daily_download.cfg --day 190307 --download_types abcdefghijklm 
+python $FINOPT_HOME/hkex/daily_download.py -f ../config/daily_download.cfg --day 190308 --download_types abcdefghijklm 
+python $FINOPT_HOME/hkex/daily_download.py -f ../config/daily_download.cfg --day 190311 --download_types abcdefghijklm 
+python $FINOPT_HOME/hkex/daily_download.py -f ../config/daily_download.cfg --day 190312 --download_types abcdefghijklm 
+python $FINOPT_HOME/hkex/daily_download.py -f ../config/daily_download.cfg --day 190313 --download_types abcdefghijklm 
+python $FINOPT_HOME/hkex/daily_download.py -f ../config/daily_download.cfg --day 190314 --download_types abcdefghijklm 
+python $FINOPT_HOME/hkex/daily_download.py -f ../config/daily_download.cfg --day 190315 --download_types abcdefghijklm 

+ 2 - 2
src/ws/ws_server.py

@@ -286,7 +286,7 @@ class MainWebSocketServer(BaseWebSocketServerWrapper, AbstractGatewayListener):
         self.twsc = TWS_client_manager(temp_kwargs)
         self.twsc.add_listener_topics(self, ['tickPrice'] )
         self.subscribe_hsif_ticks()
-        self.www = HTTPServe(temp_kwargs)
+        self.www = HTTPServe(temp_kwargs, self)
         th = threading.Thread(target=self.www.start_server)
         th.daemon = True 
         th.start()
@@ -510,7 +510,7 @@ def main():
     logconfig = kwargs['logconfig']
     logconfig['format'] = '%(asctime)s %(levelname)-8s %(message)s'    
     logging.basicConfig(**logconfig)        
-    #logging.getLogger().addFilter(LoggerNoBaseMessagingFilter())  
+    logging.getLogger().addFilter(LoggerNoBaseMessagingFilter())  
     
     esw = MainWebSocketServer('ChartTableWS', kwargs)    
     esw.start_server()