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

posted at

updated at

auカブコム証券のkabuステーションPUSH APIのサンプル

はじめに

前記事

  1. auカブコム証券のkabuステーションREST APIをcurlで叩く
  2. auカブコム証券のkabuステーションREST APIをjava(generated by the swagger code generator)で叩く
  3. auカブコム証券のkabuステーションREST APIの残高照会をcurlとjavaで叩く
  4. auカブコム証券のkabuステーションREST APIの残高照会から先物OPのdeltaを計算する
  5. auカブコム証券のkabuステーションREST APIのテスト用モックサーバーを作る
  6. auカブコム証券のkabuステーションREST APIの認証済TOKENをファイル管理する
  7. auカブコム証券のkabuステーションREST APIで自前のトレイル注文を作ってみる(情報収集編)
  8. auカブコム証券のkabuステーションREST APIで自前のトレイル注文を作ってみる(注文発注編)
  9. auカブコム証券のkabuステーションREST APIで自前のトレイル注文を作ってみる(ツール完成編)
  10. auカブコム証券のkabuステーションREST APIで自前のリピート注文を作ってみる(注文約定調査編)
  11. auカブコム証券のkabuステーションREST APIで自前のトレイル注文の改善(トレイル幅の動的拡張)
  12. auカブコム証券のkabuステーションREST APIで自前のリピート注文を作ってみる(設計、検証用実装編)
  13. auカブコム証券のチャートデータの日付を調整する

APIの体系として、REST APIとPUSH APIとあることは当初から知っていましたが、RESTはswaggerで何とかなったので後はリファレンスを見て、パラメータのクセを掴むだけでしたが、PUSH API (WebSocket)は手つかずでした。
終値ベースのテクニカル指標なら、1分ごとにsleepを入れながらRESTでgetすればいいかなと思いますが、OPだと粗すぎてポーリング間隔を10秒とかにしていいのか・・・という心配もあったので、調査用PGMを作って検証しようと思った。

想像以上(約3倍くらい)簡単に解決した。

ライブラリ

最初に見つかったのは、Java11だと標準になっているらしい。
ただ、swaggerのジェネレートしたソースがなんか怒っていたので、別のプロジェクトでJava versionを変えないといけないかな。。。

次に見つかったのが、Java EE系。
glassfishでサーバーを立てれば入っているらしいが、こっちはtomcatなんだよな。
で、サーバーはkabuステーションを使うので、クライアントだけでよく、tyrus-standalone-clientを依存ライブラリに追加すればよいらしい。

pom.xmlの修正

maven repoでtyrus-standalone-client検索するとすぐに見つかる。
最新は2.0.2だが、ビルドエラーだった。おそらくJDKを上げないと入っていない感じ。上げたくないので、記事にあったちょっと古い1.15の定義をコピーする。

<dependency>
    <groupId>org.glassfish.tyrus.bundles</groupId>
    <artifactId>tyrus-standalone-client</artifactId>
    <version>1.15</version>
</dependency>

javaアプリ

コピーして、設定変えただけです。

@ClientEndpoint
public class MainWSClient {

	public static void main(String[] args) throws DeploymentException, IOException {
		URI uri = URI.create("ws://localhost:18080/kabusapi/websocket");
		WebSocketContainer container = ContainerProvider.getWebSocketContainer();
		Session session = container.connectToServer(new MainWSClient(), uri);
//		session.getBasicRemote().sendText("sample text");
		while (true) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}	
		}
	}

	@OnOpen
	public void onOpen(Session session) {
		System.out.println("onOpen:" + session);
	}

	@OnMessage
	public void onMessage(String message) {
		System.out.println("onMessge:" + message);
	}

	@OnError
	public void onError(Throwable th) {
		System.out.println("onError:" + th.getMessage());
	}

	@OnClose
	public void onClose(Session session) {
		System.out.println("onClose:" + session);
	}

}

実行

実行すると、onOpenだけコールバックされる。

onOpen:TyrusSession{uri=ws://localhost:18080/kabusapi/websocket, id='887143b4-3f99-4681-9460-31b6f273a3a6', 

エラーも出ていないので、onMessageが呼ばれるはずなんだけど。。。
接続した後に、クライアントからサーバーになんかコマンド送るのかなぁ?(どこにも説明がない)

そこで、REST APIに
/register PUSH配信する銘柄を登録します。
と書いてあったな。ということで、curlで以下のjsonをPUTする。

curl -v -X PUT -H "X-API-KEY: %TOKEN%" -H "Content-Type: application/json" -H "Accept: application/json" "http://localhost:18080/kabusapi/register" -d "@register.json"
{"Symbols":
	[
		{"Symbol":"167060019","Exchange":2}
	]
}

すると、

onMessge:{"ClearingPrice":26870.0000,"Exchange":2,"ExchangeName":"大阪日通し","TradingVolume":393859.0,"TradingVolumeTime":"2022-05-03T00:27:26+09:00","VWAP":26764.3678,"TradingValue":1054138715000.0,"BidQty":103.0,"BidPrice":26690.0,"BidSign":"0101","Symbol":"167060019","SymbolName":"日経225mini 22/06","CurrentPrice":26685.0,"CurrentPriceTime":"2022-05-03T00:27:26+09:00","CurrentPriceChangeStatus":"0058","CurrentPriceStatus":1,"CalcPrice":26685.0,"PreviousClose":26810.00000,"PreviousCloseTime":"2022-05-02T00:00:00+09:00","ChangePreviousClose":-125.00000,"ChangePreviousClosePer":-0.47,"OpeningPrice":26890.0,"OpeningPriceTime":"2022-05-02T16:30:01+09:00","HighPrice":26910.0,"HighPriceTime":"2022-05-02T23:34:03+09:00","LowPrice":26645.0,"LowPriceTime":"2022-05-02T16:59:19+09:00","SecurityType":901}
onMessge:{"ClearingPrice":26870.0000,"Exchange":2,"ExchangeName":"大阪日通し","TradingVolume":393859.0,"TradingVolumeTime":"2022-05-03T00:27:26+09:00","VWAP":26764.3678,"TradingValue":1054138715000.0,"BidQty":128.0,"BidPrice":26690.0,"BidSign":"0101","Symbol":"167060019","SymbolName":"日経225mini 22/06","CurrentPrice":26685.0,"CurrentPriceTime":"2022-05-03T00:27:26+09:00","CurrentPriceChangeStatus":"0058","CurrentPriceStatus":1,"CalcPrice":26685.0,"PreviousClose":26810.00000,"PreviousCloseTime":"2022-05-02T00:00:00+09:00","ChangePreviousClose":-125.00000,"ChangePreviousClosePer":-0.47,"OpeningPrice":26890.0,"OpeningPriceTime":"2022-05-02T16:30:01+09:00","HighPrice":26910.0,"HighPriceTime":"2022-05-02T23:34:03+09:00","LowPrice":26645.0,"LowPriceTime":"2022-05-02T16:59:19+09:00","SecurityType":901}
onMessge:{"ClearingPrice":26870.0000,"Exchange":2,"ExchangeName":"大阪日通し","TradingVolume":393859.0,"TradingVolumeTime":"2022-05-03T00:27:26+09:00","VWAP":26764.3678,"TradingValue":1054138715000.0,"BidQty":132.0,"BidPrice":26690.0,"BidSign":"0101","Symbol":"167060019","SymbolName":"日経225mini 22/06","CurrentPrice":26685.0,"CurrentPriceTime":"2022-05-03T00:27:26+09:00","CurrentPriceChangeStatus":"0058","CurrentPriceStatus":1,"CalcPrice":26685.0,"PreviousClose":26810.00000,"PreviousCloseTime":"2022-05-02T00:00:00+09:00","ChangePreviousClose":-125.00000,"ChangePreviousClosePer":-0.47,"OpeningPrice":26890.0,"OpeningPriceTime":"2022-05-02T16:30:01+09:00","HighPrice":26910.0,"HighPriceTime":"2022-05-02T23:34:03+09:00","LowPrice":26645.0,"LowPriceTime":"2022-05-02T16:59:19+09:00","SecurityType":901}

気配の更新ごとなので、想像以上に出てきた。約定価格の更新でいいのだけど。
後は、String型で渡されるJSON文字列を処理するだけ。
欲しいのは、"Symbol":"167060019"の行の"CurrentPrice":26685.0と"CurrentPriceTime":"2022-05-03T00:27:26+09:00"くらいかな。
正直にJSONのデシリアライズ(アンマーシャル)とかすると余計に負荷がかかりそう。。。

githubソース

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?