/*
* Copyright (c) 2004-2011 Marco Maccaferri and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Marco Maccaferri - initial API and implementation
*/
package org.eclipsetrader.ui.internal.ats;
import java.text.DateFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.part.ViewPart;
import org.eclipsetrader.core.ats.Report;
import org.eclipsetrader.core.ats.simulation.SimulationReport;
import org.eclipsetrader.core.charts.OHLCDataSeries;
import org.eclipsetrader.core.feed.IBar;
import org.eclipsetrader.core.feed.IOHLC;
import org.eclipsetrader.core.feed.OHLC;
import org.eclipsetrader.core.instruments.ISecurity;
import org.eclipsetrader.core.trading.IOrder;
import org.eclipsetrader.core.trading.IOrderSide;
import org.eclipsetrader.core.trading.IStockTransaction;
import org.eclipsetrader.core.trading.ITransaction;
import org.eclipsetrader.ui.Util;
import org.eclipsetrader.ui.charts.BarChart;
import org.eclipsetrader.ui.charts.BaseChartViewer;
import org.eclipsetrader.ui.charts.IChartObject;
import org.eclipsetrader.ui.charts.LineChart;
import org.eclipsetrader.ui.charts.LineChart.LineStyle;
import org.eclipsetrader.ui.internal.charts.VOLUME;
public class ReportViewPart extends ViewPart {
public static final String VIEW_ID = "org.eclipsetrader.ui.ats.views.report";
private BaseChartViewer equityChartViewer;
private TableViewer tradesViewer;
public ReportViewPart() {
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createPartControl(Composite parent) {
createSummaryPage(parent);
}
private Control createSummaryPage(Composite parent) {
SashForm content = new SashForm(parent, SWT.VERTICAL | SWT.NO_FOCUS);
GC gc = new GC(content);
FontMetrics fontMetrics = gc.getFontMetrics();
gc.dispose();
Composite composite = new Composite(content, SWT.NONE);
composite.setLayout(new GridLayout(1, false));
Label label = new Label(composite, SWT.NONE);
label.setText("Performance");
equityChartViewer = new BaseChartViewer(composite, SWT.BORDER);
equityChartViewer.setFillAvailableSpace(true);
equityChartViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
composite = new Composite(content, SWT.NONE);
composite.setLayout(new GridLayout(1, false));
label = new Label(composite, SWT.NONE);
label.setText("Trades");
tradesViewer = new TableViewer(composite, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION);
tradesViewer.getTable().setHeaderVisible(true);
tradesViewer.getTable().setLinesVisible(false);
tradesViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
content.setWeights(new int[] {
75, 25
});
final DateFormat dateFormat = Util.getDateFormat();
final NumberFormat numberFormat = NumberFormat.getInstance();
numberFormat.setGroupingUsed(true);
numberFormat.setMinimumFractionDigits(2);
numberFormat.setMaximumFractionDigits(2);
final NumberFormat priceNumberFormat = NumberFormat.getInstance();
priceNumberFormat.setGroupingUsed(false);
priceNumberFormat.setMinimumFractionDigits(1);
priceNumberFormat.setMaximumFractionDigits(4);
TableViewerColumn vewerColumn = new TableViewerColumn(tradesViewer, SWT.NONE);
vewerColumn.getColumn().setText("Date / Time");
vewerColumn.getColumn().setWidth(Dialog.convertHorizontalDLUsToPixels(fontMetrics, 60));
vewerColumn.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell) {
ITransaction transaction = (ITransaction) cell.getElement();
cell.setText(dateFormat.format(transaction.getOrder().getDate()));
}
});
vewerColumn = new TableViewerColumn(tradesViewer, SWT.NONE);
vewerColumn.getColumn().setText("Instrument");
vewerColumn.getColumn().setWidth(Dialog.convertHorizontalDLUsToPixels(fontMetrics, 150));
vewerColumn.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell) {
IOrder order = ((ITransaction) cell.getElement()).getOrder();
if (order != null) {
cell.setText(order.getSecurity().getName());
}
}
});
vewerColumn = new TableViewerColumn(tradesViewer, SWT.NONE);
vewerColumn.getColumn().setText("Side");
vewerColumn.getColumn().setWidth(Dialog.convertHorizontalDLUsToPixels(fontMetrics, 50));
vewerColumn.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell) {
IOrder order = ((ITransaction) cell.getElement()).getOrder();
if (order != null) {
cell.setText(order.getSide().toString());
}
}
});
vewerColumn = new TableViewerColumn(tradesViewer, SWT.RIGHT);
vewerColumn.getColumn().setText("Q.ty");
vewerColumn.getColumn().setWidth(Dialog.convertHorizontalDLUsToPixels(fontMetrics, 60));
vewerColumn.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell) {
ITransaction transaction = (ITransaction) cell.getElement();
if (transaction instanceof IStockTransaction) {
cell.setText(String.valueOf(((IStockTransaction) transaction).getFilledQuantity()));
}
}
});
vewerColumn = new TableViewerColumn(tradesViewer, SWT.RIGHT);
vewerColumn.getColumn().setText("Avg. Price");
vewerColumn.getColumn().setWidth(Dialog.convertHorizontalDLUsToPixels(fontMetrics, 60));
vewerColumn.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell) {
ITransaction transaction = (ITransaction) cell.getElement();
if (transaction instanceof IStockTransaction) {
cell.setText(priceNumberFormat.format(((IStockTransaction) transaction).getAveragePrice()));
}
}
});
vewerColumn = new TableViewerColumn(tradesViewer, SWT.RIGHT);
vewerColumn.getColumn().setText("Amount");
vewerColumn.getColumn().setWidth(Dialog.convertHorizontalDLUsToPixels(fontMetrics, 60));
vewerColumn.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell) {
ITransaction transaction = (ITransaction) cell.getElement();
IOrder order = transaction.getOrder();
double amount = transaction.getAmount().getAmount();
if (order != null) {
cell.setText(numberFormat.format(order.getSide() == IOrderSide.Buy ? -amount : amount));
}
else {
cell.setText(numberFormat.format(amount));
}
}
});
vewerColumn = new TableViewerColumn(tradesViewer, SWT.NONE);
vewerColumn.getColumn().setText("Message");
vewerColumn.getColumn().setWidth(Dialog.convertHorizontalDLUsToPixels(fontMetrics, 100));
vewerColumn.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell) {
IOrder order = ((ITransaction) cell.getElement()).getOrder();
if (order != null && order.getReference() != null) {
cell.setText(order.getReference());
}
}
});
tradesViewer.setContentProvider(new ArrayContentProvider());
return content;
}
private Control createSecurityPage(Composite parent, ISecurity security, List<IBar> bars) {
BaseChartViewer chartViewer = new BaseChartViewer(parent, SWT.NONE);
chartViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
List<IOHLC> list = new ArrayList<IOHLC>();
for (IBar bar : bars) {
list.add(new OHLC(bar.getDate(), bar.getOpen(), bar.getHigh(), bar.getLow(), bar.getClose(), bar.getVolume()));
}
OHLCDataSeries dataSeries = new OHLCDataSeries(security.getName(), list.toArray(new IOHLC[list.size()]), null);
chartViewer.setInput(new IChartObject[][] {
new IChartObject[] {
new BarChart(dataSeries),
},
new IChartObject[] {
new VOLUME().createObject(dataSeries)
}
});
return chartViewer.getControl();
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.WorkbenchPart#setFocus()
*/
@Override
public void setFocus() {
equityChartViewer.getControl().setFocus();
}
public void setReport(Report report) {
String title = NLS.bind("Report: {0}", new Object[] {
report.getStrategy().getName()
});
if (report instanceof SimulationReport) {
SimulationReport simulationReport = (SimulationReport) report;
DateFormat dateFormat = Util.getDateFormat();
title = NLS.bind("Report: {0} [{1}-{2}]", new Object[] {
report.getStrategy().getName(),
dateFormat.format(simulationReport.getBegin()),
dateFormat.format(simulationReport.getEnd())
});
}
setPartName(title);
LineChart lineChart = new LineChart(report.getEquityData(), LineStyle.Solid, new RGB(0, 0, 224));
equityChartViewer.setInput(new IChartObject[][] {
new IChartObject[] {
lineChart
},
});
equityChartViewer.setSummaryVisible(false);
tradesViewer.setInput(report.getTradesData());
}
}