/*
* 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 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.graphics.RGB;
import org.eclipsetrader.core.charts.IDataSeries;
import org.eclipsetrader.core.charts.NumericDataSeries;
import org.eclipsetrader.ui.charts.ChartParameters;
import org.eclipsetrader.ui.charts.GroupChartObject;
import org.eclipsetrader.ui.charts.HistogramAreaChart;
import org.eclipsetrader.ui.charts.HistogramBarChart;
import org.eclipsetrader.ui.charts.IChartObject;
import org.eclipsetrader.ui.charts.IChartObjectFactory;
import org.eclipsetrader.ui.charts.IChartParameters;
import org.eclipsetrader.ui.charts.LineChart;
import org.eclipsetrader.ui.charts.LineChart.LineStyle;
import org.eclipsetrader.ui.charts.MAType;
import org.eclipsetrader.ui.charts.OHLCField;
import org.eclipsetrader.ui.charts.RenderStyle;
import org.eclipsetrader.ui.internal.charts.Util;
import org.eclipsetrader.ui.internal.charts.indicators.Activator;
import com.tictactec.ta.lib.Core;
import com.tictactec.ta.lib.MInteger;
public class MACD implements IChartObjectFactory, IExecutableExtension {
private String id;
private String factoryName;
private String name;
private OHLCField field = OHLCField.Close;
private int fastPeriod = 7;
private MAType fastMaType = MAType.EMA;
private int slowPeriod = 21;
private MAType slowMaType = MAType.EMA;
private int signalPeriod = 14;
private MAType signalMaType = MAType.EMA;
private RenderStyle macdLineStyle = RenderStyle.Line;
private RGB macdLineColor;
private RenderStyle signalLineStyle = RenderStyle.Dot;
private RGB signalLineColor;
private RenderStyle histLineStyle = RenderStyle.Invisible;
private RGB histLineColor;
public MACD() {
}
/* (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;
}
/* (non-Javadoc)
* @see org.eclipsetrader.ui.internal.charts.IGeneralPropertiesAdapter#setName(java.lang.String)
*/
public void setName(String name) {
this.name = name;
}
public OHLCField getField() {
return field;
}
public void setField(OHLCField field) {
this.field = field;
}
public int getFastPeriod() {
return fastPeriod;
}
public void setFastPeriod(int fastPeriod) {
this.fastPeriod = fastPeriod;
}
public int getSlowPeriod() {
return slowPeriod;
}
public void setSlowPeriod(int slowPeriod) {
this.slowPeriod = slowPeriod;
}
public int getSignalPeriod() {
return signalPeriod;
}
public void setSignalPeriod(int signalPeriod) {
this.signalPeriod = signalPeriod;
}
public MAType getFastMaType() {
return fastMaType;
}
public void setFastMaType(MAType fastMaType) {
this.fastMaType = fastMaType;
}
public MAType getSlowMaType() {
return slowMaType;
}
public void setSlowMaType(MAType slowMaType) {
this.slowMaType = slowMaType;
}
public MAType getSignalMaType() {
return signalMaType;
}
public void setSignalMaType(MAType signalMaType) {
this.signalMaType = signalMaType;
}
public RenderStyle getMacdLineStyle() {
return macdLineStyle;
}
public void setMacdLineStyle(RenderStyle macdLineStyle) {
this.macdLineStyle = macdLineStyle;
}
public RGB getMacdLineColor() {
return macdLineColor;
}
public void setMacdLineColor(RGB macdLineColor) {
this.macdLineColor = macdLineColor;
}
public RenderStyle getSignalLineStyle() {
return signalLineStyle;
}
public void setSignalLineStyle(RenderStyle signalLineStyle) {
this.signalLineStyle = signalLineStyle;
}
public RGB getSignalLineColor() {
return signalLineColor;
}
public void setSignalLineColor(RGB signalLineColor) {
this.signalLineColor = signalLineColor;
}
public RenderStyle getHistLineStyle() {
return histLineStyle;
}
public void setHistLineStyle(RenderStyle histLineStyle) {
this.histLineStyle = histLineStyle;
}
public RGB getHistLineColor() {
return histLineColor;
}
public void setHistLineColor(RGB histLineColor) {
this.histLineColor = histLineColor;
}
/* (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();
Core core = Activator.getDefault() != null ? Activator.getDefault().getCore() : new Core();
int lookback = core.macdExtLookback(fastPeriod, MAType.getTALib_MAType(fastMaType), slowPeriod, MAType.getTALib_MAType(slowMaType), signalPeriod, MAType.getTALib_MAType(signalMaType));
if (values.length < lookback) {
return null;
}
int startIdx = 0;
int endIdx = values.length - 1;
double[] inReal = Util.getValuesForField(values, field);
MInteger outBegIdx = new MInteger();
MInteger outNbElement = new MInteger();
double[] outMACD = new double[values.length - lookback];
double[] outSignal = new double[values.length - lookback];
double[] outMACDHist = new double[values.length - lookback];
core.macdExt(startIdx, endIdx, inReal, fastPeriod, MAType.getTALib_MAType(fastMaType), slowPeriod, MAType.getTALib_MAType(slowMaType), signalPeriod, MAType.getTALib_MAType(signalMaType), outBegIdx, outNbElement, outMACD, outSignal, outMACDHist);
GroupChartObject object = new GroupChartObject();
object.add(createLineChartObject(new NumericDataSeries("MACD", outMACD, source), macdLineStyle, macdLineColor));
object.add(createLineChartObject(new NumericDataSeries("MACD-S", outSignal, source), signalLineStyle, signalLineColor));
object.add(createLineChartObject(new NumericDataSeries("MACD-H", outMACDHist, source), histLineStyle, histLineColor));
return object;
}
protected IChartObject createLineChartObject(IDataSeries result, RenderStyle renderStyle, RGB color) {
LineStyle lineStyle = LineStyle.Solid;
switch (renderStyle) {
case Dash:
lineStyle = LineStyle.Dash;
break;
case Dot:
lineStyle = LineStyle.Dot;
break;
case HistogramBars:
return new HistogramBarChart(result);
case Histogram:
return new HistogramAreaChart(result, color);
case Invisible:
lineStyle = LineStyle.Invisible;
break;
}
return new LineChart(result, lineStyle, color);
}
/* (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("field", field.getName());
parameters.setParameter("fast-period", fastPeriod);
parameters.setParameter("fast-ma-type", fastMaType.getName());
parameters.setParameter("slow-period", slowPeriod);
parameters.setParameter("slow-ma-type", slowMaType.getName());
parameters.setParameter("signal-period", signalPeriod);
parameters.setParameter("signal-ma-type", signalMaType.getName());
parameters.setParameter("macd-style", macdLineStyle.getName());
if (macdLineColor != null) {
parameters.setParameter("macd-color", macdLineColor);
}
parameters.setParameter("signal-style", signalLineStyle.getName());
if (signalLineColor != null) {
parameters.setParameter("signal-color", signalLineColor);
}
parameters.setParameter("hist-style", histLineStyle.getName());
if (histLineColor != null) {
parameters.setParameter("hist-color", histLineColor);
}
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;
field = parameters.hasParameter("field") ? OHLCField.getFromName(parameters.getString("field")) : OHLCField.Close;
fastPeriod = parameters.getInteger("fast-period");
fastMaType = MAType.getFromName(parameters.getString("fast-ma-type"));
slowPeriod = parameters.getInteger("slow-period");
slowMaType = MAType.getFromName(parameters.getString("slow-ma-type"));
signalPeriod = parameters.getInteger("signal-period");
signalMaType = MAType.getFromName(parameters.getString("signal-ma-type"));
macdLineStyle = parameters.hasParameter("macd-style") ? RenderStyle.getStyleFromName(parameters.getString("macd-style")) : RenderStyle.Line;
macdLineColor = parameters.getColor("macd-color");
signalLineStyle = parameters.hasParameter("signal-style") ? RenderStyle.getStyleFromName(parameters.getString("signal-style")) : RenderStyle.Dot;
signalLineColor = parameters.getColor("signal-color");
histLineStyle = parameters.hasParameter("hist-style") ? RenderStyle.getStyleFromName(parameters.getString("hist-style")) : RenderStyle.Invisible;
histLineColor = parameters.getColor("hist-color");
}
}