package gmocoin

  1. Overview
  2. Docs

GMOコイン API from OCaml

Builds, tests & co

GMOコイン 暗号資産取引所API のOCaml SDKです。

セットアップ

Private APIを使うには、カレントディレクトリに gmocoin-auth.conf を作成し、1行目にAPIキー、2行目にAPIシークレットを書いてください。

YOUR_API_KEY
YOUR_API_SECRET
open 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 test

test/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

エンドポイント

状態

実装

取引所ステータス

GET /v1/status

PublicApi.status

最新レート

GET /v1/ticker

PublicApi.ticker

板情報

GET /v1/orderbooks

PublicApi.orderbooks

取引履歴

GET /v1/trades

PublicApi.trades

KLine情報の取得

GET /v1/klines

PublicApi.klines

取引ルール

GET /v1/symbols

PublicApi.symbols

Public WebSocket API

エンドポイント: wss://api.coin.z.com/ws/public/v1(概要ページの記載は/ws/publicだが、実際のサンプルコードは全て/v1付き)

チャンネル

状態

実装

最新レート (ticker)

Realtime.updates(Ticker of Realtime.ticker)

板情報 (orderbooks)

Realtime.updates(Orderbook of Realtime.orderbook。差分ではなく毎回スナップショット全体)

取引履歴 (trades)

Realtime.updates(Trade of Realtime.trade)

Realtime.updates ~symbol channelsで指定した銘柄・チャンネルをまとめて購読し、update Lwt_stream.t(Ticker | Orderbook | Tradeのバリアント)として受信できます。板情報だけのように単一チャンネルしか使わないことが多いため、パターンマッチ不要でその型のストリームを直接返す専用関数も用意しています: Realtime.ticker_updates / Realtime.orderbook_updates / Realtime.trade_updates(内部的にはupdatesを1チャンネルだけで呼んでいるだけ)。bin/main.mlwatch_and_buyRealtime.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

エンドポイント

状態

実装

余力情報を取得

GET /v1/account/margin

PrivateApi.margin

資産残高を取得

GET /v1/account/assets

PrivateApi.assets

取引高情報を取得

GET /v1/account/tradingVolume

PrivateApi.trading_volume

日本円の入金履歴の取得

GET /v1/account/fiatDeposit/history

PrivateApi.fiat_deposit_history

日本円の出金履歴の取得

GET /v1/account/fiatWithdrawal/history

PrivateApi.fiat_withdrawal_history

暗号資産の預入履歴の取得

GET /v1/account/deposit/history

PrivateApi.deposit_history

暗号資産の送付履歴の取得

GET /v1/account/withdrawal/history

PrivateApi.withdrawal_history

注文情報取得

GET /v1/orders

PrivateApi.orders

有効注文一覧

GET /v1/activeOrders

PrivateApi.active_orders

約定情報取得

GET /v1/executions

PrivateApi.executions

最新の約定一覧

GET /v1/latestExecutions

PrivateApi.latest_executions

建玉一覧を取得

GET /v1/openPositions

PrivateApi.open_positions

建玉サマリーを取得

GET /v1/positionSummary

PrivateApi.position_summary

口座振替

POST /v1/account/transfer

⚠️

PrivateApi.transfer(実弾での動作確認は未実施)

注文

POST /v1/order

PrivateApi.order

注文変更

POST /v1/changeOrder

PrivateApi.change_order

注文キャンセル

POST /v1/cancelOrder

PrivateApi.cancel_order

注文の複数キャンセル

POST /v1/cancelOrders

PrivateApi.cancel_orders

注文の一括キャンセル

POST /v1/cancelBulkOrder

PrivateApi.cancel_bulk_order

決済注文

POST /v1/closeOrder

PrivateApi.close_order

一括決済注文

POST /v1/closeBulkOrder

PrivateApi.close_bulk_order

ロスカットレート変更

POST /v1/changeLosscutPrice

PrivateApi.change_losscut_price

アクセストークンを取得/延長/削除

POST/PUT/DELETE /v1/ws-auth

PrivateApi.ws_auth_post/ws_auth_put/ws_auth_delete

Private WebSocket API

エンドポイント: wss://api.coin.z.com/ws/private/v1/<token>(tokenPrivateApi.ws_auth_postで取得)

チャンネル

状態

実装

約定情報通知

⚠️

Realtime.private_updates(ExecutionEvent)。実際のAPIキーでの動作確認は未実施

注文情報通知

⚠️

Realtime.private_updates(OrderEvent)。実際のAPIキーでの動作確認は未実施

ポジション情報通知

⚠️

Realtime.private_updates(PositionEvent)。実際のAPIキーでの動作確認は未実施

ポジションサマリー情報通知

⚠️

Realtime.private_updates(PositionSummaryEvent)。実際のAPIキーでの動作確認は未実施

公開チャンネル用のupdatesと違い、private_updatesは接続が切れても内部で自動再接続はしない(アクセストークンが期限切れ(60分)で無効になっている可能性があり、その場合は再接続してもトークンを取り直さない限り無意味なため)。切断時はストリームの読み出しが例外で終わるので、呼び出し側で新しいトークンを取得してから呼び直すこと。