トップ  >  リファレンス  >  ストラテジーAPI  >  インジケータ  >  インジケータ算出
インジケータ算出


インジケータはシフト・バーインターバル・タイムインターバルのいずれかで算出する事が出来ます。

インジケータの算出はプライスのソース別に分けることが出来ます。
  • ローソク足プライスフィード:各インジケータで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 {            
        // フィードデータによる直近10本のEMA算出
        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));

        // フィードデータによる直近10本のMACD算出
        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");

// オプション入力設定(number of bars = 2)
fractIndicator.setOptInputParameter(0, 2);

// 入力設定( double[][]に変換している事に注目)
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++) {
    // open=0, close=1, high=2, low=3, volume=4
    // 全プライスにインプット配列と同じプライスを設定(唯一利用可能な値なので)
    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



スポンサーリンク

スポンサーリンク
検索
リファレンスツリー


Copyright ©2016 JForexAPIで自動売買させ隊! All Rights Reserved.


Top

inserted by FC2 system