Code Monkey home page Code Monkey logo

huobi_golang's People

Contributors

clarkjia avatar eynzhang avatar shaodan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

huobi_golang's Issues

the getrequest package could not be found

in readme

Market data
Candlestick/KLine
client := new(client.MarketClient).Init(config.Host)
optionalRequest := getrequest.GetCandlestickOptionalRequest{Period: getrequest.MIN1, Size: 10}
resp, err := client.GetCandlestick("btcusdt", optionalRequest)

the getrequest package could not be found

Infinite reconnecting loop

Guys you don't reset p.lastReceivedTime variable while reconnect so that's cause infinite reconnecting loop.

查询历史账号报错:Format Error: account-id.

错误 :Get account history error: {"status":"error","err-code":"validation-format-error","err-msg":"Format Error: account-id.","data":null}
``

var (
	AccessKey = "xxx-xxx-xxx-xxx"
	SecretKey = "xxx-xxxx-xxxx-xxxx"
	accountId int64
)
/**
财务流水
*/
func (controller *Index) GetAccountHistory(r *ghttp.Request) {

	client := new(client.AccountClient).Init(AccessKey, SecretKey, config.Host)
	//if accountId == 0 {
	info, err := client.GetAccountInfo()
	applogger.Info("Get account ledger error: ", info)
	if err == nil {

		for _, accountInfo := range info {
			if accountInfo.Type == "spot" {
				accountId = (accountInfo.Id)
			}
		}

	} else {
		base.Error(r, "Get account ledger error"+err.Error())
		return
	}
	//}
	fmt.Println(accountId)
	getAccountHistoryOptionalRequest := account.GetAccountHistoryOptionalRequest{}

	resp, err := client.GetAccountHistory(string((accountId)), getAccountHistoryOptionalRequest)
	if err != nil {
		applogger.Error("Get account history error: %s", err)
		base.Error(r, "Get account history error"+err.Error())
		return
	} else {
		applogger.Info("Get account history, count=%d", len(resp))

		base.Succ(r, g.Map{"list": resp, "form": nil})
	}

	return
}`

Make logging pluggable

Since every project has its own logging facilities, make logging module pluggble is more developer friendly.

how to get Candlestick data in websocket

when i ran "reqAndSubscribeCandlestick",
in client.SetHandler() para is:
client.Request("btcusdt", "4hour", 1569361140, 1600988820, "2305")
client.Subscribe("btcusdt", "4hour", "2118")

but i can't get "Candlestick data, id: xxxxxx" in stdout.
the stdout only contains "Candlestick update, id: xxxxx" data. thx.

TradeTick.Data.Id is overflow

GetHistoricalTrade error: json: cannot unmarshal number 10043412649746196623382279 into Go struct field .data.Data.id of type int64

GetHistoricalTrade id overflows int64

GET /market/history/trade
golang sdk

type TradeTick struct {
Id int64 json:"id"
Ts int64 json:"ts"
Data []struct {
Amount decimal.Decimal json:"amount"
TradeId int64 json:"trade-id"
Ts int64 json:"ts"
Id int64 json:"id" //type of Id is int64
Price decimal.Decimal json:"price"
Direction string json:"direction"
}
}

func (client *MarketClient) GetHistoricalTrade(symbol string, optionalRequest getrequest.GetHistoricalTradeOptionalRequest) ([]market.TradeTick, error) {
...
url := client.publicUrlBuilder.Build("/market/history/trade", request)
getResp, getErr := internal.HttpGet(url)
if getErr != nil {
return nil, getErr
}

result := market.GetHistoricalTradeResponse{}

*jsonErr := json.Unmarshal([]byte(getResp), &result)
...

}

getResp : {"ch":"market.eoseth.trade.detail","status":"ok","ts":1594745613073,"data":[{"id":101110131882,"ts":1594745594604,"data":[{"id":10111013188257230009901629,......
*line error: 10111013188257230009901629 overflows int64

go mod about import path

go: quant/pkg/grid imports
github.com/huobirdcenter/huobi_Golang/config: github.com/huobirdcenter/[email protected]: parsing go.mod:
module declares its path as: github.com/huobirdcenter/huobi_golang
but was required as: github.com/huobirdcenter/huobi_Golang

WebSocketV1ClientBase.lastReceivedTime field data race

WARNING: DATA RACE
Write at 0x00c000158128 by goroutine 56:
  .../pkg/client/websocketclientbase.(*WebSocketV1ClientBase).readLoop()
     .../pkg/client/websocketclientbase/websocketv1clientbase.go:212 +0x23c

Previous write at 0x00c000158128 by goroutine 16:
 .../pkg/client/websocketclientbase.(*WebSocketV1ClientBase).startTicker()
     .../pkg/client/websocketclientbase/websocketv1clientbase.go:137 +0xbc

panic: d.nx != 0

panic: d.nx != 0

goroutine 85 [running]:
crypto/sha256.(*digest).checkSum(0xc00043d9f0, 0x0, 0x0, 0x0, 0x0)
        c:/go/src/crypto/sha256/sha256.go:234 +0x1e0
crypto/sha256.(*digest).Sum(0xc00009eb00, 0x0, 0x0, 0x0, 0xc0, 0xb6, 0x0)
        c:/go/src/crypto/sha256/sha256.go:210 +0x70
crypto/hmac.(*hmac).Sum(0xc0000ae840, 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0)
        c:/go/src/crypto/hmac/hmac.go:46 +0x5d
github.com/huobirdcenter/huobi_golang/internal/requestbuilder.(*Signer).sign(0xc00005f250, 0xc00046cfc0, 0xb6, 0x40, 0xb6)
        C:/Users/Administrator/go/pkg/mod/github.com/huobirdcenter/[email protected]/internal/requestbuilder/signer.go:40 +0xba
github.com/huobirdcenter/huobi_golang/internal/requestbuilder.(*Signer).Sign(0xc00005f250, 0xb1626e, 0x3, 0xb1be37, 0xd, 0xc000094960, 0x25, 0xc00046cf00, 0x7e, 0xc71190, ...)
        C:/Users/Administrator/go/pkg/mod/github.com/huobirdcenter/[email protected]/internal/requestbuilder/signer.go:34 +0x39c
github.com/huobirdcenter/huobi_golang/internal/requestbuilder.(*PrivateUrlBuilder).BuildWithTime(0xc000106510, 0xb1626e, 0x3, 0xc000094960, 0x25, 0x2cd91da0, 0xed654903d, 0x0, 0x0, 0xc00043dd58, ...)
        C:/Users/Administrator/go/pkg/mod/github.com/huobirdcenter/[email protected]/internal/requestbuilder/privateurlbuilder.go:55 +0x1c3
github.com/huobirdcenter/huobi_golang/internal/requestbuilder.(*PrivateUrlBuilder).Build(0xc000106510, 0xb1626e, 0x3, 0xc000094960, 0x25, 0x0, 0x8, 0xc000094960)
        C:/Users/Administrator/go/pkg/mod/github.com/huobirdcenter/[email protected]/internal/requestbuilder/privateurlbuilder.go:41 +0xf2
github.com/huobirdcenter/huobi_golang/pkg/client.(*AccountClient).GetAccountBalance(0xc0000960b0, 0xb184b4, 0x8, 0x0, 0xc00043df58, 0xc0000c4000)
        C:/Users/Administrator/go/pkg/mod/github.com/huobirdcenter/[email protected]/pkg/client/accountclient.go:49 +0xc6

get order info failed after create order

When I placed a buy/sell order, due to it just return an order id for me, I have to request get order api to get more info. But I encounter error for {Status:error ErrorCode:base-record-invalid ErrorMessage:record invalid Data:<nil>} sometimes. Actually everything is ok,may it is too short time for place order and get order info in the server.

PerfLogger data race

WARNING: DATA RACE
Read at 0x0000020d07f0 by goroutine 25:
  .../logging/perflogger.GetInstance()
     .../logging/perflogger/performancelogger.go:29 +0x65

Previous write at 0x0000020d07f0 by goroutine 24:
  .../logging/perflogger.GetInstance()
     .../logging/perflogger/performancelogger.go:30 +0x3d5

k8s内运行问题

我用sdk的样例,在本地运行没有问题,但是在k8s中运行时报这个错误:

[Error] 2021/02/28 15:06:42 Get "https://api.huobi.pro/market/trade?symbol=btcusdt": 
dial tcp: lookup api.huobi.pro on 10.96.0.10:53: server misbehaving

这个错误是该代码报出来的,打印出的日志

const host = "api.huobi.pro"
c = new(client.MarketClient).Init(host)

res, err := c.GetLast24hCandlestick("btcusdt")
if err != nil {
	log.L.Error("%s", err)
	break
}

不知是k8s dns的问题还是sdk的问题,请问有无k8s运行此sdk的成功样例?

cannot find package "." in: github.com/huobirdcenter/huobi_golang/pkg/client/orderwebsocketclient

build failed with can not find package "."

go version && huobi_golang version

go version go1.16 darwin/amd64

github.com/huobirdcenter/huobi_golang v0.0.0-20201119082032-67bf5220fbce

example code:

package main

import (
	"github.com/huobirdcenter/huobi_golang/config"
	"github.com/huobirdcenter/huobi_golang/logging/applogger"
	"github.com/huobirdcenter/huobi_golang/pkg/client/orderwebsocketclient"
	"github.com/huobirdcenter/huobi_golang/pkg/model/auth"
	"github.com/huobirdcenter/huobi_golang/pkg/model/order"
)

func main() {
	// Initialize a new instance
	client := new(orderwebsocketclient.SubscribeOrderWebSocketV2Client).Init(config.AccessKey, config.AccountId, config.Host)

	// Set the callback handlers
	client.SetHandler(
		// Connected handler
		func(resp *auth.WebSocketV2AuthenticationResponse) {
			if resp.IsSuccess() {
				// Subscribe if authentication passed
				client.Subscribe("btcusdt", "1149")
			} else {
				applogger.Info("Authentication error, code: %d, message:%s", resp.Code, resp.Message)
			}
		},
		// Response handler
		func(resp interface{}) {
			subResponse, ok := resp.(order.SubscribeOrderV2Response)
			if ok {
				if subResponse.Action == "sub" {
					if subResponse.IsSuccess() {
						applogger.Info("Subscription topic %s successfully", subResponse.Ch)
					} else {
						applogger.Error("Subscription topic %s error, code: %d, message: %s", subResponse.Ch, subResponse.Code, subResponse.Message)
					}
				} else if subResponse.Action == "push" {
					if subResponse.Data != nil {
						o := subResponse.Data
						applogger.Info("Order update, event: %s, symbol: %s, type: %s, status: %s",
							o.EventType, o.Symbol, o.Type, o.OrderStatus)
					}
				}
			} else {
				applogger.Warn("Received unknown response: %v", resp)
			}
		})

	// Connect to the server and wait for the handler to handle the response
	client.Connect(true)}

error info:

cannot find package "." in:
 
/MY_PROJECT_PATH/vendor/github.com/huobirdcenter/huobi_golang/pkg/client/orderwebsocketclient

marketwebsocket 如何获取 "ch"

在php的demo中是直接返回,但是在golang中,这个属性被私有化了,如果能把handleMessage放开,自定义解析就好了

panic: concurrent write to websocket connection

i subscribe websocket market data and receive realtime kline, Client.Subscribe("btcusdt", "1min", "2118").
i also obtain historical kline periodically by a time.ticker goroutine, Client.Request(xxxxxxx)
but i got a panic finally after running a period of time,

panic: concurrent write to websocket connection

goroutine 33 [running]:
github.com/gorilla/websocket.(*messageWriter).flushFrame(0xc00007d260, 0xc000170001, 0x0, 0x0, 0x0, 0x7f01d726d108, 0x0)
        F:/go/pkg/mod/github.com/gorilla/[email protected]/conn.go:610 +0x5e9
github.com/gorilla/websocket.(*messageWriter).Close(0xc00007d260, 0x0, 0xc0006c5de8)
        F:/go/pkg/mod/github.com/gorilla/[email protected]/conn.go:724 +0x62
github.com/gorilla/websocket.(*Conn).beginMessage(0xc00054b4a0, 0xc000170030, 0x1, 0x0, 0xc0006c5e40)
        F:/go/pkg/mod/github.com/gorilla/[email protected]/conn.go:473 +0x26d
github.com/gorilla/websocket.(*Conn).NextWriter(0xc00054b4a0, 0x1, 0x9, 0xbf6400, 0xc000328060, 0x20)
        F:/go/pkg/mod/github.com/gorilla/[email protected]/conn.go:513 +0x53
github.com/gorilla/websocket.(*Conn).WriteMessage(0xc00054b4a0, 0x1, 0xc000328060, 0x17, 0x20, 0x20, 0x17)
        F:/go/pkg/mod/github.com/gorilla/[email protected]/conn.go:766 +0x6e
github.com/huobirdcenter/huobi_golang/pkg/client/websocketclientbase.(*WebSocketClientBase).readLoop(0xc00006e360)
        F:/go/pkg/mod/github.com/huobirdcenter/[email protected]/pkg/client/websocketclientbase/websocketclientbase.go:222 +0x528
created by github.com/huobirdcenter/huobi_golang/pkg/client/websocketclientbase.(*WebSocketClientBase).startReadLoop
        F:/go/pkg/mod/github.com/huobirdcenter/[email protected]/pkg/client/websocketclientbase/websocketclientbase.go:174 +0x3f

i think the reason is time.Ticker goroutine and ping pong in "startReadLoop --> readLoop" write websocket simultaneous, how to solve it?

Changes by the Optimization of “Search Past Orders” Interface on API

https://www.huobi.com/support/en-us/detail/64892083374346
This update involves the below:
github.com\huobirdcenter\huobi_golang\pkg\client\orderclient.go

// Returns orders based on a specific searching criteria.
func (p *OrderClient) GetHistoryOrders(request *model.GetRequest) (*order.GetHistoryOrdersResponse, error) {
	url := p.privateUrlBuilder.Build("GET", "/v1/order/orders", request)
	getResp, getErr := internal.HttpGet(url)
	if getErr != nil {
		return nil, getErr
	}

	result := order.GetHistoryOrdersResponse{}
	jsonErr := json.Unmarshal([]byte(getResp), &result)
	if jsonErr != nil {
		return nil, jsonErr
	}

	return &result, nil
}

to be: /v1/order/openOrders

order state:
created: The order is created, and not in the matching queue yet.
submitted: The order is submitted, and already in the matching queue, waiting for deal.
partial-filled: The order is already in the matching queue and partially traded, and is waiting for further matching and trade.
filled: The order is already traded and not in the matching queue any more.
partial-canceled: The order is not in the matching queue any more. The status is transferred from 'partial-filled', the order is partially trade, but remaining is canceled.
canceling: The order is under canceling, but haven't been removed from matching queue yet.
canceled: The order is not in the matching queue any more, and completely canceled. There is no trade associated with this order.

or make a new:

// Returns all open orders based on a specific searching criteria.
// https://www.huobi.com/support/en-us/detail/64892083374346
func (p *OrderClient) GetAllOpenOrders(request *model.GetRequest) (*order.GetHistoryOrdersResponse, error) {
	url := p.privateUrlBuilder.Build("GET", "/v1/order/openOrders", request)
	getResp, getErr := internal.HttpGet(url)
	if getErr != nil {
		return nil, getErr
	}

	result := order.GetHistoryOrdersResponse{}
	jsonErr := json.Unmarshal([]byte(getResp), &result)
	if jsonErr != nil {
		return nil, jsonErr
	}

	return &result, nil
}

SubscribeOrderV2Response.Data need OrderValue for buy-market order

type SubscribeOrderV2Response struct {
	base.WebSocketV2ResponseBase
	Data *struct {
		EventType     string `json:"eventType"`
		Symbol        string `json:"symbol"`
		OrderId       int64 `json:"orderId"`
		ClientOrderId string `json:"clientOrderId"`
		OrderPrice    string `json:"orderPrice"`
		OrderSize string `json:"orderSize"`
		Type string `json:"type"`
		OrderStatus string `json:"orderStatus"`
		OrderCreateTime int64 `json:"orderCreateTime"`
		TradePrice string `json:"tradePrice"`
		TradeVolume string `json:"tradeVolume"`
		TradeId int64 `json:"tradeId"`
		TradeTime int64 `json:"tradeTime"`
		Aggressor bool `json:"aggressor"`
		RemainAmt string `json:"remainAmt"`
		LastActTime int64 `json:"lastActTime"`
	}
}

there is no OrderValue, can you upgrade and fix it, thanks!

订阅订单更新有bug

下单后会出现

ERROR Handle message error: json: cannot unmarshal number into Go struct field .Data.orderCreateTime of type string

类型可能得改成int64

placeOrder 示例错误代码:Invalid order source spot api

placeOrder 示例错误代码:Invalid order source spot api

代码:
func placeOrder() {
client := new(client.OrderClient).Init(config.AccessKey, config.SecretKey, config.Host)
request := order.PlaceOrderRequest{
AccountId: config.AccountId,
Type: "sell-market",
Symbol: "btcusdt",
Amount: "10",
Source: "spot-api",
}

fmt.Print("request:\n", request, '\n')

resp, err := client.PlaceOrder(&request)
if err != nil {
	applogger.Error(err.Error())
} else {
	switch resp.Status {
	case "ok":
		applogger.Info("Place order successfully, order id: %s", resp.Data)
	case "error":
		applogger.Error("Place order error 哭啊: %s", resp.ErrorMessage)
	}
}

}

{"status":"error","err-code":"api-signature-not-valid","err-msg":"Signature not valid: Verification failure [校验失败]","data":null}

first i get accont information by client.AccountClient ,when i recieve the response, i use the same account client instance to get the account balance , this time the response is a error

{"status":"error","err-code":"api-signature-not-valid","err-msg":"Signature not valid: Verification failure [校验失败]","data":null}

but when i change the code like that
`
func (p *Signer) sign(payload string) string {
p.hash.Write([]byte(payload))
result := base64.StdEncoding.EncodeToString(p.hash.Sum(nil))

p.hash.Reset()
return result

}`
then there is no error,but i dont know whether it‘s correct

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.