-
Notifications
You must be signed in to change notification settings - Fork 11
/
funding_rate.go
86 lines (71 loc) · 2.17 KB
/
funding_rate.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package swap
import (
"context"
"net/http"
"github.com/NadiaSama/ccexgo/exchange"
"github.com/NadiaSama/ccexgo/exchange/huobi"
"github.com/pkg/errors"
"github.com/shopspring/decimal"
)
type (
FundingRateResp struct {
EstimmatedRate decimal.Decimal `json:"estimated_rate"`
FundingRate decimal.Decimal `json:"funding_rate"`
ContractCode string `json:"contract_code"`
Symbol string `json:"symbol"`
FeeAsset string `json:"fee_asset"`
FundingTime string `json:"funding_time"`
NextFundingTime string `json:"next_funding_time"`
}
FundingRateReq struct {
*exchange.RestReq
}
)
const (
FundingRateEndPoint = "/swap-api/v1/swap_funding_rate"
)
func NewFundingRateReq(cc string) *FundingRateReq {
r := exchange.NewRestReq()
return &FundingRateReq{
RestReq: r.AddFields("contract_code", cc),
}
}
func (rc *RestClient) SwapFundingRate(ctx context.Context, req *FundingRateReq) (*FundingRateResp, error) {
var resp FundingRateResp
param, err := req.Values()
if err != nil {
return nil, errors.WithMessage(err, "build values fail")
}
if err := rc.Request(ctx, http.MethodGet, FundingRateEndPoint, param, nil, false, &resp); err != nil {
return nil, errors.WithMessage(err, "request funding fail")
}
return &resp, nil
}
func (rc *RestClient) FetchFundingRate(ctx context.Context, symbol exchange.Symbol) (*exchange.FundingRate, error) {
resp, err := rc.SwapFundingRate(ctx, NewFundingRateReq(symbol.String()))
if err != nil {
return nil, err
}
return resp.Transfer()
}
func (tr *FundingRateResp) Transfer() (*exchange.FundingRate, error) {
symbol, err := ParseSymbol(tr.ContractCode)
if err != nil {
return nil, errors.WithMessage(err, "parse symbol fail")
}
nt, err := huobi.ParseTSStr(tr.NextFundingTime)
if err != nil {
return nil, errors.WithMessage(err, "parse next_funding_time fail")
}
ts, err := huobi.ParseTSStr(tr.FundingTime)
if err != nil {
return nil, errors.WithMessage(err, "parse funding_time fail")
}
return &exchange.FundingRate{
Symbol: symbol,
FundingRate: tr.FundingRate,
NextFundingTime: nt,
Time: ts,
Raw: tr,
}, nil
}