mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-22 14:55:16 +00:00
Merge pull request #1288 from c9s/c9s/strategy-deposit2transfer
FIX: [deposit2transfer] call QuerySpotAccount for getting the spot balance
This commit is contained in:
commit
52f9cbd48d
|
@ -562,6 +562,35 @@ func (e *Exchange) getLaunchDate() (time.Time, error) {
|
||||||
return time.Date(2018, time.June, 21, 0, 0, 0, 0, loc), nil
|
return time.Date(2018, time.June, 21, 0, 0, 0, 0, loc), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (e *Exchange) QuerySpotAccount(ctx context.Context) (*types.Account, error) {
|
||||||
|
if err := e.accountQueryLimiter.Wait(ctx); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
vipLevel, err := e.client.NewGetVipLevelRequest().Do(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// MAX returns the fee rate in the following format:
|
||||||
|
// "maker_fee": 0.0005 -> 0.05%
|
||||||
|
// "taker_fee": 0.0015 -> 0.15%
|
||||||
|
a := &types.Account{
|
||||||
|
AccountType: types.AccountTypeSpot,
|
||||||
|
MarginLevel: fixedpoint.Zero,
|
||||||
|
MakerFeeRate: fixedpoint.NewFromFloat(vipLevel.Current.MakerFee), // 0.15% = 0.0015
|
||||||
|
TakerFeeRate: fixedpoint.NewFromFloat(vipLevel.Current.TakerFee), // 0.15% = 0.0015
|
||||||
|
}
|
||||||
|
|
||||||
|
balances, err := e.queryBalances(ctx, maxapi.WalletTypeSpot)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
a.UpdateBalances(balances)
|
||||||
|
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (e *Exchange) QueryAccount(ctx context.Context) (*types.Account, error) {
|
func (e *Exchange) QueryAccount(ctx context.Context) (*types.Account, error) {
|
||||||
if err := e.accountQueryLimiter.Wait(ctx); err != nil {
|
if err := e.accountQueryLimiter.Wait(ctx); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -577,12 +606,17 @@ func (e *Exchange) QueryAccount(ctx context.Context) (*types.Account, error) {
|
||||||
// "taker_fee": 0.0015 -> 0.15%
|
// "taker_fee": 0.0015 -> 0.15%
|
||||||
|
|
||||||
a := &types.Account{
|
a := &types.Account{
|
||||||
AccountType: types.AccountTypeSpot,
|
|
||||||
MarginLevel: fixedpoint.Zero,
|
MarginLevel: fixedpoint.Zero,
|
||||||
MakerFeeRate: fixedpoint.NewFromFloat(vipLevel.Current.MakerFee), // 0.15% = 0.0015
|
MakerFeeRate: fixedpoint.NewFromFloat(vipLevel.Current.MakerFee), // 0.15% = 0.0015
|
||||||
TakerFeeRate: fixedpoint.NewFromFloat(vipLevel.Current.TakerFee), // 0.15% = 0.0015
|
TakerFeeRate: fixedpoint.NewFromFloat(vipLevel.Current.TakerFee), // 0.15% = 0.0015
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if e.MarginSettings.IsMargin {
|
||||||
|
a.AccountType = types.AccountTypeMargin
|
||||||
|
} else {
|
||||||
|
a.AccountType = types.AccountTypeSpot
|
||||||
|
}
|
||||||
|
|
||||||
balances, err := e.QueryAccountBalances(ctx)
|
balances, err := e.QueryAccountBalances(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -590,8 +624,6 @@ func (e *Exchange) QueryAccount(ctx context.Context) (*types.Account, error) {
|
||||||
a.UpdateBalances(balances)
|
a.UpdateBalances(balances)
|
||||||
|
|
||||||
if e.MarginSettings.IsMargin {
|
if e.MarginSettings.IsMargin {
|
||||||
a.AccountType = types.AccountTypeMargin
|
|
||||||
|
|
||||||
req := e.v3client.NewGetMarginADRatioRequest()
|
req := e.v3client.NewGetMarginADRatioRequest()
|
||||||
adRatio, err := req.Do(ctx)
|
adRatio, err := req.Do(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -606,16 +638,21 @@ func (e *Exchange) QueryAccount(ctx context.Context) (*types.Account, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Exchange) QueryAccountBalances(ctx context.Context) (types.BalanceMap, error) {
|
func (e *Exchange) QueryAccountBalances(ctx context.Context) (types.BalanceMap, error) {
|
||||||
if err := e.accountQueryLimiter.Wait(ctx); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
walletType := maxapi.WalletTypeSpot
|
walletType := maxapi.WalletTypeSpot
|
||||||
if e.MarginSettings.IsMargin {
|
if e.MarginSettings.IsMargin {
|
||||||
walletType = maxapi.WalletTypeMargin
|
walletType = maxapi.WalletTypeMargin
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return e.queryBalances(ctx, walletType)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Exchange) queryBalances(ctx context.Context, walletType maxapi.WalletType) (types.BalanceMap, error) {
|
||||||
|
if err := e.accountQueryLimiter.Wait(ctx); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
req := e.v3client.NewGetWalletAccountsRequest(walletType)
|
req := e.v3client.NewGetWalletAccountsRequest(walletType)
|
||||||
|
|
||||||
accounts, err := req.Do(ctx)
|
accounts, err := req.Do(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -20,6 +20,10 @@ type marginTransferService interface {
|
||||||
TransferMarginAccountAsset(ctx context.Context, asset string, amount fixedpoint.Value, io types.TransferDirection) error
|
TransferMarginAccountAsset(ctx context.Context, asset string, amount fixedpoint.Value, io types.TransferDirection) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type spotAccountQueryService interface {
|
||||||
|
QuerySpotAccount(ctx context.Context) (*types.Account, error)
|
||||||
|
}
|
||||||
|
|
||||||
const ID = "deposit2transfer"
|
const ID = "deposit2transfer"
|
||||||
|
|
||||||
var log = logrus.WithField("strategy", ID)
|
var log = logrus.WithField("strategy", ID)
|
||||||
|
@ -140,22 +144,23 @@ func (s *Strategy) checkDeposits(ctx context.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
account, err2 := s.session.UpdateAccount(ctx)
|
// we can't use the account from margin
|
||||||
if err2 != nil {
|
amount := d.Amount
|
||||||
log.WithError(err2).Errorf("unable to update account")
|
if service, ok := s.session.Exchange.(spotAccountQueryService); ok {
|
||||||
continue
|
account, err2 := service.QuerySpotAccount(ctx)
|
||||||
|
if err2 != nil {
|
||||||
|
log.WithError(err2).Errorf("unable to update account")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if bal, ok := account.Balance(d.Asset); ok {
|
||||||
|
log.Infof("spot account balance %s: %+v", d.Asset, bal)
|
||||||
|
amount = fixedpoint.Min(bal.Available, amount)
|
||||||
|
} else {
|
||||||
|
log.Errorf("unexpected error: %s balance not found", d.Asset)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bal, ok := account.Balance(d.Asset)
|
|
||||||
if !ok {
|
|
||||||
log.Errorf("unexpected error: %s balance not found", d.Asset)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Infof("%s balance: %+v", d.Asset, bal)
|
|
||||||
|
|
||||||
amount := fixedpoint.Min(bal.Available, d.Amount)
|
|
||||||
|
|
||||||
bbgo.Notify("Found succeeded deposit %s %s, transferring %s %s into the margin account",
|
bbgo.Notify("Found succeeded deposit %s %s, transferring %s %s into the margin account",
|
||||||
d.Amount.String(), d.Asset,
|
d.Amount.String(), d.Asset,
|
||||||
amount.String(), d.Asset)
|
amount.String(), d.Asset)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user