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は