前回の投稿で、ビットコインの自動取引Botを作成する!という目標をたてました。
なので、今回はビットコイン取引所「Zaif」のAPIをC#で実装したサンプルを紹介します!
他の取引所のAPIについてはコチラ
APIキーと秘密キー
取引所のAPIにはprivateとPublicがあります。
PrivateなAPIとはアカウント固有の情報を扱うもので、資産残高の取得や売買の注文などが該当します。対してpublicなAPIは板情報の取得など、アカウントに依存しない情報を扱うものが該当します。
privateのAPIを使用するには、APIキーと秘密キーを必要とします。アカウントを開設して本人確認が済んでいれば、取引所から取得できます。
HTTP API
取引所のAPIは、基本的に、取引所サイトにHTTPでリクエストして、レスポンスとしてJSON形式のテキストを受け取るというものです。
取引所fのAPIのヘルプに戻り値の型情報が載っているので、それと等価のクラスを定義すればオブジェクトにデシリアライズできます。
リクエストでは何らかのパラメータを渡すのですが、プライベートメソッドでは、それを秘密キーで暗号化します。
パラメータの持たせ方とか、暗号化の方法とかが、取引所ごとに若干異なります。
コード
取引所と通信する基本部のコード
秘密キーによる署名と、HTTPによる応答を行うメソッドをC#で実装したものです。取引所サイトにHTTPでリクエストして、レスポンスとしてJSON形式のテキストを受け取ります。
Zaifの場合、nonceを少数付きで指定するのがコツです。
/// <summary>Zaif取引所のAPIを実行します。 /// </summary> /// <param name="http">取引所と通信する HttpClient。</param> /// <param name="path">APIの通信URL(取引所サイトからの相対)。</param> /// <param name="apiKey">APIキー。</param> /// <param name="secret">秘密キー。</param> /// <param name="method">APIのメソッド名。</param> /// <param name="parameters">APIのパラメータのリスト(Key:パラメータ名, Value:パラメータの値)。</param> /// <returns>レスポンスとして返されるJSON形式の文字列。</returns> static async Task<string> Send(HttpClient http, Uri path, string apiKey, string secret, string method, Dictionary<string, string> parameters = null) { // nonceにunixtimeを用いる。整数だと1秒に一回しかAPIを呼べない。 double nonce = (DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; //パラメータなしの場合 if (parameters == null) parameters = new Dictionary<string, string>(); //ノンスとメソッドを追加 parameters.Add("nonce", nonce.ToString()); parameters.Add("method", method); // POSTするメッセージを作成 var content = new FormUrlEncodedContent(parameters); string message = await content.ReadAsStringAsync(); // メッセージをHMACSHA512で署名 byte[] hash = new HMACSHA512(Encoding.UTF8.GetBytes(secret)).ComputeHash(Encoding.UTF8.GetBytes(message)); string sign = BitConverter.ToString(hash).ToLower().Replace("-", ""); // HTTPヘッダをセット http.DefaultRequestHeaders.Clear(); http.DefaultRequestHeaders.Add("key", apiKey); http.DefaultRequestHeaders.Add("Sign", sign); // 送信 HttpResponseMessage res = await http.PostAsync(path, content); //返答内容を取得 string text = await res.Content.ReadAsStringAsync(); //通信上の失敗 if (!res.IsSuccessStatusCode) return ""; return text; }
使用例
先に紹介した通信メソッドの使用例です。コード内のAPIキー(apiKey)と秘密キー(secret)は取引所から取得したものに置き換えてください。
板情報を取得する
//Zaif取引所にアクセスする HttpClient HttpClient http = new HttpClient(); http.BaseAddress = new Uri("https://api.zaif.jp"); //板情報取得 Uri path = new Uri("/api/1/depth/btc_jpy", UriKind.Relative);//APIの通信URL string apiKey = "XXXXX";//APIキー string secret = "XXXXX";//秘密キー string method = "depth";//APIメソッド string json = await Send(http, path, apiKey, secret, method);
資産を取得する
//Zaif取引所にアクセスする HttpClient HttpClient http = new HttpClient(); http.BaseAddress = new Uri("https://api.zaif.jp"); //資産残高取得 Uri path = new Uri("/tapi", UriKind.Relative);//APIの通信URL string apiKey = "XXXXX";//APIキー string secret = "XXXXX";//秘密キー string method = "get_info2";//APIメソッド string json = await Send(http, path, apiKey, secret, method);
買い注文を出す
//Zaif取引所にアクセスする HttpClient HttpClient http = new HttpClient(); http.BaseAddress = new Uri("https://api.zaif.jp"); //パラメータ var param = new Dictionary<string, string> { { "currency_pair", "btc_jpy" },//取引する通貨の種類 { "action", "bid" },//注文の売買の種類(買い:bid, 売り:ask) { "price", "100000" },//ビットコインのレート(5円単位) { "amount", "0.01" },//ビットコインの注文量(0.0001BTC単位) }; //買い注文を出す Uri path = new Uri("/tapi", UriKind.Relative);//APIの通信URL string apiKey = "XXXXX";//APIキー string secret = "XXXXX";//秘密キー string method = "trade";//APIメソッド string json = await Send(http, path, apiKey, secret, method, param);
まとめ
こちがZaifのAPIのヘルプです。APIキーの取得についても書かれています。
https://corp.zaif.jp/api-docs/trade-api/
他の取引所のAPIについてはコチラ