bobhk 8 жил өмнө
parent
commit
8ea4833fb3

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 41 - 18
src/alerts/hist_index.py


+ 22 - 19
src/finopt/ystockquote.py

@@ -182,27 +182,30 @@ def get_historical_prices(symbol, start_date, end_date):
     """
     Get historical prices for the given ticker symbol.
     Date format is 'YYYYMMDD'
-    http://www.google.com/finance/historical?q=AAPL&startdate=Nov%201,%202011&enddate=Nov%2030,%202011&output=csv
+    
     Returns a nested list.
     """
-#     url = 'http://ichart.yahoo.com/table.csv?s=%s&' % symbol + \
-#           'd=%s&' % str(int(end_date[4:6]) - 1) + \
-#           'e=%s&' % str(int(end_date[6:8])) + \
-#           'f=%s&' % str(int(end_date[0:4])) + \
-#           'g=d&' + \
-#           'a=%s&' % str(int(start_date[4:6]) - 1) + \
-#           'b=%s&' % str(int(start_date[6:8])) + \
-#           'c=%s&' % str(int(start_date[0:4])) + \
-#           'ignore=.csv'
-#     days = urllib.urlopen(url).readlines()
-#     data = [day[:-2].split(',') for day in days]
-#     return data
-    url = 'https://www.google.com/finance/historical?q=%s&startdate=%s&enddate=%s&output=csv' % (symbol, start_date, end_date)
-    
-    #url = 'http://www.google.com/finance/historical?q=HSI&startdate=jan%201,2017&enddate=may%2019,2017&output=csv'
-    print url
-    csv = urllib.urlopen(url).readlines()
-    print csv
+    url = 'http://ichart.yahoo.com/table.csv?s=%s&' % symbol + \
+          'd=%s&' % str(int(end_date[4:6]) - 1) + \
+          'e=%s&' % str(int(end_date[6:8])) + \
+          'f=%s&' % str(int(end_date[0:4])) + \
+          'g=d&' + \
+          'a=%s&' % str(int(start_date[4:6]) - 1) + \
+          'b=%s&' % str(int(start_date[6:8])) + \
+          'c=%s&' % str(int(start_date[0:4])) + \
+          'ignore=.csv'
+    days = urllib.urlopen(url).readlines()
+    data = [day[:-2].split(',') for day in days]
+    return data
+
+
+#ss = [["0001.HK",2.5],["0002.HK",1.86],["0003.HK",1.62],["0004.HK",1.27],["0005.HK",15.02],["0006.HK",1.44],["0011.HK",1.42],["0012.HK",0.82],["0013.HK",2.53],["0016.HK",2.53],["0017.HK",0.7],["0019.HK",1.01],["0023.HK",0.67],["0066.HK",0.67],["0083.HK",0.66],["0101.HK",0.94],["0144.HK",0.46],["0151.HK",1.14],["0267.HK",0.18],["0291.HK",0.46],["0293.HK",0.24],["0322.HK",0.71],["0330.HK",0.25],["0386.HK",1.88],["0388.HK",1.86],["0494.HK",1.06],["0688.HK",1.25],["0700.HK",4.52],["0762.HK",0.94],["0836.HK",0.49],["0857.HK",3.29],["0883.HK",4.38],["0939.HK",7.08],["0941.HK",8.08],["1044.HK",0.91],["1088.HK",1.59],["1109.HK",0.53],["1199.HK",0.27],["1299.HK",4.69],["1398.HK",5.25],["1880.HK",1.01],["1898.HK",0.43],["1928.HK",1.06],["2318.HK",1.85],["2388.HK",1.42],["2600.HK",0.19],["2628.HK",2.56],["3328.HK",0.71],["3988.HK",3.63]]
+#for s in ss:
+#    chg_percent = float(get_change(s[0]))/ float(get_price(s[0])) 
+#    print '["%s","HSI",%f,%f],' % (s[0], s[1], chg_percent)
+    
+    
+        
 
 
    

+ 191 - 0
src/rethink/portfolio_column_chart.py

@@ -0,0 +1,191 @@
+# -*- coding: utf-8 -*-
+import sys, traceback, logging
+from rethink.portfolio_item import PortfolioRules, PortfolioItem, Portfolio
+import numpy as np
+from rethink.table_model import AbstractPortfolioTableModelListener, AbstractTableModel
+from ib.ext.Contract import Contract
+    
+class PortfolioColumnChart():
+
+    '''
+    
+        code to handle portfolio column chart
+    
+    
+        [[ 0.   0.   0.  -2.   0. ]
+         [ 0.   0.   0.  -1.   0. ]
+         [ 0.   0.   0.   0.   0. ]
+         [ 0.   0.   0.  -3.   0. ]
+         [ 0.   0.   0.   1.   0. ]
+         [ 0.   0.   0.  -4.   0. ]
+         [ 0.   0.   0.   1.   0. ]
+         [ 0.  -2.   0.   1.   0. ]
+         [ 0.  -2.   1.   0.   0. ]
+         [ 0.   0.   0.   0.   2.6]
+         [-3.   0.   0.   0.   0. ]
+         [ 0.   0.   0.   0.   0. ]
+         [-1.   0.   0.   0.   0. ]
+         [ 0.   0.  -3.   0.   0. ]
+         [ 0.   0.  -1.   0.   0. ]]
+
+        
+        
+    '''
+    def __init__(self, pf):
+        self.pf = pf
+        self.xy_arr = None
+        self.col_header = {'y_map': None, 'y_map_reverse': None}
+        self.row_header = {'x_map': None, 'x_map_reverse': None}
+    
+    
+    def ckey_to_row(self, contract_key):
+        
+        p_item= self.pf.is_contract_in_portfolio(contract_key)
+        if p_item:
+            if p_item.get_instrument_type() == 'OPT':
+                row = self.row_header['x_map'][p_item.get_strike()]
+                return row
+            else:  #FUT average price 
+                col = self.col_header['y_map'][self.make_col_header(p_item)]
+                for i in self.xy_arr.shape[0]:
+                    if self.xy_arr[i][col] <> 0:
+                        return i
+        
+           
+    def get_values_at(self, row):
+        rf = [{'v': self.row_header['x_map_reverse'][row]}]
+        for rv in self.xy_arr[row]:
+            rf.append({'v': rv})
+        
+        return rf
+           
+    def make_col_header(self, p_item):
+        return  '%s-%s-%s-%s' % (p_item.get_expiry(),  p_item.get_symbol_id(), 
+                                                    p_item.get_instrument_type(), p_item.get_right() )  
+    
+    def get_JSON(self):  
+        
+        
+        p2_items = self.pf.get_portfolio_port_items().values()
+        p1_items = filter(lambda x: x.get_symbol_id() in PortfolioRules.rule_map['interested_position_types']['symbol'], p2_items)
+        p_items = filter(lambda x: x.get_instrument_type() in  PortfolioRules.rule_map['interested_position_types']['instrument_type'], p1_items)
+        
+        print ','.join(str(x.get_strike()) for x in p_items)
+        # row values domain
+        # find out the strikes of all contracts purchased, for futures, use the average cost 
+        x_range  = set(
+                    map(lambda x:int(round(x.get_strike(),-1)), filter(lambda x: x.get_instrument_type() in 'OPT', p_items)) +   
+                    map(lambda x:int(round(x.get_port_field(PortfolioItem.AVERAGE_PRICE),-1)), filter(lambda x: x.get_instrument_type() in 'FUT', p_items))
+                   )
+    
+        # column values domain (month,symbol,contract_type, right)
+        y_range = set(map(self.make_col_header, p_items))
+        
+
+
+        # sort the list then create a map that stores kv pairs of value:index_pos
+        x_range = sorted(list(x_range))
+        print x_range
+        x_map = {}
+        x_map_reverse = {}
+        for i in range(len(x_range)):
+            x_map[x_range[i]] = i
+            x_map_reverse[i] = x_range[i]
+        print '---xmap and xmap reverse' 
+        print x_map
+        print x_map_reverse
+        print '----'
+        self.row_header['x_map'] = x_map
+        self.row_header['x_map_reverse'] = x_map_reverse
+
+        y_range = sorted(list(y_range))
+        y_map = {}
+        y_map_reverse = {}
+        for i in range(len(y_range)):
+            y_map[y_range[i]] = i
+            y_map_reverse[i]= y_range[i]  
+        
+        print '---ymap and ymap reverse' 
+        print y_map
+        print y_map_reverse
+        print '----'
+        self.col_header['y_map'] = y_map
+        self.col_header['y_map_reverse'] = y_map_reverse
+        
+        def set_ij(p_item):
+            if p_item.get_instrument_type() == 'FUT':
+                i = x_map[int(round(p_item.get_port_field(PortfolioItem.AVERAGE_PRICE), -1))]
+                #
+                # hard code logic below to convert number of MHI in HSI unit (that is 5:1)
+                v = p_item.get_quantity() *\
+                 (PortfolioRules.rule_map['option_structure'][p_item.get_symbol_id()]['multiplier'] /
+                  PortfolioRules.rule_map['option_structure']['HSI']['multiplier'] 
+                  )
+                
+                
+            else:
+                i = x_map[int(round(p_item.get_strike(), -1))]
+                v = p_item.get_quantity()
+            j = y_map[self.make_col_header(p_item)]
+            
+            return (i,j,v)
+        
+        ijv_dist = map(set_ij, p_items)
+        print ijv_dist
+        xy_arr = np.zeros((len(x_range), len(y_range)))
+        
+        
+        
+        def update_ijv(ijv):
+            xy_arr[ijv[0], ijv[1]] = ijv[2]
+            return 1
+        
+        map(update_ijv, ijv_dist)
+        print xy_arr
+        
+        def gen_datatable():
+            ccj = {'cols':[{'id': 'strike', 'label': 'strike', 'type': 'number'}], 'rows':[]}
+            for j in range(len(y_map_reverse)):
+                ccj['cols'].append({'id': y_map_reverse[j], 'label': y_map_reverse[j], 'type': 'number' })
+                
+            def row_item(i):
+                for m in range(xy_arr.shape[1]):
+                    ccj['rows'][i]['c'].append({'v':xy_arr[i][m]})     
+                               
+            for i in range(len(x_map_reverse)):
+                ccj['rows'].append({'c':[{'v':x_map_reverse[i]}]})
+                row_item(i)
+            return ccj    
+                
+        return gen_datatable()
+    
+    
+class PortfolioColumnChartTM(PortfolioColumnChart, AbstractTableModel, AbstractPortfolioTableModelListener):
+    
+#     def get_column_count(self):
+#         raise NotImplementedException
+#     
+#     def get_row_count(self):
+#         raise NotImplementedException
+# 
+#     def get_column_name(self, col):
+#         raise NotImplementedException
+# 
+#     def get_column_id(self, col):
+#         raise NotImplementedException
+# 
+#     def get_value_at(self, row, col):
+#         raise NotImplementedException
+#     
+#     def get_values_at(self, row):
+#         raise NotImplementedException
+#     
+#     def set_value_at(self, row, col, value):
+#         raise NotImplementedException
+#     
+#     def insert_row(self, values):
+#         raise NotImplementedException
+    
+    def event_tm_request_table_structure(self, event, request_id, account):
+        logging.info("[PortfolioColumnChartTM:%s] received %s content:[%s]" % (self.name, event, vars()))       
+    

+ 1 - 106
src/rethink/portfolio_item.py

@@ -13,8 +13,7 @@ from rethink.option_chain import OptionsChain
 from rethink.tick_datastore import TickDataStore
 from numpy import average
 from rethink.table_model import AbstractTableModel
-from gtk.keysyms import percent
-import numpy as np
+
 
 
 class PortfolioRules():
@@ -481,107 +480,3 @@ class Portfolio(AbstractTableModel):
         return '\n'.join('[%d]:%s' % (x[0], x[1]) for x in  self.port['g_table']['row_to_ckey_index'].items())       
     
     
-    
-class PortfolioColumnChart:
-
-    '''
-    
-        code to handle portfolio column chart
-    
-    
-        row1: <strike>, <month-contract_type-
-        
-    '''
-    def __init__(self, pf):
-        self.pf = pf
-        
-    
-    def get_JSON(self):  
-        
-        
-        p2_items = self.pf.get_portfolio_port_items().values()
-        p1_items = filter(lambda x: x.get_symbol_id() in PortfolioRules.rule_map['interested_position_types']['symbol'], p2_items)
-        p_items = filter(lambda x: x.get_instrument_type() in  PortfolioRules.rule_map['interested_position_types']['instrument_type'], p1_items)
-        
-        print ','.join(str(x.get_strike()) for x in p_items)
-        # row values domain
-        # find out the strikes of all contracts purchased, for futures, use the average cost 
-        x_range  = set(
-                    map(lambda x:int(round(x.get_strike(),-1)), filter(lambda x: x.get_instrument_type() in 'OPT', p_items)) +   
-                    map(lambda x:int(round(x.get_port_field(PortfolioItem.AVERAGE_PRICE),-1)), filter(lambda x: x.get_instrument_type() in 'FUT', p_items))
-                   )
-    
-        # column values domain (month,symbol,contract_type, right)
-        y_range = set(map(lambda x:'%s-%s-%s-%s' % (x.get_expiry(),  x.get_symbol_id(), 
-                                                    x.get_instrument_type(), x.get_right() ), p_items))
-        
-
-
-        # sort the list then create a map that stores kv pairs of value:index_pos
-        x_range = sorted(list(x_range))
-        print x_range
-        x_map = {}
-        x_map_reverse = {}
-        for i in range(len(x_range)):
-            x_map[x_range[i]] = i
-            x_map_reverse[i] = x_range[i]
-        print '---xmap and xmap reverse' 
-        print x_map
-        print x_map_reverse
-        print '----'
-
-        y_range = sorted(list(y_range))
-        y_map = {}
-        y_map_reverse = {}
-        for i in range(len(y_range)):
-            y_map[y_range[i]] = i
-            y_map_reverse[i]= y_range[i]  
-        
-        print '---ymap and ymap reverse' 
-        print y_map
-        print y_map_reverse
-        print '----'
-        def set_ij(p_item):
-            if p_item.get_instrument_type() == 'FUT':
-                i = x_map[int(round(p_item.get_port_field(PortfolioItem.AVERAGE_PRICE), -1))]
-                #
-                # hard code logic below to convert number of MHI in HSI unit (that is 5:1)
-                v = p_item.get_quantity() *\
-                 (PortfolioRules.rule_map['option_structure'][p_item.get_symbol_id()]['multiplier'] /
-                  PortfolioRules.rule_map['option_structure']['HSI']['multiplier'] 
-                  )
-                
-                
-            else:
-                i = x_map[int(round(p_item.get_strike(), -1))]
-                v = p_item.get_quantity()
-            j = y_map['%s-%s-%s-%s' % (p_item.get_expiry(),  p_item.get_symbol_id(), p_item.get_instrument_type(), p_item.get_right())]
-            
-            return (i,j,v)
-        
-        ijv_dist = map(set_ij, p_items)
-        print ijv_dist
-        xy_arr = np.zeros((len(x_range), len(y_range)))
-        
-        def update_ijv(ijv):
-            xy_arr[ijv[0], ijv[1]] = ijv[2]
-            return 1
-        
-        map(update_ijv, ijv_dist)
-        print xy_arr
-        
-        def gen_datatable():
-            ccj = {'cols':[{'id': 'strike', 'label': 'strike', 'type': 'number'}], 'rows':[]}
-            for j in range(len(y_map_reverse)):
-                ccj['cols'].append({'id': y_map_reverse[j], 'label': y_map_reverse[j], 'type': 'number' })
-                
-            def row_item(i):
-                for m in range(xy_arr.shape[1]):
-                    ccj['rows'][i]['c'].append({'v':xy_arr[i][m]})     
-                               
-            for i in range(len(x_map_reverse)):
-                ccj['rows'].append({'c':[{'v':x_map_reverse[i]}]})
-                row_item(i)
-            return ccj    
-                
-        return gen_datatable()

+ 13 - 1
src/rethink/portfolio_monitor.py

@@ -10,7 +10,8 @@ from misc2.helpers import ContractHelper
 from finopt.instrument import Symbol, Option
 from rethink.option_chain import OptionsChain
 from rethink.tick_datastore import TickDataStore
-from rethink.portfolio_item import PortfolioItem, PortfolioRules, Portfolio, PortfolioColumnChart
+from rethink.portfolio_item import PortfolioItem, PortfolioRules, Portfolio
+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
 
@@ -39,6 +40,11 @@ class PortfolioMonitor(AbstractGatewayListener, AbstractPortfolioTableModelListe
         self.portfolios = {}
         self.starting_engine = {}
         
+        
+        '''
+            portfolio_charts: {<account>, {'<chart type'>, <chart object ref>...
+        '''
+        self.portfolio_charts = {'PortfolioColumnChart': None}
     
 
             
@@ -135,6 +141,10 @@ class PortfolioMonitor(AbstractGatewayListener, AbstractPortfolioTableModelListe
             return self.portfolios[account]
         except KeyError:
             self.portfolios[account] = Portfolio(account)
+            #
+            # set up portfolio chart objects
+            #
+            self.portfolio_charts[account] = {'PortfolioColumnChartTM': PortfolioColumnChartTM(self.portfolios[account])}
         return self.portfolios[account]
     
     def deduce_option_underlying(self, option):
@@ -391,6 +401,8 @@ class PortfolioMonitor(AbstractGatewayListener, AbstractPortfolioTableModelListe
         event_type = AbstractTableModel.EVENT_TM_TABLE_ROW_UPDATED if mode == 'U' else AbstractTableModel.EVENT_TM_TABLE_ROW_INSERTED
         self.get_kproducer().send_message(event_type, json.dumps({'source': '%s' % port.get_object_name(), 'row': row, 'row_values': rvs}))
     
+        
+    
     # implment AbstractPortfolioTableModelListener
     # handle requests to get data table json
     def event_tm_request_table_structure(self, event, request_id, account):

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно