Browse Source

weekend coding to fix a bug on table order indexing

laxaurus 9 years ago
parent
commit
de6e5f1dde
3 changed files with 46 additions and 26 deletions
  1. 14 7
      src/rethink/portfolio_item.py
  2. 31 18
      src/ws/client_g.html
  3. 1 1
      src/ws/ws_server.py

+ 14 - 7
src/rethink/portfolio_item.py

@@ -37,7 +37,7 @@ class PortfolioItem():
     AVERAGE_COST = 7002
     AVERAGE_COST = 7002
     POSITION_DELTA = 7003
     POSITION_DELTA = 7003
     POSITION_THETA = 7004
     POSITION_THETA = 7004
-    POSITION_GAMMA = 7009
+    GAMMA_PERCENT = 7009
     UNREAL_PL = 7005
     UNREAL_PL = 7005
     PERCENT_GAIN_LOSS = 7006
     PERCENT_GAIN_LOSS = 7006
     AVERAGE_PRICE = 7007
     AVERAGE_PRICE = 7007
@@ -140,7 +140,7 @@ class PortfolioItem():
                 
                 
                 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                                
                 pos_theta = self.get_quantity() * self.instrument.get_tick_value(Option.THETA) * multiplier
                 pos_theta = self.get_quantity() * self.instrument.get_tick_value(Option.THETA) * multiplier
-                pos_gamma = self.get_quantity() * self.instrument.get_tick_value(Option.GAMMA) * multiplier                               
+                gamma_percent = pos_delta * (1 + self.instrument.get_tick_value(Option.GAMMA))                               
 
 
                 #(spot premium * multiplier - avgcost) * pos)
                 #(spot premium * multiplier - avgcost) * pos)
                 try:
                 try:
@@ -162,7 +162,7 @@ class PortfolioItem():
                 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
-                pos_gamma = 0
+                gamma_percent = 0
                 # (S - X) * pos * multiplier
                 # (S - X) * pos * multiplier
                 unreal_pl = (self.instrument.get_tick_value(4) - self.get_average_cost() ) * self.get_quantity() * \
                 unreal_pl = (self.instrument.get_tick_value(4) - self.get_average_cost() ) * self.get_quantity() * \
                                PortfolioRules.rule_map['option_structure'][self.get_symbol_id()]['multiplier']
                                PortfolioRules.rule_map['option_structure'][self.get_symbol_id()]['multiplier']
@@ -173,7 +173,7 @@ class PortfolioItem():
                         
                         
             self.set_port_field(PortfolioItem.POSITION_DELTA, pos_delta)
             self.set_port_field(PortfolioItem.POSITION_DELTA, pos_delta)
             self.set_port_field(PortfolioItem.POSITION_THETA, pos_theta)
             self.set_port_field(PortfolioItem.POSITION_THETA, pos_theta)
-            self.set_port_field(PortfolioItem.POSITION_GAMMA, pos_gamma)
+            self.set_port_field(PortfolioItem.GAMMA_PERCENT, gamma_percent)
             self.set_port_field(PortfolioItem.UNREAL_PL, unreal_pl)
             self.set_port_field(PortfolioItem.UNREAL_PL, unreal_pl)
             self.set_port_field(PortfolioItem.AVERAGE_PRICE, average_px)
             self.set_port_field(PortfolioItem.AVERAGE_PRICE, average_px)
             self.set_port_field(PortfolioItem.PERCENT_GAIN_LOSS, percent_gain_loss)
             self.set_port_field(PortfolioItem.PERCENT_GAIN_LOSS, percent_gain_loss)
@@ -290,7 +290,7 @@ class Portfolio(AbstractTableModel):
         self.port['g_table']['header'] = [('symbol', 'Symbol', 'string'), ('right', 'Right', 'string'), ('avgcost', 'Avg Cost', 'number'), ('market_value', 'Market Value', 'number'), 
         self.port['g_table']['header'] = [('symbol', 'Symbol', 'string'), ('right', 'Right', 'string'), ('avgcost', 'Avg Cost', 'number'), ('market_value', 'Market Value', 'number'), 
                   ('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'), ('gamma_percent', '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')
                   ('symbolid', 'Sym Id', 'string')
                   ]  
                   ]  
@@ -356,7 +356,7 @@ class Portfolio(AbstractTableModel):
              {'v': handle_NaN(x[1].get_instrument().get_tick_value(Option.GAMMA))},
              {'v': handle_NaN(x[1].get_instrument().get_tick_value(Option.GAMMA))},
              {'v': handle_NaN(x[1].get_port_field(PortfolioItem.POSITION_DELTA))},
              {'v': handle_NaN(x[1].get_port_field(PortfolioItem.POSITION_DELTA))},
              {'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.GAMMA_PERCENT))},
              {'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()}
              {'v': x[1].get_symbol_id()}
@@ -386,7 +386,14 @@ class Portfolio(AbstractTableModel):
         map(lambda hf: dtj['cols'].append({'id': hf[0], 'label': hf[1], 'type': hf[2]}), self.port['g_table']['header'])
         map(lambda hf: dtj['cols'].append({'id': hf[0], 'label': hf[1], 'type': hf[2]}), self.port['g_table']['header'])
         
         
         #p_items = sorted([x for x in self.port['port_items'].iteritems()])
         #p_items = sorted([x for x in self.port['port_items'].iteritems()])
-        p_items = [x for x in self.port['port_items'].iteritems()]
+        
+        # create a list of port items tuples (contract_key, port_item) ordered by row_id
+        # that is in the order when each items was created and inserted into the map
+        # this ensures that the same sequence is replicated to the google datatable
+        p_items = map(lambda x:(self.port['g_table']['row_to_ckey_index'][x], 
+                        self.port['port_items'][ self.port['g_table']['row_to_ckey_index'][x] ]), range(self.port['g_table']['row_index']))
+        
+
         #p1_items = filter(lambda x: x[1].get_symbol_id() in PortfolioRules.rule_map['interested_position_types']['symbol'], p_items)
         #p1_items = filter(lambda x: x[1].get_symbol_id() in PortfolioRules.rule_map['interested_position_types']['symbol'], p_items)
         #p2_items = filter(lambda x: x[1].get_instrument_type() in  PortfolioRules.rule_map['interested_position_types']['instrument_type'], p1_items)
         #p2_items = filter(lambda x: x[1].get_instrument_type() in  PortfolioRules.rule_map['interested_position_types']['instrument_type'], p1_items)
         #map(lambda p: dtj['rows'].append({'c': self.port_item_to_row_fields(p)}), p2_items)
         #map(lambda p: dtj['rows'].append({'c': self.port_item_to_row_fields(p)}), p2_items)

+ 31 - 18
src/ws/client_g.html

@@ -25,12 +25,10 @@
 	var view = null;
 	var view = null;
 	var data = null;
 	var data = null;
 	var table= null;   
 	var table= null;   
-//        var options = {sortColumn:1, showRowNumber: true, width: '100%', height: '100%'};
-        var options = {sort: 'disable', sortColumn:-1, showRowNumber: true, width: '100%', height: '100%'};
-	   //google.charts.load('current', {'packages':['table']});
-	   google.load("visualization", "1.1", {packages:["corechart", 'table','gauge']});
+    var options = {allowHtml: true, sortColumn:1, showRowNumber: true, width: '100%', height: '100%'};
+	google.load("visualization", "1.1", {packages:["corechart", 'table','gauge']});
 	   //google.setOnLoadCallback(drawTable);
 	   //google.setOnLoadCallback(drawTable);
-	   google.setOnLoadCallback(init);
+	google.setOnLoadCallback(init);
 	
 	
 
 
 	
 	
@@ -46,20 +44,34 @@
 	}
 	}
 	
 	
 	
 	
-	   
-	function drawTable() {
-	 
-   	   data= new google.visualization.DataTable();
-	   table = new google.visualization.Table(document.getElementById('table_div'));
-	   table.draw(data, {sort: 'event', sortColumn:-1, showRowNumber: true, width: '100%', height: '100%'});
-	 }
+	function setupFormatter(tableData){
+	    var numF = new google.visualization.NumberFormat(
+    		    {prefix: '$', pattern:'0.00', negativeColor: 'red', negativeParens: true});
+	    var percentF = new google.visualization.NumberFormat(
+	    		{pattern: '##.#%'})
+	    var arrowF = new google.visualization.ArrowFormat();
+        var barF = new google.visualization.BarFormat({width: 80,
+			colorPositive: 'green', max:100 });       
+    			    
+    	var colorF = new google.visualization.ColorFormat();
+    	colorF.addRange(-100, 0, 'white', 'red');
+    	colorF.addRange(0, 100, 'white', 'blue');
+    	 	    
+	    
+	    numF.format(data, 3);  //market value
+	    colorF.format(data, 6); // position
+	    percentF.format(data, 7); //delta		
+	    percentF.format(data, 8); //theta    
+	    numF.format(data, 10); // position delta
+	    numF.format(data, 11); // position theta
+	    numF.format(data, 13); //unreal p/l
+	    barF.format(data, 14) //% gain loss
+		
+	}	   
 	   
 	   
 
 
     var ws;
     var ws;
 	
 	
-	
-	
-    
     function init() {
     function init() {
 
 
       // Connect to Web Socket
       // Connect to Web Socket
@@ -80,12 +92,13 @@
 
 
 			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: 14, test: function(value, row, column, table) {
 			/*view.setRows(view.getFilteredRows([{column: 14, test: function(value, row, column, table) {
         return (value == 'HSI' || value == 'MHI') 
         return (value == 'HSI' || value == 'MHI') 
     }}]));*/
     }}]));*/
+    		setupFormatter(data);
 			table = new google.visualization.Table(document.getElementById('table_div'));
 			table = new google.visualization.Table(document.getElementById('table_div'));
-			table.draw(data, options);
+			table.draw(view, options);
 			output('number of rows: ' + data.getNumberOfRows());
 			output('number of rows: ' + data.getNumberOfRows());
            
            
         } else if (d1.event == 'event_tm_table_row_updated'){
         } else if (d1.event == 'event_tm_table_row_updated'){
@@ -99,7 +112,7 @@
 			
 			
 			table.draw(data, options);
 			table.draw(data, options);
 //			table.draw(data);           
 //			table.draw(data);           
-//        	setValueAtRandomCell(getRandomInt(1000, 5000));
+
         }
         }
         
         
       };
       };

+ 1 - 1
src/ws/ws_server.py

@@ -146,7 +146,7 @@ class PortfolioTableModelListener(BaseMessageListener):
     '''
     '''
     
     
     '''
     '''
-    CACHE_MAX = 25
+    CACHE_MAX = 15
     TIME_MAX = 1.0
     TIME_MAX = 1.0
     
     
     def __init__(self, name, server_wrapper):
     def __init__(self, name, server_wrapper):