Incorrect Indicator asigment in public void setInputParameter(int index, Object array)

Hi,

I'm writting my first Ask/Bid comparison indicator but it raise some errors.

The indicator uses two inputs:
InputParameterInfo iAsk = new InputParameterInfo("Ask Price",
InputParameterInfo.Type.BAR);
InputParameterInfo iBid = new InputParameterInfo("Bid Price",
InputParameterInfo.Type.BAR);

iAsk.setOfferSide(OfferSide.ASK);
iBid.setOfferSide(OfferSide.BID);

But, sometimes in calculations, it produces OutOfBounds exception, with no reason.

Then I put this comprobation code in setInputParameter:
public void setInputParameter(int index, Object array) {
inputs[index] = (IBar[]) array;

if (index == 1)
{
if (inputs[0] != null)
{
if (inputs[1].length != inputs[0].length)
{

consoleT.getErr().format("Inputs error; input[0]: %d elements from %tc to %tc input[1]: %d elements from %tc to %tc",
inputs[0].length, new Date(inputs[0][0].getTime()), new Date(inputs[0][inputs[0].length - 1].getTime()),
inputs[1].length, new Date(inputs[1][0].getTime()), new Date(inputs[1][inputs[1].length - 1].getTime())).println();
}
}
}
}


And, for example, using EUR/USD chart in one hour ticks. When i reduce zoom to maximum and go to 2013 year, my code raises this error.

Inputs error; input[0]: 5029 elements from Fri Apr 19 00:00:00 CEST 2013 to Tue Jan 21 12:00:00 CET 2014 input[1]: 4000 elements from Fri May 31 21:00:00 CEST 2013 to Tue Jan 21 12:00:00 CET 2014

What is wrong?, why input[1] (BID side) is only 4000 elements long?


Another error produces when i change the Bid to Ask in the graphics. Then the error changes to:

Inputs error; input[0]: 4000 elements from Fri May 31 22:00:00 CEST 2013 to Tue Jan 21 13:00:00 CET 2014 input[1]: 5653 elements from Thu Mar 28 00:00:00 CET 2013 to Tue Jan 21 13:00:00 CET 2014

Now, input[0] (ASK side) gives only 4000 elements?



Could be a graphics (side Ask/Bid) interrelation with my indicator asking for both sides?


Best regards,

Víctor


Here is the whole Java code:

package jforex;

import java.util.ArrayList;
import java.util.Date;
import java.awt.Color;

import com.dukascopy.api.IBar;
import com.dukascopy.api.IConsole;
import com.dukascopy.api.OfferSide;
import com.dukascopy.api.indicators.*;

public class TestAskBid implements IIndicator {
protected IndicatorInfo indicatorInfo;
protected ArrayList<InputParameterInfo> listInputParameterInfos = new ArrayList<InputParameterInfo>();
protected InputParameterInfo[] inputParameterInfos;
protected ArrayList<OptInputParameterInfo> listOptInputParameterInfos = new ArrayList<OptInputParameterInfo>();
protected OptInputParameterInfo[] optInputParameterInfos;
protected ArrayList<OutputParameterInfo> listOutputParameterInfos = new ArrayList<OutputParameterInfo>();
protected OutputParameterInfo[] outputParameterInfos;
protected IBar[][] inputs = new IBar[2][];
private int timePeriod = 20;
protected double[][] outputs = new double[1][];

private IConsole consoleT;

public void onStart(IIndicatorContext context) {
consoleT = context.getConsole();

indicatorInfo = new IndicatorInfo("TestAskBid", "TestAskBid", "My indicators",
false, false, false, 2, 1, 1);

InputParameterInfo iAsk = new InputParameterInfo("Ask Price",
InputParameterInfo.Type.BAR);
InputParameterInfo iBid = new InputParameterInfo("Bid Price",
InputParameterInfo.Type.BAR);

iAsk.setOfferSide(OfferSide.ASK);
iBid.setOfferSide(OfferSide.BID);

listInputParameterInfos.add(iAsk);
listInputParameterInfos.add(iBid);

listOptInputParameterInfos
.add(new OptInputParameterInfo("Period",
OptInputParameterInfo.Type.OTHER,
new IntegerRangeDescription(20,
1, 100, 1)));

listOutputParameterInfos.add(new OutputParameterInfo("TestAskBid",
OutputParameterInfo.Type.DOUBLE,
OutputParameterInfo.DrawingStyle.HISTOGRAM)
{
{
setColor(new Color(255, 0, 0));
}
});


/* Generic */
indicatorInfo.setRecalculateOnNewCandleOnly(true);

inputParameterInfos = new InputParameterInfo[listInputParameterInfos
.size()];
listInputParameterInfos.toArray(inputParameterInfos);

optInputParameterInfos = new OptInputParameterInfo[listOptInputParameterInfos
.size()];
listOptInputParameterInfos.toArray(optInputParameterInfos);

outputParameterInfos = new OutputParameterInfo[listOutputParameterInfos
.size()];
listOutputParameterInfos.toArray(outputParameterInfos);
}

public IndicatorResult calculate(int startIndex, int endIndex) {
//calculating startIndex taking into account lookback value
if (startIndex - getLookback() < 0) {
startIndex -= startIndex - getLookback();
}
int i, j;
for (i = startIndex, j = 0; i <= endIndex; i++, j++) {
// Do calculation.
}
return new IndicatorResult(startIndex, endIndex - startIndex + 1);
}

public IndicatorInfo getIndicatorInfo() {
return indicatorInfo;
}

public InputParameterInfo getInputParameterInfo(int index) {
if (index <= inputParameterInfos.length) {
return inputParameterInfos[index];
}
return null;
}

public int getLookback() {
return timePeriod;
}

public int getLookforward() {
return 0;
}

public OptInputParameterInfo getOptInputParameterInfo(int index) {
if (index <= optInputParameterInfos.length) {
return optInputParameterInfos[index];
}
return null;
}

public OutputParameterInfo getOutputParameterInfo(int index) {
if (index <= outputParameterInfos.length) {
return outputParameterInfos[index];
}
return null;
}

public void setInputParameter(int index, Object array) {
inputs[index] = (IBar[]) array;

if (index == 1)
{
if (inputs[0] != null)
{
if (inputs[1].length != inputs[0].length)
{

consoleT.getErr().format("Inputs error; input[0]: %d elements from %tc to %tc input[1]: %d elements from %tc to %tc",
inputs[0].length, new Date(inputs[0][0].getTime()), new Date(inputs[0][inputs[0].length - 1].getTime()),
inputs[1].length, new Date(inputs[1][0].getTime()), new Date(inputs[1][inputs[1].length - 1].getTime())).println();
}
}
}
}

public void setOptInputParameter(int index, Object value) {
timePeriod = (Integer) value;
}

public void setOutputParameter(int index, Object array) {
outputs[index] = (double[]) array;
}
}

Translate to English Show original

orto leave comments

Answers: 2

Best Answer

Hey,
i am not are if getting ASK and BID prices from the chart for an Indicator at the same time is properly defined - note that one Value defaults to 4000, irregardless of set interval. Also the charts allows to display either BID or ASK prices.
A Solution would be to build a custom strategy and overloading "onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) " to calculate the difference while plotting it with an primitive Indicator

Translate to English Show original
10 Feb. 2014 by

orto leave comments

"Asignment" better :)

Translate to English Show original
21 Jan. 2014 by

orto leave comments
Please log in or register to post answer.