search
LoginSignup
1

posted at

updated at

【v20】auカブコム証券のkabuステーションPUSH APIを受信してCSVファイルへ保存する(複数銘柄対応版)

はじめに

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

16番目の記事で、1銘柄(先物:2022/06)のPUSH APIを受信して、CSVファイルに保存していましたが、複数の先物銘柄に対応します。

検証用条件

最終的には設定ファイルに銘柄を記載していたですが、とりあえず銘柄コードをハードコーディングして検証します。
従来のGlobal.cfgの2022/06のSymbol(167060019)はそのまま使い、2022/07~2022/09を追加します。

保存先ファイルパス

1銘柄のときは\tmp\ChartData.csvでしたが、銘柄コードのサブディレクトリに変更します。\tmp\167060019\ChartData.csvなど。
同じディレクトリにロックファイルChartData.lockも管理します。

ソース

メインクラスをMainChartData_r2にコピーします。
SymbolInfoクラスを作成し、起動時にこのインスタンスのリストを初期化します。
メンバー変数として、r1のList dataList、String lastVolume、FileLockLogic fileLockLogicを移動し、メソッドaddChartData、isExistsChartData、getAndClearChartDataをスレッド同期します。
writeChartData()より前の時点で銘柄コードごとに分別されていないといけないので、onMessage()でSymbolで分別します。
StringUtil.parseString()で銘柄コードを切り出して、Mapを参照してもよかったですが、数件しかないのでListをループして該当の銘柄コードを探します。

実行ログ

2022/08にそもそも受信していない場合と、受信したが約定していないのでファイルに書いていない場合が確認できた。

2022/05/24 17:22:04.877 [1] MainChartData.writeChartData(): code=167060019, bufList.size=52, writeCnt=2
2022/05/24 17:22:04.884 [1] MainChartData.writeChartData(): code=167070019, bufList.size=21, writeCnt=1
2022/05/24 17:22:04.888 [1] MainChartData.writeChartData(): code=167090019, bufList.size=31, writeCnt=2

2022/05/24 17:22:14.889 [1] MainChartData.writeChartData(): code=167060019, bufList.size=80, writeCnt=18
2022/05/24 17:22:14.895 [1] MainChartData.writeChartData(): code=167070019, bufList.size=25, writeCnt=0
2022/05/24 17:22:14.898 [1] MainChartData.writeChartData(): code=167080019, bufList.size=9, writeCnt=1
2022/05/24 17:22:14.901 [1] MainChartData.writeChartData(): code=167090019, bufList.size=37, writeCnt=0

CPU使用量は最大で1%程度、javaヒープメモリ250MBでGC後に20MB程度。
API仕様上は、MAX50銘柄らしい。

追記:オプションATM±11 C/Pを追加する(先物:4、OP:46)。

MAX50銘柄というのなら、試しに登録してみる。
先物:2022/06~2022/07
OP:2022/06 27000±11本 Call/Put

OPの銘柄コードを見ても、まるで分らないので、suffixをつけて先物と区別する。
50個のディレクトリが作成された。

137065618_P25625
137065818_P25875
137066118_P26125
137066318_P26375
137066618_P26625
137066818_P26875
137067118_P27125
137067318_P27375
137067618_P27625
137067818_P27875
137068118_P28125
137068318_P28375
147065618_C25625
147065818_C25875
147066118_C26125
147066318_C26375
147066618_C26625
147066818_C26875
147067118_C27125
147067318_C27375
147067618_C27625
147067818_C27875
147068118_C28125
147068318_C28375
167060019
167070019
167080019
167090019
187065718_P25750
187066018_P26000
187066218_P26250
187066518_P26500
187066718_P26750
187067018_P27000
187067218_P27250
187067518_P27500
187067718_P27750
187068018_P28000
187068218_P28250
197065718_C25750
197066018_C26000
197066218_C26250
197066518_C26500
197066718_C26750
197067018_C27000
197067218_C27250
197067518_C27500
197067718_C27750
197068018_C28000
197068218_C28250

OPはほとんどスカスカ。

2022/05/25 01:25:07.420 [1] MainChartData.writeChartData(): code=167060019, bufList.size=86, writeCnt=10
2022/05/25 01:25:07.421 [1] MainChartData.writeChartData(): code=167070019, bufList.size=37, writeCnt=4
2022/05/25 01:25:07.423 [1] MainChartData.writeChartData(): code=167080019, bufList.size=13, writeCnt=0
2022/05/25 01:25:07.423 [1] MainChartData.writeChartData(): code=167090019, bufList.size=40, writeCnt=1
2022/05/25 01:25:07.425 [1] MainChartData.writeChartData(): code=147065618_C25625, bufList.size=2, writeCnt=0
2022/05/25 01:25:07.426 [1] MainChartData.writeChartData(): code=137065618_P25625, bufList.size=4, writeCnt=0
2022/05/25 01:25:07.426 [1] MainChartData.writeChartData(): code=197065718_C25750, bufList.size=1, writeCnt=0
2022/05/25 01:25:07.427 [1] MainChartData.writeChartData(): code=187065718_P25750, bufList.size=2, writeCnt=0
2022/05/25 01:25:07.427 [1] MainChartData.writeChartData(): code=147065818_C25875, bufList.size=1, writeCnt=0

OPは、IV、Gamma、Theta、Vega、Deltaがあるはずなので、次回検証する。

追記:先物のサブディレクトリ名もsuffixをつける。

なんか先物だけ銘柄コードだけなのも、変なのでF202206のようなsuffixをつける。
とりあえず先物は日経225miniしか扱わないので、種類は考慮しない。

167060019 -> 167060019_F202206
167070019 -> 167070019_F202207
167080019 -> 167080019_F202208
167090019 -> 167090019_F202209

追記:List symbolListをMap symbolMapに変更する。

50個登録したので、毎回Listをループして探索するのを止めて、Mapから銘柄コードで検索する。
onMessage()のループをMap.get()に変更する。
それ以外はMap.values()をループ処理するが、Listと比べてキー(銘柄コード)の辞書順に動作が変わる。

追記:保存先を\tmpから\tmp\chartへ変更する。

サブディレクトリが多くて邪魔になってきたので、保存先を\tmpから\tmp\chartへ変更する。
今まで、\tmp\chartにダウンロードした4本値のファイルを配置していた。
そちらのツールも複数銘柄対応する必要がある。

  • v10.MainChartDataHourly: 出力を\tmp\chart\167060019_F202206 (ChartData5m.db)
  • v10.MainChartDataDaily: 出力を\tmp\chart\167060019_F202206 (ChartData1d.db)
  • v14.MainMergeChartData: 入出力を\tmp\chart\167060019_F202206 (ChartData5m.db ChartData.csv ChartData.txt)
  • v15.MainCalcIndicator: 入力を\tmp\chart\167060019_F202206 (ChartData.txt)
  • v16.MainCalcIndicator2: 入力を\tmp\chart\167060019_F202206 (ChartData.txt)
  • v19.MainCalcIndicator3: 入力を\tmp\chart\167060019_F202206 (ChartData.txt)

追記:株式に対応するため市場コードを追加する。

そのまま株式でも使えると思っていたら、銘柄登録APIに市場コードに2(日通し)を直接渡していたので、SymbolInfoクラスに追加する。
以下のように東証の株式コードを追加する。

symbolMap.put(code, new SymbolInfo(code, 1));

また、銘柄登録全解除APIを最初に実行して、クリアするようにした。

追記:指数対応のため、typeを追加する。

株式はOKだったが、指数はそもそも売買高がないので、TradingVolume=nullのため保存されない。
指数対応のため、SymbolInfoクラスにtype(1:株式、2:先物、3:OP、4:指数)を追加する。
type==4のときは、日時と現値のみの2カラムを出力する。

指数は日経平均(101)で取得してみた。

		symbolMap.put("101", new SymbolInfo(4, "101", 1));

為替もできそうで、登録時にエラーとなって無理だった。

追記:OPのGreeksを出力する。

type==3のときは、Greeks(IV, delta, gamma, theta, vega)も出力する。

  • type1(株式): date, price, volume
  • type2(先物): date, price, volume
  • type3(OP): date, price, volume, IV, delta, gamma, theta, vega
  • type4(指数): date, price

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