search
LoginSignup
0
Help us understand the problem. What are the problem?

posted at

updated at

【v13】5分足の時刻を列挙する

はじめに

過去記事は「auカブコム証券のkabuステーションREST APIに関する記事一覧」。

意外とこういう作り捨てのPGMが後から効いてきたりするので、githubに入れておく。

時刻について

API等で取得したデータの時刻がどのバーに所属するのかを考えてみると、
09:01の5分足は、09:00 <= x < 09:05の範囲なので、09:00となる。

09:00:00 100
09:01:30 120
09:04:59 130
09:05:00 50

のとき

open  100
high  130
low   100
close 130

5分足(昼)の列挙

昼の5分足の時刻は、

	private static void printDay5() {
		int hour = 8;
		int min = 45;
		for (int i = 0; i < 79 + 1; i++) { // 79 = 13 * 6 + 1
			String time = String.format("%02d:%02d:00", hour, min);
			System.out.print(time + " ");
			min += 5;
			if (min >= 60) {
				hour++;
				min -= 60;
				System.out.println();
			}
		}
		System.out.println();
	}

を実行すると、

08:45:00 08:50:00 08:55:00 
09:00:00 09:05:00 09:10:00 09:15:00 09:20:00 09:25:00 09:30:00 09:35:00 09:40:00 09:45:00 09:50:00 09:55:00 
10:00:00 10:05:00 10:10:00 10:15:00 10:20:00 10:25:00 10:30:00 10:35:00 10:40:00 10:45:00 10:50:00 10:55:00 
11:00:00 11:05:00 11:10:00 11:15:00 11:20:00 11:25:00 11:30:00 11:35:00 11:40:00 11:45:00 11:50:00 11:55:00 
12:00:00 12:05:00 12:10:00 12:15:00 12:20:00 12:25:00 12:30:00 12:35:00 12:40:00 12:45:00 12:50:00 12:55:00 
13:00:00 13:05:00 13:10:00 13:15:00 13:20:00 13:25:00 13:30:00 13:35:00 13:40:00 13:45:00 13:50:00 13:55:00 
14:00:00 14:05:00 14:10:00 14:15:00 14:20:00 14:25:00 14:30:00 14:35:00 14:40:00 14:45:00 14:50:00 14:55:00 
15:00:00 15:05:00 15:10:00 15:15:00 15:20:00 

の79本は、80個の点の間。この文字列を配列に入れて、添字0-79でアクセスできるようにする。

5分足(夜)の列挙

夜の5分足は24時で0時にリセットする。

	private static void printNight5() {
		int hour = 16;
		int min = 30;
		for (int i = 0; i < 163 + 1; i++) { // 163 = 27 * 6 + 1
			String time = String.format("%02d:%02d:00", hour, min);
			System.out.print(time + " ");
			min += 5;
			if (min >= 60) {
				hour++;
				min -= 60;
				System.out.println();
			}
			if (hour >= 24) {
				hour -= 24;
			}
		}
		System.out.println();
	}

を実行すると、

16:30:00 16:35:00 16:40:00 16:45:00 16:50:00 16:55:00 
17:00:00 17:05:00 17:10:00 17:15:00 17:20:00 17:25:00 17:30:00 17:35:00 17:40:00 17:45:00 17:50:00 17:55:00 
18:00:00 18:05:00 18:10:00 18:15:00 18:20:00 18:25:00 18:30:00 18:35:00 18:40:00 18:45:00 18:50:00 18:55:00 
19:00:00 19:05:00 19:10:00 19:15:00 19:20:00 19:25:00 19:30:00 19:35:00 19:40:00 19:45:00 19:50:00 19:55:00 
20:00:00 20:05:00 20:10:00 20:15:00 20:20:00 20:25:00 20:30:00 20:35:00 20:40:00 20:45:00 20:50:00 20:55:00 
21:00:00 21:05:00 21:10:00 21:15:00 21:20:00 21:25:00 21:30:00 21:35:00 21:40:00 21:45:00 21:50:00 21:55:00 
22:00:00 22:05:00 22:10:00 22:15:00 22:20:00 22:25:00 22:30:00 22:35:00 22:40:00 22:45:00 22:50:00 22:55:00 
23:00:00 23:05:00 23:10:00 23:15:00 23:20:00 23:25:00 23:30:00 23:35:00 23:40:00 23:45:00 23:50:00 23:55:00 
00:00:00 00:05:00 00:10:00 00:15:00 00:20:00 00:25:00 00:30:00 00:35:00 00:40:00 00:45:00 00:50:00 00:55:00 
01:00:00 01:05:00 01:10:00 01:15:00 01:20:00 01:25:00 01:30:00 01:35:00 01:40:00 01:45:00 01:50:00 01:55:00 
02:00:00 02:05:00 02:10:00 02:15:00 02:20:00 02:25:00 02:30:00 02:35:00 02:40:00 02:45:00 02:50:00 02:55:00 
03:00:00 03:05:00 03:10:00 03:15:00 03:20:00 03:25:00 03:30:00 03:35:00 03:40:00 03:45:00 03:50:00 03:55:00 
04:00:00 04:05:00 04:10:00 04:15:00 04:20:00 04:25:00 04:30:00 04:35:00 04:40:00 04:45:00 04:50:00 04:55:00 
05:00:00 05:05:00 05:10:00 05:15:00 05:20:00 05:25:00 05:30:00 05:35:00 05:40:00 05:45:00 05:50:00 05:55:00 
06:00:00 06:05:00 

の163本は、164個の点の間。
ただし、23:55~24:00と00:00~00:05は、24:00=00:00となる。
そのまま使うと、23:55:00 <= x < 00:00:00となりヒットしない。

追記:05:55は無かった

4本値のデータには、5分前の15:10はあるが、05:55は無かった。

2022/05/02 15:05:00,26850,26895,26830,26840,11086
2022/05/02 15:10:00,26835,26840,26830,26840,31
2022/05/02 15:15:00,26810,26810,26810,26810,3905

2022/05/03 05:45:00,26870,26930,26870,26915,2001
2022/05/03 05:50:00,26915,26920,26850,26855,1304
2022/05/03 06:00:00,26880,26880,26880,26880,1878

判定を以下のようにする。
05:45 <= x < 05:50
05:50 <= x < 06:00
06:00 <= x < 06:05

追記:05:55がある日のあった

2022/04/19 08:45:00~2022/05/07 06:00:00までで、2413件。
4/19, 4/20, 4/21, 4/22, 4/25,
4/26, 4/27, 4/28, 5/2, 5/6
の10日間で、241×10=2410のつもりが3件多い。

3日だけレアデータ見つけた。

2022/04/20 05:55:00,27215,27215,27215,27215,1
2022/04/25 05:55:00,26720,26720,26720,26720,1
2022/04/26 05:55:00,26830,26830,26830,26830,1

追記:x分足を追加

3分足、10分足、15分足、20分足、30分足、60分足を追加。

追記:現物を追加

現物は、09:00-11:30、12:30-15:00のため、AM,PMを追加。

追記:TimeUtilを拡張

int hour, min, sec;の3つの変数を使ったループは、繰り上がりの判定などコピペだらけで、
また、共通メソッドにしようとするとC++のように3つの変数の参照渡しができないので、
何かしらの箱(クラスや配列)を用意する必要がある。

時刻のみの(C言語の)time_t型のような、"00:00:00"からの経過時間(秒)を管理するint値を使い、
繰り上がりを気にせずx分足の間隔を加算し、"hh: mm:ss"の文字列を生成するときに剰余を計算して、正規化する。

これによりロジックが簡潔に書けるようになった。

	private static void printAm5() {
		int st = TimeUtil.time_val(9, 0, 0);
		int ed = TimeUtil.time_val(11, 30, 0);
		printHourLf(st, ed, DELTA5);
	}

	private static void printPm5() {
		int st = TimeUtil.time_val(12, 30, 0);
		int ed = TimeUtil.time_val(15, 00, 0);
		printHourLf(st, ed, DELTA5);
	}

	private static void printDay5() {
		int st = TimeUtil.time_val(8, 45, 0);
		int ed = TimeUtil.time_val(15, 15, 0);
		printHourLf(st, ed, DELTA5);
	}

	private static void printNight5() {
		int st = TimeUtil.time_val(16, 30, 0);
		int ed = TimeUtil.time_val(30, 00, 0);
		printHourLf(st, ed, DELTA5);
	}

追記:むかしのソースをr1で残す

後から参照するため、int hour, min, sec;のソースをr1で戻し、TimeUtilのソースをr2にする。

追記:ソースを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
Help us understand the problem. What are the problem?