Jelajahi Sumber

resume where it left off after a month's break

fix a bug that crash portfolio_column_chart if a future position is zero
change ws server to accept connections from all addresses
move client_g.html to html folder from ./ws folder
laxaurus 8 tahun lalu
induk
melakukan
ce42cc7a05

+ 2 - 5
src/config/app.cfg

@@ -30,7 +30,7 @@ redis.datastore.key.hkex_holiday_prefix: 'hkex_holiday_'
  
 [/]
 tools.sessions.on : True
-tools.staticdir.root : '/home/larry-13.04/workspace/finopt/src/'
+tools.staticdir.root : '/home/laxaurus/workspace/finopt/src/'
 #tools.staticdir.root : '/home/larry-13.04/production/finopt/'
 
 [/static]
@@ -42,9 +42,6 @@ tools.staticdir.tmpl : './html'
 tools.staticdir.on: True
 tools.staticdir.dir : './html/public'
 
-[/ws]
-tools.websocket.on: True
-tools.websocket.handler_cls: opt_serve.OptWebSocket
 
 
 
@@ -58,7 +55,7 @@ portfolio.account_summary_tags: "['AccountType','NetLiquidation','TotalCashValue
 
 
 [opt_serve]
-opt_serve.logconfig: "{'filename': '/home/larry-13.04/workspace/finopt/log/serve.log', 'filemode': 'w','level': logging.INFO}"
+opt_serve.logconfig: "{'filename': '/tmp/serve.log', 'filemode': 'w','level': logging.INFO}"
 
 
 [cep]

+ 6 - 53
src/finopt/opt_serve.py

@@ -15,10 +15,7 @@ import json
 import optcal
 import ConfigParser
 import portfolio
-from comms.alert_bot import AlertHelper
-from ws4py.server.cherrypyserver import WebSocketPlugin, WebSocketTool
-from ws4py.websocket import WebSocket
-from ws4py.websocket import EchoWebSocket
+#from comms.alert_bot import AlertHelper
 from sets import Set
 import thread
 
@@ -703,53 +700,12 @@ class QServer(object):
         f = open(html)
         return f.read()
     
-class OptWebSocket(WebSocket):
+    @cherrypy.expose
+    def ws_client_g(self):
+        html = '%s%s/client_g.html' % (cherrypy.request.app.config['/']['tools.staticdir.root'], cherrypy.request.app.config['/static']['tools.staticdir.tmpl'])
+        f = open(html)
+        return f.read()
     
-#     def __init__(self):
-#         logging.debug('instantiated.')
-
-
-        
-    def received_message(self, message):
-        self.send(message.data, message.is_binary)
-        logging.info('received %s' % message.data)   
-        
-        
-#     def opened(self):
-#         logging.info('web socket opened')
-        #self.send('hello')
-#         while 1:
-#             self.send('%f' % time.time(), False)
-#             time.sleep(2)
-
-            
-
-    def opened(self):
-
-        logging.info('web socket opened')
-        def data_provider():   
-            
-            while 1:         
-#                print ('%f' % time.time())
-#                time.sleep(2)
-            
-                def cb():
-                    #for i in range(1, 200, 25):
-                    #    yield "#" * i
-                    yield '%f' % time.time()
-                
-                   
-                self.send(cb())
-        
-                logging.info('--- here')
-                time.sleep(2)  
-            
-        thread.start_new_thread(data_provider())
-        
-              
-    def closed(self, code, reason=None):
-        print "Closed down", code, reason
-        
                  
 if __name__ == '__main__':
             
@@ -784,9 +740,6 @@ if __name__ == '__main__':
     r_conn = redis.Redis(host,port,db)
 
 
-    
-    WebSocketPlugin(cherrypy.engine).subscribe()
-    cherrypy.tools.websocket = WebSocketTool()    
     cherrypy.quickstart(QServer(r_conn, config), '/', cfg_path[0])
     
    

TEMPAT SAMPAH
src/finopt/ystockquote.pyc


+ 53 - 43
src/ws/client_g.html → src/html/client_g.html

@@ -22,17 +22,11 @@
 	$('#test-btn').click(function(){
 		alert('hereee');
 	});  
-	
-	var view = null;
-	var data = null;
-	var table= null;   
-    var options = {allowHtml: true, sortColumn:1, 
-    		showRowNumber: true, width: '100%', height: '100%'};
-    
+
     var chartOptions = {
-            width: 600,
-            height: 400,
-            legend: { position: 'top', maxLines: 3 },
+            width: 800,
+            height: 500,
+            legend: { position: 'right', maxLines: 3 },
             bar: { groupWidth: '75%' },
             isStacked: true,allowHtml: true,
          /*series: {
@@ -41,6 +35,15 @@
     			2:{color:'#1E90FF',},
     			}*/ 
     };
+	var columnChart = {'view': null, 'data': null, 'chart': null, 'options': chartOptions};
+
+    var tableOptions = {allowHtml: true, sortColumn:1, 
+    		showRowNumber: true, width: '100%', height: '100%'};
+	var tableChart = {'view': null, 'data': null, 'chart': null, 'options': tableOptions};
+	
+
+    
+
     
 	google.load("visualization", "1.1", {packages:["corechart", 'table','gauge']});
 	   //google.setOnLoadCallback(drawTable);
@@ -49,11 +52,7 @@
 
 	
 	
-	function setValueAtRandomCell(value){
-		data.setCell(getRandomInt(0, data.getNumberOfRows()-1), 
-			getRandomInt(0, data.getNumberOfColumns()-1), value);
-		table.draw(data);
-	}
+
 	
 	function getRandomInt(min, max) {
 	    return Math.floor(Math.random() * (max - min + 1)) + min;
@@ -78,16 +77,16 @@
 		colorGF.addGradientRange(null, null, 'white', 'orange', 'blue');
 	
 	    	 	    
-		    numF.format(data, 2);  //avg cost
-		    numF.format(data, 3);  //market value
-		    colorF.format(data, 6); // position
-		    percentF.format(data, 7); //delta		
+		    numF.format(tableChart.data, 2);  //avg cost
+		    numF.format(tableChart.data, 3);  //market value
+		    colorF.format(tableChart.data, 6); // position
+		    percentF.format(tableChart.data, 7); //delta		
 		    
-		    numF.format(data, 10); // position delta
-		    numF.format(data, 11); // position theta
-		    numF.format(data, 12); // position gamma
-		    colorGF.format(data, 13); //unreal p/l
-		    barF.format(data, 14) //% gain loss
+		    numF.format(tableChart.data, 10); // position delta
+		    numF.format(tableChart.data, 11); // position theta
+		    numF.format(tableChart.data, 12); // position gamma
+		    colorGF.format(tableChart.data, 13); //unreal p/l
+		    barF.format(tableChart.data, 14) //% gain loss
 		
 	}	   
 	   
@@ -98,7 +97,7 @@
     function init() {
 
       // Connect to Web Socket
-      ws = new WebSocket("ws://localhost:9001/");
+      ws = new WebSocket("ws://vorsprung:9001/");
    
       // Set event handlers.
       ws.onopen = function() {
@@ -116,31 +115,46 @@
 		console.log(d1);
         
         if (d1.event == "event_tm_table_structure_changed"){
-			data = new google.visualization.DataTable(d1.value);
-			view = new google.visualization.DataView(data);
 
 			if (d1.source.class == 'Portfolio'){
-				view.setRows(view.getFilteredRows([{column: 15, test: function(value, row, column, table) {
-			        return (value == 'HSI' || value == 'MHI') 
-			    }}]));
-	    		setupFormatter(data);
-				table = new google.visualization.Table(document.getElementById('table_div'));
-				table.draw(view, options);
-				output('number of rows: ' + data.getNumberOfRows());
+				tableChart.data = new google.visualization.DataTable(d1.value);
+				tableChart.view = new google.visualization.DataView(tableChart.data);
+				tableChart.view.setRows(tableChart.view.getFilteredRows([{column: 15, test: function(value, row, column, table) {
+			        return (value == 'HSI' || value == 'MHI')
+			    }},
+			    {column: 6, test: function(value, row, column, table) {
+			        return (value != 0)
+			    }},
+			     
+			    ]));
+
+
+
+	    		setupFormatter(tableChart.data);
+	    		tableChart.chart = new google.visualization.Table(document.getElementById('table_div'));
+	    		tableChart.chart.draw(tableChart.view, tableChart.options);
+				output('number of rows: ' + tableChart.data.getNumberOfRows());
+				
+			} else if (d1.source.class == 'PortfolioColumnChartTM'){
+				columnChart.data = new google.visualization.DataTable(d1.value);
+				columnChart.view = new google.visualization.DataView(columnChart.data);
+				columnChart.chart = new google.visualization.ColumnChart(
+				        document.getElementById('chart_div'));
+				columnChart.chart.draw(columnChart.view, columnChart.options);
 			}
            
         } else if (d1.event == 'event_tm_table_row_updated'){
 
 			console.log(d1.value.row.toString()+ ':' + d1.value.row_values[0]['v']);
 			for (var c=2; c < d1.value.row_values.length; c++){
-				data.setCell(d1.value.row, c, d1.value.row_values[c]["v"]);
+				tableChart.data.setCell(d1.value.row, c, d1.value.row_values[c]["v"]);
 
 			}
 			//data.setCell(d1.value.row, 1, d1.value.row_values[0]['v']);
 			
-			options.sortColumn = table.getSortInfo().column;
-			table.draw(view, options);
-//			table.draw(data);           
+			tableChart.options.sortColumn = tableChart.chart.getSortInfo().column;
+			tableChart.chart.draw(tableChart.view, tableChart.options);
+           
 
         } else if (d1.event == 'event_tm_table_row_inserted'){
         	var newRow = d1.value.row_values.map(function(x){
@@ -165,11 +179,7 @@
 
     }
     
-    function handleTableChartEvents(){
-    	
-    	
-    }
-    
+
     
     function onSubmit() {
       var input = document.getElementById("input");

+ 6 - 1
src/rethink/portfolio_column_chart.py

@@ -99,7 +99,12 @@ class PortfolioColumnChart():
         
         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)
+        
+# 2017-7-26
+# filter out zero positions
+        p0_items = filter(lambda x: x.get_port_field(PortfolioItem.POSITION) <> 0, p1_items)
+        p_items = filter(lambda x: x.get_instrument_type() in  PortfolioRules.rule_map['interested_position_types']['instrument_type'], p0_items)
+        
         
         #i_strikes_range ','.join(str(x.get_strike()) for x in p_items)
         # row values domain

+ 0 - 4
src/sh/run_mds.sh~

@@ -1,4 +0,0 @@
-#!/bin/bash
-ROOT=/home/larry-13.04/workspace/finopt
-export PYTHONPATH=$ROOT/src
-python $ROOT/src/cep/ib_mds.py $ROOT/src/config/app.cfg

+ 20 - 3
src/sh/run_opt_serve.sh

@@ -1,4 +1,21 @@
 #!/bin/bash
-ROOT=$FINOPT_HOME
-export PYTHONPATH=$ROOT
-python $ROOT/finopt/opt_serve.py $ROOT/config/app.cfg
+#ROOT=$FINOPT_HOME
+#export PYTHONPATH=$ROOT
+#python $ROOT/finopt/opt_serve.py $ROOT/config/app.cfg
+
+
+#!/bin/bash
+
+
+HOST=$(hostname)
+echo $HOST
+if [ $HOST == 'hkc-larryc-vm1' ]; then
+	FINOPT_HOME=~/ironfly-workspace/finopt/src
+elif [ $HOST == 'vorsprung' ]; then
+	FINOPT_HOME=~/workspace/finopt/src	
+else
+	FINOPT_HOME=~/l1304/workspace/finopt-ironfly/finopt/src
+fi
+export PYTHONPATH=$FINOPT_HOME:$PYTHONPATH
+
+python $FINOPT_HOME/finopt/opt_serve.py $FINOPT_HOME/config/app.cfg

+ 0 - 4
src/sh/run_opt_serve.sh~

@@ -1,4 +0,0 @@
-#!/bin/bash
-ROOT=/home/larry-13.04/workspace/finopt
-export PYTHONPATH=$ROOT/src
-python $ROOT/src/finopt/opt_serve.py $ROOT/src/config/app.cfg

+ 0 - 4
src/sh/run_options_data.sh~

@@ -1,4 +0,0 @@
-#!/bin/bash
-ROOT=/home/larry-13.04/workspace/finopt
-export PYTHONPATH=$ROOT/src
-python $ROOT/src/finopt/options_data.py $ROOT/src/config/app.cfg

+ 2 - 2
src/sh/ws.sh

@@ -11,5 +11,5 @@ else
 	FINOPT_HOME=~/l1304/workspace/finopt-ironfly/finopt/src
 fi
 export PYTHONPATH=$FINOPT_HOME:$PYTHONPATH
-python $FINOPT_HOME/ws/ws_server.py  -c -g AE1  
-#python $FINOPT_HOME/ws/ws_server.py   -g AE1  
+#python $FINOPT_HOME/ws/ws_server.py  -c -g AE1  
+python $FINOPT_HOME/ws/ws_server.py   -g AE1  

+ 0 - 0
src/html/gchart.py → src/ws/gchart.py


+ 1 - 1
src/ws/ws_server.py

@@ -25,7 +25,7 @@ class BaseWebSocketServerWrapper(Subscriber):
                 self.kwargs[key] = kwargs.pop(key)        
         self.kwargs.update(kwargs)
                       
-        server = WebsocketServer(self.kwargs['ws_port'])
+        server = WebsocketServer(self.kwargs['ws_port'], '0.0.0.0')
         self.set_server(server)
         server.set_fn_new_client(self.new_client)
         server.set_fn_client_left(self.client_left)