はじめに
過去記事は「auカブコム証券のkabuステーションREST APIに関する記事一覧」。
テクニカル指標が4本値のみ使用していたので、いままで売買高を処理対象としていませんでしたが、そろそろ売買高も使いたいので、マージツールを拡張します。
ベースとなるソース
最新のマージツールは、37番目の記事のv31.MainMergeChartData_r4で、これをベースにv36.MainMergeChartData_r5を作る。
ただしマージファイルのエンティティは、33番目の記事のv27.MergeChartInfo_r3で、これをベースにv36.MergeChartInfo_r5を作る。
具象クラスにmergeCsvChartData()を実装していると、管理が面倒なので、事前にv31.MergeChartDataCommon_r4に移動するリファクタリングを行った。
ゴール
結果の検証はテクニカル指標を実装するときに行う。
指数は売買高がないので、常に0とする。
実装
エンティティ
MergeChartInfo_r5に売買高を追加する。
これにより3番目のコンストラクタの引数が増える。
public int tradeVolume;
public MergeChartInfo_r5(String date) {
this.tradeVolume = 0;
public MergeChartInfo_r5(String[] cols) {
this.tradeVolume = StringUtil.parseInt(cols[i++]);
public MergeChartInfo_r5(String date, int price, int volume) {
this.tradeVolume = volume;
public static String toHeaderString() {
sa[i++] = "volume";
public String toLineString() {
sa[i++] = "" + tradeVolume;
抽象クラス
mergeCsvChartData()にcols[2]から売買高を取り出す。
ただし、指数はカラム数が1つ少ないため、例外が出ないようにチェックする。
CSVファイルの1行目は、その前のデータからの差分が計算できないため、常に0とする。
1行目の判定のため、prevVolumeは-1で初期化する。
2行目以降は、前の行との差を、該当する売買高とする。
ただし、15:15-16:30の間にリセットされるため、差がマイナスの場合、(0を引いた)その値を使う。
int prevVolume = -1;
int volume = 0;
if (cols.length > 2) { // 指数には売買高は存在しない
volume = (int) StringUtil.parseDouble(cols[2]);
}
if (prevVolume < 0) { // CSVの先頭行の売買高は不明のため0とする
prevVolume = volume;
volume = 0;
} else {
int delta = volume - prevVolume;
if (delta < 0) { // 差が減っている場合は、16:30をまたいで翌日扱い
delta = volume;
}
prevVolume = volume;
volume = delta;
}
マップに存在しない場合は、コンストラクタで売買高を初期化し、マップに追加する。
存在する場合は、既存の売買高に加算する。
if (ci == null) {
ci = new MergeChartInfo_r5(key, price, volume);
chartMap.put(key, ci);
} else {
ci.tradeVolume += volume;
}
メインクラス
クラス名を更新する。
private static final String[] mergeClassNames = {
"v36.MergeChartData1m_r5",
"v36.MergeChartData3m_r5",
"v36.MergeChartData5m_r5",
"v36.MergeChartData10m_r5",
"v36.MergeChartData15m_r5",
"v36.MergeChartData20m_r5",
"v36.MergeChartData30m_r5",
"v36.MergeChartData60m_r5",
};
実行結果
出力されたマージファイル。
2022/08/09 08:58:00 28135 28140 28125 28130 552 2
2022/08/09 08:59:00 28135 28140 28125 28125 1464 2
2022/08/09 09:00:00 28125 28145 28120 28140 1214878 2
2022/08/09 09:01:00 28140 28160 28135 28145 4222 2
2022/08/09 09:02:00 28145 28165 28130 28160 3166 2
追記:現物のデータに対応
先物OPしか対象としていなかったので、あまり現物のデータの中身を確認していなかったが、
先物は8:45-15:15に対して、現物や指数は9:00-15:00のため、分足の種類によって、誤ったマージデータとなる。
- 10分足:8:45,8:55,9:05のため、9:00は8:55となる
- 20分足:8:45,9:05のため、9:00は8:45となる
- 30分足:8:45,9:15のため、9:00は8:45となる
- 60分足:8:45,9:45のため、9:00は8:45となる
現物用に別途テーブルを用意し、search()にsuper.isFuture()を渡して区別する。
追記:ソースをarchiveブランチへ移動
最新版に移行し、もう使われることはないので、アーカイブする。
githubソース