From b41f8a8355113681a59ac558ffc9b2a61e67c334 Mon Sep 17 00:00:00 2001 From: c9s Date: Fri, 24 Mar 2023 22:35:22 +0800 Subject: [PATCH] binance: add FuturesGetIncomeHistoryRequest api support --- .../futures_get_income_history_request.go | 58 +++++ ...s_get_income_history_request_requestgen.go | 212 ++++++++++++++++++ .../futures_get_position_risks_request.go | 19 +- ...s_get_position_risks_request_requestgen.go | 148 ++++++++++++ 4 files changed, 435 insertions(+), 2 deletions(-) create mode 100644 pkg/exchange/binance/binanceapi/futures_get_income_history_request.go create mode 100644 pkg/exchange/binance/binanceapi/futures_get_income_history_request_requestgen.go create mode 100644 pkg/exchange/binance/binanceapi/futures_get_position_risks_request_requestgen.go diff --git a/pkg/exchange/binance/binanceapi/futures_get_income_history_request.go b/pkg/exchange/binance/binanceapi/futures_get_income_history_request.go new file mode 100644 index 000000000..544760ac6 --- /dev/null +++ b/pkg/exchange/binance/binanceapi/futures_get_income_history_request.go @@ -0,0 +1,58 @@ +package binanceapi + +import ( + "time" + + "github.com/c9s/requestgen" + + "github.com/c9s/bbgo/pkg/fixedpoint" + "github.com/c9s/bbgo/pkg/types" +) + +// FuturesIncomeType can be one of the following value: +// TRANSFER, WELCOME_BONUS, REALIZED_PNL, FUNDING_FEE, COMMISSION, INSURANCE_CLEAR, REFERRAL_KICKBACK, COMMISSION_REBATE, +// API_REBATE, CONTEST_REWARD, CROSS_COLLATERAL_TRANSFER, OPTIONS_PREMIUM_FEE, +// OPTIONS_SETTLE_PROFIT, INTERNAL_TRANSFER, AUTO_EXCHANGE, +// DELIVERED_SETTELMENT, COIN_SWAP_DEPOSIT, COIN_SWAP_WITHDRAW, POSITION_LIMIT_INCREASE_FEE +type FuturesIncomeType string + +const ( + FuturesIncomeTransfer FuturesIncomeType = "TRANSFER" + FuturesIncomeWelcomeBonus FuturesIncomeType = "WELCOME_BONUS" + FuturesIncomeFundingFee FuturesIncomeType = "FUNDING_FEE" + FuturesIncomeRealizedPnL FuturesIncomeType = "REALIZED_PNL" + FuturesIncomeCommission FuturesIncomeType = "COMMISSION" + FuturesIncomeReferralKickback FuturesIncomeType = "REFERRAL_KICKBACK" + FuturesIncomeCommissionRebate FuturesIncomeType = "COMMISSION_REBATE" + FuturesIncomeApiRebate FuturesIncomeType = "API_REBATE" + FuturesIncomeContestReward FuturesIncomeType = "CONTEST_REWARD" +) + +type FuturesIncome struct { + Symbol string `json:"symbol"` + IncomeType FuturesIncomeType `json:"incomeType"` + Income fixedpoint.Value `json:"income"` + Asset string `json:"asset"` + Info string `json:"info"` + Time types.MillisecondTimestamp `json:"time"` + TranId string `json:"tranId"` + TradeId string `json:"tradeId"` +} + +//go:generate requestgen -method GET -url "/fapi/v2/positionRisk" -type FuturesGetIncomeHistoryRequest -responseType []FuturesIncome +type FuturesGetIncomeHistoryRequest struct { + client requestgen.AuthenticatedAPIClient + + symbol string `param:"symbol"` + + incomeType FuturesIncomeType `param:"incomeType"` + + startTime *time.Time `param:"startTime,milliseconds"` + endTime *time.Time `param:"endTime,milliseconds"` + + limit *uint64 `param:"limit"` +} + +func (c *FuturesRestClient) NewFuturesGetIncomeHistoryRequest() *FuturesGetIncomeHistoryRequest { + return &FuturesGetIncomeHistoryRequest{client: c} +} diff --git a/pkg/exchange/binance/binanceapi/futures_get_income_history_request_requestgen.go b/pkg/exchange/binance/binanceapi/futures_get_income_history_request_requestgen.go new file mode 100644 index 000000000..9ff3468a4 --- /dev/null +++ b/pkg/exchange/binance/binanceapi/futures_get_income_history_request_requestgen.go @@ -0,0 +1,212 @@ +// Code generated by "requestgen -method GET -url /fapi/v2/positionRisk -type FuturesGetIncomeHistoryRequest -responseType []FuturesIncome"; DO NOT EDIT. + +package binanceapi + +import ( + "context" + "encoding/json" + "fmt" + "net/url" + "reflect" + "regexp" + "strconv" + "time" +) + +func (f *FuturesGetIncomeHistoryRequest) Symbol(symbol string) *FuturesGetIncomeHistoryRequest { + f.symbol = symbol + return f +} + +func (f *FuturesGetIncomeHistoryRequest) IncomeType(incomeType FuturesIncomeType) *FuturesGetIncomeHistoryRequest { + f.incomeType = incomeType + return f +} + +func (f *FuturesGetIncomeHistoryRequest) StartTime(startTime time.Time) *FuturesGetIncomeHistoryRequest { + f.startTime = &startTime + return f +} + +func (f *FuturesGetIncomeHistoryRequest) EndTime(endTime time.Time) *FuturesGetIncomeHistoryRequest { + f.endTime = &endTime + return f +} + +func (f *FuturesGetIncomeHistoryRequest) Limit(limit uint64) *FuturesGetIncomeHistoryRequest { + f.limit = &limit + return f +} + +// GetQueryParameters builds and checks the query parameters and returns url.Values +func (f *FuturesGetIncomeHistoryRequest) GetQueryParameters() (url.Values, error) { + var params = map[string]interface{}{} + + query := url.Values{} + for _k, _v := range params { + query.Add(_k, fmt.Sprintf("%v", _v)) + } + + return query, nil +} + +// GetParameters builds and checks the parameters and return the result in a map object +func (f *FuturesGetIncomeHistoryRequest) GetParameters() (map[string]interface{}, error) { + var params = map[string]interface{}{} + // check symbol field -> json key symbol + symbol := f.symbol + + // assign parameter of symbol + params["symbol"] = symbol + // check incomeType field -> json key incomeType + incomeType := f.incomeType + + // TEMPLATE check-valid-values + switch incomeType { + case FuturesIncomeTransfer, FuturesIncomeWelcomeBonus, FuturesIncomeFundingFee, FuturesIncomeRealizedPnL, FuturesIncomeCommission, FuturesIncomeReferralKickback, FuturesIncomeCommissionRebate, FuturesIncomeApiRebate, FuturesIncomeContestReward: + params["incomeType"] = incomeType + + default: + return nil, fmt.Errorf("incomeType value %v is invalid", incomeType) + + } + // END TEMPLATE check-valid-values + + // assign parameter of incomeType + params["incomeType"] = incomeType + // check startTime field -> json key startTime + if f.startTime != nil { + startTime := *f.startTime + + // assign parameter of startTime + // convert time.Time to milliseconds time stamp + params["startTime"] = strconv.FormatInt(startTime.UnixNano()/int64(time.Millisecond), 10) + } else { + } + // check endTime field -> json key endTime + if f.endTime != nil { + endTime := *f.endTime + + // assign parameter of endTime + // convert time.Time to milliseconds time stamp + params["endTime"] = strconv.FormatInt(endTime.UnixNano()/int64(time.Millisecond), 10) + } else { + } + // check limit field -> json key limit + if f.limit != nil { + limit := *f.limit + + // assign parameter of limit + params["limit"] = limit + } else { + } + + return params, nil +} + +// GetParametersQuery converts the parameters from GetParameters into the url.Values format +func (f *FuturesGetIncomeHistoryRequest) GetParametersQuery() (url.Values, error) { + query := url.Values{} + + params, err := f.GetParameters() + if err != nil { + return query, err + } + + for _k, _v := range params { + if f.isVarSlice(_v) { + f.iterateSlice(_v, func(it interface{}) { + query.Add(_k+"[]", fmt.Sprintf("%v", it)) + }) + } else { + query.Add(_k, fmt.Sprintf("%v", _v)) + } + } + + return query, nil +} + +// GetParametersJSON converts the parameters from GetParameters into the JSON format +func (f *FuturesGetIncomeHistoryRequest) GetParametersJSON() ([]byte, error) { + params, err := f.GetParameters() + if err != nil { + return nil, err + } + + return json.Marshal(params) +} + +// GetSlugParameters builds and checks the slug parameters and return the result in a map object +func (f *FuturesGetIncomeHistoryRequest) GetSlugParameters() (map[string]interface{}, error) { + var params = map[string]interface{}{} + + return params, nil +} + +func (f *FuturesGetIncomeHistoryRequest) applySlugsToUrl(url string, slugs map[string]string) string { + for _k, _v := range slugs { + needleRE := regexp.MustCompile(":" + _k + "\\b") + url = needleRE.ReplaceAllString(url, _v) + } + + return url +} + +func (f *FuturesGetIncomeHistoryRequest) iterateSlice(slice interface{}, _f func(it interface{})) { + sliceValue := reflect.ValueOf(slice) + for _i := 0; _i < sliceValue.Len(); _i++ { + it := sliceValue.Index(_i).Interface() + _f(it) + } +} + +func (f *FuturesGetIncomeHistoryRequest) isVarSlice(_v interface{}) bool { + rt := reflect.TypeOf(_v) + switch rt.Kind() { + case reflect.Slice: + return true + } + return false +} + +func (f *FuturesGetIncomeHistoryRequest) GetSlugsMap() (map[string]string, error) { + slugs := map[string]string{} + params, err := f.GetSlugParameters() + if err != nil { + return slugs, nil + } + + for _k, _v := range params { + slugs[_k] = fmt.Sprintf("%v", _v) + } + + return slugs, nil +} + +func (f *FuturesGetIncomeHistoryRequest) Do(ctx context.Context) ([]FuturesIncome, error) { + + // empty params for GET operation + var params interface{} + query, err := f.GetParametersQuery() + if err != nil { + return nil, err + } + + apiURL := "/fapi/v2/positionRisk" + + req, err := f.client.NewAuthenticatedRequest(ctx, "GET", apiURL, query, params) + if err != nil { + return nil, err + } + + response, err := f.client.SendRequest(req) + if err != nil { + return nil, err + } + + var apiResponse []FuturesIncome + if err := response.DecodeJSON(&apiResponse); err != nil { + return nil, err + } + return apiResponse, nil +} diff --git a/pkg/exchange/binance/binanceapi/futures_get_position_risks_request.go b/pkg/exchange/binance/binanceapi/futures_get_position_risks_request.go index 0614420a3..83459a8f9 100644 --- a/pkg/exchange/binance/binanceapi/futures_get_position_risks_request.go +++ b/pkg/exchange/binance/binanceapi/futures_get_position_risks_request.go @@ -2,10 +2,25 @@ package binanceapi import "github.com/c9s/requestgen" -type FuturesPositionRisksResponse struct { +type FuturesPositionRisk struct { + EntryPrice string `json:"entryPrice"` + MarginType string `json:"marginType"` + IsAutoAddMargin string `json:"isAutoAddMargin"` + IsolatedMargin string `json:"isolatedMargin"` + Leverage string `json:"leverage"` + LiquidationPrice string `json:"liquidationPrice"` + MarkPrice string `json:"markPrice"` + MaxNotionalValue string `json:"maxNotionalValue"` + PositionAmt string `json:"positionAmt"` + Notional string `json:"notional"` + IsolatedWallet string `json:"isolatedWallet"` + Symbol string `json:"symbol"` + UnRealizedProfit string `json:"unRealizedProfit"` + PositionSide string `json:"positionSide"` + UpdateTime int `json:"updateTime"` } -//go:generate requestgen -method GET -url "/fapi/v2/positionRisk" -type FuturesGetPositionRisksRequest -responseType .FuturesPositionRisksResponse +//go:generate requestgen -method GET -url "/fapi/v2/positionRisk" -type FuturesGetPositionRisksRequest -responseType []FuturesPositionRisk type FuturesGetPositionRisksRequest struct { client requestgen.AuthenticatedAPIClient diff --git a/pkg/exchange/binance/binanceapi/futures_get_position_risks_request_requestgen.go b/pkg/exchange/binance/binanceapi/futures_get_position_risks_request_requestgen.go new file mode 100644 index 000000000..f17d53dd9 --- /dev/null +++ b/pkg/exchange/binance/binanceapi/futures_get_position_risks_request_requestgen.go @@ -0,0 +1,148 @@ +// Code generated by "requestgen -method GET -url /fapi/v2/positionRisk -type FuturesGetPositionRisksRequest -responseType []FuturesPositionRisk"; DO NOT EDIT. + +package binanceapi + +import ( + "context" + "encoding/json" + "fmt" + "net/url" + "reflect" + "regexp" +) + +func (f *FuturesGetPositionRisksRequest) Symbol(symbol string) *FuturesGetPositionRisksRequest { + f.symbol = symbol + return f +} + +// GetQueryParameters builds and checks the query parameters and returns url.Values +func (f *FuturesGetPositionRisksRequest) GetQueryParameters() (url.Values, error) { + var params = map[string]interface{}{} + + query := url.Values{} + for _k, _v := range params { + query.Add(_k, fmt.Sprintf("%v", _v)) + } + + return query, nil +} + +// GetParameters builds and checks the parameters and return the result in a map object +func (f *FuturesGetPositionRisksRequest) GetParameters() (map[string]interface{}, error) { + var params = map[string]interface{}{} + // check symbol field -> json key symbol + symbol := f.symbol + + // assign parameter of symbol + params["symbol"] = symbol + + return params, nil +} + +// GetParametersQuery converts the parameters from GetParameters into the url.Values format +func (f *FuturesGetPositionRisksRequest) GetParametersQuery() (url.Values, error) { + query := url.Values{} + + params, err := f.GetParameters() + if err != nil { + return query, err + } + + for _k, _v := range params { + if f.isVarSlice(_v) { + f.iterateSlice(_v, func(it interface{}) { + query.Add(_k+"[]", fmt.Sprintf("%v", it)) + }) + } else { + query.Add(_k, fmt.Sprintf("%v", _v)) + } + } + + return query, nil +} + +// GetParametersJSON converts the parameters from GetParameters into the JSON format +func (f *FuturesGetPositionRisksRequest) GetParametersJSON() ([]byte, error) { + params, err := f.GetParameters() + if err != nil { + return nil, err + } + + return json.Marshal(params) +} + +// GetSlugParameters builds and checks the slug parameters and return the result in a map object +func (f *FuturesGetPositionRisksRequest) GetSlugParameters() (map[string]interface{}, error) { + var params = map[string]interface{}{} + + return params, nil +} + +func (f *FuturesGetPositionRisksRequest) applySlugsToUrl(url string, slugs map[string]string) string { + for _k, _v := range slugs { + needleRE := regexp.MustCompile(":" + _k + "\\b") + url = needleRE.ReplaceAllString(url, _v) + } + + return url +} + +func (f *FuturesGetPositionRisksRequest) iterateSlice(slice interface{}, _f func(it interface{})) { + sliceValue := reflect.ValueOf(slice) + for _i := 0; _i < sliceValue.Len(); _i++ { + it := sliceValue.Index(_i).Interface() + _f(it) + } +} + +func (f *FuturesGetPositionRisksRequest) isVarSlice(_v interface{}) bool { + rt := reflect.TypeOf(_v) + switch rt.Kind() { + case reflect.Slice: + return true + } + return false +} + +func (f *FuturesGetPositionRisksRequest) GetSlugsMap() (map[string]string, error) { + slugs := map[string]string{} + params, err := f.GetSlugParameters() + if err != nil { + return slugs, nil + } + + for _k, _v := range params { + slugs[_k] = fmt.Sprintf("%v", _v) + } + + return slugs, nil +} + +func (f *FuturesGetPositionRisksRequest) Do(ctx context.Context) ([]FuturesPositionRisk, error) { + + // empty params for GET operation + var params interface{} + query, err := f.GetParametersQuery() + if err != nil { + return nil, err + } + + apiURL := "/fapi/v2/positionRisk" + + req, err := f.client.NewAuthenticatedRequest(ctx, "GET", apiURL, query, params) + if err != nil { + return nil, err + } + + response, err := f.client.SendRequest(req) + if err != nil { + return nil, err + } + + var apiResponse []FuturesPositionRisk + if err := response.DecodeJSON(&apiResponse); err != nil { + return nil, err + } + return apiResponse, nil +}