/* * 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.core.ats.javascript; import org.eclipse.core.runtime.IAdaptable; import org.eclipsetrader.core.ats.engines.BarsDataSeriesFunction; import org.eclipsetrader.core.ats.engines.IndicatorFunction; import org.eclipsetrader.core.ats.engines.JavaScriptEngineInstrument; import org.eclipsetrader.core.charts.NumericDataSeries; import org.eclipsetrader.ui.charts.MAType; import org.eclipsetrader.ui.charts.OHLCField; import org.eclipsetrader.ui.internal.charts.Util; import org.eclipsetrader.ui.internal.charts.indicators.Activator; import org.mozilla.javascript.Context; import org.mozilla.javascript.Function; import org.mozilla.javascript.ScriptableObject; import com.tictactec.ta.lib.Core; import com.tictactec.ta.lib.MInteger; public class MACDH extends IndicatorFunction { private static final long serialVersionUID = -9191442400382251716L; 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; public MACDH() { } public MACDH(BarsDataSeriesFunction bars, int fastPeriod, int slowPeriod, int signalPeriod) { super(bars); this.fastPeriod = fastPeriod; this.slowPeriod = slowPeriod; this.signalPeriod = signalPeriod; calculate(); } public static Object jsConstructor(Context cx, Object[] args, Function ctorObj, boolean inNewExpr) { BarsDataSeriesFunction bars = (BarsDataSeriesFunction) ScriptableObject.getProperty( getTopLevelScope(ctorObj), JavaScriptEngineInstrument.PROPERTY_BARS); int fastPeriod = (int) Context.toNumber(args[0]); int slowPeriod = (int) Context.toNumber(args[1]); int signalPeriod = (int) Context.toNumber(args[2]); MACDH result = new MACDH(bars, fastPeriod, slowPeriod, signalPeriod); return result; } /* (non-Javadoc) * @see org.eclipsetrader.core.ats.javascript.IndicatorFunction#calculate() */ @Override protected void calculate() { 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) { series = new NumericDataSeries(String.format("%s%d/%d/%d", getClassName(), fastPeriod, slowPeriod, signalPeriod), new Number[0], source); //$NON-NLS-1$ return; } 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); series = new NumericDataSeries(String.format("%s%d/%d/%d", getClassName(), fastPeriod, slowPeriod, signalPeriod), outMACDHist, source); //$NON-NLS-1$ } /* (non-Javadoc) * @see org.eclipsetrader.core.ats.javascript.IndicatorFunction#jsFunction_crosses(org.eclipsetrader.core.ats.javascript.IndicatorFunction, java.lang.Object) */ @Override public Object jsFunction_crosses(IndicatorFunction other, Object bar) { return super.jsFunction_crosses(other, bar); } /* (non-Javadoc) * @see org.eclipsetrader.core.ats.javascript.IndicatorFunction#jsFunction_first() */ @Override public Object jsFunction_first() { return super.jsFunction_first(); } /* (non-Javadoc) * @see org.eclipsetrader.core.ats.javascript.IndicatorFunction#jsFunction_last() */ @Override public Object jsFunction_last() { return super.jsFunction_last(); } /* (non-Javadoc) * @see org.eclipsetrader.core.ats.javascript.IndicatorFunction#jsFunction_highest() */ @Override public Object jsFunction_highest() { return super.jsFunction_highest(); } /* (non-Javadoc) * @see org.eclipsetrader.core.ats.javascript.IndicatorFunction#jsFunction_lowest() */ @Override public Object jsFunction_lowest() { return super.jsFunction_lowest(); } }