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

posted at

updated at

【v14】保存した4本値チャートデータの終値と、PUSH APIで受信したチャートデータをマージする

はじめに

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

ようやく1つのマイルストーンが見えてきたらしい。
kabuステーションの4本値を保存したファイルの日付を補正したファイルと、PUSH APIが受信して保存したファイルをマージした最新の終値の時系列データをファイルに保存します。

4本値チャートデータ

5分足のみを対象。ファイル名(167060019_5分足_220503-0717.csv)のようなファイルを13番目の記事のMainChartDataHourlyツールを実行すると、\tmp\ChartData5m.dbに日付が補正されたCSVファイルが保存される。6カラム。

No Name Description Example
1 date 日時 2022/05/03 05:50:00
2 open 始値 26915
3 high 高値 26920
4 low 安値 26850
5 close 終値 26855
6 volume 出来高 1304

PUSH APIで受信したチャートデータ

16番目の記事のMainChartDataツールを実行すると、\tmp\ChartData.csvに価格が変化したときの現値のCSVファイルが保存される。2~3カラム。volumeは使わない。

No Name Description Example
1 date 日時 2022-05-03 00:36:37
2 price 約定価格 26730.0
3 volume 売買高(5/10追加) 407256.0

マージ方法

4本値のデータは100%正しい前提で、4本値のファイルを最初に取り込み、次にPUSH APIのファイルを読み、該当する日時にデータが存在しない場合に上書きする。PUSH APIは時系列に並んでいる前提で、PUSH APIのデータには上書きする(最も新しいデータが終値)。

ChartInfoクラスにint flag;を持たせて、0:データなし、1:4本値のデータ、2:PUSH APIで取得したデータ、とする。

制限

  • 4本値に15:10は存在するが、05:55は存在しないので、例外的に05:50 <= x < 06:00の10分の幅にする。もっとも、こんな時刻に発注しないので、6:30ごろに4本値を手動で保存すればいいのだけど。 ⇒05:55を含める/含めないは、移動平均などの計算に含める/含めないという結果の違いで、さらに誰かから受注して作っているわけでもないので自分で好きに決めればいい。
  • 隙間が空いているかどうかチェックしていない。09:00の次が09:10で09:05が飛んでいる場合、そのまま移動平均などを計算すると、09:05が元々無いものとして計算されてしまう。後日対応予定。 ⇒閑散としていたら、飛ぶのは日常なので、前の価格をそのままコピーして埋めていく処理が必要。
  • MainChartDataツールが1秒スリープごとにバッファに溜まったデータをファイル保存しているので、こちらの読み込みと競合する可能性がある。向こうがsynchronizedの範囲を狭くするため、バッファから取得する瞬間にバッファをクリアするので、ファイル書き込みエラー時にバッファのデータは消えてリトライできない。 ⇒1秒だと短すぎて、10秒遅れ程度が、これを参照する側として妥当なので、CSV保存ツールは10秒にした。
  • ↑の解決方法は、ファイルロックで、ロックが取れるまで待機か、そのターンをスキップする。 ⇒ロックが取れなくてスキップしても、そのまま上のループで10秒スリープなので、1秒スリープしながらロックが取れるまでリトライするくらいでよいかも。
  • ↑の解決方法2は、PUSH APIの受信ツールが常駐PGMなので、Webアプリにしてしまい、tomcatにデプロイして、ファイルにも保存するが、自前のREST APIで別プロセスのPGMがHTTPで取れるようにすれば、synchronizedで同期が取れる。 ⇒Webにするなら、注文依頼ファイルをWebから指示したい。まあ、出先で操作したいかどうかで、自宅前提なら、ローカルの設定ファイルでもWebアプリでもあまり変わらない。サーバー環境へのRDPログインを避けたいのなら、プライベートGitに設定ファイルをpushしてしまえば、jenkinsがポーリングして最新の設定ファイルを持ってきてくれる。

出力ファイル

デバッグ用にテキストファイルを保存する。

No Name Description Example
1 date 日時 2022/05/06 08:45:00
2 close 終値 26675
3 flag フラグ 2(0:データなし、1:4本値のデータ、2:PUSH APIで取得したデータ)

※隙間を埋めたフラグを3としたら、0が使うことが無くなる。

4本値

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


PUSH API

2022-05-06 08:49:55,26675.0
2022-05-06 08:50:00,26670.0

をマージして、

2022/05/03 05:50:00	26855	1
2022/05/03 06:00:00	26880	1
2022/05/06 08:45:00	26675	2

追記:意味不明な相違

5/7 06:00までのChartData5m.dbと、5/7 06:00までのChartData.csvをマージした場合と、
5/3 06:00までのChartData5m.dbと、5/7 06:00までのChartData.csvをマージした場合、
5/6 08:45~5/7 06:00の終値は同じでフラグが1か2の違いとなるはず。

Diffを取ると、なぜか16:30が異なる。

2022/05/06 15:15:00	27105	1
2022/05/06 16:30:00	26935	1
2022/05/06 16:35:00	26920	1

2022/05/06 15:15:00	27105	2
2022/05/06 16:30:00	26930	2
2022/05/06 16:35:00	26920	2

そんな馬鹿な。。。ChartData5m.dbは26935。

2022/05/06 15:15:00,27105,27105,27105,27105,5565
2022/05/06 16:30:00,27000,27000,26925,26935,15228
2022/05/06 16:35:00,26935,26950,26910,26920,7368

ChartData.csvは26930。26935というのなら16:35で始値。

2022-05-06 16:34:56,26930.0
2022-05-06 16:34:58,26925.0
2022-05-06 16:34:59,26930.0
2022-05-06 16:35:00,26935.0
2022-05-06 16:35:00,26930.0
2022-05-06 16:35:01,26925.0

せっかく700MBのonMessageの生JSONデータがあるので、探すと26930。

"CurrentPrice":26930.0,"CurrentPriceTime":"2022-05-06T16:34:59+09:00","CurrentPriceChangeStatus":"0057","CurrentPriceStatus":1,
"CurrentPrice":26930.0,"CurrentPriceTime":"2022-05-06T16:34:59+09:00","CurrentPriceChangeStatus":"0057","CurrentPriceStatus":1,
"CurrentPrice":26935.0,"CurrentPriceTime":"2022-05-06T16:35:00+09:00","CurrentPriceChangeStatus":"0057","CurrentPriceStatus":1,
"CurrentPrice":26935.0,"CurrentPriceTime":"2022-05-06T16:35:00+09:00","CurrentPriceChangeStatus":"0057","CurrentPriceStatus":1,

細かいことは気にしないに限る。
でも、残り240/241は正しいので、約定が詰まっているデータの判定ロジックはほぼ正しいようだ。

2022/09とか2022/12とかの銘柄を収集すれば、閑散としていそう。

追記:05:55が無い日もあるが、リストに含める。

過去データに05:55が含まれる日が見つかったため、リストに05:55を含める。
今後、テクニカル指標を計算する際に、05:55のデータが無い場合は、05:50をコピーして、これを本数に含めて計算する。

追記:TradingVolumeを追加する

MainChartDataツールがvolume(売買高)を追加したので、カラム数チェックを「2以外をエラー(length != 2)」を「2未満をエラー(length < 2)」に修正する。

追記:ChartData.csvを読み込む際に、ChartData.lockをロックする。

MainChartDataツールがChartData.csvを書き込む際にChartData.lockをロックするので、MainMergeChartDataもChartData.csvを読み込む際に、ChartData.lockをロックする。

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