トップ  >  リファレンス  >  ストラテジーAPI  >  ヒストリカルデータ  >  ヒストリーバー
ヒストリーバー


バーデータを取得する方法は以下の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);

    // WEEKENDSフィルター設定で取得
    List<IBar> barsNoWeekends = history.getBars(
                                                 Instrument.EURUSD,         // 通貨ペア
                                                 Period.DAILY,              // 時間軸
                                                 OfferSide.BID,             // オファーサイド
                                                 Filter.WEEKENDS,           // フィルター
                                                 weeklyPrev.getTime(),      // 取得開始時刻
                                                 weeklyCurr.getTime()       // 取得終了時刻
                                                );


    // NO_FILTERフィルター設定で取得
    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("―――――――――――――――――――――――――――――――――――――――");

    // NO_FILTERフィルター設定で取得したデータから、WEEKENDSフィルター設定で取得したデータを削除。
    barsNoFilter.removeAll(barsNoWeekends);
    for(IBar bar : barsNoFilter){
        print("週末のみ( NO_FILTER - WEEKENDS )のバー情報: " + bar);
    }
    
    
}


サンプルソースコード:HistoryBarsFilter1Week.java


スポンサーリンク

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


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


Top

inserted by FC2 system