package gmocoin
Install
dune-project
Dependency
Authors
Maintainers
Sources
md5=7a6f33dd187087e2fb02e2bc8fed8094
sha512=53b4f9a96dedd5a17f503e27aa9bb1439fa2d705251d1fb722b180cf8d7c916e44fd7f6d5867f1b8aedf9fe95940b6560086afdcc2f15372802a79f2796de5f0
doc/README.html
GMOコイン API from OCaml
GMOコイン 暗号資産取引所API のOCaml SDKです。
セットアップ
Private APIを使うには、カレントディレクトリに gmocoin-auth.conf を作成し、1行目にAPIキー、2行目にAPIシークレットを書いてください。
YOUR_API_KEY
YOUR_API_SECRETopen Gmocoin
let () =
let auth = Auth.auth () in
Lwt_main.run begin
PrivateApi.assets auth () >>= fun assets ->
...
end実装上の注意
- TLSバックエンド:
api.coin.z.comはcohttp-lwt-unixの既定TLSバックエンド (ocaml-tls, "native") で接続すると、ハンドシェイク後や応答読み取り中に断続的にECONNRESET/EPIPEで切断されることを確認しています(WAF等によるTLSフィンガープリント判定と見られます)。lib/http.mlでプロセス起動時にCONDUIT_TLS=openssl環境変数を自動設定してOpenSSLバックエンドを強制していますが、これでも完全には解消しないため、Http.get(冪等なGETのみ)は該当エラーを検知すると最大5回まで自動リトライします。POSTは二重注文を避けるため意図的にリトライしません。 - 署名対象パス: GMOコインの署名は
/v1/...(/privateを含まない、クエリ文字列も含まない) を対象にHMAC-SHA256で計算します。実際のリクエストURLには/privateを付与しますが、署名にはそのまま使わないようApiCommon内で分離しています。 - レスポンスエンベロープ: 全レスポンスは
{"status": 0, "data": ..., "responsetime": "..."}という共通形式です。statusが0以外の場合、型付きの{status: int; messages: {message_code; message_string} list}を積んだApiCommon.Api_errorを投げます。ただしPublicApi.statusだけは例外にせず(string, ApiCommon.api_error) result Lwt.tを返します(取引所稼働状況の確認自体がメンテナンス中に例外で失敗するのは本末転倒なため)。 - 数値の文字列表現: price/sizeなど大半の数値フィールドはJSON上で文字列 (
"455659") として返されるため、型定義でもstringとしています。呼び出し側で必要に応じてfloat_of_string等に変換してください。
テスト
dune testtest/test_gmocoin.mlにJSONパース(公式ドキュメントのレスポンス例をそのまま使用、MARKET注文でpriceが欠落するケースやCANCELED注文でcancelTypeが付くケースなどoptionフィールドの境界も含む)とRateLimiterのスライディングウィンドウ挙動を検証する単体テスト(alcotest)があります。ネットワークアクセスは行いません。
レートリミッター
API制限に基づき、ApiCommonがPrivate APIの全リクエストに自動で流量制限をかけます(RateLimiterモジュール、スライディングウィンドウ方式)。上限に達した場合は例外を投げずに、枠が空くまで自動的に待機してから送信します。
対象 | 上限 | 備考 |
|---|---|---|
Private API GET | 20回/秒 | Tier 1 (先週の取引高 < 10億円) を既定値として採用。Tier 2 (30回/秒) は未対応 |
Private API POST | 20回/秒 | 同上 |
Public API | 制限なし | ドキュメントに具体的な数値の記載なし |
Public WebSocket / Private WebSocketの「subscribe/unsubscribeは1秒間1回まで」という制限には未対応です(Public WebSocket APIは実装済みですが、同一接続内で複数チャンネルを連続購読する際の間隔調整はまだ入れていません)。
API実装状況
Public API
ベースURL: https://api.coin.z.com/public
API | エンドポイント | 状態 | 実装 |
|---|---|---|---|
取引所ステータス |
| ✅ |
|
最新レート |
| ✅ |
|
板情報 |
| ✅ |
|
取引履歴 |
| ✅ |
|
KLine情報の取得 |
| ✅ |
|
取引ルール |
| ✅ |
|
Public WebSocket API
エンドポイント: wss://api.coin.z.com/ws/public/v1(概要ページの記載は/ws/publicだが、実際のサンプルコードは全て/v1付き)
チャンネル | 状態 | 実装 |
|---|---|---|
最新レート (ticker) | ✅ |
|
板情報 (orderbooks) | ✅ |
|
取引履歴 (trades) | ✅ |
|
Realtime.updates ~symbol channelsで指定した銘柄・チャンネルをまとめて購読し、update Lwt_stream.t(Ticker | Orderbook | Tradeのバリアント)として受信できます。板情報だけのように単一チャンネルしか使わないことが多いため、パターンマッチ不要でその型のストリームを直接返す専用関数も用意しています: Realtime.ticker_updates / Realtime.orderbook_updates / Realtime.trade_updates(内部的にはupdatesを1チャンネルだけで呼んでいるだけ)。bin/main.mlのwatch_and_buyはRealtime.orderbook_updatesを使い、板情報のbest_bidが閾値以下になるたびにPrivateApi.orderで成行の現物買い注文を出すサンプル実装です。
実装時に分かった注意点:
- tickerチャンネルは値動きがないと配信されないことを確認しました(25秒待っても何も届かないケースあり)。常にスナップショットが届く
orderbooksチャンネルの方が、bid/ask監視には適しています。 - 板情報のレスポンスには、ドキュメントに記載のない
groupingフィールドが実際には含まれていました(Realtime.orderbookではstring optionとして吸収)。 - 接続はPrivate APIのHTTPと同様、既定のTLSバックエンドだと不安定なため、
`OpenSSLクライアントを明示的に指定しています。 - サーバーから1分に1回pingが送られ、pongを返さないと切断されます。
Realtime.updates内で自動的に応答します。
Private API
ベースURL: https://api.coin.z.com/private。すべて認証が必要です。
API | エンドポイント | 状態 | 実装 |
|---|---|---|---|
余力情報を取得 |
| ✅ |
|
資産残高を取得 |
| ✅ |
|
取引高情報を取得 |
| ✅ |
|
日本円の入金履歴の取得 |
| ✅ |
|
日本円の出金履歴の取得 |
| ✅ |
|
暗号資産の預入履歴の取得 |
| ✅ |
|
暗号資産の送付履歴の取得 |
| ✅ |
|
注文情報取得 |
| ✅ |
|
有効注文一覧 |
| ✅ |
|
約定情報取得 |
| ✅ |
|
最新の約定一覧 |
| ✅ |
|
建玉一覧を取得 |
| ✅ |
|
建玉サマリーを取得 |
| ✅ |
|
口座振替 |
| ⚠️ |
|
注文 |
| ✅ |
|
注文変更 |
| ✅ |
|
注文キャンセル |
| ✅ |
|
注文の複数キャンセル |
| ✅ |
|
注文の一括キャンセル |
| ✅ |
|
決済注文 |
| ✅ |
|
一括決済注文 |
| ✅ |
|
ロスカットレート変更 |
| ✅ |
|
アクセストークンを取得/延長/削除 |
| ✅ |
|
Private WebSocket API
エンドポイント: wss://api.coin.z.com/ws/private/v1/<token>(tokenはPrivateApi.ws_auth_postで取得)
チャンネル | 状態 | 実装 |
|---|---|---|
約定情報通知 | ⚠️ |
|
注文情報通知 | ⚠️ |
|
ポジション情報通知 | ⚠️ |
|
ポジションサマリー情報通知 | ⚠️ |
|
公開チャンネル用のupdatesと違い、private_updatesは接続が切れても内部で自動再接続はしない(アクセストークンが期限切れ(60分)で無効になっている可能性があり、その場合は再接続してもトークンを取り直さない限り無意味なため)。切断時はストリームの読み出しが例外で終わるので、呼び出し側で新しいトークンを取得してから呼び直すこと。