今回は、JForex APIで、ヒストリカルデータの「History bars(過去のローソク足データ)」を扱う方法について解説します。
足のデータを読み出す方法としては主に3つの方法があります。
- 現在のバーからのシフト値を使って読み出す方法
- 時間間隔を指定して読み出す方法
- 指定時間から前後の足の数を指定して読み出す方法
情報を取得するための関数には、同期、非同期両方の手段が用意されています。
同期関数を使用して足データを読み出す
同一スレッド内で処理を行う同期関数は、関数名がgetから始まります。
具体的には、IHistoryインターフェースのgetBar, getTicks, getBars関数を使用します。
同期関数を使用する場合、処理が完了してから呼出し元に復帰する形となるため、大量のヒストリーデータを要求するとその後の処理が長時間とまってしまう可能性があります。
特に、getTicksやgetBars関数はバーやティックのリストを返すため、相応のメモリーを消費します。
数千以上のティックやバーデータを返したり、「OutOfMemoryException」の例外が発生する可能性があることを知りながら、これらの関数を使用することは推奨されません。
現在のバーからのシフト値を使って読み出す方法
getBar関数の引数に、現在のバーからのシフト値を指定することで特定のIBarオブジェクトを取得できます。
getBar関数の仕様
12345 IBar getBar(Instrument instrument,Period period,OfferSide side,int shift)throws JFException引数:
instrument:どの通貨ペアの足を取得するのかを指定
period :足のタイムフレーム
side:BidとAskのどちらかを指定
shift:現在の足から何本前の情報を取得するかを指定、0は現在の足、1は1つ前の足、2なら2つ前の足となります戻り値:
IBarオブジェクト、取得できなかった場合はNULL
shiftに0を指定すると、現在の足(形成途中)の情報を取得できます。
以下はドル円1時間足の1つ前の足の情報を取得する例です。
1 2 |
int shift = 1; IBar prevBar = history.getBar(Instrument.USDJPY, Period.ONE_HOUR, OfferSide.BID, shift); |
時間間隔を指定して複数の足データを読み出す方法
getBarsの「from 」及び「to 」引数で時間間隔を指定してやると、指定期間の「IBars」オブジェクトのリストを取得することができます。
getBars関数の仕様
123456 List<IBar> getBars(Instrument instrument,Period period,OfferSide side,long from,long to)throws JFException引数:
instrument:どの通貨ペアの足を取得するのかを指定
period:足のタイムフレーム
side:BidとAskのどちらかを指定
from:指定する時間間隔の開始時刻。正確な足の開始時間を指定する必要があります。特定時刻を含む足の開始時間を取得するにはgetBarStart関数が利用できます
to:指定する時間間隔の終了時刻。終了時刻といっても、バーが終了する時刻ではなく、取得したい最後の足の開始時刻を指定します。戻り値:
ロードされたIBarオブジェクトのリスト
以下は、USDJPYの1時間足で一つ前の足から5本分のデータを取得する例です。
1 2 3 |
long prevBarTime = history.getPreviousBarStart(Period.ONE_HOUR, history.getLastTick(Instrument.USDJPY).getTime()); long startTime = history.getTimeForNBarsBack(Period.ONE_HOUR, prevBarTime, 5); List<IBar> bars = history.getBars(Instrument.USDJPY, Period.ONE_HOUR, OfferSide.BID, startTime, prevBarTime); |
getPreviousBarStart関数は、特定時間足における、指定時間を含む足の1つ前の足の開始時間を取得できます。
引数の「period」に「Period.ONE_HOUR」を、「barTime」にドル円最新ティックの時間を指定し、prevBarTimeに一つ前の1時間足の開始時間を取得しています。
getTimeForNBarsBack関数は、特定時間足における、指定時間を含む足から指定本数分前の足の開始時間を取得することができます。
引数の「period」に「Period.ONE_HOUR」を、「to」に先ほど設定した「prevBarTime」を、「numberOfBars」に5を設定し、1つ前の時間足を含めて5本前の時間足の開始時間を取得し、startTimeに設定しています。
そして、getBars関数の「from」と「to」引数に「startTime」と「prevBarTime」を指定することで、1時間足の1つ前の足から5本分のデータを取得しています。
次に、SimpleDateFormatを用いてgetBars関数の「from」と「to」に渡す値を取得する例を見てみましょう。
以下は、2015/05/01から2015/05/31日までの日足データを取得する例です。
1 2 3 4 5 6 7 8 9 |
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); try { Date dateFrom = dateFormat.parse("2016/05/01 00:00:00"); Date dateTo = dateFormat.parse("2016/05/31 00:00:00"); } catch (ParseException e) { e.printStackTrace(); } List<IBar> bars = history.getBars(Instrument.USDJPY, Period.DAILY, OfferSide.BID, dateFrom.getTime(), dateTo.getTime()); |
指定時間から前後の足の数を指定して読み出す方法
「numberOfCandlesBefore 」及び「numberOfCandlesAfter 」引数のあるgetBars関数を使用すると、指定時間付近の前後指定数の「IBars」オブジェクトのリストを取得することができます。
getBars関数の仕様
12345678 List<IBar> getBars(Instrument instrument,Period period,OfferSide side,Filter filter,int numberOfCandlesBefore,long time,int numberOfCandlesAfter)throws JFException引数:
instrument:どの通貨ペアの足を取得するのかを指定
period:足のタイムフレーム
side:BidとAskのどちらかを指定
filter:足のフィルタ設定
numberOfCandlesBefore:timeパラメーターで指定された時間の足を含めて何本前まで取得するかを指定
time:numberOfCandlesBeforeパラメーターで特定された期間の最後にあたる足の時間、もしくはnumberOfCandlesBeforeが0の場合、numberOfCandlesAfterパラメーターで特定された期間の最初の足の時間、もしくはnumberOfCandlesBeforeが0より大きい場合numberOfCandlesAfterパラメーターで特定された期間の最初の足の前の足の時間
numberOfCandlesAfter:timeパラメーターで指定された足から何本後まで取得するかを指定戻り値:
ロードされたIBarオブジェクトのリスト
numberOfCandlesBeforeが0の場合と>0の場合とでnumberOfCandlesAfterで計算する足の起点が変わるため注意してください。
下記は、現在の時間足から5本前の足を起点として、前に5本、後に2本分の計7本の時間足を取得します。
1 2 3 |
long prevBarTime = history.getPreviousBarStart(Period.ONE_HOUR, history.getLastTick(Instrument.USDJPY).getTime()); long prev5BarTime = history.getTimeForNBarsBack(Period.ONE_HOUR,prevBarTime,5); List<IBar> bars = history.getBars(Instrument.USDJPY, Period.ONE_HOUR, OfferSide.BID, Filter.NO_FILTER, 5, prev4BarTime, 2); |
非同期関数を使用して足データを読み出す
ヒストリカルデータはローカルキャッシュから読み込まれますが、データがローカルキャッシュにない場合、サーバーからダウンロードされるため、大量のヒストリカルデータをダウンロードする場合、処理に時間がかかります。
後で必要になる大量のヒストリデータがある場合、他のストラテジーロジックをブロックしてしまわない非同期関数でそれらのデータをあらかじめロードしておき、ロード完了後に同期関数を使って読み出せば効率良く処理が行えます。
非同期関数は、関数名がreadから始まります。
具体的には、バーのデータを読み出す場合「readBars」関数を使用します。
ただ、今回は入門レベルなので使い方をここでは説明しません。
詳しくは、JForex WikiにあるサンプルプログラムやAPIリファレンスのIHistoryを参照してください。
Filterの使い方
足データを読み出す関数で、引数にFilterを指定するものがあります。
具体的には、時間間隔を指定して読み出す時のgetBarsと指定時間から前後の足の数を指定して読み出す時のgetBarsです。
Filterパラメーターを持たない関数は、フィルタリングを行いません。
Filterパラメーターで、Filter.ALL_FLATSを指定すると全てのフラット期間をフィルタリングできます。
Filter.WEEKENDSを指定すると、週末のフラット(土日の値動きのない)期間をフィルタリングできます。
コメント