From f63d2044618f87af52714c4b7040a67646b2321a Mon Sep 17 00:00:00 2001 From: nntaoli <2767415655@qq.com> Date: Mon, 29 Jun 2020 18:15:01 +0800 Subject: [PATCH 01/13] delete gateio exchange --- gateio/gateio.go | 112 ------------------------------------------ gateio/gateio_test.go | 23 --------- 2 files changed, 135 deletions(-) delete mode 100644 gateio/gateio.go delete mode 100644 gateio/gateio_test.go diff --git a/gateio/gateio.go b/gateio/gateio.go deleted file mode 100644 index a5aed745..00000000 --- a/gateio/gateio.go +++ /dev/null @@ -1,112 +0,0 @@ -package gateio - -import ( - "fmt" - . "github.com/nntaoli-project/goex" - "net/http" - "sort" - "strings" -) - -var ( - marketBaseUrl = "http://data.gate.io/api2/1" -) - -type Gate struct { - client *http.Client - accesskey, - secretkey string -} - -func New(client *http.Client, accesskey, secretkey string) *Gate { - return &Gate{client: client, accesskey: accesskey, secretkey: secretkey} -} - -func (g *Gate) LimitBuy(amount, price string, currency CurrencyPair) (*Order, error) { - panic("not implement") -} -func (g *Gate) LimitSell(amount, price string, currency CurrencyPair) (*Order, error) { - panic("not implement") -} -func (g *Gate) MarketBuy(amount, price string, currency CurrencyPair) (*Order, error) { - panic("not implement") -} -func (g *Gate) MarketSell(amount, price string, currency CurrencyPair) (*Order, error) { - panic("not implement") -} -func (g *Gate) CancelOrder(orderId string, currency CurrencyPair) (bool, error) { - panic("not implement") -} -func (g *Gate) GetOneOrder(orderId string, currency CurrencyPair) (*Order, error) { - panic("not implement") -} -func (g *Gate) GetUnfinishOrders(currency CurrencyPair) ([]Order, error) { - panic("not implement") -} -func (g *Gate) GetOrderHistorys(currency CurrencyPair, currentPage, pageSize int) ([]Order, error) { - panic("not implement") -} -func (g *Gate) GetAccount() (*Account, error) { - panic("not implement") -} - -func (g *Gate) GetTicker(currency CurrencyPair) (*Ticker, error) { - uri := fmt.Sprintf("%s/ticker/%s", marketBaseUrl, strings.ToLower(currency.ToSymbol("_"))) - - resp, err := HttpGet(g.client, uri) - if err != nil { - errCode := HTTP_ERR_CODE - errCode.OriginErrMsg = err.Error() - return nil, errCode - } - - return &Ticker{ - Last: ToFloat64(resp["last"]), - Sell: ToFloat64(resp["lowestAsk"]), - Buy: ToFloat64(resp["highestBid"]), - High: ToFloat64(resp["high24hr"]), - Low: ToFloat64(resp["low24hr"]), - Vol: ToFloat64(resp["quoteVolume"]), - }, nil -} - -func (g *Gate) GetDepth(size int, currency CurrencyPair) (*Depth, error) { - resp, err := HttpGet(g.client, fmt.Sprintf("%s/orderBook/%s", marketBaseUrl, currency.ToSymbol("_"))) - if err != nil { - errCode := HTTP_ERR_CODE - errCode.OriginErrMsg = err.Error() - return nil, errCode - } - - bids, _ := resp["bids"].([]interface{}) - asks, _ := resp["asks"].([]interface{}) - - dep := new(Depth) - - for _, v := range bids { - r := v.([]interface{}) - dep.BidList = append(dep.BidList, DepthRecord{ToFloat64(r[0]), ToFloat64(r[1])}) - } - - for _, v := range asks { - r := v.([]interface{}) - dep.AskList = append(dep.AskList, DepthRecord{ToFloat64(r[0]), ToFloat64(r[1])}) - } - - sort.Sort(sort.Reverse(dep.AskList)) - - return dep, nil -} - -func (g *Gate) GetKlineRecords(currency CurrencyPair, period, size, since int) ([]Kline, error) { - panic("not implement") -} - -//非个人,整个交易所的交易记录 -func (g *Gate) GetTrades(currencyPair CurrencyPair, since int64) ([]Trade, error) { - panic("not implement") -} - -func (g *Gate) GetExchangeName() string { - return GATEIO -} diff --git a/gateio/gateio_test.go b/gateio/gateio_test.go deleted file mode 100644 index bb5dc689..00000000 --- a/gateio/gateio_test.go +++ /dev/null @@ -1,23 +0,0 @@ -package gateio - -import ( - "github.com/nntaoli-project/goex" - "net/http" - "testing" -) - -var gate = New(http.DefaultClient, "", "") - -func TestGate_GetTicker(t *testing.T) { - ticker, err := gate.GetTicker(goex.BTC_USDT) - t.Log("err=>", err) - t.Log("ticker=>", ticker) -} - -func TestGate_GetDepth(t *testing.T) { - dep, err := gate.GetDepth(1, goex.BTC_USDT) - - t.Log("err=>", err) - t.Log("asks=>", dep.AskList) - t.Log("bids=>", dep.BidList) -} From 28078dee841c969f642977a800569b7c7f7256c9 Mon Sep 17 00:00:00 2001 From: nntaoli <2767415655@qq.com> Date: Tue, 30 Jun 2020 16:36:39 +0800 Subject: [PATCH 02/13] [spot api] LimitSell And LimitBuy method add the LimitOrderOptionalParameter , Support post_only,ioc,for and so on some special order --- API.go | 6 +++--- Const.go | 21 +++++++++++++++++++++ allcoin/allcoin.go | 4 ++-- atop/atop.go | 4 ++-- bigone/Bigone.go | 4 ++-- binance/Binance.go | 4 ++-- bitfinex/bitfinex.go | 4 ++-- bithumb/bithumb.go | 4 ++-- bitstamp/Bitstamp.go | 4 ++-- bittrex/bittrex.go | 6 +++--- builder/APIBuilder.go | 3 --- coinbig/coinbig.go | 4 ++-- coinex/coinex.go | 4 ++-- exx/exx.go | 4 ++-- gdax/gdax.go | 4 ++-- hitbtc/Hitbtc.go | 4 ++-- huobi/HuobiPro.go | 34 ++++++++++++++++++++++++++++++---- kraken/Kraken.go | 4 ++-- kucoin/kucoin.go | 4 ++-- okex/OKEx.go | 8 ++++---- okex/OKExSpot.go | 16 ++++++++++++---- poloniex/Poloniex.go | 4 ++-- zb/Zb.go | 6 +++--- 23 files changed, 106 insertions(+), 54 deletions(-) diff --git a/API.go b/API.go index 1e41f6d6..80009eba 100644 --- a/API.go +++ b/API.go @@ -3,8 +3,8 @@ package goex // api interface type API interface { - LimitBuy(amount, price string, currency CurrencyPair) (*Order, error) - LimitSell(amount, price string, currency CurrencyPair) (*Order, error) + LimitBuy(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) + LimitSell(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) MarketBuy(amount, price string, currency CurrencyPair) (*Order, error) MarketSell(amount, price string, currency CurrencyPair) (*Order, error) CancelOrder(orderId string, currency CurrencyPair) (bool, error) @@ -15,7 +15,7 @@ type API interface { GetTicker(currency CurrencyPair) (*Ticker, error) GetDepth(size int, currency CurrencyPair) (*Depth, error) - GetKlineRecords(currency CurrencyPair, period , size, since int) ([]Kline, error) + GetKlineRecords(currency CurrencyPair, period, size, since int) ([]Kline, error) //非个人,整个交易所的交易记录 GetTrades(currencyPair CurrencyPair, since int64) ([]Trade, error) diff --git a/Const.go b/Const.go index 9d197b2a..1d137d4e 100644 --- a/Const.go +++ b/Const.go @@ -168,3 +168,24 @@ const ( TIPS //余币宝 SWAP //永续合约 ) + +type LimitOrderOptionalParameter int + +func (opt LimitOrderOptionalParameter) String() string { + switch opt { + case PostOnly: + return "post_only" + case Fok: + return "fok" + case Ioc: + return "ioc" + default: + return "error-order-optional-parameter" + } +} + +const ( + PostOnly LimitOrderOptionalParameter = iota + 1 + Ioc + Fok +) \ No newline at end of file diff --git a/allcoin/allcoin.go b/allcoin/allcoin.go index 759640c0..b6440a7a 100755 --- a/allcoin/allcoin.go +++ b/allcoin/allcoin.go @@ -271,11 +271,11 @@ func (ac *Allcoin) GetAccount() (*Account, error) { return &acc, nil } -func (ac *Allcoin) LimitBuy(amount, price string, currencyPair CurrencyPair) (*Order, error) { +func (ac *Allcoin) LimitBuy(amount, price string, currencyPair CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return ac.placeOrder(amount, price, currencyPair, "LIMIT", "buy") } -func (ac *Allcoin) LimitSell(amount, price string, currencyPair CurrencyPair) (*Order, error) { +func (ac *Allcoin) LimitSell(amount, price string, currencyPair CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return ac.placeOrder(amount, price, currencyPair, "LIMIT", "sale") } diff --git a/atop/atop.go b/atop/atop.go index 00331e86..2c6c0c38 100644 --- a/atop/atop.go +++ b/atop/atop.go @@ -306,12 +306,12 @@ func (at *Atop) GetAccount() (*Account, error) { } //hao -func (at *Atop) LimitBuy(amount, price string, currencyPair CurrencyPair) (*Order, error) { +func (at *Atop) LimitBuy(amount, price string, currencyPair CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return at.plateOrder(amount, price, currencyPair, "limit", "buy") } //hao -func (at *Atop) LimitSell(amount, price string, currencyPair CurrencyPair) (*Order, error) { +func (at *Atop) LimitSell(amount, price string, currencyPair CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return at.plateOrder(amount, price, currencyPair, "limit", "sale") } diff --git a/bigone/Bigone.go b/bigone/Bigone.go index d84412ee..e0ca9920 100644 --- a/bigone/Bigone.go +++ b/bigone/Bigone.go @@ -167,11 +167,11 @@ func (bo *Bigone) placeOrder(amount, price string, pair goex.CurrencyPair, order OrderTime: int(time.Now().Unix())}, nil } -func (bo *Bigone) LimitBuy(amount, price string, currency goex.CurrencyPair) (*goex.Order, error) { +func (bo *Bigone) LimitBuy(amount, price string, currency goex.CurrencyPair, opt ...goex.LimitOrderOptionalParameter) (*goex.Order, error) { return bo.placeOrder(amount, price, currency, "LIMIT", "BID") } -func (bo *Bigone) LimitSell(amount, price string, currency goex.CurrencyPair) (*goex.Order, error) { +func (bo *Bigone) LimitSell(amount, price string, currency goex.CurrencyPair, opt ...goex.LimitOrderOptionalParameter) (*goex.Order, error) { return bo.placeOrder(amount, price, currency, "LIMIT", "ASK") } diff --git a/binance/Binance.go b/binance/Binance.go index a8171dd3..a7463126 100644 --- a/binance/Binance.go +++ b/binance/Binance.go @@ -398,11 +398,11 @@ func (bn *Binance) GetAccount() (*Account, error) { return &acc, nil } -func (bn *Binance) LimitBuy(amount, price string, currencyPair CurrencyPair) (*Order, error) { +func (bn *Binance) LimitBuy(amount, price string, currencyPair CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return bn.placeOrder(amount, price, currencyPair, "LIMIT", "BUY") } -func (bn *Binance) LimitSell(amount, price string, currencyPair CurrencyPair) (*Order, error) { +func (bn *Binance) LimitSell(amount, price string, currencyPair CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return bn.placeOrder(amount, price, currencyPair, "LIMIT", "SELL") } diff --git a/bitfinex/bitfinex.go b/bitfinex/bitfinex.go index 74338b31..ce2025e5 100644 --- a/bitfinex/bitfinex.go +++ b/bitfinex/bitfinex.go @@ -220,11 +220,11 @@ func (bfx *Bitfinex) placeOrder(orderType, side, amount, price string, pair Curr return order, nil } -func (bfx *Bitfinex) LimitBuy(amount, price string, currencyPair CurrencyPair) (*Order, error) { +func (bfx *Bitfinex) LimitBuy(amount, price string, currencyPair CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return bfx.placeOrder("exchange limit", "buy", amount, price, currencyPair) } -func (bfx *Bitfinex) LimitSell(amount, price string, currencyPair CurrencyPair) (*Order, error) { +func (bfx *Bitfinex) LimitSell(amount, price string, currencyPair CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return bfx.placeOrder("exchange limit", "sell", amount, price, currencyPair) } diff --git a/bithumb/bithumb.go b/bithumb/bithumb.go index 52b73eba..1b6f85c2 100644 --- a/bithumb/bithumb.go +++ b/bithumb/bithumb.go @@ -59,11 +59,11 @@ func (bit *Bithumb) placeOrder(side, amount, price string, pair CurrencyPair) (* Status: ORDER_UNFINISH}, nil } -func (bit *Bithumb) LimitBuy(amount, price string, currency CurrencyPair) (*Order, error) { +func (bit *Bithumb) LimitBuy(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return bit.placeOrder("bid", amount, price, currency) } -func (bit *Bithumb) LimitSell(amount, price string, currency CurrencyPair) (*Order, error) { +func (bit *Bithumb) LimitSell(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return bit.placeOrder("ask", amount, price, currency) } diff --git a/bitstamp/Bitstamp.go b/bitstamp/Bitstamp.go index 115013f6..e2690ea0 100644 --- a/bitstamp/Bitstamp.go +++ b/bitstamp/Bitstamp.go @@ -159,11 +159,11 @@ func (bitstamp *Bitstamp) placeMarketOrder(side string, pair CurrencyPair, amoun return bitstamp.placeOrder(side, pair, amount, "", urlStr) } -func (bitstamp *Bitstamp) LimitBuy(amount, price string, currency CurrencyPair) (*Order, error) { +func (bitstamp *Bitstamp) LimitBuy(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return bitstamp.placeLimitOrder("buy", currency, amount, price) } -func (bitstamp *Bitstamp) LimitSell(amount, price string, currency CurrencyPair) (*Order, error) { +func (bitstamp *Bitstamp) LimitSell(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return bitstamp.placeLimitOrder("sell", currency, amount, price) } diff --git a/bittrex/bittrex.go b/bittrex/bittrex.go index 525422f6..71f51cf1 100644 --- a/bittrex/bittrex.go +++ b/bittrex/bittrex.go @@ -1,11 +1,11 @@ package bittrex import ( + "errors" "fmt" . "github.com/nntaoli-project/goex" "net/http" "sort" - "errors" ) type Bittrex struct { @@ -19,10 +19,10 @@ func New(client *http.Client, accesskey, secretkey string) *Bittrex { return &Bittrex{client: client, accesskey: accesskey, secretkey: secretkey, baseUrl: "https://bittrex.com/api/v1.1"} } -func (bx *Bittrex) LimitBuy(amount, price string, currency CurrencyPair) (*Order, error) { +func (bx *Bittrex) LimitBuy(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { panic("not implement") } -func (bx *Bittrex) LimitSell(amount, price string, currency CurrencyPair) (*Order, error) { +func (bx *Bittrex) LimitSell(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { panic("not implement") } func (bx *Bittrex) MarketBuy(amount, price string, currency CurrencyPair) (*Order, error) { diff --git a/builder/APIBuilder.go b/builder/APIBuilder.go index 637c9004..ed304c83 100644 --- a/builder/APIBuilder.go +++ b/builder/APIBuilder.go @@ -24,7 +24,6 @@ import ( "time" "github.com/nntaoli-project/goex/coinex" - "github.com/nntaoli-project/goex/gateio" "github.com/nntaoli-project/goex/gdax" "github.com/nntaoli-project/goex/hitbtc" "github.com/nntaoli-project/goex/huobi" @@ -233,8 +232,6 @@ func (builder *APIBuilder) Build(exName string) (api API) { _api = bithumb.New(builder.client, builder.apiKey, builder.secretkey) case GDAX: _api = gdax.New(builder.client, builder.apiKey, builder.secretkey) - case GATEIO: - _api = gateio.New(builder.client, builder.apiKey, builder.secretkey) case ZB: _api = zb.New(builder.client, builder.apiKey, builder.secretkey) case COINEX: diff --git a/coinbig/coinbig.go b/coinbig/coinbig.go index 8a3b6256..9feabc71 100644 --- a/coinbig/coinbig.go +++ b/coinbig/coinbig.go @@ -166,11 +166,11 @@ func (cb *CoinBig) placeOrder(amount, price string, pair CurrencyPair, orderType OrderTime: int(time.Now().Unix())}, nil } -func (cb *CoinBig) LimitBuy(amount, price string, currencyPair CurrencyPair) (*Order, error) { +func (cb *CoinBig) LimitBuy(amount, price string, currencyPair CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return cb.placeOrder(amount, price, currencyPair, "limit", "buy") } -func (cb *CoinBig) LimitSell(amount, price string, currencyPair CurrencyPair) (*Order, error) { +func (cb *CoinBig) LimitSell(amount, price string, currencyPair CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return cb.placeOrder(amount, price, currencyPair, "limit", "sell") } diff --git a/coinex/coinex.go b/coinex/coinex.go index 9dfdeedb..499b59ad 100644 --- a/coinex/coinex.go +++ b/coinex/coinex.go @@ -103,11 +103,11 @@ func (coinex *CoinEx) placeLimitOrder(side, amount, price string, pair CurrencyP return &order, nil } -func (coinex *CoinEx) LimitBuy(amount, price string, currency CurrencyPair) (*Order, error) { +func (coinex *CoinEx) LimitBuy(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return coinex.placeLimitOrder("buy", amount, price, currency) } -func (coinex *CoinEx) LimitSell(amount, price string, currency CurrencyPair) (*Order, error) { +func (coinex *CoinEx) LimitSell(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return coinex.placeLimitOrder("sell", amount, price, currency) } diff --git a/exx/exx.go b/exx/exx.go index 20ece63e..643c0c48 100644 --- a/exx/exx.go +++ b/exx/exx.go @@ -227,11 +227,11 @@ func (exx *Exx) placeOrder(amount, price string, currency CurrencyPair, tradeTyp return order, nil } -func (exx *Exx) LimitBuy(amount, price string, currency CurrencyPair) (*Order, error) { +func (exx *Exx) LimitBuy(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return exx.placeOrder(amount, price, currency, 1) } -func (exx *Exx) LimitSell(amount, price string, currency CurrencyPair) (*Order, error) { +func (exx *Exx) LimitSell(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return exx.placeOrder(amount, price, currency, 0) } diff --git a/gdax/gdax.go b/gdax/gdax.go index 91b93f78..462242f9 100644 --- a/gdax/gdax.go +++ b/gdax/gdax.go @@ -24,10 +24,10 @@ func New(client *http.Client, accesskey, secretkey string) *Gdax { return &Gdax{client, "https://api.gdax.com", accesskey, secretkey} } -func (g *Gdax) LimitBuy(amount, price string, currency CurrencyPair) (*Order, error) { +func (g *Gdax) LimitBuy(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { panic("not implement") } -func (g *Gdax) LimitSell(amount, price string, currency CurrencyPair) (*Order, error) { +func (g *Gdax) LimitSell(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { panic("not implement") } func (g *Gdax) MarketBuy(amount, price string, currency CurrencyPair) (*Order, error) { diff --git a/hitbtc/Hitbtc.go b/hitbtc/Hitbtc.go index 36cb9ef1..ff731b88 100644 --- a/hitbtc/Hitbtc.go +++ b/hitbtc/Hitbtc.go @@ -214,11 +214,11 @@ func (hitbtc *Hitbtc) placeOrder(ty goex.TradeSide, amount, price string, curren return hitbtc.toOrder(resp), nil } -func (hitbtc *Hitbtc) LimitBuy(amount, price string, currency goex.CurrencyPair) (*goex.Order, error) { +func (hitbtc *Hitbtc) LimitBuy(amount, price string, currency goex.CurrencyPair, opt ...goex.LimitOrderOptionalParameter) (*goex.Order, error) { return hitbtc.placeOrder(goex.BUY, amount, price, currency) } -func (hitbtc *Hitbtc) LimitSell(amount, price string, currency goex.CurrencyPair) (*goex.Order, error) { +func (hitbtc *Hitbtc) LimitSell(amount, price string, currency goex.CurrencyPair, opt ...goex.LimitOrderOptionalParameter) (*goex.Order, error) { return hitbtc.placeOrder(goex.SELL, amount, price, currency) } diff --git a/huobi/HuobiPro.go b/huobi/HuobiPro.go index 2f2a49eb..484d3de0 100644 --- a/huobi/HuobiPro.go +++ b/huobi/HuobiPro.go @@ -264,8 +264,21 @@ func (hbpro *HuoBiPro) placeOrder(amount, price string, pair CurrencyPair, order return respmap["data"].(string), nil } -func (hbpro *HuoBiPro) LimitBuy(amount, price string, currency CurrencyPair) (*Order, error) { - orderId, err := hbpro.placeOrder(amount, price, currency, "buy-limit") +func (hbpro *HuoBiPro) LimitBuy(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { + orderTy := "buy-limit" + if len(opt) > 0 { + switch opt[0] { + case PostOnly: + orderTy = "buy-limit-maker" + case Ioc: + orderTy = "buy-ioc" + case Fok: + orderTy = "buy-limit-fok" + default: + Log.Error("limit order optional parameter error ,opt= ", opt[0]) + } + } + orderId, err := hbpro.placeOrder(amount, price, currency, orderTy) if err != nil { return nil, err } @@ -278,8 +291,21 @@ func (hbpro *HuoBiPro) LimitBuy(amount, price string, currency CurrencyPair) (*O Side: BUY}, nil } -func (hbpro *HuoBiPro) LimitSell(amount, price string, currency CurrencyPair) (*Order, error) { - orderId, err := hbpro.placeOrder(amount, price, currency, "sell-limit") +func (hbpro *HuoBiPro) LimitSell(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { + orderTy := "sell-limit" + if len(opt) > 0 { + switch opt[0] { + case PostOnly: + orderTy = "sell-limit-maker" + case Ioc: + orderTy = "sell-ioc" + case Fok: + orderTy = "sell-limit-fok" + default: + Log.Error("limit order optional parameter error ,opt= ", opt[0]) + } + } + orderId, err := hbpro.placeOrder(amount, price, currency, orderTy) if err != nil { return nil, err } diff --git a/kraken/Kraken.go b/kraken/Kraken.go index 9acea9c9..34ed1b05 100644 --- a/kraken/Kraken.go +++ b/kraken/Kraken.go @@ -75,11 +75,11 @@ func (k *Kraken) placeOrder(orderType, side, amount, price string, pair Currency Status: ORDER_UNFINISH}, nil } -func (k *Kraken) LimitBuy(amount, price string, currency CurrencyPair) (*Order, error) { +func (k *Kraken) LimitBuy(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return k.placeOrder("limit", "buy", amount, price, currency) } -func (k *Kraken) LimitSell(amount, price string, currency CurrencyPair) (*Order, error) { +func (k *Kraken) LimitSell(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return k.placeOrder("limit", "sell", amount, price, currency) } diff --git a/kucoin/kucoin.go b/kucoin/kucoin.go index 72e7aa36..e9c726fd 100644 --- a/kucoin/kucoin.go +++ b/kucoin/kucoin.go @@ -91,7 +91,7 @@ func (kc *KuCoin) GetTicker(currency CurrencyPair) (*Ticker, error) { return &ticker, nil } -func (kc *KuCoin) LimitBuy(amount, price string, currency CurrencyPair) (*Order, error) { +func (kc *KuCoin) LimitBuy(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { clientID := GenerateOrderClientId(32) in := kucoin.CreateOrderModel{ ClientOid: clientID, @@ -121,7 +121,7 @@ func (kc *KuCoin) LimitBuy(amount, price string, currency CurrencyPair) (*Order, return &order, nil } -func (kc *KuCoin) LimitSell(amount, price string, currency CurrencyPair) (*Order, error) { +func (kc *KuCoin) LimitSell(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { clientID := GenerateOrderClientId(32) in := kucoin.CreateOrderModel{ ClientOid: clientID, diff --git a/okex/OKEx.go b/okex/OKEx.go index 1cd8cadb..fd202caa 100644 --- a/okex/OKEx.go +++ b/okex/OKEx.go @@ -129,12 +129,12 @@ func (ok *OKEx) IsoTime() string { return iso } -func (ok *OKEx) LimitBuy(amount, price string, currency CurrencyPair) (*Order, error) { - return ok.OKExSpot.LimitBuy(amount, price, currency) +func (ok *OKEx) LimitBuy(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { + return ok.OKExSpot.LimitBuy(amount, price, currency, opt...) } -func (ok *OKEx) LimitSell(amount, price string, currency CurrencyPair) (*Order, error) { - return ok.OKExSpot.LimitSell(amount, price, currency) +func (ok *OKEx) LimitSell(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { + return ok.OKExSpot.LimitSell(amount, price, currency, opt...) } func (ok *OKEx) MarketBuy(amount, price string, currency CurrencyPair) (*Order, error) { diff --git a/okex/OKExSpot.go b/okex/OKExSpot.go index 2f111bb3..adc9407e 100644 --- a/okex/OKExSpot.go +++ b/okex/OKExSpot.go @@ -162,8 +162,12 @@ func (ok *OKExSpot) PlaceOrder(ty string, ord *Order) (*Order, error) { return ord, nil } -func (ok *OKExSpot) LimitBuy(amount, price string, currency CurrencyPair) (*Order, error) { - return ok.PlaceOrder("limit", &Order{ +func (ok *OKExSpot) LimitBuy(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { + ty := "limit" + if len(opt) > 0 { + ty = opt[0].String() + } + return ok.PlaceOrder(ty, &Order{ Price: ToFloat64(price), Amount: ToFloat64(amount), Currency: currency, @@ -171,8 +175,12 @@ func (ok *OKExSpot) LimitBuy(amount, price string, currency CurrencyPair) (*Orde }) } -func (ok *OKExSpot) LimitSell(amount, price string, currency CurrencyPair) (*Order, error) { - return ok.PlaceOrder("limit", &Order{ +func (ok *OKExSpot) LimitSell(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { + ty := "limit" + if len(opt) > 0 { + ty = opt[0].String() + } + return ok.PlaceOrder(ty, &Order{ Price: ToFloat64(price), Amount: ToFloat64(amount), Currency: currency, diff --git a/poloniex/Poloniex.go b/poloniex/Poloniex.go index 441d3755..a2b7200f 100644 --- a/poloniex/Poloniex.go +++ b/poloniex/Poloniex.go @@ -166,11 +166,11 @@ func (poloniex *Poloniex) placeLimitOrder(command, amount, price string, currenc return order, nil } -func (poloniex *Poloniex) LimitBuy(amount, price string, currency CurrencyPair) (*Order, error) { +func (poloniex *Poloniex) LimitBuy(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return poloniex.placeLimitOrder("buy", amount, price, currency) } -func (poloniex *Poloniex) LimitSell(amount, price string, currency CurrencyPair) (*Order, error) { +func (poloniex *Poloniex) LimitSell(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return poloniex.placeLimitOrder("sell", amount, price, currency) } diff --git a/zb/Zb.go b/zb/Zb.go index cd54f043..55d2da85 100644 --- a/zb/Zb.go +++ b/zb/Zb.go @@ -75,7 +75,7 @@ func (zb *Zb) GetDepth(size int, currency CurrencyPair) (*Depth, error) { asks, isok1 := resp["asks"].([]interface{}) bids, isok2 := resp["bids"].([]interface{}) - + if isok2 != true || isok1 != true { return nil, errors.New("no depth data!") } @@ -220,11 +220,11 @@ func (zb *Zb) placeOrder(amount, price string, currency CurrencyPair, tradeType return order, nil } -func (zb *Zb) LimitBuy(amount, price string, currency CurrencyPair) (*Order, error) { +func (zb *Zb) LimitBuy(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return zb.placeOrder(amount, price, currency, 1) } -func (zb *Zb) LimitSell(amount, price string, currency CurrencyPair) (*Order, error) { +func (zb *Zb) LimitSell(amount, price string, currency CurrencyPair, opt ...LimitOrderOptionalParameter) (*Order, error) { return zb.placeOrder(amount, price, currency, 0) } From bace9eaf87c4e53309104a87376cd37bf54b6dfb Mon Sep 17 00:00:00 2001 From: nntaoli <2767415655@qq.com> Date: Thu, 2 Jul 2020 15:51:43 +0800 Subject: [PATCH 03/13] [futures] add the MarketFuturesOrder method --- FutureRestAPI.go | 3 +++ binance/BinanceSwap.go | 12 ++++++++---- bitmex/bitmex.go | 4 ++++ coinbene/CoinbeneSwap.go | 7 +++++++ huobi/Hbdm.go | 11 +++++++++-- okex/OKExFuture.go | 9 +++++++++ okex/OKExSwap.go | 4 ++++ 7 files changed, 44 insertions(+), 6 deletions(-) diff --git a/FutureRestAPI.go b/FutureRestAPI.go index a80e538b..d604da5a 100644 --- a/FutureRestAPI.go +++ b/FutureRestAPI.go @@ -53,6 +53,9 @@ type FutureRestAPI interface { LimitFuturesOrder(currencyPair CurrencyPair, contractType, price, amount string, openType int) (*FutureOrder, error) + //对手价下单 + MarketFuturesOrder(currencyPair CurrencyPair, contractType, amount string, openType int)(*FutureOrder, error) + /** * 取消订单 * @param symbol btc_usd:比特币 ltc_usd :莱特币 diff --git a/binance/BinanceSwap.go b/binance/BinanceSwap.go index 00014735..bb5d53fb 100644 --- a/binance/BinanceSwap.go +++ b/binance/BinanceSwap.go @@ -19,10 +19,6 @@ type BinanceSwap struct { Binance } -func (bs *BinanceSwap) LimitFuturesOrder(currencyPair CurrencyPair, contractType, price, amount string, openType int) (*FutureOrder, error) { - return bs.PlaceFutureOrder2(currencyPair, contractType, price, amount, openType, 0, 10) -} - func NewBinanceSwap(config *APIConfig) *BinanceSwap { if config.Endpoint == "" { config.Endpoint = baseUrl @@ -362,6 +358,14 @@ func (bs *BinanceSwap) PlaceFutureOrder2(currencyPair CurrencyPair, contractType return fOrder, nil } +func (bs *BinanceSwap) LimitFuturesOrder(currencyPair CurrencyPair, contractType, price, amount string, openType int) (*FutureOrder, error) { + return bs.PlaceFutureOrder2(currencyPair, contractType, price, amount, openType, 0, 10) +} + +func (bs *BinanceSwap) MarketFuturesOrder(currencyPair CurrencyPair, contractType, amount string, openType int) (*FutureOrder, error) { + return bs.PlaceFutureOrder2(currencyPair, contractType, "0", amount, openType, 1, 10) +} + /** * 取消订单 * @param symbol btc_usd:比特币 ltc_usd :莱特币 diff --git a/bitmex/bitmex.go b/bitmex/bitmex.go index a10e80bb..ef73a47a 100644 --- a/bitmex/bitmex.go +++ b/bitmex/bitmex.go @@ -180,6 +180,10 @@ func (bm *bitmex) LimitFuturesOrder(currencyPair CurrencyPair, contractType, pri return bm.PlaceFutureOrder2(currencyPair, contractType, price, amount, openType, 0, 10) } +func (bm *bitmex) MarketFuturesOrder(currencyPair CurrencyPair, contractType, amount string, openType int) (*FutureOrder, error) { + return bm.PlaceFutureOrder2(currencyPair, contractType, "0", amount, openType, 1, 10) +} + func (bm *bitmex) FutureCancelOrder(currencyPair CurrencyPair, contractType, orderId string) (bool, error) { var param struct { OrderID string `json:"orderID,omitempty"` diff --git a/coinbene/CoinbeneSwap.go b/coinbene/CoinbeneSwap.go index 421582a2..24f304b7 100644 --- a/coinbene/CoinbeneSwap.go +++ b/coinbene/CoinbeneSwap.go @@ -42,6 +42,9 @@ func NewCoinbeneSwap(config APIConfig) *CoinbeneSwap { if config.Endpoint == "" { config.Endpoint = "http://openapi-contract.coinbene.com" } + if config.Lever <= 0 { + config.Lever = 10 + } if strings.HasSuffix(config.Endpoint, "/") { config.Endpoint = config.Endpoint[0 : len(config.Endpoint)-1] } @@ -204,6 +207,10 @@ func (swap *CoinbeneSwap) LimitFuturesOrder(currencyPair CurrencyPair, contractT }, err } +func (swap *CoinbeneSwap) MarketFuturesOrder(currencyPair CurrencyPair, contractType, amount string, openType int) (*FutureOrder, error) { + panic("not support the market order") +} + func (swap *CoinbeneSwap) FutureCancelOrder(currencyPair CurrencyPair, contractType, orderId string) (bool, error) { var param struct { OrderId string `json:"orderId"` diff --git a/huobi/Hbdm.go b/huobi/Hbdm.go index 31485d60..c7618df8 100644 --- a/huobi/Hbdm.go +++ b/huobi/Hbdm.go @@ -121,6 +121,9 @@ func NewHbdm(conf *APIConfig) *Hbdm { if conf.Endpoint == "" { conf.Endpoint = defaultBaseUrl } + if conf.Lever <= 0 { + conf.Lever = 10 + } hbdmInit() return &Hbdm{conf} } @@ -201,7 +204,7 @@ func (dm *Hbdm) GetFuturePosition(currencyPair CurrencyPair, contractType string if d.ContractType != contractType { continue } - + switch d.Direction { case "buy": positions = append(positions, FuturePosition{ @@ -284,7 +287,11 @@ func (dm *Hbdm) PlaceFutureOrder2(currencyPair CurrencyPair, contractType, price } func (dm *Hbdm) LimitFuturesOrder(currencyPair CurrencyPair, contractType, price, amount string, openType int) (*FutureOrder, error) { - return dm.PlaceFutureOrder2(currencyPair, contractType, price, amount, openType, 0, 10) + return dm.PlaceFutureOrder2(currencyPair, contractType, price, amount, openType, 0, dm.config.Lever) +} + +func (dm *Hbdm) MarketFuturesOrder(currencyPair CurrencyPair, contractType, amount string, openType int) (*FutureOrder, error) { + return dm.PlaceFutureOrder2(currencyPair, contractType, "0", amount, openType, 1, dm.config.Lever) } func (dm *Hbdm) FutureCancelOrder(currencyPair CurrencyPair, contractType, orderId string) (bool, error) { diff --git a/okex/OKExFuture.go b/okex/OKExFuture.go index 6a02e1c1..e55bf204 100644 --- a/okex/OKExFuture.go +++ b/okex/OKExFuture.go @@ -420,6 +420,15 @@ func (ok *OKExFuture) LimitFuturesOrder(currencyPair CurrencyPair, contractType, }) } +func (ok *OKExFuture) MarketFuturesOrder(currencyPair CurrencyPair, contractType, amount string, openType int) (*FutureOrder, error) { + return ok.PlaceFutureOrder2(1, &FutureOrder{ + Currency: currencyPair, + Amount: ToFloat64(amount), + OType: openType, + ContractName: contractType, + }) +} + func (ok *OKExFuture) FutureCancelOrder(currencyPair CurrencyPair, contractType, orderId string) (bool, error) { urlPath := fmt.Sprintf("/api/futures/v3/cancel_order/%s/%s", ok.GetFutureContractId(currencyPair, contractType), orderId) var response struct { diff --git a/okex/OKExSwap.go b/okex/OKExSwap.go index 0f8e9b18..8164028d 100644 --- a/okex/OKExSwap.go +++ b/okex/OKExSwap.go @@ -327,6 +327,10 @@ func (ok *OKExSwap) LimitFuturesOrder(currencyPair CurrencyPair, contractType, p return ok.PlaceFutureOrder2(currencyPair, contractType, price, amount, openType, 0, 10) } +func (ok *OKExSwap) MarketFuturesOrder(currencyPair CurrencyPair, contractType, amount string, openType int) (*FutureOrder, error) { + return ok.PlaceFutureOrder2(currencyPair, contractType, "0", amount, openType, 1, 10) +} + func (ok *OKExSwap) FutureCancelOrder(currencyPair CurrencyPair, contractType, orderId string) (bool, error) { var cancelParam struct { OrderId string `json:"order_id"` From 9500ba5a8b32efbc58f2f7c15ca1df9140c828f4 Mon Sep 17 00:00:00 2001 From: nntaoli <2767415655@qq.com> Date: Thu, 2 Jul 2020 16:17:12 +0800 Subject: [PATCH 04/13] [futures] LimitFuturesOrder method add the LimitOrderOptionalParameter --- FutureRestAPI.go | 4 ++-- binance/BinanceSwap.go | 2 +- bitmex/bitmex.go | 2 +- coinbene/CoinbeneSwap.go | 2 +- huobi/Hbdm.go | 17 ++++++++++++++--- okex/OKExFuture.go | 19 ++++++++++++++++--- okex/OKExSwap.go | 28 +++++++++++++++++++++------- 7 files changed, 56 insertions(+), 18 deletions(-) diff --git a/FutureRestAPI.go b/FutureRestAPI.go index d604da5a..c0680d50 100644 --- a/FutureRestAPI.go +++ b/FutureRestAPI.go @@ -51,10 +51,10 @@ type FutureRestAPI interface { */ PlaceFutureOrder(currencyPair CurrencyPair, contractType, price, amount string, openType, matchPrice, leverRate int) (string, error) - LimitFuturesOrder(currencyPair CurrencyPair, contractType, price, amount string, openType int) (*FutureOrder, error) + LimitFuturesOrder(currencyPair CurrencyPair, contractType, price, amount string, openType int, opt ...LimitOrderOptionalParameter) (*FutureOrder, error) //对手价下单 - MarketFuturesOrder(currencyPair CurrencyPair, contractType, amount string, openType int)(*FutureOrder, error) + MarketFuturesOrder(currencyPair CurrencyPair, contractType, amount string, openType int) (*FutureOrder, error) /** * 取消订单 diff --git a/binance/BinanceSwap.go b/binance/BinanceSwap.go index bb5d53fb..125641a9 100644 --- a/binance/BinanceSwap.go +++ b/binance/BinanceSwap.go @@ -358,7 +358,7 @@ func (bs *BinanceSwap) PlaceFutureOrder2(currencyPair CurrencyPair, contractType return fOrder, nil } -func (bs *BinanceSwap) LimitFuturesOrder(currencyPair CurrencyPair, contractType, price, amount string, openType int) (*FutureOrder, error) { +func (bs *BinanceSwap) LimitFuturesOrder(currencyPair CurrencyPair, contractType, price, amount string, openType int, opt ...LimitOrderOptionalParameter) (*FutureOrder, error) { return bs.PlaceFutureOrder2(currencyPair, contractType, price, amount, openType, 0, 10) } diff --git a/bitmex/bitmex.go b/bitmex/bitmex.go index ef73a47a..a95fe0ac 100644 --- a/bitmex/bitmex.go +++ b/bitmex/bitmex.go @@ -176,7 +176,7 @@ func (bm *bitmex) PlaceFutureOrder2(currencyPair CurrencyPair, contractType, pri return fOrder, nil } -func (bm *bitmex) LimitFuturesOrder(currencyPair CurrencyPair, contractType, price, amount string, openType int) (*FutureOrder, error) { +func (bm *bitmex) LimitFuturesOrder(currencyPair CurrencyPair, contractType, price, amount string, openType int, opt ...LimitOrderOptionalParameter) (*FutureOrder, error) { return bm.PlaceFutureOrder2(currencyPair, contractType, price, amount, openType, 0, 10) } diff --git a/coinbene/CoinbeneSwap.go b/coinbene/CoinbeneSwap.go index 24f304b7..0311cc17 100644 --- a/coinbene/CoinbeneSwap.go +++ b/coinbene/CoinbeneSwap.go @@ -195,7 +195,7 @@ func (swap *CoinbeneSwap) PlaceFutureOrder(currencyPair CurrencyPair, contractTy return data.orderId, nil } -func (swap *CoinbeneSwap) LimitFuturesOrder(currencyPair CurrencyPair, contractType, price, amount string, openType int) (*FutureOrder, error) { +func (swap *CoinbeneSwap) LimitFuturesOrder(currencyPair CurrencyPair, contractType, price, amount string, openType int, opt ...LimitOrderOptionalParameter) (*FutureOrder, error) { orderId, err := swap.PlaceFutureOrder(currencyPair, contractType, price, amount, openType, 0, 10) return &FutureOrder{ Currency: currencyPair, diff --git a/huobi/Hbdm.go b/huobi/Hbdm.go index c7618df8..10629cf5 100644 --- a/huobi/Hbdm.go +++ b/huobi/Hbdm.go @@ -239,7 +239,7 @@ func (dm *Hbdm) PlaceFutureOrder(currencyPair CurrencyPair, contractType, price, return fOrder.OrderID2, err } -func (dm *Hbdm) PlaceFutureOrder2(currencyPair CurrencyPair, contractType, price, amount string, openType, matchPrice, leverRate int) (*FutureOrder, error) { +func (dm *Hbdm) PlaceFutureOrder2(currencyPair CurrencyPair, contractType, price, amount string, openType, matchPrice, leverRate int, opt ...LimitOrderOptionalParameter) (*FutureOrder, error) { var data struct { OrderId int64 `json:"order_id"` COrderId int64 `json:"client_order_id"` @@ -258,7 +258,18 @@ func (dm *Hbdm) PlaceFutureOrder2(currencyPair CurrencyPair, contractType, price if matchPrice == 1 { params.Set("order_price_type", "opponent") //对手价下单 } else { - params.Set("order_price_type", "limit") + orderPriceType := "limit" + if len(opt) > 0 { + switch opt[0] { + case Fok: + orderPriceType = "fok" + case Ioc: + orderPriceType = "ioc" + case PostOnly: + orderPriceType = "post_only" + } + } + params.Set("order_price_type", orderPriceType) params.Add("price", dm.formatPriceSize(contractType, currencyPair.CurrencyA, price)) } @@ -286,7 +297,7 @@ func (dm *Hbdm) PlaceFutureOrder2(currencyPair CurrencyPair, contractType, price return fOrd, err } -func (dm *Hbdm) LimitFuturesOrder(currencyPair CurrencyPair, contractType, price, amount string, openType int) (*FutureOrder, error) { +func (dm *Hbdm) LimitFuturesOrder(currencyPair CurrencyPair, contractType, price, amount string, openType int, opt ...LimitOrderOptionalParameter) (*FutureOrder, error) { return dm.PlaceFutureOrder2(currencyPair, contractType, price, amount, openType, 0, dm.config.Lever) } diff --git a/okex/OKExFuture.go b/okex/OKExFuture.go index e55bf204..b818bdbe 100644 --- a/okex/OKExFuture.go +++ b/okex/OKExFuture.go @@ -410,14 +410,27 @@ func (ok *OKExFuture) PlaceFutureOrder(currencyPair CurrencyPair, contractType, return fOrder.OrderID2, err } -func (ok *OKExFuture) LimitFuturesOrder(currencyPair CurrencyPair, contractType, price, amount string, openType int) (*FutureOrder, error) { - return ok.PlaceFutureOrder2(0, &FutureOrder{ +func (ok *OKExFuture) LimitFuturesOrder(currencyPair CurrencyPair, contractType, price, amount string, openType int, opt ...LimitOrderOptionalParameter) (*FutureOrder, error) { + ord := &FutureOrder{ Currency: currencyPair, Price: ToFloat64(price), Amount: ToFloat64(amount), OType: openType, ContractName: contractType, - }) + } + + if len(opt) > 0 { + switch opt[0] { + case PostOnly: + ord.OrderType = 1 + case Fok: + ord.OrderType = 2 + case Ioc: + ord.OrderType = 3 + } + } + + return ok.PlaceFutureOrder2(0, ord) } func (ok *OKExFuture) MarketFuturesOrder(currencyPair CurrencyPair, contractType, amount string, openType int) (*FutureOrder, error) { diff --git a/okex/OKExSwap.go b/okex/OKExSwap.go index 8164028d..a83a197c 100644 --- a/okex/OKExSwap.go +++ b/okex/OKExSwap.go @@ -265,6 +265,7 @@ type BasePlaceOrderInfo struct { MatchPrice string `json:"match_price"` Type string `json:"type"` Size string `json:"size"` + OrderType string `json:"order_type"` } type PlaceOrderInfo struct { @@ -278,13 +279,13 @@ type PlaceOrdersInfo struct { } func (ok *OKExSwap) PlaceFutureOrder(currencyPair CurrencyPair, contractType, price, amount string, openType, matchPrice, leverRate int) (string, error) { - fOrder, err := ok.PlaceFutureOrder2(currencyPair, contractType, price, amount, openType, matchPrice, leverRate) + fOrder, err := ok.PlaceFutureOrder2(currencyPair, contractType, price, amount, openType, matchPrice) return fOrder.OrderID2, err } -func (ok *OKExSwap) PlaceFutureOrder2(currencyPair CurrencyPair, contractType, price, amount string, openType, matchPrice, leverRate int) (*FutureOrder, error) { +func (ok *OKExSwap) PlaceFutureOrder2(currencyPair CurrencyPair, contractType, price, amount string, openType, matchPrice int, opt ...LimitOrderOptionalParameter) (*FutureOrder, error) { cid := GenerateOrderClientId(32) - reqBody, _, _ := ok.OKEx.BuildRequestBody(PlaceOrderInfo{ + param := PlaceOrderInfo{ BasePlaceOrderInfo{ ClientOid: cid, Price: price, @@ -292,7 +293,20 @@ func (ok *OKExSwap) PlaceFutureOrder2(currencyPair CurrencyPair, contractType, p Type: fmt.Sprint(openType), Size: amount}, ok.adaptContractType(currencyPair), - }) + } + + if len(opt) > 0 { + switch opt[0] { + case PostOnly: + param.OrderType = "1" + case Fok: + param.OrderType = "2" + case Ioc: + param.OrderType = "3" + } + } + + reqBody, _, _ := ok.OKEx.BuildRequestBody(param) fOrder := &FutureOrder{ ClientOid: cid, @@ -323,12 +337,12 @@ func (ok *OKExSwap) PlaceFutureOrder2(currencyPair CurrencyPair, contractType, p return fOrder, nil } -func (ok *OKExSwap) LimitFuturesOrder(currencyPair CurrencyPair, contractType, price, amount string, openType int) (*FutureOrder, error) { - return ok.PlaceFutureOrder2(currencyPair, contractType, price, amount, openType, 0, 10) +func (ok *OKExSwap) LimitFuturesOrder(currencyPair CurrencyPair, contractType, price, amount string, openType int, opt ...LimitOrderOptionalParameter) (*FutureOrder, error) { + return ok.PlaceFutureOrder2(currencyPair, contractType, price, amount, openType, 0, opt...) } func (ok *OKExSwap) MarketFuturesOrder(currencyPair CurrencyPair, contractType, amount string, openType int) (*FutureOrder, error) { - return ok.PlaceFutureOrder2(currencyPair, contractType, "0", amount, openType, 1, 10) + return ok.PlaceFutureOrder2(currencyPair, contractType, "0", amount, openType, 1) } func (ok *OKExSwap) FutureCancelOrder(currencyPair CurrencyPair, contractType, orderId string) (bool, error) { From 4f1ced8b042d5f1deb8463944edb54d53935e733 Mon Sep 17 00:00:00 2001 From: eric Date: Sun, 5 Jul 2020 08:59:06 +0800 Subject: [PATCH 05/13] [binance] fix issue --- binance/Binance.go | 53 ++++++++++++++--------------------------- binance/Binance_test.go | 7 +++++- 2 files changed, 24 insertions(+), 36 deletions(-) diff --git a/binance/Binance.go b/binance/Binance.go index a8171dd3..679b1c03 100644 --- a/binance/Binance.go +++ b/binance/Binance.go @@ -537,40 +537,6 @@ func (bn *Binance) GetUnfinishOrders(currencyPair CurrencyPair) ([]Order, error) return orders, nil } -func (bn *Binance) GetAllUnfinishOrders() ([]Order, error) { - params := url.Values{} - - bn.buildParamsSigned(¶ms) - path := bn.apiV3 + UNFINISHED_ORDERS_INFO + params.Encode() - - respmap, err := HttpGet3(bn.httpClient, path, map[string]string{"X-MBX-APIKEY": bn.accessKey}) - if err != nil { - return nil, err - } - - orders := make([]Order, 0) - for _, v := range respmap { - ord := v.(map[string]interface{}) - side := ord["side"].(string) - orderSide := SELL - if side == "BUY" { - orderSide = BUY - } - - ordId := ToInt(ord["orderId"]) - orders = append(orders, Order{ - OrderID: ToInt(ord["orderId"]), - OrderID2: strconv.Itoa(ordId), - Currency: bn.toCurrencyPair(ord["symbol"].(string)), - Price: ToFloat64(ord["price"]), - Amount: ToFloat64(ord["origQty"]), - Side: TradeSide(orderSide), - Status: ORDER_UNFINISH, - OrderTime: ToInt(ord["time"])}) - } - return orders, nil -} - func (bn *Binance) GetKlineRecords(currency CurrencyPair, period, size, since int) ([]Kline, error) { params := url.Values{} params.Set("symbol", currency.ToSymbol("")) @@ -662,6 +628,23 @@ func (bn *Binance) GetOrderHistorys(currency CurrencyPair, currentPage, pageSize orderSide = BUY } ordId := ToInt(ord["orderId"]) + status := ord["status"].(string) + var tradeStatus TradeStatus + switch status { + case "NEW": + tradeStatus = ORDER_UNFINISH + case "FILLED": + tradeStatus = ORDER_FINISH + case "PARTIALLY_FILLED": + tradeStatus = ORDER_PART_FINISH + case "CANCELED": + tradeStatus = ORDER_CANCEL + case "PENDING_CANCEL": + tradeStatus = ORDER_CANCEL_ING + case "REJECTED": + tradeStatus = ORDER_REJECT + } + orders = append(orders, Order{ OrderID: ToInt(ord["orderId"]), OrderID2: strconv.Itoa(ordId), @@ -669,7 +652,7 @@ func (bn *Binance) GetOrderHistorys(currency CurrencyPair, currentPage, pageSize Price: ToFloat64(ord["price"]), Amount: ToFloat64(ord["origQty"]), Side: TradeSide(orderSide), - Status: ORDER_UNFINISH, + Status: tradeStatus, OrderTime: ToInt(ord["time"])}) } return orders, nil diff --git a/binance/Binance_test.go b/binance/Binance_test.go index 75bea087..b4defdc6 100644 --- a/binance/Binance_test.go +++ b/binance/Binance_test.go @@ -23,7 +23,7 @@ var ba = NewWithConfig( }, Timeout: 10 * time.Second, }, - Endpoint: US_API_BASE_URL, + Endpoint: GLOBAL_API_BASE_URL, ApiKey: "q6y6Gr7fF3jSJLncpfn2PmAA0xu4XRiRFHpFkyJy3d7K68WUxY0Gt8rrajCDUfbI", ApiSecretKey: "AP8C2kh4RyISN3fpRCFMZJddf233XbPcYWQ1S7gBan3pGjCQg2JnyQFSJrIaNzRh", }) @@ -70,6 +70,7 @@ func TestBinance_GetUnfinishOrders(t *testing.T) { orders, err := ba.GetUnfinishOrders(goex.ETH_BTC) t.Log(orders, err) } + func TestBinance_GetKlineRecords(t *testing.T) { before := time.Now().Add(-time.Hour).Unix() * 1000 kline, _ := ba.GetKlineRecords(goex.ETH_BTC, goex.KLINE_PERIOD_5MIN, 100, int(before)) @@ -91,3 +92,7 @@ func TestBinance_SetTimeOffset(t *testing.T) { t.Log(ba.setTimeOffset()) t.Log(ba.timeOffset) } + +func TestBinance_GetOrderHistorys(t *testing.T) { + t.Log(ba.GetOrderHistorys(goex.BTC_USDT, 1, 1)) +} From e6ef6d9ae21b9cf2be7aabbbbcb81a42f31fe619 Mon Sep 17 00:00:00 2001 From: eric Date: Thu, 9 Jul 2020 07:42:43 +0800 Subject: [PATCH 06/13] [okex spot] add fee for order --- okex/OKExSpot.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/okex/OKExSpot.go b/okex/OKExSpot.go index adc9407e..2478d9d5 100644 --- a/okex/OKExSpot.go +++ b/okex/OKExSpot.go @@ -243,6 +243,7 @@ type OrderResponse struct { FilledNotional string `json:"filled_notional"` PriceAvg string `json:"price_avg"` State int `json:"state,string"` + Fee float64 `json:"fee,string"` OrderType int `json:"order_type,string"` Timestamp string `json:"timestamp"` } @@ -255,7 +256,8 @@ func (ok *OKExSpot) adaptOrder(response OrderResponse) *Order { Amount: response.Size, AvgPrice: ToFloat64(response.PriceAvg), DealAmount: ToFloat64(response.FilledSize), - Status: ok.adaptOrderState(response.State)} + Status: ok.adaptOrderState(response.State), + Fee: response.Fee} switch response.Side { case "buy": From 588b496a514e2666590273da0df1f8957794e447 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 10 Jul 2020 08:09:49 +0800 Subject: [PATCH 07/13] [okex spot] add fee for order --- okex/OKExSpot.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/okex/OKExSpot.go b/okex/OKExSpot.go index 2478d9d5..60d813e7 100644 --- a/okex/OKExSpot.go +++ b/okex/OKExSpot.go @@ -243,7 +243,7 @@ type OrderResponse struct { FilledNotional string `json:"filled_notional"` PriceAvg string `json:"price_avg"` State int `json:"state,string"` - Fee float64 `json:"fee,string"` + Fee string `json:"fee"` OrderType int `json:"order_type,string"` Timestamp string `json:"timestamp"` } @@ -257,7 +257,7 @@ func (ok *OKExSpot) adaptOrder(response OrderResponse) *Order { AvgPrice: ToFloat64(response.PriceAvg), DealAmount: ToFloat64(response.FilledSize), Status: ok.adaptOrderState(response.State), - Fee: response.Fee} + Fee: ToFloat64(response.Fee)} switch response.Side { case "buy": From 917861ae9793d0de4dcc167da05c8fe2479c449f Mon Sep 17 00:00:00 2001 From: qct Date: Mon, 13 Jul 2020 09:39:03 +0800 Subject: [PATCH 08/13] Add algo order for okex and fix swap/candle bug (#175) * add ShortPnlRatio & LongPnlRatio for okex future * fix swap candle * Place, cancel, get Algo order --- Models.go | 6 ++ okex/OKExFuture.go | 2 + okex/OKExFuturesWs.go | 3 +- okex/OKExSwap.go | 148 ++++++++++++++++++++++++++++++++++++++++++ okex/OKExSwap_test.go | 24 +++++++ 5 files changed, 182 insertions(+), 1 deletion(-) diff --git a/Models.go b/Models.go index 87fad236..768882ad 100644 --- a/Models.go +++ b/Models.go @@ -167,6 +167,10 @@ type FutureOrder struct { Fee float64 //手续费 ContractName string FinishedTime int64 // finished timestamp + + //策略委托单 + TriggerPrice float64 + AlgoType int //1:限价 2:市场价;触发价格类型,默认是限价;为市场价时,委托价格不必填; } type FuturePosition struct { @@ -186,6 +190,8 @@ type FuturePosition struct { ContractType string ContractId int64 ForceLiquPrice float64 //预估爆仓价 + ShortPnlRatio float64 //空仓收益率 + LongPnlRatio float64 //多仓收益率 } type HistoricalFunding struct { diff --git a/okex/OKExFuture.go b/okex/OKExFuture.go index b818bdbe..25df900a 100644 --- a/okex/OKExFuture.go +++ b/okex/OKExFuture.go @@ -520,6 +520,8 @@ func (ok *OKExFuture) GetFuturePosition(currencyPair CurrencyPair, contractType ForceLiquPrice: pos.LiquidationPrice, LeverRate: pos.Leverage, CreateDate: pos.CreatedAt.Unix(), + ShortPnlRatio: pos.ShortPnlRatio, + LongPnlRatio: pos.LongPnlRatio, }) } diff --git a/okex/OKExFuturesWs.go b/okex/OKExFuturesWs.go index 2de0cb47..d1e88921 100644 --- a/okex/OKExFuturesWs.go +++ b/okex/OKExFuturesWs.go @@ -182,7 +182,8 @@ func (okV3Ws *OKExV3FuturesWs) handle(channel string, data json.RawMessage) erro } ) - if strings.Contains(channel, "futures/candle") { + if strings.Contains(channel, "futures/candle") || + strings.Contains(channel, "swap/candle") { ch = "candle" } else { ch, err = okV3Ws.v3Ws.parseChannel(channel) diff --git a/okex/OKExSwap.go b/okex/OKExSwap.go index a83a197c..827b484f 100644 --- a/okex/OKExSwap.go +++ b/okex/OKExSwap.go @@ -76,6 +76,9 @@ const ( GET_TICKER = "/api/swap/v3/instruments/%s/ticker" GET_ALL_TICKER = "/api/swap/v3/instruments/ticker" GET_UNFINISHED_ORDERS = "/api/swap/v3/orders/%s?status=%d&limit=%d" + PLACE_ALGO_ORDER = "/api/swap/v3/order_algo" + CANCEL_ALGO_ORDER = "/api/swap/v3/cancel_algos" + GET_ALGO_ORDER = "/api/swap/v3/order_algo/%s?order_type=%d&" ) type BaseResponse struct { @@ -699,3 +702,148 @@ func (ok *OKExSwap) SetMarginLevel(currencyPair CurrencyPair, level, marginMode } return &resp, nil } + +//委托策略下单 algo_type 1:限价 2:市场价;触发价格类型,默认是限价;为市场价时,委托价格不必填; +func (ok *OKExSwap) PlaceFutureAlgoOrder(ord *FutureOrder) (*FutureOrder, error) { + var param struct { + InstrumentId string `json:"instrument_id"` + Type int `json:"type"` + OrderType int `json:"order_type"` //1:止盈止损 2:跟踪委托 3:冰山委托 4:时间加权 + Size string `json:"size"` + TriggerPrice string `json:"trigger_price"` + AlgoPrice string `json:"algo_price"` + AlgoType string `json:"algo_type"` + } + + var response struct { + ErrorMessage string `json:"error_message"` + ErrorCode string `json:"error_code"` + DetailMsg string `json:"detail_msg"` + + Data struct { + Result string `json:"result"` + ErrorMessage string `json:"error_message"` + ErrorCode string `json:"error_code"` + AlgoId string `json:"algo_id"` + InstrumentId string `json:"instrument_id"` + OrderType int `json:"order_type"` + } `json:"data"` + } + if ord == nil { + return nil, errors.New("ord param is nil") + } + param.InstrumentId = ok.adaptContractType(ord.Currency) + param.Type = ord.OType + param.OrderType = ord.OrderType + param.AlgoType = fmt.Sprint(ord.AlgoType) + param.TriggerPrice = fmt.Sprint(ord.TriggerPrice) + param.AlgoPrice = fmt.Sprint(ToFloat64(ord.Price)) + param.Size = fmt.Sprint(ord.Amount) + + reqBody, _, _ := ok.BuildRequestBody(param) + err := ok.DoRequest("POST", PLACE_ALGO_ORDER, reqBody, &response) + + if err != nil { + return ord, err + } + + ord.OrderID2 = response.Data.AlgoId + ord.OrderTime = time.Now().UnixNano() / int64(time.Millisecond) + + return ord, nil +} + +//委托策略撤单 +func (ok *OKExSwap) FutureCancelAlgoOrder(currencyPair CurrencyPair, orderId []string) (bool, error) { + if len(orderId) == 0 { + return false, errors.New("invalid order id") + } + var cancelParam struct { + InstrumentId string `json:"instrument_id"` + AlgoIds []string `json:"algo_ids"` + OrderType string `json:"order_type"` + } + + var resp struct { + ErrorMessage string `json:"error_message"` + ErrorCode string `json:"error_code"` + DetailMsg string `json:"detailMsg"` + Data struct { + Result string `json:"result"` + AlgoIds string `json:"algo_ids"` + InstrumentID string `json:"instrument_id"` + OrderType string `json:"order_type"` + } `json:"data"` + } + + cancelParam.InstrumentId = ok.adaptContractType(currencyPair) + cancelParam.OrderType = "1" + cancelParam.AlgoIds = orderId + + reqBody, _, _ := ok.BuildRequestBody(cancelParam) + + err := ok.DoRequest("POST", CANCEL_ALGO_ORDER, reqBody, &resp) + if err != nil { + return false, err + } + + return resp.Data.Result == "success", nil +} + +//获取委托单列表, status和algo_id必填且只能填其一 +func (ok *OKExSwap) GetFutureAlgoOrders(algo_id string, status string, currencyPair CurrencyPair) ([]FutureOrder, error) { + uri := fmt.Sprintf(GET_ALGO_ORDER, ok.adaptContractType(currencyPair), 1) + if algo_id != "" { + uri += "algo_id=" + algo_id + } else if status != "" { + uri += "status=" + status + } else { + return nil, errors.New("status or algo_id is needed") + } + + var resp struct { + OrderStrategyVOS []struct { + AlgoId string `json:"algo_id"` + AlgoPrice string `json:"algo_price"` + InstrumentId string `json:"instrument_id"` + Leverage string `json:"leverage"` + OrderType string `json:"order_type"` + RealAmount string `json:"real_amount"` + RealPrice string `json:"real_price"` + Size string `json:"size"` + Status string `json:"status"` + Timestamp string `json:"timestamp"` + TriggerPrice string `json:"trigger_price"` + Type string `json:"type"` + } `json:"orderStrategyVOS"` + } + + err := ok.DoRequest("GET", uri, "", &resp) + if err != nil { + return nil, err + } + + var orders []FutureOrder + for _, info := range resp.OrderStrategyVOS { + oTime, _ := time.Parse(time.RFC3339, info.Timestamp) + + ord := FutureOrder{ + OrderID2: info.AlgoId, + Price: ToFloat64(info.AlgoPrice), + Amount: ToFloat64(info.Size), + AvgPrice: ToFloat64(info.RealPrice), + DealAmount: ToFloat64(info.RealAmount), + OrderTime: oTime.UnixNano() / int64(time.Millisecond), + Status: ok.AdaptTradeStatus(ToInt(info.Status)), + Currency: CurrencyPair{}, + OrderType: ToInt(info.OrderType), + OType: ToInt(info.Type), + TriggerPrice: ToFloat64(info.TriggerPrice), + } + ord.Currency = currencyPair + orders = append(orders, ord) + } + + //log.Println(len(orders)) + return orders, nil +} diff --git a/okex/OKExSwap_test.go b/okex/OKExSwap_test.go index d49e3c89..1e412bba 100644 --- a/okex/OKExSwap_test.go +++ b/okex/OKExSwap_test.go @@ -97,3 +97,27 @@ func TestOKExSwap_GetMarginLevel(t *testing.T) { func TestOKExSwap_GetFutureAccountInfo(t *testing.T) { t.Log(okExSwap.GetFutureAccountInfo(goex.BTC_USDT)) } + +func TestOKExSwap_PlaceFutureAlgoOrder(t *testing.T) { + ord := &goex.FutureOrder{ + ContractName: goex.SWAP_CONTRACT, + Currency: goex.BTC_USD, + OType: 2, //开空 + OrderType: 1, //1:止盈止损 2:跟踪委托 3:冰山委托 4:时间加权 + Price: 9877, + Amount: 1, + + TriggerPrice: 9877, + AlgoType: 1, + } + t.Log(okExSwap.PlaceFutureAlgoOrder(ord)) +} + +func TestOKExSwap_FutureCancelAlgoOrder(t *testing.T) { + t.Log(okExSwap.FutureCancelAlgoOrder(goex.BTC_USD, []string{"309935122485305344"})) + +} + +func TestOKExSwap_GetFutureAlgoOrders(t *testing.T) { + t.Log(okExSwap.GetFutureAlgoOrders("", "2", goex.BTC_USD)) +} From d7de1e52f87b2494d0ca266edaa1d4e06f720a67 Mon Sep 17 00:00:00 2001 From: bit_he <2767415655@qq.com> Date: Tue, 14 Jul 2020 16:17:34 +0800 Subject: [PATCH 09/13] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e46be10d..cb4dff54 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@
goex -
+[文档] https://github.com/nntaoli-project/goex/wiki ### goex目标 From 88bf8ed6967be07e0a4ac7d6dc89faaf273a0082 Mon Sep 17 00:00:00 2001 From: qct Date: Wed, 15 Jul 2020 11:48:27 +0800 Subject: [PATCH 10/13] Polish, rename contract_type to contractType --- FutureRestAPI.go | 4 ++-- okex/OKExFuture.go | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/FutureRestAPI.go b/FutureRestAPI.go index c0680d50..e79528a6 100644 --- a/FutureRestAPI.go +++ b/FutureRestAPI.go @@ -111,10 +111,10 @@ type FutureRestAPI interface { /** * 获取K线数据 */ - GetKlineRecords(contract_type string, currency CurrencyPair, period, size, since int) ([]FutureKline, error) + GetKlineRecords(contractType string, currency CurrencyPair, period, size, since int) ([]FutureKline, error) /** * 获取Trade数据 */ - GetTrades(contract_type string, currencyPair CurrencyPair, since int64) ([]Trade, error) + GetTrades(contractType string, currencyPair CurrencyPair, since int64) ([]Trade, error) } diff --git a/okex/OKExFuture.go b/okex/OKExFuture.go index 25df900a..00e24d21 100644 --- a/okex/OKExFuture.go +++ b/okex/OKExFuture.go @@ -627,9 +627,9 @@ func (ok *OKExFuture) GetDeliveryTime() (int, int, int, int) { /** since : 单位秒,开始时间 */ -func (ok *OKExFuture) GetKlineRecords(contract_type string, currency CurrencyPair, period, size, since int) ([]FutureKline, error) { +func (ok *OKExFuture) GetKlineRecords(contractType string, currency CurrencyPair, period, size, since int) ([]FutureKline, error) { urlPath := "/api/futures/v3/instruments/%s/candles?start=%s&granularity=%d" - contractId := ok.GetFutureContractId(currency, contract_type) + contractId := ok.GetFutureContractId(currency, contractType) sinceTime := time.Unix(int64(since), 0).UTC() if since/int(time.Second) != 1 { //如果不为秒,转为秒 @@ -665,7 +665,7 @@ func (ok *OKExFuture) GetKlineRecords(contract_type string, currency CurrencyPai return klines, nil } -func (ok *OKExFuture) GetTrades(contract_type string, currencyPair CurrencyPair, since int64) ([]Trade, error) { +func (ok *OKExFuture) GetTrades(contractType string, currencyPair CurrencyPair, since int64) ([]Trade, error) { panic("") } From 98b4dbfc68856f402f3c0af155e72e614ab58624 Mon Sep 17 00:00:00 2001 From: qct Date: Wed, 15 Jul 2020 23:15:11 +0800 Subject: [PATCH 11/13] Add GetKlineRecordsByRange for okex future --- okex/OKExFuture.go | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/okex/OKExFuture.go b/okex/OKExFuture.go index 00e24d21..1d991566 100644 --- a/okex/OKExFuture.go +++ b/okex/OKExFuture.go @@ -665,6 +665,45 @@ func (ok *OKExFuture) GetKlineRecords(contractType string, currency CurrencyPair return klines, nil } +/** + since : 单位秒,开始时间 + to : 单位秒,结束时间 +*/ +func (ok *OKExFuture) GetKlineRecordsByRange(contractType string, currency CurrencyPair, period, since, to int) ([]FutureKline, error) { + urlPath := "/api/futures/v3/instruments/%s/candles?start=%s&end=%s&granularity=%d" + contractId := ok.GetFutureContractId(currency, contractType) + sinceTime := time.Unix(int64(since), 0).UTC() + toTime := time.Unix(int64(to), 0).UTC() + + granularity := adaptKLinePeriod(KlinePeriod(period)) + if granularity == -1 { + return nil, errors.New("kline period parameter is error") + } + + var response [][]interface{} + err := ok.DoRequest("GET", fmt.Sprintf(urlPath, contractId, sinceTime.Format(time.RFC3339), toTime.Format(time.RFC3339), granularity), "", &response) + if err != nil { + return nil, err + } + + var klines []FutureKline + for _, itm := range response { + t, _ := time.Parse(time.RFC3339, fmt.Sprint(itm[0])) + klines = append(klines, FutureKline{ + Kline: &Kline{ + Timestamp: t.Unix(), + Pair: currency, + Open: ToFloat64(itm[1]), + High: ToFloat64(itm[2]), + Low: ToFloat64(itm[3]), + Close: ToFloat64(itm[4]), + Vol: ToFloat64(itm[5])}, + Vol2: ToFloat64(itm[6])}) + } + + return klines, nil +} + func (ok *OKExFuture) GetTrades(contractType string, currencyPair CurrencyPair, since int64) ([]Trade, error) { panic("") } From b5e104ec09a5af0f6b71d2125f6b2c58e4391074 Mon Sep 17 00:00:00 2001 From: nntaoli <2767415655@qq.com> Date: Wed, 22 Jul 2020 14:23:14 +0800 Subject: [PATCH 12/13] readme --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index cb4dff54..8d62b567 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@
goex +
-[文档] https://github.com/nntaoli-project/goex/wiki ### goex目标 @@ -9,6 +9,10 @@ goex项目是为了统一并标准化各个数字资产交易平台的接口而 [English](https://github.com/nntaoli-project/goex/blob/dev/README_en.md) +### wiki文档 + +[文档](https://github.com/nntaoli-project/goex/wiki) + ### goex已支持交易所 `23+` | 交易所 | 行情接口 | 交易接口 | 版本号 | From ed525ea9eab14c4a0935a8bd67e69faff35011dc Mon Sep 17 00:00:00 2001 From: nntaoli <2767415655@qq.com> Date: Wed, 22 Jul 2020 14:43:37 +0800 Subject: [PATCH 13/13] [futures] lever field type from int change to float64 --- FutureRestAPI.go | 2 +- Models.go | 8 +++----- binance/BinanceSwap.go | 6 +++--- coinbene/CoinbeneSwap.go | 6 +++--- huobi/Hbdm.go | 8 ++++---- okex/OKExFuture.go | 4 ++-- okex/OKExSwap.go | 4 +++- 7 files changed, 19 insertions(+), 19 deletions(-) diff --git a/FutureRestAPI.go b/FutureRestAPI.go index e79528a6..befa94dd 100644 --- a/FutureRestAPI.go +++ b/FutureRestAPI.go @@ -49,7 +49,7 @@ type FutureRestAPI interface { * @param openType 1:开多 2:开空 3:平多 4:平空 * @param matchPrice 是否为对手价 0:不是 1:是 ,当取值为1时,price无效 */ - PlaceFutureOrder(currencyPair CurrencyPair, contractType, price, amount string, openType, matchPrice, leverRate int) (string, error) + PlaceFutureOrder(currencyPair CurrencyPair, contractType, price, amount string, openType, matchPrice int, leverRate float64) (string, error) LimitFuturesOrder(currencyPair CurrencyPair, contractType, price, amount string, openType int, opt ...LimitOrderOptionalParameter) (*FutureOrder, error) diff --git a/Models.go b/Models.go index 768882ad..99801962 100644 --- a/Models.go +++ b/Models.go @@ -119,7 +119,7 @@ type APIConfig struct { ApiPassphrase string //for okex.com v3 api ClientId string //for bitstamp.net , huobi.pro - Lever int //杠杆倍数 , for future + Lever float64 //杠杆倍数 , for future } type Kline struct { @@ -163,7 +163,7 @@ type FutureOrder struct { Currency CurrencyPair OrderType int //ORDINARY=0 POST_ONLY=1 FOK= 2 IOC= 3 OType int //1:开多 2:开空 3:平多 4: 平空 - LeverRate int //倍数 + LeverRate float64 //倍数 Fee float64 //手续费 ContractName string FinishedTime int64 // finished timestamp @@ -180,7 +180,7 @@ type FuturePosition struct { BuyPriceCost float64 BuyProfitReal float64 CreateDate int64 - LeverRate int + LeverRate float64 SellAmount float64 SellAvailable float64 SellPriceAvg float64 @@ -228,7 +228,6 @@ type RepaymentParameter struct { BorrowId string } - type TransferParameter struct { Currency string `json:"currency"` From int `json:"from"` @@ -248,7 +247,6 @@ type WithdrawParameter struct { Fee string `json:"fee"` } - type DepositWithdrawHistory struct { WithdrawalId string `json:"withdrawal_id,omitempty"` Currency string `json:"currency"` diff --git a/binance/BinanceSwap.go b/binance/BinanceSwap.go index 125641a9..181168d6 100644 --- a/binance/BinanceSwap.go +++ b/binance/BinanceSwap.go @@ -289,7 +289,7 @@ func (bs *BinanceSwap) Transfer(currency Currency, transferType int, amount floa return ToInt64(respmap["tranId"]), nil } -func (bs *BinanceSwap) PlaceFutureOrder(currencyPair CurrencyPair, contractType, price, amount string, openType, matchPrice, leverRate int) (string, error) { +func (bs *BinanceSwap) PlaceFutureOrder(currencyPair CurrencyPair, contractType, price, amount string, openType, matchPrice int, leverRate float64) (string, error) { fOrder, err := bs.PlaceFutureOrder2(currencyPair, contractType, price, amount, openType, matchPrice, leverRate) return fOrder.OrderID2, err } @@ -304,7 +304,7 @@ func (bs *BinanceSwap) PlaceFutureOrder(currencyPair CurrencyPair, contractType, * @param openType 1:开多 2:开空 3:平多 4:平空 * @param matchPrice 是否为对手价 0:不是 1:是 ,当取值为1时,price无效 */ -func (bs *BinanceSwap) PlaceFutureOrder2(currencyPair CurrencyPair, contractType, price, amount string, openType, matchPrice, leverRate int) (*FutureOrder, error) { +func (bs *BinanceSwap) PlaceFutureOrder2(currencyPair CurrencyPair, contractType, price, amount string, openType, matchPrice int, leverRate float64) (*FutureOrder, error) { fOrder := &FutureOrder{ Currency: currencyPair, ClientOid: GenerateOrderClientId(32), @@ -490,7 +490,7 @@ func (bs *BinanceSwap) GetFuturePosition(currencyPair CurrencyPair, contractType continue } p := FuturePosition{ - LeverRate: ToInt(cont["leverage"]), + LeverRate: ToFloat64(cont["leverage"]), Symbol: currencyPair, ForceLiquPrice: ToFloat64(cont["liquidationPrice"]), } diff --git a/coinbene/CoinbeneSwap.go b/coinbene/CoinbeneSwap.go index 0311cc17..26602381 100644 --- a/coinbene/CoinbeneSwap.go +++ b/coinbene/CoinbeneSwap.go @@ -21,7 +21,7 @@ type baseResp struct { type CoinbeneOrder struct { OrderId string `json:"orderId"` Direction string `json:"direction"` - Leverage int `json:"leverage,string"` + Leverage float64 `json:"leverage,string"` Symbol string `json:"symbol"` OrderType string `json:"orderType"` Quantity float64 `json:"quantity,string"` @@ -163,7 +163,7 @@ func (swap *CoinbeneSwap) GetFutureUserinfo(currencyPair ...CurrencyPair) (*Futu return acc, nil } -func (swap *CoinbeneSwap) PlaceFutureOrder(currencyPair CurrencyPair, contractType, price, amount string, openType, matchPrice, leverRate int) (string, error) { +func (swap *CoinbeneSwap) PlaceFutureOrder(currencyPair CurrencyPair, contractType, price, amount string, openType, matchPrice int, leverRate float64) (string, error) { var param struct { Symbol string `json:"symbol"` Leverage string `json:"leverage"` @@ -229,7 +229,7 @@ func (swap *CoinbeneSwap) GetFuturePosition(currencyPair CurrencyPair, contractT AvailableQuantity float64 `json:"availableQuantity,string"` AveragePrice float64 `json:"averagePrice,string"` CreateTime time.Time `json:"createTime"` - Leverage int `json:"leverage,string"` + Leverage float64 `json:"leverage,string"` LiquidationPrice float64 `json:"liquidationPrice,string"` RealisedPnl float64 `json:"realisedPnl,string"` UnrealisedPnl float64 `json:"unrealisedPnl,string"` diff --git a/huobi/Hbdm.go b/huobi/Hbdm.go index 10629cf5..78ef73f7 100644 --- a/huobi/Hbdm.go +++ b/huobi/Hbdm.go @@ -27,7 +27,7 @@ type OrderInfo struct { OrderPriceType string `json:"order_price_type"` Direction string `json:"direction"` Offset string `json:"offset"` - LeverRate int `json:"lever_rate"` + LeverRate float64 `json:"lever_rate"` OrderId int64 `json:"order_id"` ClientOrderId int64 `json:"client_order_id"` OrderSource string `json:"order_source"` @@ -184,7 +184,7 @@ func (dm *Hbdm) GetFuturePosition(currencyPair CurrencyPair, contractType string ProfitRate float64 `json:"profit_rate"` Profit float64 `json:"profit"` PositionMargin float64 `json:"position_margin"` - LeverRate int `json:"lever_rate"` + LeverRate float64 `json:"lever_rate"` Direction string `json:"direction"` } @@ -234,12 +234,12 @@ func (dm *Hbdm) GetFuturePosition(currencyPair CurrencyPair, contractType string return positions, nil } -func (dm *Hbdm) PlaceFutureOrder(currencyPair CurrencyPair, contractType, price, amount string, openType, matchPrice, leverRate int) (string, error) { +func (dm *Hbdm) PlaceFutureOrder(currencyPair CurrencyPair, contractType, price, amount string, openType, matchPrice int, leverRate float64) (string, error) { fOrder, err := dm.PlaceFutureOrder2(currencyPair, contractType, price, amount, openType, matchPrice, leverRate) return fOrder.OrderID2, err } -func (dm *Hbdm) PlaceFutureOrder2(currencyPair CurrencyPair, contractType, price, amount string, openType, matchPrice, leverRate int, opt ...LimitOrderOptionalParameter) (*FutureOrder, error) { +func (dm *Hbdm) PlaceFutureOrder2(currencyPair CurrencyPair, contractType, price, amount string, openType, matchPrice int, leverRate float64, opt ...LimitOrderOptionalParameter) (*FutureOrder, error) { var data struct { OrderId int64 `json:"order_id"` COrderId int64 `json:"client_order_id"` diff --git a/okex/OKExFuture.go b/okex/OKExFuture.go index 1d991566..128bafa5 100644 --- a/okex/OKExFuture.go +++ b/okex/OKExFuture.go @@ -399,7 +399,7 @@ func (ok *OKExFuture) PlaceFutureOrder2(matchPrice int, ord *FutureOrder) (*Futu return ord, nil } -func (ok *OKExFuture) PlaceFutureOrder(currencyPair CurrencyPair, contractType, price, amount string, openType, matchPrice, leverRate int) (string, error) { +func (ok *OKExFuture) PlaceFutureOrder(currencyPair CurrencyPair, contractType, price, amount string, openType, matchPrice int, leverRate float64) (string, error) { fOrder, err := ok.PlaceFutureOrder2(matchPrice, &FutureOrder{ Price: ToFloat64(price), Amount: ToFloat64(amount), @@ -473,7 +473,7 @@ func (ok *OKExFuture) GetFuturePosition(currencyPair CurrencyPair, contractType LongPnlRatio float64 `json:"long_pnl_ratio,string"` LongUnrealisedPnl float64 `json:"long_unrealised_pnl,string"` RealisedPnl float64 `json:"realised_pnl,string"` - Leverage int `json:"leverage,string"` + Leverage float64 `json:"leverage,string"` ShortQty float64 `json:"short_qty,string"` ShortAvailQty float64 `json:"short_avail_qty,string"` ShortAvgCost float64 `json:"short_avg_cost,string"` diff --git a/okex/OKExSwap.go b/okex/OKExSwap.go index 827b484f..e630398c 100644 --- a/okex/OKExSwap.go +++ b/okex/OKExSwap.go @@ -281,7 +281,7 @@ type PlaceOrdersInfo struct { OrderData []*BasePlaceOrderInfo `json:"order_data"` } -func (ok *OKExSwap) PlaceFutureOrder(currencyPair CurrencyPair, contractType, price, amount string, openType, matchPrice, leverRate int) (string, error) { +func (ok *OKExSwap) PlaceFutureOrder(currencyPair CurrencyPair, contractType, price, amount string, openType, matchPrice int, leverRate float64) (string, error) { fOrder, err := ok.PlaceFutureOrder2(currencyPair, contractType, price, amount, openType, matchPrice) return fOrder.OrderID2, err } @@ -511,6 +511,8 @@ func (ok *OKExSwap) GetFuturePosition(currencyPair CurrencyPair, contractType st positions[0].SellPriceAvg = sellPosition.AvgCost positions[0].SellProfitReal = sellPosition.RealizedPnl positions[0].SellPriceCost = sellPosition.SettlementPrice + + positions[0].LeverRate = ToFloat64(sellPosition.Leverage) } return positions, nil }