/*
* 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.charts.indicators;
import java.util.Date;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExecutableExtension;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
import org.eclipsetrader.core.charts.DataSeries;
import org.eclipsetrader.core.charts.IDataSeries;
import org.eclipsetrader.core.charts.NumberValue;
import org.eclipsetrader.ui.charts.ChartObjectFocusEvent;
import org.eclipsetrader.ui.charts.ChartParameters;
import org.eclipsetrader.ui.charts.DataBounds;
import org.eclipsetrader.ui.charts.Graphics;
import org.eclipsetrader.ui.charts.GroupChartObject;
import org.eclipsetrader.ui.charts.IChartObject;
import org.eclipsetrader.ui.charts.IChartObjectFactory;
import org.eclipsetrader.ui.charts.IChartObjectVisitor;
import org.eclipsetrader.ui.charts.IChartParameters;
import org.eclipsetrader.ui.charts.IGraphics;
import org.eclipsetrader.ui.charts.OHLCField;
import org.eclipsetrader.ui.charts.PixelTools;
import org.eclipsetrader.ui.charts.RenderStyle;
import org.eclipsetrader.ui.internal.charts.Util;
public class TREND implements IChartObjectFactory, IExecutableExtension {
private String id;
private String factoryName;
private String name;
private int period = 30;
private RenderStyle upperLineStyle = RenderStyle.Line;
private RGB upperLineColor;
private RenderStyle middleLineStyle = RenderStyle.Dot;
private RGB middleLineColor;
private RenderStyle lowerLineStyle = RenderStyle.Line;
private RGB lowerLineColor;
private class LineToolObject implements IChartObject {
private RenderStyle style;
private RGB color;
private Date d1;
private Date d2;
private Double v1;
private Double v2;
private Point p1;
private Point p2;
private boolean hasFocus;
public LineToolObject(RenderStyle style, RGB color, Date d1, Double v1, Date d2, Double v2) {
this.style = style;
this.color = color;
this.d1 = d1;
this.v1 = v1;
this.d2 = d2;
this.v2 = v2;
}
/* (non-Javadoc)
* @see org.eclipsetrader.ui.charts.IChartObject#setDataBounds(org.eclipsetrader.ui.charts.DataBounds)
*/
@Override
public void setDataBounds(DataBounds bounds) {
}
/* (non-Javadoc)
* @see org.eclipsetrader.ui.charts.IChartObject#getDataSeries()
*/
@Override
public IDataSeries getDataSeries() {
return new DataSeries(name, new IAdaptable[] {
new NumberValue(d1, v1), new NumberValue(d2, v2)
});
}
/* (non-Javadoc)
* @see org.eclipsetrader.ui.charts.IChartObject#containsPoint(int, int)
*/
@Override
public boolean containsPoint(int x, int y) {
if (p1 != null && p2 != null) {
return PixelTools.isPointOnLine(x, y, p1.x, p1.y, p2.x, p2.y);
}
return false;
}
/* (non-Javadoc)
* @see org.eclipsetrader.ui.charts.IChartObject#getToolTip()
*/
@Override
public String getToolTip() {
return name;
}
/* (non-Javadoc)
* @see org.eclipsetrader.ui.charts.IChartObject#getToolTip(int, int)
*/
@Override
public String getToolTip(int x, int y) {
return null;
}
/* (non-Javadoc)
* @see org.eclipsetrader.ui.charts.IChartObject#handleFocusGained(org.eclipsetrader.ui.charts.ChartObjectFocusEvent)
*/
@Override
public void handleFocusGained(ChartObjectFocusEvent event) {
hasFocus = true;
}
/* (non-Javadoc)
* @see org.eclipsetrader.ui.charts.IChartObject#handleFocusLost(org.eclipsetrader.ui.charts.ChartObjectFocusEvent)
*/
@Override
public void handleFocusLost(ChartObjectFocusEvent event) {
hasFocus = false;
}
/* (non-Javadoc)
* @see org.eclipsetrader.ui.charts.IChartObject#invalidate()
*/
@Override
public void invalidate() {
}
/* (non-Javadoc)
* @see org.eclipsetrader.ui.charts.IChartObject#paint(org.eclipsetrader.ui.charts.IGraphics)
*/
@Override
public void paint(IGraphics graphics) {
p1 = new Point(graphics.mapToHorizontalAxis(d1), graphics.mapToVerticalAxis(v1));
p2 = new Point(graphics.mapToHorizontalAxis(d2), graphics.mapToVerticalAxis(v2));
graphics.pushState();
switch (style) {
case Dash:
graphics.setLineStyle(SWT.LINE_DASH);
break;
case Dot:
graphics.setLineStyle(SWT.LINE_DOT);
break;
default:
graphics.setLineStyle(SWT.LINE_SOLID);
break;
}
graphics.setForegroundColor(color);
graphics.setLineWidth(hasFocus ? 2 : 0);
graphics.drawLine(p1.x, p1.y, p2.x, p2.y);
graphics.popState();
}
/* (non-Javadoc)
* @see org.eclipsetrader.ui.charts.IChartObject#paintScale(org.eclipsetrader.ui.charts.Graphics)
*/
@Override
public void paintScale(Graphics graphics) {
}
/* (non-Javadoc)
* @see org.eclipsetrader.ui.charts.IChartObject#accept(org.eclipsetrader.ui.charts.IChartObjectVisitor)
*/
@Override
public void accept(IChartObjectVisitor visitor) {
}
}
public TREND() {
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement, java.lang.String, java.lang.Object)
*/
@Override
public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException {
id = config.getAttribute("id");
factoryName = config.getAttribute("name");
name = config.getAttribute("name");
}
/* (non-Javadoc)
* @see org.eclipsetrader.charts.ui.indicators.IChartIndicator#getId()
*/
@Override
public String getId() {
return id;
}
/* (non-Javadoc)
* @see org.eclipsetrader.charts.ui.indicators.IChartIndicator#getName()
*/
@Override
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPeriod() {
return period;
}
public void setPeriod(int period) {
this.period = period;
}
public RenderStyle getUpperLineStyle() {
return upperLineStyle;
}
public void setUpperLineStyle(RenderStyle upperLineStyle) {
this.upperLineStyle = upperLineStyle;
}
public RGB getUpperLineColor() {
return upperLineColor;
}
public void setUpperLineColor(RGB upperLineColor) {
this.upperLineColor = upperLineColor;
}
public RenderStyle getMiddleLineStyle() {
return middleLineStyle;
}
public void setMiddleLineStyle(RenderStyle middleLineStyle) {
this.middleLineStyle = middleLineStyle;
}
public RGB getMiddleLineColor() {
return middleLineColor;
}
public void setMiddleLineColor(RGB middleLineColor) {
this.middleLineColor = middleLineColor;
}
public RenderStyle getLowerLineStyle() {
return lowerLineStyle;
}
public void setLowerLineStyle(RenderStyle lowerLineStyle) {
this.lowerLineStyle = lowerLineStyle;
}
public RGB getLowerLineColor() {
return lowerLineColor;
}
public void setLowerLineColor(RGB lowerLineColor) {
this.lowerLineColor = lowerLineColor;
}
/* (non-Javadoc)
* @see org.eclipsetrader.ui.charts.IChartObjectFactory#createObject(org.eclipsetrader.core.charts.IDataSeries)
*/
@Override
public IChartObject createObject(IDataSeries source) {
if (source == null) {
return null;
}
IAdaptable[] values = source.getValues();
if (values.length < period) {
return null;
}
double[] inReal = Util.getValuesForField(values, OHLCField.Close);
int numberPlotPoints = 0;
double sumxx = 0;
double sumxy = 0;
double sumx = 0;
double sumy = 0;
for (int i = inReal.length - period; i < inReal.length; i++, numberPlotPoints++) {
double x = numberPlotPoints;
double y = inReal[i];
sumx += x;
sumy += y;
sumxx += x * x;
sumxy += x * y;
}
double n = numberPlotPoints;
double Sxx = sumxx - sumx * sumx / n;
double Sxy = sumxy - sumx * sumy / n;
double b = Sxy / Sxx;
double a = (sumy - b * sumx) / n;
double average = 0;
numberPlotPoints = 0;
for (int i = inReal.length - period; i < inReal.length; i++, numberPlotPoints++) {
average += Math.pow(inReal[i] - (a + numberPlotPoints * b), 2);
}
average /= numberPlotPoints;
average /= Math.sqrt(average);
Date d1 = (Date) values[values.length - period].getAdapter(Date.class);
Date d2 = (Date) values[values.length - 1].getAdapter(Date.class);
GroupChartObject object = new GroupChartObject();
object.add(new LineToolObject(middleLineStyle, middleLineColor, d1, a, d2, a + period * b));
object.add(new LineToolObject(upperLineStyle, upperLineColor, d1, a + average, d2, a + average + period * b));
object.add(new LineToolObject(lowerLineStyle, lowerLineColor, d1, a - average, d2, a - average + period * b));
return object;
}
/* (non-Javadoc)
* @see org.eclipsetrader.ui.charts.IChartObjectFactory#getParameters()
*/
@Override
public IChartParameters getParameters() {
ChartParameters parameters = new ChartParameters();
if (!factoryName.equals(name)) {
parameters.setParameter("name", name);
}
parameters.setParameter("period", period);
parameters.setParameter("upper-line-style", upperLineStyle.getName());
if (upperLineColor != null) {
parameters.setParameter("upper-line-color", upperLineColor);
}
parameters.setParameter("middle-line-style", middleLineStyle.getName());
if (middleLineColor != null) {
parameters.setParameter("middle-line-color", middleLineColor);
}
parameters.setParameter("lower-line-style", lowerLineStyle.getName());
if (lowerLineColor != null) {
parameters.setParameter("lower-line-color", lowerLineColor);
}
return parameters;
}
/* (non-Javadoc)
* @see org.eclipsetrader.ui.charts.IChartObjectFactory#setParameters(org.eclipsetrader.ui.charts.IChartParameters)
*/
@Override
public void setParameters(IChartParameters parameters) {
name = parameters.hasParameter("name") ? parameters.getString("name") : factoryName;
period = parameters.getInteger("period");
upperLineStyle = parameters.hasParameter("upper-line-style") ? RenderStyle.getStyleFromName(parameters.getString("upper-line-style")) : RenderStyle.Line;
upperLineColor = parameters.getColor("upper-line-color");
middleLineStyle = parameters.hasParameter("middle-line-style") ? RenderStyle.getStyleFromName(parameters.getString("middle-line-style")) : RenderStyle.Dot;
middleLineColor = parameters.getColor("middle-line-color");
lowerLineStyle = parameters.hasParameter("lower-line-style") ? RenderStyle.getStyleFromName(parameters.getString("lower-line-style")) : RenderStyle.Line;
lowerLineColor = parameters.getColor("lower-line-color");
}
}