package jforex.strategies.indicators.arbitrary;
import java.io.File;
import java.util.Arrays;
import com.dukascopy.api.*;
import com.dukascopy.api.indicators.*;
import com.dukascopy.api.IIndicators.AppliedPrice;
@RequiresFullAccess
public class CalculateArbitraryIndicator implements IStrategy {
private IConsole console;
private IIndicators indicators;
@Configurable(value = "カスタムインジケータ.jfx file",
description = "カスタムインジケータ用。 プラットフォームインジケータの場合は、空のままにする。")
public File indFile;
@Configurable("インジケータ名")
public String indName = "ALLIGATOR";
@Configurable("通過ペア")
public Instrument instrument = Instrument.EURUSD;
@Configurable("時間軸")
public Period period = Period.ONE_MIN;
@Configurable("適用価格")
public AppliedPrice appliedPrice = AppliedPrice.CLOSE;
@Configurable("オファーサイド")
public OfferSide side = OfferSide.BID;
public void onStart(IContext context) throws JFException {
this.console = context.getConsole();
this.indicators = context.getIndicators();
if (indFile != null && indFile.exists()) {
indName = indicators.registerCustomIndicator(indFile);
}
IIndicator indicator = indicators.getIndicator(indName);
IndicatorInfo info = indicator.getIndicatorInfo();
int inputCount = info.getNumberOfInputs();
int optInputCount = info.getNumberOfOptionalInputs();
int outputCount = info.getNumberOfOutputs();
print("インプット数=%s, オプションインプット数=%s, アウトプット数=%s", inputCount, optInputCount, outputCount);
print("インプットパラメータタイプ=%s", indicator.getInputParameterInfo(0).getType());
AppliedPrice[] inputTypes = new AppliedPrice[inputCount];
Arrays.fill(inputTypes, appliedPrice);
OfferSide[] offerSides = new OfferSide[inputCount];
Arrays.fill(offerSides, side);
Object[] optParams = new Object[optInputCount];
for (int i = 0; i < optInputCount; i++) {
optParams[i] = indicator.getOptInputParameterInfo(i).getDescription().getOptInputDefaultValue();
print("オプションインプットのデフォルト設定: %s=%s", indicator.getOptInputParameterInfo(i).getName(), optParams[i]);
}
int shift = 0;
Object[] outputs = indicators.calculateIndicator(
instrument,
period,
offerSides,
indName,
inputTypes,
optParams,
shift
);
print("インジケータアウトプット: ");
for (int i = 0; i < outputCount; i++) {
OutputParameterInfo outputInfo = indicator.getOutputParameterInfo(i);
String outputName = outputInfo.getName();
if (outputInfo.getType() == OutputParameterInfo.Type.DOUBLE) {
print("%s=%.7f", outputName, (Double) outputs[i]);
} else if (outputInfo.getType() == OutputParameterInfo.Type.INT) {
print("%s=%s", outputName, outputs[i]);
} else {
print("%sのタイプはint/double以外のものです:%s。", outputName, outputs[i].getClass());
}
}
}
private void print(String format, Object... args) {
print(String.format(format, args));
}
private void print(Object message) {
console.getOut().println(message);
}
public void onAccount(IAccount account) throws JFException { }
public void onMessage(IMessage message) throws JFException { }
public void onStop() throws JFException { }
public void onTick(Instrument instrument, ITick tick) throws JFException { }
public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException { }
}