スポンサーリンク

ビットコイン取引所「QUOINE」のAPIをC#から実行してみた!

取引所API

前回の投稿で、「BTCBOX」のAPIを紹介しました。
今回はビットコイン取引所「QUOINE」のAPIをC#で実装したサンプルを紹介します!
ちなみに、「QUOINE」は「コイン」と読むそうです。

他の取引所のAPIについてはコチラ

コード

取引所と通信する基本部のコード

秘密キーによる署名と、HTTPによる応答を行うメソッドをC#で実装したものです。取引所サイトにHTTPでリクエストして、レスポンスとしてJSON形式のテキストを受け取ります。

QUOINEの場合、署名にJWTを用います。JWT(JSON Web Token)は、JSONに電子署名をして、URL-safeな文字列にする手順の規約です。署名する処理は JwtHS256Encodeメソッド に切り出しています。

/// <summary>BTCBOX取引所の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="body">APIメソッドが"POST"のとき指定するリクエストボディ。</param>
/// <returns>レスポンスとして返されるJSON形式の文字列。</returns>
internal async Task<string> Send(HttpClient http, Uri path, string apiKey, string secret, string method, object body = null)
{
    //ノンス作成
    string nonce = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();

    //署名の内容
    var auth_payload = new
    {
        path = path.ToString(),
        nonce = nonce,
        token_id = apiKey,
    };

    //JWTでHA256署名
    string sign = JwtHS256Encode(auth_payload, secret);

    //HTTPヘッダ
    http.DefaultRequestHeaders.Clear();
    http.DefaultRequestHeaders.Add("X-Quoine-API-Version", "2");
    http.DefaultRequestHeaders.Add("X-Quoine-Auth", sign);

    //送信
    HttpResponseMessage res;
    if (method == "POST")
    {
        //リクエストボディをJSONにして渡す
        string jsonBody = JsonConvert.SerializeObject(body);
        var content = new StringContent(jsonBody, Encoding.UTF8, "application/json");

        res = await http.PostAsync(path, content);
    }
    else if (method == "GET")
    {
        res = await http.GetAsync(path);
    }
    else
    {
        throw new ArgumentException("method は POST か GET を指定してください。", method);
    }

    //応答内容を取得
    string text = await res.Content.ReadAsStringAsync();

    //応答失敗
    if (!res.IsSuccessStatusCode)
    {
        HttpLog.WriteLine("応答失敗", http.BaseAddress, path, method, res.StatusCode, text);//ログ
        return "";
    }

    return text;
}

/// <summary>JWT(JSON Web Token)に準じ、指定したオブジェクトのJSON表現にHMACSHA256で署名した文字列を返します。
/// </summary>
/// <param name="payload">署名をするオブジェクト。</param>
/// <param name="secret">署名に用いる秘密キー。</param>
/// <returns>署名した文字列。</returns>
public static string JwtHS256Encode(object payload, string secret)
{
    //ヘッダー
    byte[] headerBytes = Encoding.UTF8.GetBytes("{\"alg\":\"HS256\",\"typ\":\"JWT\"}");
    string header = Convert.ToBase64String(headerBytes);

    //署名する内容
    byte[] payloadBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(payload));
    string body = Convert.ToBase64String(payloadBytes);

    //ヘッダーと内容をピリオドでつなぐ
    var header_body = header + "." + body;

    //HMACSHA256で署名
    byte[] chaHash = new HMACSHA256(Encoding.UTF8.GetBytes(secret)).ComputeHash(Encoding.UTF8.GetBytes(header_body));
    string sign = Convert.ToBase64String(chaHash);

    //ヘッダーと内容と署名をピリオドでつなぐ
    return header_body + "." + sign;
}

使用例

先に紹介した通信メソッドの使用例です。コード内のAPIキー(apiKey)と秘密キー(secret)は取引所から取得したものに置き換えてください。

板情報を取得する

//QUOINE取引所にアクセスする HttpClient
HttpClient http = new HttpClient();
http.BaseAddress = new Uri("https://api.quoine.com");

//板情報を取得
Uri path = new Uri("/products/5/price_levels", UriKind.Relative);//APIの通信URL
string apiKey = "XXXXX";//APIキー        
string secret = "XXXXX";//秘密キー
string method = "GET";//APIメソッド
string json = await Send(http, path, apiKey, secret, method);

資産を取得する

//QUOINE取引所にアクセスする HttpClient
HttpClient http = new HttpClient();
http.BaseAddress = new Uri("https://api.quoine.com");

//資産残高取得
Uri path = new Uri("/accounts/balance", UriKind.Relative);//APIの通信URL
string apiKey = "XXXXX";//APIキー        
string secret = "XXXXX";//秘密キー
string method = "GET";//APIメソッド
string json = await Send(http, path, apiKey, secret, method);

買い注文を出す

最低取引量は0.01btcです。それ以下の注文はエラーになります。

QUOINEでは、日本円の端数が次のように処理されます。
・トレーダーが支払う日本円の一円未満は切り上げ
・トレーダーが貰える日本円の一円未満は切り下げ

//QUOINE取引所にアクセスする HttpClient
HttpClient http = new HttpClient();
http.BaseAddress = new Uri("https://api.quoine.com");

//リクエストボディ
var body = new
{
    order_type = "limit",//指値 "limit"、成行 "market" 
    product_id = 5,//通貨の組み合わせ(5:BTCJPY)
    side = "buy",//注文の売買の種類(買い:buy, 売り:sell)
    price = 100000m,//ビットコインのレート
    quantity = 0.01m,//ビットコインの注文量(0.01以上から)
};

//注文を出す
Uri path = new Uri("/orders/", UriKind.Relative);//APIの通信URL
string apiKey = "XXXXX";//APIキー        
string secret = "XXXXX";//秘密キー
string method = "POST";//APIメソッド
string json = await Send(http, path, apiKey, secret, method, body);

まとめ

こちがQUOINEのAPIのヘルプです(残念ながら英語です)。APIキーの取得についても書かれています。
https://developers.quoine.com/

他の取引所のAPIについてはコチラ

タイトルとURLをコピーしました