Dukascopy
 
 
Wiki JStore Search Login

JFOREX-2480 Spearman Indicator
 Post subject: JFOREX-2480 Spearman Indicator Post rating: 0   Post Posted: Wed 16 Feb, 2011, 14:57 

User rating: 0
Joined: Wed 16 Feb, 2011, 14:43
Posts: 1
Hi, I've found the following, freely available Spearman Java code from the Internet. I tried to compile it using JForex but it hit huge error messages. I'm a newbie of both Java and JForex. Could you please take a look at the following code and tell me what I need to add on this code to work?

--------

package org.chartsy.spearman;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Stroke;
import java.text.DecimalFormat;
import java.util.LinkedHashMap;
import org.chartsy.main.ChartFrame;
import org.chartsy.main.chart.Indicator;
import org.chartsy.main.data.DataItem;
import org.chartsy.main.data.Dataset;
import org.chartsy.main.utils.DefaultPainter;
import org.chartsy.main.utils.Range;
import org.chartsy.main.utils.SerialVersion;
import org.openide.nodes.AbstractNode;

/**
*
* @author Viorel
*/
public class Spearman extends Indicator
{

private static final long serialVersionUID = SerialVersion.APPVERSION;

public static final String SPEARMAN = "spearman";
public static final String SMA = "sma";
private IndicatorProperties properties;

public Spearman()
{
super();
properties = new IndicatorProperties();
}

public @Override String getName()
{
return "Spearman Indicator";
}

public @Override String getLabel()
{
StringBuilder builder = new StringBuilder();
builder.append(properties.getLabel());
builder.append(" (").append(properties.getPeriod()).append(")");
return builder.toString();
}

public @Override String getPaintedLabel(ChartFrame cf)
{
return getLabel();
}

public @Override Indicator newInstance()
{
Indicator indicator = new Spearman();
return indicator;
}

public @Override LinkedHashMap getHTML(ChartFrame cf, int i)
{
LinkedHashMap ht = new LinkedHashMap();

DecimalFormat df = new DecimalFormat("#,##0.00");
double[] values = getValues(cf, i);
String[] labels = {"Spearman:", "SMA:"};

ht.put(getLabel(), " ");
if (values.length > 0) {
Color[] colors = getColors();
for (int j = 0; j < values.length; j++)
{
ht.put(getFontHTML(colors[j], labels[j]),
getFontHTML(colors[j], df.format(values[j])));
}
}

return ht;
}

public @Override void paint(Graphics2D graphics, ChartFrame chartFrame, Rectangle bounds)
{
Dataset spearman = visibleDataset(chartFrame, SPEARMAN);
Dataset sma = visibleDataset(chartFrame, SMA);

if (spearman != null)
{
if (maximized)
{
Range range = getRange(chartFrame);
DefaultPainter.line(
graphics, chartFrame, range, bounds, spearman,
properties.getColor(), properties.getStroke()); // paint line

if (sma != null)
{
DefaultPainter.line(
graphics, chartFrame, range, bounds, sma,
properties.getSMAColor(), properties.getSMAStroke()); // paint sma line
}
}
}
}

public @Override void calculate()
{
Dataset dataset = getDataset();
int count = dataset.getItemsCount();
int period = properties.getPeriod();

Dataset spearman = Dataset.EMPTY(count);

for (int i = period; i < count; i++)
{
double[] r1 = new double[period], // time series order
r2 = new double[period],
r11 = new double[period], // price (close)
r21 = new double[period], // internal sort table
r22 = new double[period]; // order of prices (close)

for (int j = 0; j < period; j++)
{
r1[j] = j;
r22[j] = j;
r11[j] = dataset.getCloseAt(i - period + j);
r21[j] = dataset.getCloseAt(i - period + j);
}

int changed = 1;
while (changed > 0)
{
changed = 0;
for (int j = 0; j < period - 1; j++)
{
if (r21[j + 1] < r21[j])
{
double temp = r21[j];
r21[j] = r21[j + 1];
r21[j + 1] = temp;
changed = 1;
}
}
}

for (int j = 0; j < period; j++)
{
int found = 0;
while (found < 1)
{
for (int k = 0; k < period; k++)
{
if (r21[k] == r11[j])
{
r22[j] = k;
found = 1;
}
}
}
}

double absum = 0;
for (int j = 0; j < period; j++)
{
double ab = r1[j] - r22[j];
double ab2 = Math.pow(ab, 2);
absum += ab2;
}

double coefcorr = (1 - (6 * absum) / (period * (period * period - 1)));
long time = dataset.getTimeAt(i);
double close = 100 * coefcorr;

DataItem item = new DataItem(time, close);
spearman.setDataItem(i, item);
}

int smaPeriod = properties.getSMAPeriod();
Dataset sma = Dataset.SMA(spearman, smaPeriod);

addDataset(SPEARMAN, spearman);
addDataset(SMA, sma);
}

public @Override boolean hasZeroLine()
{
return false;
}

public @Override boolean getZeroLineVisibility()
{
return false;
}

public @Override Color getZeroLineColor()
{
return null;
}

public @Override Stroke getZeroLineStroke()
{
return null;
}

public @Override boolean hasDelimiters()
{
return false;
}

public @Override boolean getDelimitersVisibility()
{
return false;
}

public @Override double[] getDelimitersValues()
{
return new double[] {};
}

public @Override Color getDelimitersColor()
{
return null;
}

public @Override Stroke getDelimitersStroke()
{
return null;
}

public @Override Color[] getColors()
{
return new Color[]
{
properties.getColor(),
properties.getSMAColor()
};
}

public @Override double[] getValues(ChartFrame chartFrame)
{
if (datasetExists(SPEARMAN) && datasetExists(SMA))
return new double[]
{
visibleDataset(chartFrame, SPEARMAN).getLastClose(),
visibleDataset(chartFrame, SMA).getLastClose()
};
return new double[] {};
}

public @Override double[] getValues(ChartFrame chartFrame, int i)
{
if (datasetExists(SPEARMAN) && datasetExists(SMA))
return new double[]
{
visibleDataset(chartFrame, SPEARMAN).getCloseAt(i),
visibleDataset(chartFrame, SMA).getCloseAt(i)
};
return new double[] {};
}

public @Override boolean getMarkerVisibility()
{
return properties.getMarker();
}

public @Override AbstractNode getNode()
{
return new IndicatorNode(properties);
}

@Override
public Range getRange(ChartFrame cf)
{
if (datasets.isEmpty())
return new Range();

Dataset spearman = visibleDataset(cf, SPEARMAN);
Dataset sma = visibleDataset(cf, SMA);

double min = Math.min(
spearman.getMin(Dataset.CLOSE_PRICE),
sma.getMin(Dataset.CLOSE_PRICE));
double max = Math.max(
spearman.getMax(Dataset.CLOSE_PRICE),
sma.getMax(Dataset.CLOSE_PRICE));
max = Math.max(max, Math.abs(min));
max = Math.round(max);
max = max + (10 - (max % 10)) + 10;
min = -1 * max;

Range range = new Range(min, max);
return range;
}

@Override
public Double[] getPriceValues(ChartFrame cf)
{
Double[] values = new Double[5];
Range range = getRange(cf);

double max = range.getUpperBound() - 10;
values[0] = new Double(0);
values[1] = new Double(max);
values[2] = new Double(max / 2);
values[3] = new Double(-1 * max);
values[4] = new Double((-1 * max) / 2);

return values;
}

}

---------

Thanks
Yangwoo


 
 Post subject: Re: JFOREX-2745 Spearman Indicator Post rating: 0   Post Posted: Wed 16 Feb, 2011, 15:54 
User avatar

User rating:
Joined: Fri 31 Aug, 2007, 09:17
Posts: 6139
Hi,
This indicator won't work under JForex, it needs to be rewritten completely. It seems to be the Spearman's Rank Correlation Index indicator, we are already working on adding this indicator to JForex, which means it will be available soon.


 
 Post subject: Re: JFOREX-2480 Spearman Indicator Post rating: 0   Post Posted: Fri 13 Jan, 2012, 02:55 

User rating: 0
Joined: Fri 25 Nov, 2011, 02:49
Posts: 17
Location: Malaysia,
Did this ever get completed?


 

Jump to:  

  © 1998-2025 Dukascopy® Bank SA
On-line Currency forex trading with Swiss Forex Broker - ECN Forex Brokerage,
Managed Forex Accounts, introducing forex brokers, Currency Forex Data Feed and News
Currency Forex Trading Platform provided on-line by Dukascopy.com