golang 取引所APIを使用せずに公开APIを使用する

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang 取引所APIを使用せずに公开APIを使用する相关的知识,希望对你有一定的参考价值。

/*
https://developers.quoine.com/#authentication
*/

package mtquoine

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"net/url"
	"strings"
	"time"
)

const ()

// Quoine APIクラス相当
type Quoine struct {
	name    string
	baseuri string
	timeout int // 秒単位で指定
}

// NewQuoine インスタンスを生成して返す
func NewQuoine() (q *Quoine) {
	q = new(Quoine)
	q.name = "quoine"
	q.baseuri = "https://api.quoine.com"
	q.timeout = 1000 * 10 // 10秒

	// var splited = strings.Split(currencyPair, "_")
	// q.TargetCurrency = splited[0]
	// q.BaseCurrency = splited[1]
	return
}

// GetExchangeName 取引所名を返す
// main関数のInterfaceで使用される
func (q *Quoine) GetExchangeName() (name string) {
	return q.name
}

//=============================================================================
// Public API
//=============================================================================

// OrderBook 板情報を返す
// GET /products/:id/price_levels
func (q *Quoine) OrderBook(params url.Values) (result *OrderBookResult, err error) {
	// pp.Println("--------", params["pair"][0])
	productID := q.getCurrencyPair(params["pair"][0])
	path := fmt.Sprintf("/products/%d/price_levels", productID)
	// pp.Println("hogehoge", path)
	req, err := q._publicRequest("GET", path, nil)
	if err != nil {
		return nil, err
	}
	client := &http.Client{Timeout: time.Duration(q.timeout) * time.Second}
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal("板情報取得エラー:", err)
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		log.Fatal(resp)
	}

	bytes, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
		return
	}

	ob := quoineOrderBook{}
	err = json.Unmarshal([]byte(bytes), &ob)
	if err != nil {
		log.Fatalf("unmrshal failed: %v", err)
		panic(err)
	}

	result = new(OrderBookResult)
	result.Exchange = q.name
	result.AskPrice, err = ob.SellPriceLevels[0][0].Float64()
	result.AskSize, err = ob.SellPriceLevels[0][1].Float64()
	result.BidPrice, err = ob.BuyPriceLevels[0][0].Float64()
	result.BidSize, err = ob.BuyPriceLevels[0][1].Float64()
	result.Spread = result.AskPrice - result.BidPrice
	result.MidPrice = (result.AskPrice + result.BidPrice) / 2.0
	return
}

// Public API用のリクエスト
func (q *Quoine) _publicRequest(method string, path string, values url.Values) (*http.Request, error) {
	encodedParams := values.Encode()
	url := q.baseuri + path
	// pp.Println("URL:", url)
	req, err := http.NewRequest("GET", url, strings.NewReader(encodedParams))
	if err != nil {
		return nil, err
	}
	req.Header.Add("X-Quoine-API-Version", "2")
	req.Header.Add("Content-Type", "application/json")
	return req, nil
}

// currency_pair_code
// func getProductID(currencyPair string) (id int) {
func (q *Quoine) getCurrencyPair(currencyPair string) (id int) {
	switch {
	case currencyPair == "BTC_JPY":
		id = 5
	case currencyPair == "ETH_JPY":
		id = 29
	case currencyPair == "BCH_JPY":
		id = 41
	}
	return
}

//=============================================================================
// Quoine
//=============================================================================

// QuoineOrderBook 板情報
type quoineOrderBook struct {
	BuyPriceLevels  [][]json.Number `json:"buy_price_levels,[][]string"`
	SellPriceLevels [][]json.Number `json:"sell_price_levels,[][]string"`
	// BuyPriceLevels  [][]float64 `json:"buy_price_levels,[][]string"`
	// SellPriceLevels [][]float64 `json:"sell_price_levels,[][]string"`
}

// QuoineErrorResult Quoineエラー結果
// {"errors":{"quantity":["less_than_order_size"]}}
type QuoineErrorResult struct {
	Errors struct {
		Quantity []string `json:"quantity"`
	} `json:"errors"`
}

python WARPの検索APIを利用するコードの骨组み.Jupyterに埋め込むととりあえずJSONを取得できます。

import urllib.request
import urllib
from urllib.parse import urlparse
import json

keyword = "何か入れる"
keyword_encode = urllib.parse.quote_plus(keyword)
api = "http://lab.ndl.go.jp/warp/api/page/select?q=keyword%3A{}&rows=100&json.nl=arrarr".format(keyword_encode)

response = urllib.request.urlopen(test)
content = json.loads(response.read().decode('utf8'))

with open("/Users/<user>/Documents/test_ndl.json", "w") as f:
    json.dump(content, f, ensure_ascii=False)

以上是关于golang 取引所APIを使用せずに公开APIを使用する的主要内容,如果未能解决你的问题,请参考以下文章

sh 谷歌:未指定キーワードを発生させずに検索する

取引先機能

markdown ActiveRecord的でDBに保存せずに一括で属性に値をセット

python WARPの検索APIを利用するコードの骨组み.Jupyterに埋め込むととりあえずJSONを取得できます。

markdown 招摇的UI APIでのドキュメントを确认する

python Python3の的urllibでとあるAPIからJSONを取得したいのですが,そのAPIが高频度で502を返すため的urlopen()をリトライする実装を工夫しています.urllib3は