バーデータを取得する方法は以下の3種類です。
- シフトを指定する
- タイムインターバルを指定する
- キャンドルインターバルを指定する
これは同期メソッドと非同期メソッドの両方で使えます。
注意:この章で紹介しているメソッドはAPI 2.6.49以前のバージョンでは実装されていないものがあります。
同期メソッド
同じスレッドに同期してデータをロードするメソッドは、メソッド名が"get"で始まります。
例えば、getBarメソッドやgetTicksメソッドやgetBarsメソッド等です。
サーバーへアクセスしローカルキャッシュにヒストリーデータをダウンロードするのに時間がかかります、
この間(ダウンロードが完了するまでの間)は、同じスレッドのストラテジーは実行されません。
また、getBarsメソッドとgetTicksメソッドはバーとティックのリストを返します、その為多くのメモリを使用します。
同期メソッドを使って数千〜数百万のティックやバーを返すような使い方はOutOfMemoryExceptionエラーを引き起こす可能性があるので推奨しません。
getBarメソッドでshiftパラメータで0〜10程度の範囲を指定して使用するなら問題ありません、
なぜならデータ取得するのにサーバーアクセスする時間が非常に短いからです。
long prevBarTime = history.getPreviousBarStart(
Period.TEN_SECS,
tick.getTime()
);
List<IBar> bars = history.getBars(
instrument,
Period.TEN_SECS,
OfferSide.BID,
history.getTimeForNBarsBack(Period.TEN_SECS, prevBarTime, 10),
prevBarTime
);
サンプルソースコード:
GetBarsExample.java
シフトによるバーデータ取得(同期メソッド)
getBarメソッドは指定したシフトのバーを返します。
shiftに0を指定した場合、現在のバーを返します(また終値が確定していないバー)。
shiftに1を指定した場合、1つ前のバーを返します(終値が確定している最新のバー)。
shiftに2を指定した場合、2つ前のバーを返します。
以下例は、EUR/USDの1時間足の1つ前のバーを取得します。
int shift = 1;
IBar prevBar = history.getBar(
Instrument.EURUSD,
Period.ONE_HOUR,
OfferSide.BID,
shift
);
console.getOut().println("シフト指定(1つ前のバーのデータ):" + prevBar);
サンプルソースコード:
HistoryBarsSynch.java
タイムインターバルによるバーデータ取得(同期メソッド)
getBarsメソッドはfromパラメータとtoパラメータで時間指定すると、指定した時間範囲内のIBarsリストをロードします。
fromパラメータとtoパラメータの両方ともバーの時間で割り切れる値にしなければなりません。
例えば、1時間足でロードする場合は、fromパラメータとtoパラメータは分と秒の値を丸める必要があります。
以下例は、EUR/USDの1時間足の1つ前〜5つ前の間のバーを取得します。
long prevBarTime = history.getPreviousBarStart(Period.ONE_HOUR, history.getLastTick(Instrument.EURUSD).getTime());
long startTime = history.getTimeForNBarsBack(Period.ONE_HOUR, prevBarTime, 5);
List<IBar> bars = history.getBars(
Instrument.EURUSD,
Period.ONE_HOUR,
OfferSide.BID,
startTime,
prevBarTime
);
int last = bars.size() - 1;
console.getOut().format(
"タイムインターバル指定:1つ前のバーの終値=%.5f; 5つ前のバーの終値=%.5f",
bars.get(last).getClose(), bars.get(0).getClose()
).println();
サンプルソースコード:
HistoryBarsSynch.java
2008年10月5日から2010年10月4日までの期間の日足バーのデータをロードする場合は、以下の通りです。
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyy HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
try {
Date dateFrom = dateFormat.parse("05/10/2008 00:00:00");
Date dateTo = dateFormat.parse("04/10/2010 00:00:00");
} catch (ParseException e) {
e.printStackTrace();
}
List<IBar> bars = history.getBars(
Instrument.EURUSD,
Period.DAILY,
OfferSide.ASK,
dateFrom.getTime(),
dateTo.getTime()
);
キャンドルインターバルによるバーデータ取得(同期メソッド)
getBarsメソッドはnumberOfCandlesBeforeパラメータとnumberOfCandlesAfterパラメータを持っています。
指定した時刻を基準にして、その基準時刻を中心にパラメータで指定した前後の範囲のIBarsリストを取得します。
以下例は、EUR/USDの1時間足の1つ前〜5つ前の間のバーを取得します。
long prevBarTime = history.getPreviousBarStart(Period.ONE_HOUR, history.getLastTick(Instrument.EURUSD).getTime());
List<IBar> bars = history.getBars(
Instrument.EURUSD,
Period.ONE_HOUR,
OfferSide.BID,
Filter.NO_FILTER,
5,
prevBarTime,
0
);
サンプルソースコード:
HistoryBarsSynch.java
非同期メソッド
ヒストリカルデータはローカルキャッシュから取得します。
ローカルキャッシュにデータが無い場合はサーバーからダウンロードされますが、これは時間を要します。
サーバーと同期したヒストリカルデータをロードする場合、ローカルキャッシュに既にデータがある場合よりも時間がかかります。
サーバー同期したヒストリカルデータが今すぐ必要じゃない場合は、非同期メソッドを使ってローカルキャッシュからデータをロードする事が出来ます。
非同期メソッドは他ストラテジーロジックの実行をブロックする事無く、データをロードする事が出来ます。
後で、同期メソッドを用いてデータをロードします。
非同期メソッドは、メソッド名が"read"で始まります。
非同期メソッドを使用するには2つのリスナーを実装する必要があります。
リスナーは他スレッドから呼ばれます、データのロードが完了した時に通知します。
この非同期メソッドは実行後に直ぐ(リスナーがデータ受信完了する前)に終了する可能性が高いです。
これは次のロジックがダウンロード中のヒストリカルデータを必要としない場合や、
ロジックを分離してリスナーがデータのダウンロード完了通知した後に分離していたロジックを実行する時に使います。
history.readBars(
Instrument.EURUSD,
Period.TEN_SECS,
OfferSide.BID,
history.getBarStart(Period.DAILY, tick.getTime()) - Period.DAILY.getInterval() ,
history.getBarStart(Period.DAILY, tick.getTime()) - Period.TEN_SECS.getInterval(),
new LoadingDataListener() {
public void newTick(Instrument instrument, long time, double ask, double bid,
double askVol, double bidVol) {
}
public void newBar(Instrument instrument, Period period, OfferSide side, long time,
double open, double close, double low, double high, double vol) {
++numberOfBarsLoaded;
}
},
new LoadingProgressListener() {
public void dataLoaded(long startTime, long endTime, long currentTime, String information) {
console.getOut().println(information);
}
public void loadingFinished(boolean allDataLoaded, long startTime, long endTime, long currentTime) {
if (allDataLoaded) {
console.getOut().println("全データロード完了。ロード済みバー数: " + numberOfBarsLoaded);
context.stop();
} else {
console.getOut().println("ロード失敗したか、ユーザー操作によってキャンセルされました。");
context.stop();
}
}
public boolean stopJob() {
return false;
}
}
);
サンプルソースコード:
ReadBarsExample.java
フィルターの使用
バーフィルターはFilter列挙で定義されていて、IHistory.getBarsメソッドで使用されます。
パラメータにFilter.NO_FILTERを指定した場合、フィルタリングしません。
次の例は、先週の日足バーのヒストリカルデータから以下3種類のデータをログ出力します。
- Filter.WEEKENDフィルターで取得したデータ(週末以外のデータ)
- Filter.NO_FILTERフィルターで取得したデータ(週末を含んだ全てのデータ)
- 上記2つの差のデータ(週末のみのデータ)
public void onStart(IContext context) throws JFException {
console = context.getConsole();
history = context.getHistory();
context.setSubscribedInstruments(java.util.Collections.singleton(Instrument.EURUSD), true);
IBar weeklyCurr = history.getBar(Instrument.EURUSD, Period.WEEKLY, OfferSide.BID, 0);
IBar weeklyPrev = history.getBar(Instrument.EURUSD, Period.WEEKLY, OfferSide.BID, 1);
List<IBar> barsNoWeekends = history.getBars(
Instrument.EURUSD,
Period.DAILY,
OfferSide.BID,
Filter.WEEKENDS,
weeklyPrev.getTime(),
weeklyCurr.getTime()
);
List<IBar> barsNoFilter = history.getBars(
Instrument.EURUSD,
Period.DAILY,
OfferSide.BID,
Filter.NO_FILTER,
weeklyPrev.getTime(),
weeklyCurr.getTime()
);
print(String.format("WEEKENDSフィルター設定で取得したバー数: %s, NO_FILTERフィルター設定で取得したバー数: %s",
barsNoWeekends.size(), barsNoFilter.size()));
for(IBar bar : barsNoWeekends){
print("WEEKENDSフィルター設定で取得したバー情報: " + bar);
}
print("―――――――――――――――――――――――――――――――――――――――");
for(IBar bar : barsNoFilter){
print("NO_FILTERフィルター設定で取得したバー情報: " + bar);
}
print("―――――――――――――――――――――――――――――――――――――――");
barsNoFilter.removeAll(barsNoWeekends);
for(IBar bar : barsNoFilter){
print("週末のみ( NO_FILTER - WEEKENDS )のバー情報: " + bar);
}
}
サンプルソースコード:
HistoryBarsFilter1Week.java