Introduce request package and integrate with exchanges

This commit is contained in:
Ryan O'Hara-Reid
2018-03-27 14:05:15 +11:00
committed by Adrian Gallagher
parent 52dfddbb18
commit 7fc9d20fd7
52 changed files with 1990 additions and 1544 deletions

View File

@@ -3,6 +3,7 @@ package kraken
import (
"fmt"
"log"
"net/http"
"net/url"
"strconv"
"strings"
@@ -11,6 +12,7 @@ import (
"github.com/thrasher-/gocryptotrader/common"
"github.com/thrasher-/gocryptotrader/config"
"github.com/thrasher-/gocryptotrader/exchanges"
"github.com/thrasher-/gocryptotrader/exchanges/request"
"github.com/thrasher-/gocryptotrader/exchanges/ticker"
)
@@ -38,6 +40,9 @@ const (
krakenTradeVolume = "TradeVolume"
krakenOrderCancel = "CancelOrder"
krakenOrderPlace = "AddOrder"
krakenAuthRate = 0
krakenUnauthRate = 0
)
// Kraken is the overarching type across the alphapoint package
@@ -45,6 +50,7 @@ type Kraken struct {
exchange.Base
CryptoFee, FiatFee float64
Ticker map[string]Ticker
*request.Handler
}
// SetDefaults sets current default settings
@@ -64,6 +70,8 @@ func (k *Kraken) SetDefaults() {
k.ConfigCurrencyPairFormat.Uppercase = true
k.AssetTypes = []string{ticker.Spot}
k.SupportsAutoPairUpdating = true
k.Handler = new(request.Handler)
k.SetRequestHandler(k.Name, krakenAuthRate, krakenUnauthRate, new(http.Client))
}
// Setup sets current exchange configuration
@@ -108,7 +116,7 @@ func (k *Kraken) GetServerTime(unixTime bool) (interface{}, error) {
var result GeneralResponse
path := fmt.Sprintf("%s/%s/public/%s", krakenAPIURL, krakenAPIVersion, krakenServerTime)
err := common.SendHTTPGetRequest(path, true, k.Verbose, &result)
err := k.SendHTTPRequest(path, &result)
if err != nil {
return nil, fmt.Errorf("getServerTime() error %s", err)
}
@@ -124,7 +132,7 @@ func (k *Kraken) GetAssets() (interface{}, error) {
var result GeneralResponse
path := fmt.Sprintf("%s/%s/public/%s", krakenAPIURL, krakenAPIVersion, krakenAssets)
return result.Result, common.SendHTTPGetRequest(path, true, k.Verbose, &result)
return result.Result, k.SendHTTPRequest(path, &result)
}
// GetAssetPairs returns a full asset pair list
@@ -137,7 +145,7 @@ func (k *Kraken) GetAssetPairs() (map[string]AssetPairs, error) {
response := Response{}
path := fmt.Sprintf("%s/%s/public/%s", krakenAPIURL, krakenAPIVersion, krakenAssetPairs)
return response.Result, common.SendHTTPGetRequest(path, true, k.Verbose, &response)
return response.Result, k.SendHTTPRequest(path, &response)
}
// GetTicker returns ticker information from kraken
@@ -154,7 +162,7 @@ func (k *Kraken) GetTicker(symbol string) (Ticker, error) {
resp := Response{}
path := fmt.Sprintf("%s/%s/public/%s?%s", krakenAPIURL, krakenAPIVersion, krakenTicker, values.Encode())
err := common.SendHTTPGetRequest(path, true, k.Verbose, &resp)
err := k.SendHTTPRequest(path, &resp)
if err != nil {
return ticker, err
}
@@ -192,7 +200,7 @@ func (k *Kraken) GetOHLC(symbol string) ([]OpenHighLowClose, error) {
path := fmt.Sprintf("%s/%s/public/%s?%s", krakenAPIURL, krakenAPIVersion, krakenOHLC, values.Encode())
err := common.SendHTTPGetRequest(path, true, k.Verbose, &result)
err := k.SendHTTPRequest(path, &result)
if err != nil {
return OHLC, err
}
@@ -238,7 +246,7 @@ func (k *Kraken) GetDepth(symbol string) (Orderbook, error) {
path := fmt.Sprintf("%s/%s/public/%s?%s", krakenAPIURL, krakenAPIVersion, krakenDepth, values.Encode())
err := common.SendHTTPGetRequest(path, true, k.Verbose, &result)
err := k.SendHTTPRequest(path, &result)
if err != nil {
return orderBook, err
}
@@ -297,7 +305,7 @@ func (k *Kraken) GetTrades(symbol string) ([]RecentTrades, error) {
path := fmt.Sprintf("%s/%s/public/%s?%s", krakenAPIURL, krakenAPIVersion, krakenTrades, values.Encode())
err := common.SendHTTPGetRequest(path, true, k.Verbose, &result)
err := k.SendHTTPRequest(path, &result)
if err != nil {
return recentTrades, err
}
@@ -338,7 +346,7 @@ func (k *Kraken) GetSpread(symbol string) ([]Spread, error) {
path := fmt.Sprintf("%s/%s/public/%s?%s", krakenAPIURL, krakenAPIVersion, krakenSpread, values.Encode())
err := common.SendHTTPGetRequest(path, true, k.Verbose, &response)
err := k.SendHTTPRequest(path, &response)
if err != nil {
return peanutButter, err
}
@@ -568,6 +576,11 @@ func (k *Kraken) CancelOrder(orderID int64) (interface{}, error) {
return k.SendAuthenticatedHTTPRequest(krakenOrderCancel, values)
}
// SendHTTPRequest sends an unauthenticated HTTP requests
func (k *Kraken) SendHTTPRequest(path string, result interface{}) error {
return k.SendPayload("GET", path, nil, nil, result, false, k.Verbose)
}
// SendAuthenticatedHTTPRequest sends an authenticated HTTP request
func (k *Kraken) SendAuthenticatedHTTPRequest(method string, values url.Values) (interface{}, error) {
if !k.AuthenticatedAPISupport {
@@ -599,20 +612,11 @@ func (k *Kraken) SendAuthenticatedHTTPRequest(method string, values url.Values)
headers["API-Key"] = k.APIKey
headers["API-Sign"] = signature
rawResp, err := common.SendHTTPRequest("POST", krakenAPIURL+path, headers, strings.NewReader(values.Encode()))
if err != nil {
return nil, err
}
if k.Verbose {
log.Printf("Received raw: \n%s\n", rawResp)
}
var resp interface{}
err = common.JSONDecode([]byte(rawResp), &resp)
err = k.SendPayload("POST", krakenAPIURL+path, headers, strings.NewReader(values.Encode()), &resp, true, k.Verbose)
if err != nil {
return nil, err
return resp, err
}
data := resp.(map[string]interface{})