package com.activequant.trading.datamodel;
import java.util.List;
import com.activequant.trading.AbstractTSBase;
@SuppressWarnings("serial")
public class PositionTable extends AQTableDataBase {
public enum Columns{
INSTRUMENTID(0, "Instrument ID"),
POSITION(1, "Position"),
ENTRYPRICE(2, "Avg. Entry PX"),
PNLATLIQUIDATION(3, "Crnt. Liquidation P/L");
//
int colIdx;
String colname;
private Columns(int pos, String colname){
this.colIdx = pos;
this.colname = colname;
}
public int colIdx(){return colIdx;}
public String colName(){return colname;}
}
private Object[][] data = new Object[0][];
private String[] header;
public PositionTable(){
super();
header = new String[Columns.values().length];
for(int i=0;i<header.length;i++){
header[i] = Columns.values()[i].name();
}
}
public PositionTable(AbstractTSBase abstractTSBase) {
super(abstractTSBase);
header = new String[Columns.values().length];
for(int i=0;i<header.length;i++){
header[i] = Columns.values()[i].colName();
}
}
public void deleteInstrument(String instrumentId){
if(containsInstrumentId(instrumentId)){
int pos = getPosition(instrumentId);
//
List<Object[]> l = c(data);
l.remove(pos);
data = c(l);
}
}
public boolean containsInstrumentId(String instId){
for(Object[] row : data){
if(row[Columns.INSTRUMENTID.colIdx].equals(instId))return true;
}
return false;
}
/**
* Use getRowIdx instead
* @param instId
* @return
*/
@Deprecated
public int getPosition(String instId){
return getRowIdx(instId);
}
/**
* returns the row index in which information is stored.
* This information never changes unless the table is emptied and new instruments are added.
*
* @param instId
* @return
*/
public int getRowIdx(String instId){
int pos = -1;
for(Object[] row : data){
pos++;
if(row[Columns.INSTRUMENTID.colIdx].equals(instId))return pos;
}
throw new RuntimeException("Instrument ID not present in current system configuration. Cannot continue. ");
}
public void addInstrument(String instrumentId){
// convert data to list.
List<Object[]> l = c(data);
Object[] row = new Object[header.length];
row[Columns.INSTRUMENTID.colIdx] = instrumentId;
row[Columns.POSITION.colIdx] = 0.0;
row[Columns.ENTRYPRICE.colIdx] = 0.0;
l.add(row);
data = c(l);
}
public void setPosition(String instrumentId, Double price, Double quantity){
//
List<Object[]> rows = c(data);
Object[] row = null;
int rowIndex = -1;
for(int i=0;i<rows.size();i++)
{
if(rows.get(i)[Columns.INSTRUMENTID.colIdx].equals(instrumentId)){
row = rows.get(i);
rowIndex = i;
break;
}
}
if(row == null){
row =new Object[header.length];
rows.add(row);
rowIndex = rows.size()-1;
}
//
row[Columns.INSTRUMENTID.colIdx] = instrumentId;
row[Columns.ENTRYPRICE.colIdx] = price;
row[Columns.POSITION.colIdx] = quantity;
//
data = c(rows);
getRowUpdateEvent().fire(rowIndex);
}
/**
* returns the current position for a tradeable.
* @param instrumentId
* @return
*/
public double getCurrentPosition(String instrumentId){
int pos = -1;
for(Object[] row : data){
pos++;
if(row[Columns.INSTRUMENTID.colIdx].equals(instrumentId))break;
}
if(pos!=-1){
return ((Double)data[pos][Columns.POSITION.colIdx]).doubleValue();
}
return 0.0;
}
/**
* returns the current entry price for a tradeable.
* @param instrumentId
* @return
*/
public double getEntryPrice(String instrumentId){
int pos = -1;
for(Object[] row : data){
pos++;
if(row[Columns.INSTRUMENTID.colIdx].equals(instrumentId))break;
}
if(pos!=-1){
return ((Double)data[pos][Columns.ENTRYPRICE.colIdx]).doubleValue();
}
return 0.0;
}
@Override
public Object[][] getData() {
return data;
}
@Override
public String[] getHeader() {
return header;
}
}