LoginSignup
0

posted at

updated at

【v36】マージツールに売買高を対象にする

はじめに

過去記事は「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ソース

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0