JForexのindicatorは標準で多種多様なものが搭載されていますが、そのまま使うと週末データ(値動き0)のものも含まれて処理されてしまうようです。(過去の経験から)。結果として、狙ったポイントでの取引実行が出来なくなってしまいます。
そこで、indicatorsの各メソッドには、標準でFilterで週末データをカットし、各関数値を計算する機能が備わっています。
が、こいつらを使うのは面倒くさいコードをごちょごちょ書く必要があり、サンプルコードは割と転がっていません。
ですので、JForex記事の出だしとして、Filter付きデータ処理について、データ準備部分などのコードは定型化されていますので、メモとして残しときます。
ざっくり説明。下記の例は週末データをカットし、現在までのローソク足情報を元に、mamaとtemaの各移動平均線の現在値を算出します。
移動平均線のクロスの検出に使ってます。(順方向に復帰したかとかチェックする場合)
long presentBarStartTime = this.history.getBarStart(period, bidBar.getTime());
java.util.List<IBar> bars = this.history.getBars(instrument,
period,
OfferSide.BID,
Filter.WEEKENDS,
90, // beforの数値は、indicators算出期間の2倍ぐらい欲しい
presentBarStartTime,
0);
long pastNBarStartTime = bars.get(0).getTime();
double[][] mama = this.indicators.mama(instrument,
period,
OfferSide.BID,
IIndicators.AppliedPrice.MEDIAN_PRICE, 0.60, 0.30,
Filter.WEEKENDS,
pastNBarStartTime,
presentBarStartTime);
// 最後の要素が現在データ(Filter付きメソッドを使用する場合は、こういう回りくどい方法じゃないとデータ取得できない
double fama0 = mama[1][mama[1].length - 1];
double[] ma = this.indicators.ma(instrument,
period,
OfferSide.BID,
IIndicators.AppliedPrice.MEDIAN_PRICE,
6,
IIndicators.MaType.TEMA,
Filter.WEEKENDS,
pastNBarStartTime,
presentBarStartTime);
double ma0 = ma[ma.length - 1];
ついでに、移動平均線のクロス検出のサンプル(白矢印)
こういう回りくどいことをしないと、休日の48時間分が固定値となり、週明けにぞっとする動きをしてしまう原因となります。
もっと、なんというかFactoryとか上位層でFilterメソッドを標準で使用するように指定する方法が無いかと思います。
