GMOコインのAPIを利用して簡単な自動取引プログラムでも作ってみようかと思いました。
ドキュメントやサンプルプログラムは割としっかりとしたものが用意されているものの、SDKがなくちょっと作ってみようかなと思い、まず公式ドキュメントを見ながらOpenAPI yamlを書き起こしてみることにしました。
まだプライベートAPIについては1つしか書けてませんが、これから網羅していく予定です。
Swagger UI & クライアントコードの生成
上記のyamlファイルから生成したSwaggerページもGithub pageで公開するようにしました。このページからAPI呼び出しの実行はCORSの問題でできませんが。。
また、openapi-generator ( https://github.com/openapitools/openapi-generator )でSDKの生成もしてみました。
今回はGoを使ってやってみることにしました。Go以外にも openapi-generator では非常に多くの言語をサポートしています。
これらのページ、コードの生成はGithub Actionsを利用してファイルをPushしたら自動で行われるようにしています。実際のジョブは以下のファイルに記載してます。もう少し中のステップを整理したほうが良い気がしていますが参考までに。
Public APIを呼び出してみる
生成したSDKを利用して実際にAPIが叩けるのか、取引所ステータス取得APIで試してみました。以下のようなコードで取得できました。
cfg := gmoclient.NewConfiguration()
c := gmoclient.NewAPIClient(cfg)
ctx := context.Background()
req := c.PublicApi.PublicV1StatusGet(ctx)
res, _, err := req.Execute()
fmt.Println(res.Data)
=== 実行結果 ===
map[status:OPEN]
Private APIを呼び出してみる
プライベートAPIの呼び出しには認証が必要です。
OpenAPIの定義ではcomponentsにsecuritySchemesを定義します。
components:
securitySchemes:
ApiKey:
type: apiKey
in: header
name: API-KEY
ApiTimestamp:
type: apiKey
in: header
name: API-TIMESTAMP
ApiSign:
type: apiKey
in: header
name: API-SIGN
そして今回はPrivate APIだけに適用したいのでPrivate APIの定義にsecurityを記載します。
/private/v1/account/assets:
get:
summary: Get account assets
tags: [ 'private' ]
security:
- ApiKey: []
ApiTimestamp: []
ApiSign: []
では実際に呼び出しする際ですが、timestampとsignの文字列を生成する部分を用意しなければならないですが、それさえできれば余力情報を取得APIは以下のように書けば動きました。
ヘッダーに認証情報を埋め込む部分の書き方がドキュメントなどを漁ってみてもよくわからずちょっと苦労しました。。最終的には生成されたclientコードをみてこんな感じで渡せばいいのかな?というので書いたら動きました。
// auth header params
timestamp := createTimestamp()
message := timestamp + "GET" + "/v1/account/margin"
sign := computeHmac256(message, "your_api_secret")
m := map[string]gmoclient.APIKey{
"ApiKey": {
Key: "your_api_key",
Prefix: "",
},
"ApiTimestamp": {
Key: timestamp,
Prefix: "",
},
"ApiSign": {
Key: sign,
Prefix: "",
},
}
privateCxt := context.WithValue(context.Background(), gmoclient.ContextAPIKeys, m)
amReq := c.PrivateApi.PrivateV1AccountMarginGet(privateCxt)
am, resp, err := amReq.Execute()
fmt.Println(resp.Body)
=== 実行結果 ===
{{"status":0,"data":{"actualProfitLoss":"42336","availableAmount":"42336","margin":"0","marginCallStatus":"NORMAL","profitLoss":"0"},"responsetime":"2022-01-06T23:56:39.593Z"}
}
GMOコインのAPI利用に必要なキーとシークレットの取得についてはこちらのページ(https://coin.z.com/jp/corp/product/info/api/)を参照してください。
Goのジェネレータとしては oapi-codegen の方が良さそうかもしれないですが、とりあえず動いたのでこれをベースにして取引できるところまで作ってみようかなあと思います。
コメント