Files
gocryptotrader/exchanges/collateral/collateral.go
Scott 5f2f6f884b Binance,Okx: Add Leverage, MarginType, Positions and CollateralMode support (#1220)
* init

* surprise train commit

* basic distinctions

* the terms of binance are confusing

* renames and introduction of allocatedMargin

* add new margin funcs

* pulling out wires

* implement proper getposition stuff

* bad coding day

* investigate order manager next

* a broken mess, but a progressing one

* finally completes some usdtmargined stuff

* coinMfutures eludes me

* expand to okx

* imports fix

* completes okx wrapper implementations

* cleans and polishes before rpc implementations

* rpc setup, order manager features, exch features

* more rpc, collateral and margin things

* mini test

* looking at rpc response, expansion of features

* reorganising before the storm

* changing how futures requests work

* cleanup and tests of cli usage

* remove silly client side logic

* cleanup

* collateral package, typo fix, margin err, rpc derive

* uses convert.StringToFloat ONLY ON STRUCTS FROM THIS PR

* fix binance order history bug

* niteroos

* adds new funcs to exchange standards testing

* more post merge fixes

* fix binance

* replace simepletimeformat

* fix for merge

* merge fixes

* micro fixes

* order side now required for leverage

* fix up the rest

* global -> portfolio collateral

* Update exchanges/collateral/collateral_test.go

Co-authored-by: Adrian Gallagher <adrian.gallagher@thrasher.io>

* adds fields and todos

* rm field redundancy

* lint fix oopsie daisy

* fixes panic, expands error and cli explanations (sorry shaz)

* ensures casing is appropriate for underlying

* Adds a shiny TODO

---------

Co-authored-by: Adrian Gallagher <adrian.gallagher@thrasher.io>
2023-09-26 16:16:31 +10:00

72 lines
1.8 KiB
Go

package collateral
import (
"encoding/json"
"fmt"
"strings"
)
// Valid returns whether the collateral mode is valid
func (t Mode) Valid() bool {
return t != UnsetMode && supportedCollateralModes&t == t
}
// UnmarshalJSON converts json into collateral mode
func (t *Mode) UnmarshalJSON(d []byte) error {
var mode string
err := json.Unmarshal(d, &mode)
if err != nil {
return err
}
*t, err = StringToMode(mode)
return err
}
// String returns the string representation of the collateral mode in lowercase
// the absence of a lower func should hopefully highlight that String is lower
func (t Mode) String() string {
switch t {
case UnsetMode:
return unsetCollateralStr
case SingleMode:
return singleCollateralStr
case MultiMode:
return multiCollateralStr
case PortfolioMode:
return portfolioCollateralStr
case UnknownMode:
return unknownCollateralStr
}
return ""
}
// Upper returns the upper case string representation of the collateral mode
func (t Mode) Upper() string {
return strings.ToUpper(t.String())
}
// IsValidCollateralModeString checks to see if the supplied string is a valid collateral mode
func IsValidCollateralModeString(m string) bool {
switch strings.ToLower(m) {
case singleCollateralStr, multiCollateralStr, portfolioCollateralStr, unsetCollateralStr:
return true
}
return false
}
// StringToMode converts a string to a collateral mode
// doesn't error, just returns unknown if the string is not recognised
func StringToMode(m string) (Mode, error) {
switch strings.ToLower(m) {
case singleCollateralStr:
return SingleMode, nil
case multiCollateralStr:
return MultiMode, nil
case portfolioCollateralStr:
return PortfolioMode, nil
case "":
return UnsetMode, nil
}
return UnknownMode, fmt.Errorf("%w %v", ErrInvalidCollateralMode, m)
}