package jforex.feed.test;
import java.util.Arrays;
import java.util.HashSet;
import com.dukascopy.api.*;
import com.dukascopy.api.IIndicators.AppliedPrice;
import com.dukascopy.api.feed.*;
import com.dukascopy.api.feed.util.*;
import com.dukascopy.api.indicators.IIndicator;
public class FeedEmaMacdMinMax implements IStrategy, IFeedListener {
private IConsole console;
private IIndicators indicators;
@Configurable("フィード")
public IFeedDescriptor feedDescriptor = new RenkoFeedDescriptor(Instrument.EURUSD, PriceRange.ONE_PIP, OfferSide.BID);
@Configurable("インジケータ算出用フィードデータカウント")
public int dataCount = 10;
@Configurable("MINMAX期間")
public int minMaxTimePeriod = 5;
@Configurable("EMA期間")
public int emaTimePeriod = 12;
@Configurable("MACDシグナル期間")
public int macdSignalPeriod = 9;
@Configurable("MACD長期期間")
public int macdSlowPeriod = 26;
@Configurable("MACD短期期間")
public int macdFastPeriod = 12;
@Configurable("チャートを開く")
public boolean openChart = false;
private static int MAX = 0, MIN = 1;
@Override
public void onStart(IContext context) throws JFException {
console = context.getConsole();
indicators = context.getIndicators();
context.setSubscribedInstruments(new HashSet<Instrument>(Arrays.asList(new Instrument[] { feedDescriptor.getInstrument() })), true);
if (openChart) {
context.openChart(feedDescriptor);
}
print("フィード登録=" + feedDescriptor);
context.subscribeToFeed(feedDescriptor, this);
}
@Override
public void onFeedData(IFeedDescriptor feedDescriptor, ITimedData feedData) {
console.getInfo().println("フィードデータ:" + feedData + " フィードタイプ:" + feedDescriptor);
try {
double[] minMax = indicators.minMax(
feedDescriptor,
AppliedPrice.CLOSE,
feedDescriptor.getOfferSide(),
minMaxTimePeriod
).calculate(1);
print("シフト:直前のバー %s max=%.5f min=%.5f", feedDescriptor.getDataType(), minMax[MAX], minMax[MIN]);
double emaPrev = indicators.ema(
feedDescriptor,
AppliedPrice.CLOSE,
feedDescriptor.getOfferSide(),
emaTimePeriod
).calculate(1);
print("シフト:直前のバー %s ema=%.5f", feedDescriptor.getDataType(), emaPrev);
double[] ema =indicators.ema(
feedDescriptor,
AppliedPrice.CLOSE,
feedDescriptor.getOfferSide(),
emaTimePeriod
).calculate(dataCount, feedData.getTime(), 0);
print("フィード:直近10本のEMA %s %s: %s", dataCount, feedDescriptor.getDataType(), arrayToString(ema));
double[][] macd = indicators.macd(
feedDescriptor,
AppliedPrice.CLOSE,
feedDescriptor.getOfferSide(),
macdFastPeriod,
macdSlowPeriod,
macdSignalPeriod
).calculate(dataCount, feedData.getTime(), 0);
IIndicator macdIndicator = indicators.getIndicator("MACD");
for (int i = 0; i < macdIndicator.getIndicatorInfo().getNumberOfOutputs(); i++) {
String outputName = macdIndicator.getOutputParameterInfo(i).getName();
print("フィード:MACD %s の直近%s本データ %s: %s",
outputName, dataCount, feedDescriptor.getDataType(), arrayToString(macd[i]));
}
} catch (JFException e) {
console.getErr().println(e);
e.printStackTrace();
}
}
private void print(Object o) {
console.getOut().println(o);
}
private void print(String format, Object... args) {
console.getOut().format(format, args).println();
}
private static String arrayToString(double[] arr) {
String str = "";
for (int r = 0; r < arr.length; r++) {
str += String.format("[%s] %.5f; ", r, arr[r]);
}
return str;
}
@Override
public void onTick(Instrument instrument, ITick tick) throws JFException { }
@Override
public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException { }
@Override
public void onMessage(IMessage message) throws JFException { }
@Override
public void onAccount(IAccount account) throws JFException { }
@Override
public void onStop() throws JFException { }
}