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 CalculateArbIndCandleInterval implements IStrategy {
private IConsole console;
private IIndicators indicators;
private IHistory history;
@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;
@Configurable("バーカウント")
public int candleCount = 10;
public void onStart(IContext context) throws JFException {
this.console = context.getConsole();
this.indicators = context.getIndicators();
this.history = context.getHistory();
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);
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]);
}
long currBarTime = history.getBar(instrument, period, side, 0).getTime();
Object[] outputs = indicators.calculateIndicator(
instrument,
period, offerSides,
indName, inputTypes,
optParams,
Filter.NO_FILTER,
candleCount,
currBarTime,
0
);
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=%s", outputName, arrayToString((double[])outputs[i]));
} else if(outputInfo.getType() == OutputParameterInfo.Type.INT){
print("%s=%s", outputName, arrayToString((int[])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 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;
}
public static String arrayToString(int[] arr) {
String str = "";
for (int r = 0; r < arr.length; r++) {
str += String.format("[%s] %s; ", r, arr[r]);
}
return str;
}
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 { }
}