LoginSignup
0

posted at

updated at

【v40】Tickデータをコピーするツール

はじめに

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

「ダウンロードした4本値とPUSH APIの現値のマージ」→「テクニカル指標の計算」→「テクニカル指標のトリガー」と作ってきたが、現値のトリガーも作りたいと思ったときに、PUSH APIを受信してCSVファイルに保存するところまで戻ってしまう。常駐PGMのため、ファイルロックで排他制御しているので、現値のコピーツールを作成して、トリガー側で自由にファイルアクセスできるようにする。

ゴール

毎朝、CSVファイルを退避して、0バイトからPUSH APIを受信しているので、当日分のみ扱う。
深夜になるとファイルサイズが大きくなり、過去のデータは1分足でも参照できるので、最新の60件で切り捨てて保存する。

ベースとなるソース

v38.MainMergeChartData_r10をベースに、大幅に削って、v40.MainCopyChartData_r12を作成する。
まず、単体ツールを作成し、後からv39.MainWatchChartData_r11をベースに、v40.MainWatchChartData_r12を作成する。

実装

DBファイルは存在しないので、CSVファイルのみ読み込む。
コピーの中で件数を調整する。

マージツール(v38.MergeChartDataCommon_r10)

	public void execute() {
		readDbChartData();
		List<String> lines = readCsvChartData();
		mergeCsvChartData(lines);
		writeChartMap();
	}

コピーツール(v40.MainCopyChartData_r12)

	public void execute() {
		List<String> lines = readCsvChartData();
		copyCsvChartData(lines);
		writeChartList();
	}

出力ファイルは、現値のみなので、入力ファイルのまま保存する。

実行結果

基本的に件数が減るだけだが、マージツールで対応した日付をまたぐ部分で前日となる補正も行う。

Warning: REPLACE line=2022-08-09 00:00:00,27855.0,181357.0, new=2022-08-10 00:00:00, prev=2022-08-09 23:59:58
MainCopyChartData_r12.readCsvChartData(167090019_F202209): readCnt=35655
MainCopyChartData_r12.copyCsvChartData(167090019_F202209): addCnt=35655, delCnt=35595
MainCopyChartData_r12.writeChartList(167090019_F202209): chartList.size=60

追記:リアルタイムにコピーとマージとテクニカル指標の計算とイベントトリガーを発火するツール

v40.MainWatchChartData_r12からコピー処理を呼び出すために、v40.MainCopyChartData_r12から処理本体を切り出してv40.MainCopyChartData_r12を作成する。
単体ツールは1度しか実行しないが、常駐ツールは何度も実行されるため、copyCsvChartData()の冒頭でリストをクリアする。

execute()のループにコピーを追加する。

		while (true) {
			List<String> lines = pollingCsvChartData();
			for (String key : BarNameFactory_r10.getBarNames()) {
				MergeChartData_r10 merge = mergeMap.get(key);
				merge.mergeCsvChartData(lines);
//				merge.writeChartMap();
				CalcCoordinator_r10 calc = calcMap.get(key);
				calc.execute(merge);
				TriggerCoordinator_r11 trigger = triggerMap.get(key);
				trigger.execute(merge, calc);
			}
		}

		while (true) {
			List<String> lines = pollingCsvChartData();
			copyObj.copyCsvChartData(lines);
			copyObj.writeChartList();
			for (String key : BarNameFactory_r10.getBarNames()) {
				MergeChartData_r10 merge = mergeMap.get(key);
				merge.mergeCsvChartData(lines);
//				merge.writeChartMap();
				CalcCoordinator_r10 calc = calcMap.get(key);
				calc.execute(merge);
				TriggerCoordinator_r11 trigger = triggerMap.get(key);
				trigger.execute(merge, calc);
			}
		}

実行結果

2022/10/09 15:27:18.054 MainWatchChartData_r12.execute(): (448124 bytes)
2022/10/09 15:27:18.075 MainWatchChartData_r12.pollingCsvChartData(): read all (12205 lines)
CopyChartData_r12.copyCsvChartData(167100019_F202210): addCnt=12205, delCnt=12145
CopyChartData_r12.writeChartList(167100019_F202210): chartList.size=60
MergeChartDataCommon_r10.mergeCsvChartData(167100019_F202210_1m): updateCnt=12205
:
2022/10/09 15:27:46.864 MainWatchChartData_r12.pollingCsvChartData(): read part (1 lines -> 12206 lines)
CopyChartData_r12.copyCsvChartData(167100019_F202210): addCnt=12206, delCnt=12146
CopyChartData_r12.writeChartList(167100019_F202210): chartList.size=60
MergeChartDataCommon_r10.mergeCsvChartData(167100019_F202210_1m): updateCnt=12206

追記:Tickデータのイベントトリガー

既存のイベントトリガーにTickデータを対応するのは難しいので、別のトリガーツールv40.MainTriggerChartData_r12を作成する。
プラグイン化せず、v40.TriggerChartData_r12のクラスを生成してチェックする。

チェックのロジックは、固定の価格以上でイベントを発火する。

2022/10/09 18:44:25.498 [2022-09-24 05:44:33] price 26420 >= 26420
2022/10/09 18:44:25.498 [2022-09-24 05:47:30] price 26430 >= 26420

追記:リアルタイムにTickデータのイベントトリガーを発火する

v40.MainWatchChartData_r12にTickデータのイベントトリガーを組み込む。
copyObjの中のリストを渡すので、ファイル保存しない。

			copyObj.copyCsvChartData(lines);
//			copyObj.writeChartList();
			triggerObj.execute(copyObj);

追記:名称ChartDataをTickDataに変更

イベントトリガーに関連する部分のみ、ChartDataをTickDataに変更する。

クラス名
v40.MainCopyChartData_r12 to v40.MainCopyTickData_r12
v40.CopyChartData_r12 to v40.CopyTickData_r12
v40.MainTriggerChartData_r12 to v40.MainTriggerTickData_r12
v40.TriggerChartData_r12 to v40.TriggerTickData_r12
v42.MainCopyChartData_r14 to v42.MainCopyTickData_r14
v42.CopyChartData_r14 to v42.CopyTickData_r14

javadocコメント
チャート to ティック
マージ to 抽出

定数名
CHART_TXT_FILENAME to TICK_TXT_FILENAME

ファイル名
ChartData_r10.txt to ChartData_tick.txt
TriggerIndicator.out to TriggerTickData.out

追記:イベントトリガー情報を定義

List<String> reportListをList<EventInfo> eventListに置き換える。
EventListを共通に使うため、内部クラスをv39.beanに出す。
barは"tick"、indicatorは"0"として、同じカラム数で出力する。

追記:TriggerTickData_r12のTickデータ受け入れをCopyTickData_r12からListに変更

execute(List)を後から追加して、MainWatchChartDataで読み込んだTickデータを受け渡していたが、インターフェイスを渡すと、revが上がっていくと、どちらも上げていく必要がある。最終的にreadChartData()の中で、getChartList()で全データを取得するので、MainWatchChartDataがgetChartList()を呼んで、Listを渡す。

追記:ソースを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