インジケータはシフト・バーインターバル・タイムインターバルのいずれかで算出する事が出来ます。
インジケータの算出はプライスのソース別に分けることが出来ます。
- ローソク足プライスフィード:各インジケータで4つのメソッドをサポートしています(詳細はインジケータカタログのページ参照)。
- ユニバーサルプライスフィード:レンジバーとカスタム期間と他プライスフィードでインジケータ算出出来ます。
- カスタムプライス配列:任意のプライス配列です。
ローソク足プライスフィード
ローソク足プライスフィードでの計算用のIIndicatorsインターフェースは、各インジケータに対して4メソッドあります。
各メソッドは対応するユニバーサルインジケータ算出メソッドを持っています。
例えばMACDインジケータは以下メソッドを持っています。
- シフトによるMACD
- バーインターバルによるMACD
- タイムインターバルによるMACD
- タイムインターバル(フィルター)によるMACD
これは4つのユニバーサルインジケータ算出メソッドに対応します。
- シフトによるインジケータ算出
- バーインターバルによるインジケータ算出
- タイムインターバルによるインジケータ算出
- タイムインターバル(フィルター)によるインジケータ算出
ユニバーサルメソッドはプラットフォームインジケータとカスタムインジケータの両方で使えます。
シフトとバーインターバルのメソッドはフィルターを使用しません。
タイムインバーバルはフィルターを使用します。
ティックフィードの算出はタイムインターバルメソッドでのみ使う事が出来ます。
実際の使用例は以下サンプルソースコードを参照して下さい。
サンプルソースコード:
MinMaxAtomicTests.java
サンプルソースコード:
EmaAtomicTests.java
シフトによるインジケータ算出
シフトによって算出するメソッドの構成は以下の通りです。
indicatorName(
Instrument instrument,
Period period,
OfferSide side,
IIndicators.AppliedPrice appliedPrice,
Indicator-specific parameters,
int shift
)
- Indicator-specific parametersは、
インジケータのオプション入力です。インジケータによってカウント数が異なります。
例えば、macdメソッドでは3(int型のパラメータ指定で、長期期間・短期期間・シグナル期間の3つ)まで入力可能です。
sqrtメソッドではパラメーター指定は出来ません。
- int shiftは、
現在のバーを基点に、後方に何本バーをシフトさせるかを指定します。
0の場合は、現在のバー(終値が確定していない生成中のバー)。
1の場合は、直前のバー(終値が確定している最新のバー)。
2の場合は、直前のバー(現在のバーから2つ前のバー)。
メソッドの戻り値は、インジケータの出力カウントに応じて、以下のいずれかを返します。
- double値(SMAのようにアウトプットが一つしかないインジケータの場合)
- double配列。配列にはそれぞれ異なる値を出力します(例えば、MINMAXでは1番目がMIN値、2番目がMAX値になります)
以下例は、5分足で直前のバーのMINMAXを、MINMAXインジケータメソッドで算出します。
int shift = 1;
double[] minMax = indicators.minMax(
Instrument.EURUSD,
Period.ONE_MIN,
OfferSide.ASK,
AppliedPrice.CLOSE,
5,
shift
);
console.getOut().println(String.format("シフト:直前のバー min=%1$.5f max=%2$.5f", minMax[0], minMax[1]));
以下例は、5分足で直前のバーのMINMAXを、ユニバーサルメソッドで算出します。
int shift = 1;
Object[] minMaxUni = indicators.calculateIndicator(
Instrument.EURUSD,
Period.ONE_MIN,
new OfferSide[] { OfferSide.ASK },
"MINMAX",
new AppliedPrice[] { IIndicators.AppliedPrice.CLOSE },
new Object[] { 5 },
shift
);
double[] minMax = {(Double) minMaxUni[0], (Double) minMaxUni[1]};
console.getOut().println(String.format("シフト(ユニバーサル):直前のバー min=%1$.5f max=%2$.5f", minMax[0], minMax[1]));
サンプルソースコード:
MinMaxAtomicTests.java
サンプルソースコード:
EmaAtomicTests.java
バーインターバルによるインジケータ算出
バーインターバルによって算出するメソッドの構成は以下の通りです。
indicatorName(
Instrument instrument,
Period period,
OfferSide side,
AppliedPrice appliedPrice,
Filter filter,
Indicator-specific parameters,
int numberOfCandlesBefore,
long time,
int numberOfCandlesAfter
)
- long timeは、
基準となるバーの時刻です。
- int numberOfCandlesBeforeは、
long timeで指定されたバーから前方向へのオフセット数です(timeのバーを含む)。
- int numberOfCandlesAfterは、
long timeで指定されたバーから後ろ方向へのオフセット数です。
メソッドの戻り値は、インジケータの出力カウントに応じて、以下のいずれかを返します。
- double型の1次元配列(アウトプットが一つしかないインジケータの場合)
- double型の2次元配列。各配列(2次元配列の1次元目の配列)にはそれぞれ異なる出力をします(例えば、MINMAXの1次元目が[0]の配列にはMINのデータ、1次元目が[1]の配列にはMAXのデータ)。
以下例は、5分足で直近4本のバーのMINMAXを、MINMAXインジケータメソッドで算出します。
int candlesBefore = 4, candlesAfter = 0;
long currBarTime = history.getBar(Instrument.EURUSD, Period.ONE_MIN, OfferSide.ASK, 0).getTime();
double[][] minMax = indicators.minMax(
Instrument.EURUSD,
Period.ONE_MIN,
OfferSide.ASK,
AppliedPrice.CLOSE,
5,
Filter.NO_FILTER,
candlesBefore,
currBarTime,
candlesAfter
);
int last = minMax[0].length - 1;
console.getOut().println(String.format(
"バーインターバル:現在のバー min=%1$.5f max=%2$.5f; 直前のバー min=%3$.5f max=%4$.5f;" +
" 3つ目のバー min=%5$.5f max=%6$.5f",
minMax[0][last], minMax[1][last], minMax[0][last - 1], minMax[1][last - 1], minMax[0][0], minMax[1][0]));
以下例は、5分足で直近4本のバーのMINMAXを、ユニバーサルメソッドで算出します。
int candlesBefore = 4, candlesAfter = 0;
long currBarTime = history.getBar(Instrument.EURUSD, Period.ONE_MIN, OfferSide.ASK, 0).getTime();
Object[] minMaxUni = indicators.calculateIndicator(
Instrument.EURUSD,
Period.ONE_MIN,
new OfferSide[] { OfferSide.ASK },
"MINMAX",
new AppliedPrice[] { IIndicators.AppliedPrice.CLOSE },
new Object[] { 5 },
Filter.NO_FILTER,
candlesBefore,
currBarTime,
candlesAfter
);
double[][] minMax = {(double[]) minMaxUni[0], (double[]) minMaxUni[1]};
int last = minMax[0].length - 1;
console.getOut().println(String.format(
"バーインターバル(ユニバーサル):現在のバー min=%1$.5f max=%2$.5f; 直前のバー min=%3$.5f max=%4$.5f;" +
" 3つ目のバー min=%5$.5f max=%6$.5f",
minMax[0][last], minMax[1][last], minMax[0][last - 1], minMax[1][last - 1], minMax[0][0], minMax[1][0]));
サンプルソースコード:
MinMaxAtomicTests.java
サンプルソースコード:
EmaAtomicTests.java
タイムインターバルによるインジケータ算出
タイムインターバルによって算出するメソッドの構成は以下の通りです。
indicatorName(
Instrument instrument,
Period period,
OfferSide side,
AppliedPrice appliedPrice,
Indicator-specific parameters,
long from,
long to
)
- long fromは、
算出開始するバーの時刻です。
- long toは、
算出終了するバーの時刻です。
メソッドの戻り値は、インジケータの出力カウントに応じて、以下のいずれかを返します。
- double型の1次元配列(アウトプットが一つしかないインジケータの場合)
- double型の2次元配列。各配列(2次元配列の1次元目の配列)にはそれぞれ異なる出力をします(例えば、MINMAXの1次元目が[0]の配列にはMINのデータ、1次元目が[1]の配列にはMAXのデータ)。
以下例は、5分足で直近4本のバーのMINMAXを、MINMAXインジケータメソッドで算出します。
long from = history.getBar(Instrument.EURUSD, Period.ONE_MIN, OfferSide.ASK, 3).getTime();
long to = history.getBar(Instrument.EURUSD, Period.ONE_MIN, OfferSide.ASK, 0).getTime();
double[][] minMax = indicators.minMax(
Instrument.EURUSD,
Period.ONE_MIN,
OfferSide.ASK,
AppliedPrice.CLOSE,
5,
from,
to
);
int last = minMax[0].length - 1;
console.getOut().println(String.format(
"タイムインターバル:現在のバー min=%1$.5f max=%2$.5f; 直前のバー min=%3$.5f max=%4$.5f;" +
" 3つ目のバー min=%5$.5f max=%6$.5f",
minMax[0][last], minMax[1][last], minMax[0][last - 1], minMax[1][last - 1], minMax[0][0], minMax[1][0]));
以下例は、5分足で直近4本のバーのMINMAXを、ユニバーサルメソッドで算出します。
long from = history.getBar(Instrument.EURUSD, Period.ONE_MIN, OfferSide.ASK, 3).getTime();
long to = history.getBar(Instrument.EURUSD, Period.ONE_MIN, OfferSide.ASK, 0).getTime();
Object[] minMaxUni = indicators.calculateIndicator(
Instrument.EURUSD,
Period.ONE_MIN,
new OfferSide[] { OfferSide.ASK },
"MINMAX",
new AppliedPrice[] { IIndicators.AppliedPrice.CLOSE },
new Object[] { 5 },
from,
to
);
double[][] minMax = {(double[]) minMaxUni[0], (double[]) minMaxUni[1]};
int last = minMax[0].length - 1;
console.getOut().println(String.format(
"タイムインターバル(ユニバーサル):現在のバー min=%1$.5f max=%2$.5f; 直前のバー min=%3$.5f max=%4$.5f;" +
" 3つ目のバー min=%5$.5f max=%6$.5f",
minMax[0][last], minMax[1][last], minMax[0][last - 1], minMax[1][last - 1], minMax[0][0], minMax[1][0]));
サンプルソースコード:
MinMaxAtomicTests.java
サンプルソースコード:
EmaAtomicTests.java
ユニバーサルプライスフィード
ユニバーサルプライスフィードはIFeedDescriptorによってセットアップされ、
フィードタイプはDataTypeによって決定されます。
これらを用いると、プラットフォームで利用可能な全データフィードのインジケータ算出が出来ます。
- ローソク足(標準の時間軸とカスタム時間軸の両方)
- レンジバー
- ティックバー
- ポイント&フィギュア
- 蓮子バー
以下3つのメソッドがユニバーサルプライスフィードのインジケータ算出で使えます。
- シフトによるインジケータ算出
- ユニットインターバルによるインジケータ算出(フィードタイプによって決まる)
- タイムインターバルによるインジケータ算出
この手法での利点は、異なるプライスソースへの切り替えが容易になる事です。
例えば、SMA算出で使用しているローソク足からレンジバーに切り替える等。
パフォーマンスを向上させるには、
インジケータ―算出で使用するIFeedDescriptorのフィードを登録し、フィードキャッシュを有効にする(IContext.subscribeToFeedを呼ぶ)事です
シフトによるプライスフィード算出
以下例は、ユニバーサルプライスフィードメソッドを用いて、
直近の5分足のレンジバーのMINMAXを算出します。
double[] minMax = indicators.minMax(
feedDescriptor,
AppliedPrice.CLOSE,
feedDescriptor.getOfferSide(),
minMaxTimePeriod
).calculate(1);
print("シフト:直前のバー %s max=%.5f min=%.5f", feedDescriptor.getDataType(), minMax[MAX], minMax[MIN]);
フィード設定を変更し、2分足のローソク足でインジケータ算出します。
IFeedDescriptor feedDescriptor = new TimePeriodAggregationFeedDescriptor(
Instrument.EURUSD,
Period.createCustomPeriod(Unit.Minute, 2),
OfferSide.ASK
);
フィード設定を変更し、1pips蓮子バーにするには
IFeedDescriptor feedDescriptor = new TimePeriodAggregationFeedDescriptor(
Instrument.EURUSD,
PriceRange.ONE_PIP,
OfferSide.ASK
);
同様に、12分足レンジバーで直近のEMAを算出させるには
double emaPrev = indicators.ema(
feedDescriptor,
AppliedPrice.CLOSE,
feedDescriptor.getOfferSide(),
12
).calculate(1);
print("直前のバー %s ema=%.5f", feedDescriptor.getDataType(), emaPrev);
サンプルソースコード:
FeedEmaMacdMinMax.java
バーインターバルによるプライスフィード算出
以下例は、レンジバーで直近10本のEMAとMACDを算出します。
@Override
public void onFeedData(IFeedDescriptor feedDescriptor, ITimedData feedData) {
console.getInfo().println("フィードデータ:" + feedData + " フィードタイプ:" + feedDescriptor);
try {
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();
}
}
サンプルソースコード:
FeedEmaMacdMinMax.java
配列のインジケータ算出
インジケータは実際のプライスだけでなく、カスタムプライスでも計算する事が出来ます
(例えば、価格配列や別インジケータの算出結果配列等)。
正しいインプットと、オプションインプットとインジケータへの出力設定する事が重要で、
種類とサイズが異なるので予め知っておく必要があります。
必要な入力配列サイズと出力配列のインデックスサイズを見積もる時は、
Indicator.getLookbackとIndicatorInfo.isUnstablePeriodプロパティで検討します。
以下例は、メタデータを持つMAインジケータの算出例です。
maIndicator = indicators.getIndicator("MA");
maIndicator.setOptInputParameter(0, 3);
maIndicator.setOptInputParameter(1, MaType.SMA.ordinal());
double [] priceArr = new double [] { 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1};
maIndicator.setInputParameter(0, priceArr);
double [] resultArr = new double [priceArr.length];
maIndicator.setOutputParameter(0, resultArr);
maIndicator.calculate(0, priceArr.length - 1);
サンプルソースコード:
MAOnArray.java
先に記載した通り、メタデータは物によって違います。
フラクタルインジケータの場合は以下の通りになります。
fractIndicator = indicators.getIndicator("FRACTAL");
fractIndicator.setOptInputParameter(0, 2);
double [] priceArr = new double [] { 0.1, 0.2, 0.3, 0.1, 0.1, 0.2, 0.3, 0.4, 0.2, 0.1 };
double [][] arr = new double[5][priceArr.length];
for (int i = 0; i < priceArr.length; i++) {
arr[0][i] = priceArr[i];
arr[1][i] = priceArr[i];
arr[2][i] = priceArr[i];
arr[3][i] = priceArr[i];
arr[4][i] = 0;
}
fractIndicator.setInputParameter(0, arr);
double [] resultArrMax = new double [priceArr.length];
double [] resultArrMin = new double [priceArr.length];
fractIndicator.setOutputParameter(0, resultArrMax);
fractIndicator.setOutputParameter(1, resultArrMin);
fractIndicator.calculate(0, priceArr.length - 1);
サンプルソースコード:
FractalsOnArray.java