Merge pull request #266 from zenickimo/feat/zenic/add-ftx-transfer

FEATURE: add subaccount fund transfer to FTX
This commit is contained in:
Yo-An Lin 2021-08-11 18:46:10 +08:00 committed by GitHub
commit b256e68f4d
4 changed files with 79 additions and 4 deletions

View File

@ -141,8 +141,9 @@ func (e *Exchange) QueryAccount(ctx context.Context) (*types.Account, error) {
} }
a := &types.Account{ a := &types.Account{
MakerCommission: fixedpoint.NewFromFloat(resp.Result.MakerFee), MakerCommission: fixedpoint.NewFromFloat(resp.Result.MakerFee),
TakerCommission: fixedpoint.NewFromFloat(resp.Result.TakerFee), TakerCommission: fixedpoint.NewFromFloat(resp.Result.TakerFee),
TotalAccountValue: fixedpoint.NewFromFloat(resp.Result.TotalAccountValue),
} }
balances, err := e.QueryAccountBalances(ctx) balances, err := e.QueryAccountBalances(ctx)
@ -456,3 +457,20 @@ func (e *Exchange) QueryTicker(ctx context.Context, symbol string) (*types.Ticke
func (e *Exchange) QueryTickers(ctx context.Context, symbol ...string) (map[string]types.Ticker, error) { func (e *Exchange) QueryTickers(ctx context.Context, symbol ...string) (map[string]types.Ticker, error) {
panic("implement me") panic("implement me")
} }
func (e *Exchange) Transfer(ctx context.Context, coin string, size float64, destination string) (string, error) {
payload := TransferPayload{
Coin: coin,
Size: size,
Source: e.subAccount,
Destination: destination,
}
resp, err := e.newRest().Transfer(ctx, payload)
if err != nil {
return "", err
}
if !resp.Success {
return "", fmt.Errorf("ftx returns transfer failure")
}
return resp.Result.String(), nil
}

View File

@ -18,12 +18,47 @@ import (
"github.com/c9s/bbgo/pkg/util" "github.com/c9s/bbgo/pkg/util"
) )
type transferRequest struct {
*restRequest
}
type TransferPayload struct {
Coin string
Size float64
Source string
Destination string
}
func (r *restRequest) Transfer(ctx context.Context, p TransferPayload) (transferResponse, error) {
resp, err := r.
Method("POST").
ReferenceURL("api/subaccounts/transfer").
Payloads(map[string]interface{}{
"coin": p.Coin,
"size": p.Size,
"source": p.Source,
"destination": p.Destination,
}).
DoAuthenticatedRequest(ctx)
if err != nil {
return transferResponse{}, err
}
var t transferResponse
if err := json.Unmarshal(resp.Body, &t); err != nil {
return transferResponse{}, fmt.Errorf("failed to unmarshal transfer response body to json: %w", err)
}
return t, nil
}
type restRequest struct { type restRequest struct {
*walletRequest *walletRequest
*orderRequest *orderRequest
*accountRequest *accountRequest
*marketRequest *marketRequest
*fillsRequest *fillsRequest
*transferRequest
key, secret string key, secret string
// Optional sub-account name // Optional sub-account name

View File

@ -1,6 +1,7 @@
package ftx package ftx
import ( import (
"fmt"
"strings" "strings"
"time" "time"
@ -86,8 +87,9 @@ type accountResponse struct {
} }
type account struct { type account struct {
MakerFee float64 `json:"makerFee"` MakerFee float64 `json:"makerFee"`
TakerFee float64 `json:"takerFee"` TakerFee float64 `json:"takerFee"`
TotalAccountValue float64 `json:"totalAccountValue"`
} }
type positionsResponse struct { type positionsResponse struct {
@ -368,3 +370,21 @@ type fill struct {
FeeCurrency string `json:"feeCurrency"` FeeCurrency string `json:"feeCurrency"`
Liquidity string `json:"liquidity"` Liquidity string `json:"liquidity"`
} }
type transferResponse struct {
Success bool `json:"success"`
Result transfer `json:"result"`
}
type transfer struct {
Id uint `json:"id"`
Coin string `json:"coin"`
Size float64 `json:"size"`
Time string `json:"time"`
Notes string `json:"notes"`
Status string `json:"status"`
}
func (t *transfer) String() string {
return fmt.Sprintf("%+v", *t)
}

View File

@ -117,6 +117,8 @@ type Account struct {
TakerFeeRate fixedpoint.Value `json:"takerFeeRate,omitempty"` TakerFeeRate fixedpoint.Value `json:"takerFeeRate,omitempty"`
AccountType string `json:"accountType,omitempty"` AccountType string `json:"accountType,omitempty"`
TotalAccountValue fixedpoint.Value `json:"totalAccountValue,omitempty"`
balances BalanceMap balances BalanceMap
} }