Exchanges: Include format pair in wrapper functions and test for formatting issues via tool wrapper issues (#582)

* Adds formatting of pair within binance wrapper, adds return of error from cli.ShowCommmandHelp

* Add formatting function to submit order wrapper functions

* Remove superfluous functionality

* Updated exchange wrapper issues to create a disruptive pair to see which exchanges require attention, updates currency code generation and matching

* reinstated format check, fixed tests

* fixed niterinos

* fix test

* fix spelling mistake

* make html file more aesthetic

* Add missing format pairs

* add formatting to pair for BTC Markets func

* fix spelling
This commit is contained in:
Ryan O'Hara-Reid
2020-10-26 16:54:51 +11:00
committed by GitHub
parent 8a241c2efa
commit 220245c5a8
32 changed files with 429 additions and 199 deletions

View File

@@ -214,15 +214,17 @@ func (a *Alphapoint) GetExchangeHistory(p currency.Pair, assetType asset.Item, t
// SubmitOrder submits a new order and returns a true value when
// successfully submitted
func (a *Alphapoint) SubmitOrder(s *order.Submit) (order.SubmitResponse, error) {
if err := s.Validate(); err != nil {
return order.SubmitResponse{}, err
}
var submitOrderResponse order.SubmitResponse
if err := s.Validate(); err != nil {
return submitOrderResponse, err
}
response, err := a.CreateOrder(s.Pair.String(),
fPair, err := a.FormatExchangeCurrency(s.Pair, s.AssetType)
if err != nil {
return submitOrderResponse, err
}
response, err := a.CreateOrder(fPair.String(),
s.Side.String(),
s.Type.String(),
s.Amount,

View File

@@ -369,7 +369,6 @@ func (b *Binance) newOrder(api string, o *NewOrderRequest, resp *NewOrderRespons
if o.NewOrderRespType != "" {
params.Set("newOrderRespType", o.NewOrderRespType)
}
return b.SendAuthHTTPRequest(http.MethodPost, path, params, limitOrder, resp)
}

View File

@@ -375,7 +375,12 @@ func (b *Binance) UpdateTicker(p currency.Pair, assetType asset.Item) (*ticker.P
// FetchTicker returns the ticker for a currency pair
func (b *Binance) FetchTicker(p currency.Pair, assetType asset.Item) (*ticker.Price, error) {
tickerNew, err := ticker.GetTicker(b.Name, p, assetType)
fPair, err := b.FormatExchangeCurrency(p, assetType)
if err != nil {
return nil, err
}
tickerNew, err := ticker.GetTicker(b.Name, fPair, assetType)
if err != nil {
return b.UpdateTicker(p, assetType)
}
@@ -498,10 +503,6 @@ func (b *Binance) GetExchangeHistory(p currency.Pair, assetType asset.Item, time
// SubmitOrder submits a new order
func (b *Binance) SubmitOrder(s *order.Submit) (order.SubmitResponse, error) {
if err := s.Validate(); err != nil {
return order.SubmitResponse{}, err
}
var submitOrderResponse order.SubmitResponse
if err := s.Validate(); err != nil {
return submitOrderResponse, err
@@ -527,8 +528,13 @@ func (b *Binance) SubmitOrder(s *order.Submit) (order.SubmitResponse, error) {
return submitOrderResponse, errors.New("unsupported order type")
}
fPair, err := b.FormatExchangeCurrency(s.Pair, s.AssetType)
if err != nil {
return submitOrderResponse, err
}
var orderRequest = NewOrderRequest{
Symbol: s.Pair.Base.String() + s.Pair.Quote.String(),
Symbol: fPair.String(),
Side: sideType,
Price: s.Price,
Quantity: s.Amount,

View File

@@ -352,33 +352,47 @@ func (b *Bitfinex) UpdateTicker(p currency.Pair, assetType asset.Item) (*ticker.
// FetchTicker returns the ticker for a currency pair
func (b *Bitfinex) FetchTicker(p currency.Pair, assetType asset.Item) (*ticker.Price, error) {
b.appendOptionalDelimiter(&p)
tick, err := ticker.GetTicker(b.Name, p, asset.Spot)
fPair, err := b.FormatExchangeCurrency(p, assetType)
if err != nil {
return b.UpdateTicker(p, assetType)
return nil, err
}
b.appendOptionalDelimiter(&fPair)
tick, err := ticker.GetTicker(b.Name, fPair, asset.Spot)
if err != nil {
return b.UpdateTicker(fPair, assetType)
}
return tick, nil
}
// FetchOrderbook returns the orderbook for a currency pair
func (b *Bitfinex) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
b.appendOptionalDelimiter(&p)
ob, err := orderbook.Get(b.Name, p, assetType)
fPair, err := b.FormatExchangeCurrency(p, assetType)
if err != nil {
return b.UpdateOrderbook(p, assetType)
return nil, err
}
b.appendOptionalDelimiter(&fPair)
ob, err := orderbook.Get(b.Name, fPair, assetType)
if err != nil {
return b.UpdateOrderbook(fPair, assetType)
}
return ob, nil
}
// UpdateOrderbook updates and returns the orderbook for a currency pair
func (b *Bitfinex) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
b.appendOptionalDelimiter(&p)
fPair, err := b.FormatExchangeCurrency(p, assetType)
if err != nil {
return nil, err
}
b.appendOptionalDelimiter(&fPair)
var prefix = "t"
if assetType == asset.MarginFunding {
prefix = "f"
}
orderbookNew, err := b.GetOrderbook(prefix+p.String(), "P0", 100)
orderbookNew, err := b.GetOrderbook(prefix+fPair.String(), "P0", 100)
if err != nil {
return nil, err
}
@@ -398,7 +412,7 @@ func (b *Bitfinex) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orde
})
}
o.Pair = p
o.Pair = fPair
o.ExchangeName = b.Name
o.AssetType = assetType
@@ -407,7 +421,7 @@ func (b *Bitfinex) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orde
return nil, err
}
return orderbook.Get(b.Name, p, assetType)
return orderbook.Get(b.Name, fPair, assetType)
}
// UpdateAccountInfo retrieves balances for all enabled currencies on the
@@ -474,10 +488,6 @@ func (b *Bitfinex) GetExchangeHistory(p currency.Pair, assetType asset.Item, tim
// SubmitOrder submits a new order
func (b *Bitfinex) SubmitOrder(o *order.Submit) (order.SubmitResponse, error) {
if err := o.Validate(); err != nil {
return order.SubmitResponse{}, err
}
var submitOrderResponse order.SubmitResponse
err := o.Validate()
if err != nil {

View File

@@ -183,13 +183,18 @@ func (b *Bitflyer) UpdateTradablePairs(forceUpdate bool) error {
// UpdateTicker updates and returns the ticker for a currency pair
func (b *Bitflyer) UpdateTicker(p currency.Pair, assetType asset.Item) (*ticker.Price, error) {
tickerNew, err := b.GetTicker(b.CheckFXString(p).String())
fPair, err := b.FormatExchangeCurrency(p, assetType)
if err != nil {
return nil, err
}
tickerNew, err := b.GetTicker(b.CheckFXString(fPair).String())
if err != nil {
return nil, err
}
err = ticker.ProcessTicker(&ticker.Price{
Pair: p,
Pair: fPair,
Ask: tickerNew.BestAsk,
Bid: tickerNew.BestBid,
Last: tickerNew.Last,
@@ -200,14 +205,19 @@ func (b *Bitflyer) UpdateTicker(p currency.Pair, assetType asset.Item) (*ticker.
return nil, err
}
return ticker.GetTicker(b.Name, p, assetType)
return ticker.GetTicker(b.Name, fPair, assetType)
}
// FetchTicker returns the ticker for a currency pair
func (b *Bitflyer) FetchTicker(p currency.Pair, assetType asset.Item) (*ticker.Price, error) {
tick, err := ticker.GetTicker(b.Name, p, assetType)
fPair, err := b.FormatExchangeCurrency(p, assetType)
if err != nil {
return b.UpdateTicker(p, assetType)
return nil, err
}
tick, err := ticker.GetTicker(b.Name, fPair, assetType)
if err != nil {
return b.UpdateTicker(fPair, assetType)
}
return tick, nil
}
@@ -223,18 +233,28 @@ func (b *Bitflyer) CheckFXString(p currency.Pair) currency.Pair {
// FetchOrderbook returns the orderbook for a currency pair
func (b *Bitflyer) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
ob, err := orderbook.Get(b.Name, p, assetType)
fPair, err := b.FormatExchangeCurrency(p, assetType)
if err != nil {
return b.UpdateOrderbook(p, assetType)
return nil, err
}
ob, err := orderbook.Get(b.Name, fPair, assetType)
if err != nil {
return b.UpdateOrderbook(fPair, assetType)
}
return ob, nil
}
// UpdateOrderbook updates and returns the orderbook for a currency pair
func (b *Bitflyer) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
fPair, err := b.FormatExchangeCurrency(p, assetType)
if err != nil {
return nil, err
}
orderBook := new(orderbook.Base)
orderbookNew, err := b.GetOrderBook(b.CheckFXString(p).String())
orderbookNew, err := b.GetOrderBook(b.CheckFXString(fPair).String())
if err != nil {
return orderBook, err
}
@@ -247,7 +267,7 @@ func (b *Bitflyer) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orde
orderBook.Bids = append(orderBook.Bids, orderbook.Item{Price: orderbookNew.Bids[x].Price, Amount: orderbookNew.Bids[x].Size})
}
orderBook.Pair = p
orderBook.Pair = fPair
orderBook.ExchangeName = b.Name
orderBook.AssetType = assetType
@@ -256,7 +276,7 @@ func (b *Bitflyer) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orde
return orderBook, err
}
return orderbook.Get(b.Name, p, assetType)
return orderbook.Get(b.Name, fPair, assetType)
}
// UpdateAccountInfo retrieves balances for all enabled currencies on the

View File

@@ -337,27 +337,27 @@ func (b *Bithumb) GetExchangeHistory(p currency.Pair, assetType asset.Item, time
// SubmitOrder submits a new order
// TODO: Fill this out to support limit orders
func (b *Bithumb) SubmitOrder(s *order.Submit) (order.SubmitResponse, error) {
if err := s.Validate(); err != nil {
return order.SubmitResponse{}, err
}
var submitOrderResponse order.SubmitResponse
if err := s.Validate(); err != nil {
return submitOrderResponse, err
}
fPair, err := b.FormatExchangeCurrency(s.Pair, s.AssetType)
if err != nil {
return submitOrderResponse, err
}
var orderID string
var err error
if s.Side == order.Buy {
var result MarketBuy
result, err = b.MarketBuyOrder(s.Pair.Base.String(), s.Amount)
result, err = b.MarketBuyOrder(fPair.Base.String(), s.Amount)
if err != nil {
return submitOrderResponse, err
}
orderID = result.OrderID
} else if s.Side == order.Sell {
var result MarketSell
result, err = b.MarketSellOrder(s.Pair.Base.String(), s.Amount)
result, err = b.MarketSellOrder(fPair.Base.String(), s.Amount)
if err != nil {
return submitOrderResponse, err
}

View File

@@ -260,6 +260,11 @@ func (b *Bitmex) UpdateTradablePairs(forceUpdate bool) error {
// UpdateTicker updates and returns the ticker for a currency pair
func (b *Bitmex) UpdateTicker(p currency.Pair, assetType asset.Item) (*ticker.Price, error) {
fPair, err := b.FormatExchangeCurrency(p, assetType)
if err != nil {
return nil, err
}
tick, err := b.GetActiveAndIndexInstruments()
if err != nil {
return nil, err
@@ -291,23 +296,33 @@ func (b *Bitmex) UpdateTicker(p currency.Pair, assetType asset.Item) (*ticker.Pr
return nil, err
}
}
return ticker.GetTicker(b.Name, p, assetType)
return ticker.GetTicker(b.Name, fPair, assetType)
}
// FetchTicker returns the ticker for a currency pair
func (b *Bitmex) FetchTicker(p currency.Pair, assetType asset.Item) (*ticker.Price, error) {
tickerNew, err := ticker.GetTicker(b.Name, p, assetType)
fPair, err := b.FormatExchangeCurrency(p, assetType)
if err != nil {
return b.UpdateTicker(p, assetType)
return nil, err
}
tickerNew, err := ticker.GetTicker(b.Name, fPair, assetType)
if err != nil {
return b.UpdateTicker(fPair, assetType)
}
return tickerNew, nil
}
// FetchOrderbook returns orderbook base on the currency pair
func (b *Bitmex) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
ob, err := orderbook.Get(b.Name, p, assetType)
fPair, err := b.FormatExchangeCurrency(p, assetType)
if err != nil {
return b.UpdateOrderbook(p, assetType)
return nil, err
}
ob, err := orderbook.Get(b.Name, fPair, assetType)
if err != nil {
return b.UpdateOrderbook(fPair, assetType)
}
return ob, nil
}
@@ -422,9 +437,14 @@ func (b *Bitmex) SubmitOrder(s *order.Submit) (order.SubmitResponse, error) {
errors.New("order contract amount can not have decimals")
}
fPair, err := b.FormatExchangeCurrency(s.Pair, s.AssetType)
if err != nil {
return submitOrderResponse, err
}
var orderNewParams = OrderNewParams{
OrderType: s.Type.Title(),
Symbol: s.Pair.String(),
Symbol: fPair.String(),
OrderQuantity: s.Amount,
Side: s.Side.Title(),
}

View File

@@ -245,7 +245,12 @@ func (b *Bitstamp) UpdateTradablePairs(forceUpdate bool) error {
// UpdateTicker updates and returns the ticker for a currency pair
func (b *Bitstamp) UpdateTicker(p currency.Pair, assetType asset.Item) (*ticker.Price, error) {
tick, err := b.GetTicker(p.String(), false)
fPair, err := b.FormatExchangeCurrency(p, assetType)
if err != nil {
return nil, err
}
tick, err := b.GetTicker(fPair.String(), false)
if err != nil {
return nil, err
}
@@ -258,7 +263,7 @@ func (b *Bitstamp) UpdateTicker(p currency.Pair, assetType asset.Item) (*ticker.
Ask: tick.Ask,
Volume: tick.Volume,
Open: tick.Open,
Pair: p,
Pair: fPair,
LastUpdated: time.Unix(tick.Timestamp, 0),
ExchangeName: b.Name,
AssetType: assetType})
@@ -266,14 +271,19 @@ func (b *Bitstamp) UpdateTicker(p currency.Pair, assetType asset.Item) (*ticker.
return nil, err
}
return ticker.GetTicker(b.Name, p, assetType)
return ticker.GetTicker(b.Name, fPair, assetType)
}
// FetchTicker returns the ticker for a currency pair
func (b *Bitstamp) FetchTicker(p currency.Pair, assetType asset.Item) (*ticker.Price, error) {
tick, err := ticker.GetTicker(b.Name, p, assetType)
fPair, err := b.FormatExchangeCurrency(p, assetType)
if err != nil {
return b.UpdateTicker(p, assetType)
return nil, err
}
tick, err := ticker.GetTicker(b.Name, fPair, assetType)
if err != nil {
return b.UpdateTicker(fPair, assetType)
}
return tick, nil
}
@@ -289,17 +299,27 @@ func (b *Bitstamp) GetFeeByType(feeBuilder *exchange.FeeBuilder) (float64, error
// FetchOrderbook returns the orderbook for a currency pair
func (b *Bitstamp) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
ob, err := orderbook.Get(b.Name, p, assetType)
fPair, err := b.FormatExchangeCurrency(p, assetType)
if err != nil {
return b.UpdateOrderbook(p, assetType)
return nil, err
}
ob, err := orderbook.Get(b.Name, fPair, assetType)
if err != nil {
return b.UpdateOrderbook(fPair, assetType)
}
return ob, nil
}
// UpdateOrderbook updates and returns the orderbook for a currency pair
func (b *Bitstamp) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
fPair, err := b.FormatExchangeCurrency(p, assetType)
if err != nil {
return nil, err
}
orderBook := new(orderbook.Base)
orderbookNew, err := b.GetOrderbook(p.String())
orderbookNew, err := b.GetOrderbook(fPair.String())
if err != nil {
return orderBook, err
}
@@ -318,7 +338,7 @@ func (b *Bitstamp) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orde
})
}
orderBook.Pair = p
orderBook.Pair = fPair
orderBook.ExchangeName = b.Name
orderBook.AssetType = assetType
@@ -327,7 +347,7 @@ func (b *Bitstamp) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orde
return orderBook, err
}
return orderbook.Get(b.Name, p, assetType)
return orderbook.Get(b.Name, fPair, assetType)
}
// UpdateAccountInfo retrieves balances for all enabled currencies for the
@@ -388,9 +408,14 @@ func (b *Bitstamp) SubmitOrder(s *order.Submit) (order.SubmitResponse, error) {
return submitOrderResponse, err
}
fPair, err := b.FormatExchangeCurrency(s.Pair, s.AssetType)
if err != nil {
return submitOrderResponse, err
}
buy := s.Side == order.Buy
market := s.Type == order.Market
response, err := b.PlaceOrder(s.Pair.String(),
response, err := b.PlaceOrder(fPair.String(),
s.Price,
s.Amount,
buy,
@@ -567,7 +592,11 @@ func (b *Bitstamp) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail,
if len(req.Pairs) != 1 {
currPair = "all"
} else {
currPair = req.Pairs[0].String()
fPair, err := b.FormatExchangeCurrency(req.Pairs[0], asset.Spot)
if err != nil {
return nil, err
}
currPair = fPair.String()
}
resp, err := b.GetOpenOrders(currPair)
@@ -619,7 +648,11 @@ func (b *Bitstamp) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail,
var currPair string
if len(req.Pairs) == 1 {
currPair = req.Pairs[0].String()
fPair, err := b.FormatExchangeCurrency(req.Pairs[0], asset.Spot)
if err != nil {
return nil, err
}
currPair = fPair.String()
}
format, err := b.GetPairFormat(asset.Spot, false)

View File

@@ -390,14 +390,18 @@ func (b *Bittrex) SubmitOrder(s *order.Submit) (order.SubmitResponse, error) {
errors.New("limit orders only supported on exchange")
}
fPair, err := b.FormatExchangeCurrency(s.Pair, s.AssetType)
if err != nil {
return submitOrderResponse, err
}
var response UUID
var err error
if buy {
response, err = b.PlaceBuyLimit(s.Pair.String(),
response, err = b.PlaceBuyLimit(fPair.String(),
s.Amount,
s.Price)
} else {
response, err = b.PlaceSellLimit(s.Pair.String(),
response, err = b.PlaceSellLimit(fPair.String(),
s.Amount,
s.Price)
}
@@ -512,7 +516,11 @@ func (b *Bittrex) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail,
var currPair string
if len(req.Pairs) == 1 {
currPair = req.Pairs[0].String()
fPair, err := b.FormatExchangeCurrency(req.Pairs[0], asset.Spot)
if err != nil {
return nil, err
}
currPair = fPair.String()
}
format, err := b.GetPairFormat(asset.Spot, false)
@@ -576,7 +584,11 @@ func (b *Bittrex) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail,
var currPair string
if len(req.Pairs) == 1 {
currPair = req.Pairs[0].String()
fPair, err := b.FormatExchangeCurrency(req.Pairs[0], asset.Spot)
if err != nil {
return nil, err
}
currPair = fPair.String()
}
format, err := b.GetPairFormat(asset.Spot, false)

View File

@@ -321,7 +321,12 @@ func (b *BTCMarkets) UpdateTicker(p currency.Pair, assetType asset.Item) (*ticke
// FetchTicker returns the ticker for a currency pair
func (b *BTCMarkets) FetchTicker(p currency.Pair, assetType asset.Item) (*ticker.Price, error) {
tickerNew, err := ticker.GetTicker(b.Name, p, assetType)
fPair, err := b.FormatExchangeCurrency(p, assetType)
if err != nil {
return nil, err
}
tickerNew, err := ticker.GetTicker(b.Name, fPair, assetType)
if err != nil {
return b.UpdateTicker(p, assetType)
}
@@ -330,7 +335,12 @@ func (b *BTCMarkets) FetchTicker(p currency.Pair, assetType asset.Item) (*ticker
// FetchOrderbook returns orderbook base on the currency pair
func (b *BTCMarkets) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
ob, err := orderbook.Get(b.Name, p, assetType)
fPair, err := b.FormatExchangeCurrency(p, assetType)
if err != nil {
return nil, err
}
ob, err := orderbook.Get(b.Name, fPair, assetType)
if err != nil {
return b.UpdateOrderbook(p, assetType)
}
@@ -889,16 +899,21 @@ func (b *BTCMarkets) GetHistoricCandlesExtended(p currency.Pair, a asset.Item, s
return kline.Item{}, err
}
fPair, err := b.FormatExchangeCurrency(p, a)
if err != nil {
return kline.Item{}, err
}
ret := kline.Item{
Exchange: b.Name,
Pair: p,
Pair: fPair,
Asset: a,
Interval: interval,
}
dates := kline.CalcDateRanges(start, end, interval, b.Features.Enabled.Kline.ResultLimit)
for x := range dates {
candles, err := b.GetMarketCandles(p.String(),
candles, err := b.GetMarketCandles(fPair.String(),
b.FormatExchangeKlineInterval(interval),
dates[x].Start, dates[x].End, -1, -1, -1)
if err != nil {

View File

@@ -443,10 +443,6 @@ func (c *CoinbasePro) GetExchangeHistory(p currency.Pair, assetType asset.Item,
// SubmitOrder submits a new order
func (c *CoinbasePro) SubmitOrder(s *order.Submit) (order.SubmitResponse, error) {
if err := s.Validate(); err != nil {
return order.SubmitResponse{}, err
}
var submitOrderResponse order.SubmitResponse
if err := s.Validate(); err != nil {
return submitOrderResponse, err

View File

@@ -514,11 +514,6 @@ func (c *COINUT) SubmitOrder(o *order.Submit) (order.SubmitResponse, error) {
if _, err = strconv.Atoi(o.ClientID); err != nil {
return submitOrderResponse, fmt.Errorf("%s - ClientID must be a number, received: %s", c.Name, o.ClientID)
}
err = o.Validate()
if err != nil {
return submitOrderResponse, err
}
if c.Websocket.CanUseAuthenticatedWebsocketForWrapper() {
var response *order.Detail

View File

@@ -385,10 +385,12 @@ func (e *EXMO) SubmitOrder(s *order.Submit) (order.SubmitResponse, error) {
}
}
response, err := e.CreateOrder(s.Pair.String(),
oT,
s.Price,
s.Amount)
fPair, err := e.FormatExchangeCurrency(s.Pair, s.AssetType)
if err != nil {
return submitOrderResponse, err
}
response, err := e.CreateOrder(fPair.String(), oT, s.Price, s.Amount)
if err != nil {
return submitOrderResponse, err
}

View File

@@ -507,12 +507,12 @@ func (f *FTX) SubmitOrder(s *order.Submit) (order.SubmitResponse, error) {
s.Side = order.Buy
}
formattedPair, err := f.FormatExchangeCurrency(s.Pair, s.AssetType)
fPair, err := f.FormatExchangeCurrency(s.Pair, s.AssetType)
if err != nil {
return resp, err
}
tempResp, err := f.Order(formattedPair.String(),
tempResp, err := f.Order(fPair.String(),
s.Side.Lower(),
s.Type.Lower(),
"",

View File

@@ -435,10 +435,15 @@ func (g *Gateio) SubmitOrder(s *order.Submit) (order.SubmitResponse, error) {
orderTypeFormat = order.Sell.Lower()
}
fPair, err := g.FormatExchangeCurrency(s.Pair, s.AssetType)
if err != nil {
return submitOrderResponse, err
}
var spotNewOrderRequestParams = SpotNewOrderRequestParams{
Amount: s.Amount,
Price: s.Price,
Symbol: s.Pair.String(),
Symbol: fPair.String(),
Type: orderTypeFormat,
}
@@ -607,7 +612,11 @@ func (g *Gateio) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail, e
var orders []order.Detail
var currPair string
if len(req.Pairs) == 1 {
currPair = req.Pairs[0].String()
fPair, err := g.FormatExchangeCurrency(req.Pairs[0], asset.Spot)
if err != nil {
return nil, err
}
currPair = fPair.String()
}
if g.Websocket.CanUseAuthenticatedWebsocketForWrapper() {
for i := 0; ; i += 100 {

View File

@@ -234,7 +234,12 @@ func (g *Gemini) FetchAccountInfo() (account.Holdings, error) {
// UpdateTicker updates and returns the ticker for a currency pair
func (g *Gemini) UpdateTicker(p currency.Pair, assetType asset.Item) (*ticker.Price, error) {
tick, err := g.GetTicker(p.String())
fPair, err := g.FormatExchangeCurrency(p, assetType)
if err != nil {
return nil, err
}
tick, err := g.GetTicker(fPair.String())
if err != nil {
return nil, err
}
@@ -246,38 +251,53 @@ func (g *Gemini) UpdateTicker(p currency.Pair, assetType asset.Item) (*ticker.Pr
Ask: tick.Ask,
Open: tick.Open,
Close: tick.Close,
Pair: p,
Pair: fPair,
ExchangeName: g.Name,
AssetType: assetType})
if err != nil {
return nil, err
}
return ticker.GetTicker(g.Name, p, assetType)
return ticker.GetTicker(g.Name, fPair, assetType)
}
// FetchTicker returns the ticker for a currency pair
func (g *Gemini) FetchTicker(p currency.Pair, assetType asset.Item) (*ticker.Price, error) {
tickerNew, err := ticker.GetTicker(g.Name, p, assetType)
fPair, err := g.FormatExchangeCurrency(p, assetType)
if err != nil {
return g.UpdateTicker(p, assetType)
return nil, err
}
tickerNew, err := ticker.GetTicker(g.Name, fPair, assetType)
if err != nil {
return g.UpdateTicker(fPair, assetType)
}
return tickerNew, nil
}
// FetchOrderbook returns orderbook base on the currency pair
func (g *Gemini) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
ob, err := orderbook.Get(g.Name, p, assetType)
fPair, err := g.FormatExchangeCurrency(p, assetType)
if err != nil {
return g.UpdateOrderbook(p, assetType)
return nil, err
}
ob, err := orderbook.Get(g.Name, fPair, assetType)
if err != nil {
return g.UpdateOrderbook(fPair, assetType)
}
return ob, nil
}
// UpdateOrderbook updates and returns the orderbook for a currency pair
func (g *Gemini) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
fPair, err := g.FormatExchangeCurrency(p, assetType)
if err != nil {
return nil, err
}
orderBook := new(orderbook.Base)
orderbookNew, err := g.GetOrderbook(p.String(), url.Values{})
orderbookNew, err := g.GetOrderbook(fPair.String(), url.Values{})
if err != nil {
return orderBook, err
}
@@ -290,7 +310,7 @@ func (g *Gemini) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderb
orderBook.Asks = append(orderBook.Asks, orderbook.Item{Amount: orderbookNew.Asks[x].Amount, Price: orderbookNew.Asks[x].Price})
}
orderBook.Pair = p
orderBook.Pair = fPair
orderBook.ExchangeName = g.Name
orderBook.AssetType = assetType
@@ -299,7 +319,7 @@ func (g *Gemini) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderb
return orderBook, err
}
return orderbook.Get(g.Name, p, assetType)
return orderbook.Get(g.Name, fPair, assetType)
}
// GetFundingHistory returns funding history, deposits and

View File

@@ -471,8 +471,13 @@ func (h *HitBTC) SubmitOrder(o *order.Submit) (order.SubmitResponse, error) {
submitOrderResponse.FullyMatched = true
}
} else {
fPair, err := h.FormatExchangeCurrency(o.Pair, o.AssetType)
if err != nil {
return submitOrderResponse, err
}
var response OrderResponse
response, err = h.PlaceOrder(o.Pair.String(),
response, err = h.PlaceOrder(fPair.String(),
o.Price,
o.Amount,
strings.ToLower(o.Type.String()),

View File

@@ -341,13 +341,18 @@ func (i *ItBit) SubmitOrder(s *order.Submit) (order.SubmitResponse, error) {
s.Amount)
}
fPair, err := i.FormatExchangeCurrency(s.Pair, s.AssetType)
if err != nil {
return submitOrderResponse, err
}
response, err := i.PlaceOrder(wallet,
s.Side.String(),
s.Type.String(),
s.Pair.Base.String(),
fPair.Base.String(),
s.Amount,
s.Price,
s.Pair.String(),
fPair.String(),
"")
if err != nil {
return submitOrderResponse, err

View File

@@ -542,8 +542,12 @@ func (k *Kraken) SubmitOrder(s *order.Submit) (order.SubmitResponse, error) {
submitOrderResponse.OrderID = resp
submitOrderResponse.IsOrderPlaced = true
} else {
fPair, err := k.FormatExchangeCurrency(s.Pair, s.AssetType)
if err != nil {
return submitOrderResponse, err
}
var response AddOrderResponse
response, err = k.AddOrder(s.Pair.String(),
response, err = k.AddOrder(fPair.String(),
s.Side.String(),
s.Type.String(),
s.Amount,

View File

@@ -238,26 +238,41 @@ func (l *LakeBTC) UpdateTicker(p currency.Pair, assetType asset.Item) (*ticker.P
// FetchTicker returns the ticker for a currency pair
func (l *LakeBTC) FetchTicker(p currency.Pair, assetType asset.Item) (*ticker.Price, error) {
tickerNew, err := ticker.GetTicker(l.Name, p, assetType)
fPair, err := l.FormatExchangeCurrency(p, assetType)
if err != nil {
return l.UpdateTicker(p, assetType)
return nil, err
}
tickerNew, err := ticker.GetTicker(l.Name, fPair, assetType)
if err != nil {
return l.UpdateTicker(fPair, assetType)
}
return tickerNew, nil
}
// FetchOrderbook returns orderbook base on the currency pair
func (l *LakeBTC) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
ob, err := orderbook.Get(l.Name, p, assetType)
fPair, err := l.FormatExchangeCurrency(p, assetType)
if err != nil {
return l.UpdateOrderbook(p, assetType)
return nil, err
}
ob, err := orderbook.Get(l.Name, fPair, assetType)
if err != nil {
return l.UpdateOrderbook(fPair, assetType)
}
return ob, nil
}
// UpdateOrderbook updates and returns the orderbook for a currency pair
func (l *LakeBTC) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
fPair, err := l.FormatExchangeCurrency(p, assetType)
if err != nil {
return nil, err
}
orderBook := new(orderbook.Base)
orderbookNew, err := l.GetOrderBook(p.String())
orderbookNew, err := l.GetOrderBook(fPair.String())
if err != nil {
return orderBook, err
}
@@ -270,7 +285,7 @@ func (l *LakeBTC) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*order
orderBook.Asks = append(orderBook.Asks, orderbook.Item{Amount: orderbookNew.Asks[x].Amount, Price: orderbookNew.Asks[x].Price})
}
orderBook.Pair = p
orderBook.Pair = fPair
orderBook.ExchangeName = l.Name
orderBook.AssetType = assetType
@@ -279,7 +294,7 @@ func (l *LakeBTC) UpdateOrderbook(p currency.Pair, assetType asset.Item) (*order
return orderBook, err
}
return orderbook.Get(l.Name, p, assetType)
return orderbook.Get(l.Name, fPair, assetType)
}
// UpdateAccountInfo retrieves balances for all enabled currencies for the
@@ -346,9 +361,16 @@ func (l *LakeBTC) SubmitOrder(s *order.Submit) (order.SubmitResponse, error) {
return submitOrderResponse, err
}
fPair, err := l.FormatExchangeCurrency(s.Pair, s.AssetType)
if err != nil {
return submitOrderResponse, err
}
isBuyOrder := s.Side == order.Buy
response, err := l.Trade(isBuyOrder, s.Amount, s.Price,
s.Pair.Lower().String())
response, err := l.Trade(isBuyOrder,
s.Amount,
s.Price,
fPair.Lower().String())
if err != nil {
return submitOrderResponse, err
}

View File

@@ -296,6 +296,11 @@ func (l *LocalBitcoins) SubmitOrder(s *order.Submit) (order.SubmitResponse, erro
return submitOrderResponse, err
}
fPair, err := l.FormatExchangeCurrency(s.Pair, s.AssetType)
if err != nil {
return submitOrderResponse, err
}
// These are placeholder details
// TODO store a user's localbitcoin details to use here
var params = AdCreate{
@@ -305,7 +310,7 @@ func (l *LocalBitcoins) SubmitOrder(s *order.Submit) (order.SubmitResponse, erro
City: "City",
Location: "Location",
CountryCode: "US",
Currency: s.Pair.Quote.String(),
Currency: fPair.Quote.String(),
AccountInfo: "-",
BankName: "Bank",
MSG: s.Side.String(),
@@ -319,7 +324,7 @@ func (l *LocalBitcoins) SubmitOrder(s *order.Submit) (order.SubmitResponse, erro
}
// Does not return any orderID, so create the add, then get the order
err := l.CreateAd(&params)
err = l.CreateAd(&params)
if err != nil {
return submitOrderResponse, err
}

View File

@@ -534,9 +534,14 @@ func (o *OKEX) FetchTicker(p currency.Pair, assetType asset.Item) (tickerData *t
if assetType == asset.Index {
return tickerData, errors.New("ticker fetching not supported for index")
}
tickerData, err = ticker.GetTicker(o.Name, p, assetType)
fPair, err := o.FormatExchangeCurrency(p, assetType)
if err != nil {
return o.UpdateTicker(p, assetType)
return nil, err
}
tickerData, err = ticker.GetTicker(o.Name, fPair, assetType)
if err != nil {
return o.UpdateTicker(fPair, assetType)
}
return
}

View File

@@ -63,9 +63,13 @@ func (o *OKGroup) Setup(exch *config.ExchangeConfig) error {
// FetchOrderbook returns orderbook base on the currency pair
func (o *OKGroup) FetchOrderbook(p currency.Pair, assetType asset.Item) (*orderbook.Base, error) {
ob, err := orderbook.Get(o.Name, p, assetType)
fPair, err := o.FormatExchangeCurrency(p, assetType)
if err != nil {
return o.UpdateOrderbook(p, assetType)
return nil, err
}
ob, err := orderbook.Get(o.Name, fPair, assetType)
if err != nil {
return o.UpdateOrderbook(fPair, assetType)
}
return ob, nil
}
@@ -77,13 +81,13 @@ func (o *OKGroup) UpdateOrderbook(p currency.Pair, a asset.Item) (*orderbook.Bas
return orderBook, errors.New("no orderbooks for index")
}
fpair, err := o.FormatExchangeCurrency(p, a)
fPair, err := o.FormatExchangeCurrency(p, a)
if err != nil {
return nil, err
}
orderbookNew, err := o.GetOrderBook(GetOrderBookRequest{
InstrumentID: fpair.String(),
InstrumentID: fPair.String(),
}, a)
if err != nil {
return orderBook, err
@@ -162,7 +166,7 @@ func (o *OKGroup) UpdateOrderbook(p currency.Pair, a asset.Item) (*orderbook.Bas
return orderBook, err
}
return orderbook.Get(o.Name, p, a)
return orderbook.Get(o.Name, fPair, a)
}
// UpdateAccountInfo retrieves balances for all enabled currencies

View File

@@ -420,9 +420,14 @@ func (p *Poloniex) SubmitOrder(s *order.Submit) (order.SubmitResponse, error) {
return submitOrderResponse, err
}
fPair, err := p.FormatExchangeCurrency(s.Pair, s.AssetType)
if err != nil {
return submitOrderResponse, err
}
fillOrKill := s.Type == order.Market
isBuyOrder := s.Side == order.Buy
response, err := p.PlaceOrder(s.Pair.String(),
response, err := p.PlaceOrder(fPair.String(),
s.Price,
s.Amount,
false,

View File

@@ -342,7 +342,12 @@ func (y *Yobit) SubmitOrder(s *order.Submit) (order.SubmitResponse, error) {
return submitOrderResponse, errors.New("only limit orders are allowed")
}
response, err := y.Trade(s.Pair.String(),
fPair, err := y.FormatExchangeCurrency(s.Pair, s.AssetType)
if err != nil {
return submitOrderResponse, err
}
response, err := y.Trade(fPair.String(),
s.Side.String(),
s.Amount,
s.Price)

View File

@@ -426,10 +426,15 @@ func (z *ZB) SubmitOrder(o *order.Submit) (order.SubmitResponse, error) {
oT = SpotNewOrderRequestParamsTypeSell
}
fPair, err := z.FormatExchangeCurrency(o.Pair, o.AssetType)
if err != nil {
return submitOrderResponse, err
}
var params = SpotNewOrderRequestParams{
Amount: o.Amount,
Price: o.Price,
Symbol: o.Pair.Lower().String(),
Symbol: fPair.Lower().String(),
Type: oT,
}
var response int64