From 815b22dbebcc5e2f1d2b96a61beb572900888d09 Mon Sep 17 00:00:00 2001 From: Adrian Gallagher Date: Thu, 7 May 2015 03:40:16 +1000 Subject: [PATCH] Added the ability to enable/disable Cryptocurrencies on Exchanges via config file. A few more exchanges need to be completed. --- anxhttp.go | 17 ++- bitfinexhttp.go | 41 ++--- bitstamphttp.go | 19 ++- btcchinahttp.go | 38 ++--- btcchinawebsocket.go | 7 +- btcehttp.go | 41 +++-- btcmarkets.go | 47 +++--- coinbasehttp.go | 44 ++++-- coinbasewebsocket.go | 6 +- common.go | 1 + config.go | 36 ++--- config_example.json | 354 ++++++++++++++++++++++--------------------- cryptsyhttp.go | 3 +- events.go | 2 +- huobihttp.go | 32 ++-- huobiwebsocket.go | 20 +-- itbithttp.go | 3 +- kraken.go | 3 +- lakebtchttp.go | 3 +- main.go | 44 ++++-- okcoinhttp.go | 3 +- 21 files changed, 414 insertions(+), 350 deletions(-) diff --git a/anxhttp.go b/anxhttp.go index 901d1b4f..e7b1ac6f 100644 --- a/anxhttp.go +++ b/anxhttp.go @@ -32,7 +32,8 @@ type ANX struct { APIKey, APISecret string TakerFee, MakerFee float64 BaseCurrencies []string - Pairs []string + AvailablePairs []string + EnabledPairs []string } type ANXOrder struct { @@ -134,14 +135,18 @@ func (a *ANX) GetFee(maker bool) float64 { func (a *ANX) Run() { if a.Verbose { log.Printf("%s polling delay: %ds.\n", a.GetName(), a.RESTPollingDelay) + log.Printf("%s %d currencies enabled: %s.\n", a.GetName(), len(a.EnabledPairs), a.EnabledPairs) } for a.Enabled { - go func() { - ANXBTC := a.GetTicker("BTCUSD") - log.Printf("ANX BTC: Last %f High %f Low %f Volume %f\n", ANXBTC.Data.Last.Value, ANXBTC.Data.High.Value, ANXBTC.Data.Low.Value, ANXBTC.Data.Vol.Value) - AddExchangeInfo(a.GetName(), "BTC", ANXBTC.Data.Last.Value, ANXBTC.Data.Vol.Value) - }() + for _, x := range a.EnabledPairs { + currency := x + go func() { + ticker := a.GetTicker(currency) + log.Printf("ANX %s: Last %f High %f Low %f Volume %f\n", currency, ticker.Data.Last.Value, ticker.Data.High.Value, ticker.Data.Low.Value, ticker.Data.Vol.Value) + AddExchangeInfo(a.GetName(), currency, ticker.Data.Last.Value, ticker.Data.Vol.Value) + }() + } time.Sleep(time.Second * a.RESTPollingDelay) } } diff --git a/bitfinexhttp.go b/bitfinexhttp.go index 43fceb28..2f05d628 100644 --- a/bitfinexhttp.go +++ b/bitfinexhttp.go @@ -156,7 +156,8 @@ type Bitfinex struct { ActiveOrders []BitfinexActiveOrder AccountBalance []BitfinexBalance BaseCurrencies []string - Pairs []string + AvailablePairs []string + EnabledPairs []string } func (b *Bitfinex) SetDefaults() { @@ -187,23 +188,25 @@ func (b *Bitfinex) SetAPIKeys(apiKey, apiSecret string) { func (b *Bitfinex) Run() { if b.Verbose { log.Printf("%s polling delay: %ds.\n", b.GetName(), b.RESTPollingDelay) + log.Printf("%s %d currencies enabled: %s.\n", b.GetName(), len(b.EnabledPairs), b.EnabledPairs) } - b.GetAccountFeeInfo() - b.GetAccountBalance() + exchangeProducts, err := b.GetSymbols() + if err != nil { + log.Printf("%s Failed to get available symbols.\n", b.GetName()) + } else { + b.AvailablePairs = SplitStrings(StringToUpper(JoinStrings(exchangeProducts, ",")), ",") + } for b.Enabled { - go func() { - BitfinexLTC := b.GetTicker("ltcusd") - log.Printf("Bitfinex LTC: Last %f High %f Low %f Volume %f\n", BitfinexLTC.Last, BitfinexLTC.High, BitfinexLTC.Low, BitfinexLTC.Volume) - AddExchangeInfo(b.GetName(), "LTC", BitfinexLTC.Last, BitfinexLTC.Volume) - }() - - go func() { - BitfinexBTC := b.GetTicker("btcusd") - log.Printf("Bitfinex BTC: Last %f High %f Low %f Volume %f\n", BitfinexBTC.Last, BitfinexBTC.High, BitfinexBTC.Low, BitfinexBTC.Volume) - AddExchangeInfo(b.GetName(), "BTC", BitfinexBTC.Last, BitfinexBTC.Volume) - }() + for _, x := range b.EnabledPairs { + currency := x + go func() { + ticker := b.GetTicker(currency) + log.Printf("Bitfinex %s Last %f High %f Low %f Volume %f\n", currency, ticker.Last, ticker.High, ticker.Low, ticker.Volume) + AddExchangeInfo(b.GetName(), currency, ticker.Last, ticker.Volume) + }() + } time.Sleep(time.Second * b.RESTPollingDelay) } } @@ -342,13 +345,13 @@ func (b *Bitfinex) GetTrades(symbol string) bool { return true } -func (b *Bitfinex) GetSymbols() bool { - err := SendHTTPGetRequest(BITFINEX_API_URL+BITFINEX_SYMBOLS, false, nil) +func (b *Bitfinex) GetSymbols() ([]string, error) { + products := []string{} + err := SendHTTPGetRequest(BITFINEX_API_URL+BITFINEX_SYMBOLS, true, &products) if err != nil { - log.Println(err) - return false + return nil, err } - return true + return products, nil } func (b *Bitfinex) GetSymbolsDetails() bool { diff --git a/bitstamphttp.go b/bitstamphttp.go index 181c77bb..3d8384e1 100644 --- a/bitstamphttp.go +++ b/bitstamphttp.go @@ -44,7 +44,8 @@ type Bitstamp struct { Balance BitstampAccountBalance TakerFee, MakerFee float64 BaseCurrencies []string - Pairs []string + AvailablePairs []string + EnabledPairs []string } type BitstampTicker struct { @@ -117,20 +118,22 @@ func (b *Bitstamp) Run() { if b.Verbose { log.Printf("%s Websocket: %s.", b.GetName(), IsEnabled(b.Websocket)) log.Printf("%s polling delay: %ds.\n", b.GetName(), b.RESTPollingDelay) + log.Printf("%s %d currencies enabled: %s.\n", b.GetName(), len(b.EnabledPairs), b.EnabledPairs) } - b.GetBalance() - if b.Websocket { go b.PusherClient() } for b.Enabled { - go func() { - BitstampBTC := b.GetTicker() - log.Printf("Bitstamp BTC: Last %f High %f Low %f Volume %f\n", BitstampBTC.Last, BitstampBTC.High, BitstampBTC.Low, BitstampBTC.Volume) - AddExchangeInfo(b.GetName(), "BTC", BitstampBTC.Last, BitstampBTC.Volume) - }() + for _, x := range b.EnabledPairs { + currency := x + go func() { + ticker := b.GetTicker() + log.Printf("Bitstamp %s: Last %f High %f Low %f Volume %f\n", currency, ticker.Last, ticker.High, ticker.Low, ticker.Volume) + AddExchangeInfo(b.GetName(), currency, ticker.Last, ticker.Volume) + }() + } time.Sleep(time.Second * b.RESTPollingDelay) } } diff --git a/btcchinahttp.go b/btcchinahttp.go index ee9d0b69..8710b580 100644 --- a/btcchinahttp.go +++ b/btcchinahttp.go @@ -47,7 +47,8 @@ type BTCChina struct { APISecret, APIKey string Fee float64 BaseCurrencies []string - Pairs []string + AvailablePairs []string + EnabledPairs []string } type BTCChinaTicker struct { @@ -202,7 +203,9 @@ func (b *BTCChina) GetFee() float64 { func (b *BTCChina) Run() { if b.Verbose { + log.Printf("%s Websocket: %s.", b.GetName(), IsEnabled(b.Websocket)) log.Printf("%s polling delay: %ds.\n", b.GetName(), b.RESTPollingDelay) + log.Printf("%s %d currencies enabled: %s.\n", b.GetName(), len(b.EnabledPairs), b.EnabledPairs) } if b.Websocket { @@ -210,23 +213,22 @@ func (b *BTCChina) Run() { } for b.Enabled { - go func() { - BTCChinaBTC := b.GetTicker("btccny") - BTCChinaBTCLastUSD, _ := ConvertCurrency(BTCChinaBTC.Last, "CNY", "USD") - BTCChinaBTCHighUSD, _ := ConvertCurrency(BTCChinaBTC.High, "CNY", "USD") - BTCChinaBTCLowUSD, _ := ConvertCurrency(BTCChinaBTC.Low, "CNY", "USD") - log.Printf("BTCChina BTC: Last %f (%f) High %f (%f) Low %f (%f) Volume %f\n", BTCChinaBTCLastUSD, BTCChinaBTC.Last, BTCChinaBTCHighUSD, BTCChinaBTC.High, BTCChinaBTCLowUSD, BTCChinaBTC.Low, BTCChinaBTC.Vol) - AddExchangeInfo(b.GetName(), "BTC", BTCChinaBTCLastUSD, BTCChinaBTC.Vol) - }() - - go func() { - BTCChinaLTC := b.GetTicker("ltccny") - BTCChinaLTCLastUSD, _ := ConvertCurrency(BTCChinaLTC.Last, "CNY", "USD") - BTCChinaLTCHighUSD, _ := ConvertCurrency(BTCChinaLTC.High, "CNY", "USD") - BTCChinaLTCLowUSD, _ := ConvertCurrency(BTCChinaLTC.Low, "CNY", "USD") - log.Printf("BTCChina LTC: Last %f (%f) High %f (%f) Low %f (%f) Volume %f\n", BTCChinaLTCLastUSD, BTCChinaLTC.Last, BTCChinaLTCHighUSD, BTCChinaLTC.High, BTCChinaLTCLowUSD, BTCChinaLTC.Low, BTCChinaLTC.Vol) - AddExchangeInfo(b.GetName(), "LTC", BTCChinaLTCLastUSD, BTCChinaLTC.Vol) - }() + for _, x := range b.EnabledPairs { + currency := StringToLower(x) + go func() { + ticker := b.GetTicker(currency) + if currency != "ltcbtc" { + tickerLastUSD, _ := ConvertCurrency(ticker.Last, "CNY", "USD") + tickerHighUSD, _ := ConvertCurrency(ticker.High, "CNY", "USD") + tickerLowUSD, _ := ConvertCurrency(ticker.Low, "CNY", "USD") + log.Printf("BTCChina %s: Last %f (%f) High %f (%f) Low %f (%f) Volume %f\n", currency, tickerLastUSD, ticker.Last, tickerHighUSD, ticker.High, tickerLowUSD, ticker.Low, ticker.Vol) + AddExchangeInfo(b.GetName(), currency, tickerLastUSD, ticker.Vol) + } else { + log.Printf("BTCChina %s: Last %f High %f Low %f Volume %f\n", currency, ticker.Last, ticker.High, ticker.Low, ticker.Vol) + AddExchangeInfo(b.GetName(), currency, ticker.Last, ticker.Vol) + } + }() + } time.Sleep(time.Second * b.RESTPollingDelay) } } diff --git a/btcchinawebsocket.go b/btcchinawebsocket.go index 95e27c1d..d640521c 100644 --- a/btcchinawebsocket.go +++ b/btcchinawebsocket.go @@ -51,7 +51,12 @@ func (b *BTCChina) OnConnect(output chan socketio.Message) { if b.Verbose { log.Printf("%s Connected to Websocket.", b.GetName()) } - currencies := []string{"cnybtc", "cnyltc", "btcltc"} + + currencies := []string{} + for _, x := range b.EnabledPairs { + currency := StringToLower(x[3:] + x[0:3]) + currencies = append(currencies, currency) + } endpoints := []string{"marketdata", "grouporder"} for _, x := range endpoints { diff --git a/btcehttp.go b/btcehttp.go index 51b55372..d665d44b 100644 --- a/btcehttp.go +++ b/btcehttp.go @@ -35,7 +35,9 @@ type BTCE struct { APIKey, APISecret string Fee float64 BaseCurrencies []string - Pairs []string + AvailablePairs []string + EnabledPairs []string + Ticker map[string]BTCeTicker } type BTCeTicker struct { @@ -70,6 +72,7 @@ func (b *BTCE) SetDefaults() { b.Verbose = false b.Websocket = false b.RESTPollingDelay = 10 + b.Ticker = make(map[string]BTCeTicker) } func (b *BTCE) GetName() string { @@ -95,20 +98,31 @@ func (b *BTCE) GetFee() float64 { func (b *BTCE) Run() { if b.Verbose { + log.Printf("%s Websocket: %s.", b.GetName(), IsEnabled(b.Websocket)) log.Printf("%s polling delay: %ds.\n", b.GetName(), b.RESTPollingDelay) + log.Printf("%s %d currencies enabled: %s.\n", b.GetName(), len(b.EnabledPairs), b.EnabledPairs) } + pairs := []string{} + for _, x := range b.EnabledPairs { + x = StringToLower(x[0:3] + "_" + x[3:6]) + pairs = append(pairs, x) + } + pairsString := JoinStrings(pairs, "-") + for b.Enabled { go func() { - BTCeBTC := b.GetTicker("btc_usd") - log.Printf("BTC-e BTC: Last %f High %f Low %f Volume %f\n", BTCeBTC.Last, BTCeBTC.High, BTCeBTC.Low, BTCeBTC.Vol_cur) - AddExchangeInfo(b.GetName(), "BTC", BTCeBTC.Last, BTCeBTC.Vol_cur) - }() - - go func() { - BTCeLTC := b.GetTicker("ltc_usd") - log.Printf("BTC-e LTC: Last %f High %f Low %f Volume %f\n", BTCeLTC.Last, BTCeLTC.High, BTCeLTC.Low, BTCeLTC.Vol_cur) - AddExchangeInfo(b.GetName(), "LTC", BTCeLTC.Last, BTCeLTC.Vol_cur) + ticker, err := b.GetTicker(pairsString) + if err != nil { + log.Println(err) + return + } + for x, y := range ticker { + x = StringToUpper(x[0:3] + x[4:]) + log.Printf("BTC-e %s: Last %f High %f Low %f Volume %f\n", x, y.Last, y.High, y.Low, y.Vol_cur) + b.Ticker[x] = y + AddExchangeInfo(b.GetName(), x, y.Last, y.Vol_cur) + } }() time.Sleep(time.Second * b.RESTPollingDelay) } @@ -123,7 +137,7 @@ func (b *BTCE) GetInfo() { } } -func (b *BTCE) GetTicker(symbol string) BTCeTicker { +func (b *BTCE) GetTicker(symbol string) (map[string]BTCeTicker, error) { type Response struct { Data map[string]BTCeTicker } @@ -133,10 +147,9 @@ func (b *BTCE) GetTicker(symbol string) BTCeTicker { err := SendHTTPGetRequest(req, true, &response.Data) if err != nil { - log.Println(err) - return BTCeTicker{} + return nil, err } - return response.Data[symbol] + return response.Data, nil } func (b *BTCE) GetDepth(symbol string) { diff --git a/btcmarkets.go b/btcmarkets.go index 94ed9fd7..0471f64c 100644 --- a/btcmarkets.go +++ b/btcmarkets.go @@ -30,7 +30,8 @@ type BTCMarkets struct { Ticker map[string]BTCMarketsTicker APIKey, APISecret string BaseCurrencies []string - Pairs []string + AvailablePairs []string + EnabledPairs []string } type BTCMarketsTicker struct { @@ -123,36 +124,26 @@ func (b *BTCMarkets) GetFee() float64 { func (b *BTCMarkets) Run() { if b.Verbose { log.Printf("%s polling delay: %ds.\n", b.GetName(), b.RESTPollingDelay) + log.Printf("%s %d currencies enabled: %s.\n", b.GetName(), len(b.EnabledPairs), b.EnabledPairs) } for b.Enabled { - go func() { - BTCMarketsBTC, err := b.GetTicker("BTC") - if err != nil { - log.Println(err) - return - } - b.Ticker["BTC"] = BTCMarketsBTC - BTCMarketsBTCLastUSD, _ := ConvertCurrency(BTCMarketsBTC.LastPrice, "AUD", "USD") - BTCMarketsBTCBestBidUSD, _ := ConvertCurrency(BTCMarketsBTC.BestBID, "AUD", "USD") - BTCMarketsBTCBestAskUSD, _ := ConvertCurrency(BTCMarketsBTC.BestAsk, "AUD", "USD") - log.Printf("BTC Markets BTC: Last %f (%f) Bid %f (%f) Ask %f (%f)\n", BTCMarketsBTCLastUSD, BTCMarketsBTC.LastPrice, BTCMarketsBTCBestBidUSD, BTCMarketsBTC.BestBID, BTCMarketsBTCBestAskUSD, BTCMarketsBTC.BestAsk) - AddExchangeInfo(b.GetName(), "BTC", BTCMarketsBTCLastUSD, 0) - }() - - go func() { - BTCMarketsLTC, err := b.GetTicker("LTC") - if err != nil { - log.Println(err) - return - } - b.Ticker["LTC"] = BTCMarketsLTC - BTCMarketsLTCLastUSD, _ := ConvertCurrency(BTCMarketsLTC.LastPrice, "AUD", "USD") - BTCMarketsLTCBestBidUSD, _ := ConvertCurrency(BTCMarketsLTC.BestBID, "AUD", "USD") - BTCMarketsLTCBestAskUSD, _ := ConvertCurrency(BTCMarketsLTC.BestAsk, "AUD", "USD") - log.Printf("BTC Markets LTC: Last %f (%f) Bid %f (%f) Ask %f (%f)", BTCMarketsLTCLastUSD, BTCMarketsLTC.LastPrice, BTCMarketsLTCBestBidUSD, BTCMarketsLTC.BestBID, BTCMarketsLTCBestAskUSD, BTCMarketsLTC.BestAsk) - AddExchangeInfo(b.GetName(), "LTC", BTCMarketsLTCLastUSD, 0) - }() + for _, x := range b.EnabledPairs { + currency := x + go func() { + ticker, err := b.GetTicker(currency) + if err != nil { + log.Println(err) + return + } + b.Ticker[currency] = ticker + BTCMarketsLastUSD, _ := ConvertCurrency(ticker.LastPrice, "AUD", "USD") + BTCMarketsBestBidUSD, _ := ConvertCurrency(ticker.BestBID, "AUD", "USD") + BTCMarketsBestAskUSD, _ := ConvertCurrency(ticker.BestAsk, "AUD", "USD") + log.Printf("BTC Markets %s: Last %f (%f) Bid %f (%f) Ask %f (%f)\n", currency, BTCMarketsLastUSD, ticker.LastPrice, BTCMarketsBestBidUSD, ticker.BestBID, BTCMarketsBestAskUSD, ticker.BestAsk) + AddExchangeInfo(b.GetName(), currency, BTCMarketsLastUSD, 0) + }() + } time.Sleep(time.Second * b.RESTPollingDelay) } } diff --git a/coinbasehttp.go b/coinbasehttp.go index f74cb052..2502da6c 100644 --- a/coinbasehttp.go +++ b/coinbasehttp.go @@ -38,7 +38,8 @@ type Coinbase struct { Password, APIKey, APISecret string TakerFee, MakerFee float64 BaseCurrencies []string - Pairs []string + AvailablePairs []string + EnabledPairs []string } type CoinbaseTicker struct { @@ -129,25 +130,36 @@ func (c *Coinbase) Run() { if c.Verbose { log.Printf("%s Websocket: %s. (url: %s).\n", c.GetName(), IsEnabled(c.Websocket), COINBASE_WEBSOCKET_URL) log.Printf("%s polling delay: %ds.\n", c.GetName(), c.RESTPollingDelay) + log.Printf("%s %d currencies enabled: %s.\n", c.GetName(), len(c.EnabledPairs), c.EnabledPairs) } if c.Websocket { go c.WebsocketClient() } + exchangeProducts, err := c.GetProducts() + if err != nil { + log.Printf("%s Failed to get available products.\n", c.GetName()) + } else { + currencies := []string{} + for _, x := range exchangeProducts { + if x.ID != "BTC" && x.ID != "USD" && x.ID != "GBP" { + currencies = append(currencies, x.ID[0:3]+x.ID[4:]) + } + } + c.AvailablePairs = currencies + } + for c.Enabled { - go func() { - CoinbaseStats := c.GetStats("BTC-USD") - CoinbaseTicker := c.GetTicker("BTC-USD") - log.Printf("Coinbase BTC: Last $%f High $%f Low $%f Volume %f\n", CoinbaseTicker.Price, CoinbaseStats.High, CoinbaseStats.Low, CoinbaseStats.Volume) - AddExchangeInfo(c.GetName(), "BTC", CoinbaseTicker.Price, CoinbaseStats.Volume) - }() - go func() { - CoinbaseStats := c.GetStats("BTC-GBP") - CoinbaseTicker := c.GetTicker("BTC-GBP") - log.Printf("Coinbase BTC: Last £%f High £%f Low £%f Volume %f\n", CoinbaseTicker.Price, CoinbaseStats.High, CoinbaseStats.Low, CoinbaseStats.Volume) - AddExchangeInfo(c.GetName(), "BTC-GDP", CoinbaseTicker.Price, CoinbaseStats.Volume) - }() + for _, x := range c.EnabledPairs { + currency := x[0:3] + "-" + x[3:] + go func() { + stats := c.GetStats(currency) + ticker := c.GetTicker(currency) + log.Printf("Coinbase %s: Last %f High %f Low %f Volume %f\n", currency, ticker.Price, stats.High, stats.Low, stats.Volume) + AddExchangeInfo(c.GetName(), currency, ticker.Price, stats.Volume) + }() + } time.Sleep(time.Second * c.RESTPollingDelay) } } @@ -166,15 +178,15 @@ func (c *Coinbase) SetAPIKeys(password, apiKey, apiSecret string) { c.APISecret = string(result) } -func (c *Coinbase) GetProducts() { +func (c *Coinbase) GetProducts() ([]CoinbaseProduct, error) { products := []CoinbaseProduct{} err := SendHTTPGetRequest(COINBASE_API_URL+COINBASE_PRODUCTS, true, &products) if err != nil { - log.Println(err) + return nil, err } - log.Println(products) + return products, nil } func (c *Coinbase) GetOrderbook(symbol string, level int) { diff --git a/coinbasewebsocket.go b/coinbasewebsocket.go index 6ad8f3b4..dc134233 100644 --- a/coinbasewebsocket.go +++ b/coinbasewebsocket.go @@ -96,7 +96,11 @@ func (c *Coinbase) WebsocketClient() { log.Printf("%s Connected to Websocket.\n", c.GetName()) - currencies := []string{"BTC-USD", "BTC-GBP"} + currencies := []string{} + for _, x := range c.EnabledPairs { + currency := x[0:3] + "-" + x[3:] + currencies = append(currencies, currency) + } for _, x := range currencies { err = c.WebsocketSubscribe(x, conn) diff --git a/common.go b/common.go index be167575..73d43482 100644 --- a/common.go +++ b/common.go @@ -198,6 +198,7 @@ func SendHTTPGetRequest(url string, jsonDecode bool, result interface{}) (err er } contents, err := ioutil.ReadAll(res.Body) + //log.Println(string(contents)) if err != nil { return err diff --git a/config.go b/config.go index 1fca5cab..564d344a 100644 --- a/config.go +++ b/config.go @@ -1,9 +1,9 @@ package main import ( + "encoding/json" "io/ioutil" "time" - "encoding/json" ) const ( @@ -11,30 +11,31 @@ const ( ) type SMSContacts struct { - Name string - Number string + Name string + Number string Enabled bool } type Config struct { - Name string + Name string SMSGlobalUsername string SMSGlobalPassword string - SMSContacts []SMSContacts - Exchanges []Exchanges + SMSContacts []SMSContacts + Exchanges []Exchanges } type Exchanges struct { - Name string - Enabled bool - Verbose bool - Websocket bool + Name string + Enabled bool + Verbose bool + Websocket bool RESTPollingDelay time.Duration - APIKey string - APISecret string - ClientID string - Pairs string - BaseCurrencies string + APIKey string + APISecret string + ClientID string + AvailablePairs string + EnabledPairs string + BaseCurrencies string } func ReadConfig() (Config, error) { @@ -49,7 +50,7 @@ func ReadConfig() (Config, error) { return cfg, err } -func SaveConfig() (error) { +func SaveConfig() error { payload, err := json.MarshalIndent(bot.config, "", " ") if err != nil { @@ -61,7 +62,6 @@ func SaveConfig() (error) { if err != nil { return err } - + return nil } - diff --git a/config_example.json b/config_example.json index cf0c6981..071ce6e7 100644 --- a/config_example.json +++ b/config_example.json @@ -1,172 +1,186 @@ { - "Name": "Skynet", - "SMSGlobalUsername": "Username", - "SMSGlobalPassword": "Password", - "SMSContacts" : [ - { - "Name": "Bob", - "Number": "12345", - "Enabled": false - } - ], - "Exchanges": [ - { - "Name": "ANX", - "Pairs": "BTCUSD,BTCHKD,BTCEUR,BTCCAD,BTCAUD,BTCSGD,BTCJPY,BTCGBP,BTCNZD,LTCBTC,DOGEBTC,STRBTC,XRPBTC", - "APIKey": "Key", - "APISecret": "Secret", - "BaseCurrencies": "USD,HKD,EUR,CAD,AUD,SGD,JPY,GBP,NZD", - "Enabled": true, - "Verbose": false, - "Websocket": false, - "RESTPollingDelay": 10 - }, - { - "Name": "Bitfinex", - "Pairs": "BTCUSD,LTCUSD,DRKUSD", - "APIKey": "Key", - "APISecret": "Secret", - "BaseCurrencies": "USD", - "Enabled": true, - "Verbose": false, - "Websocket": false, - "RESTPollingDelay": 10 - }, - { - "Name": "Bitstamp", - "Pairs": "BTCUSD", - "ClientID": "ClientID", - "APIKey": "Key", - "APISecret": "Secret", - "BaseCurrencies": "USD", - "Enabled": true, - "Verbose": false, - "Websocket": true, - "RESTPollingDelay": 10 - }, - { - "Name": "BTC China", - "Pairs": "BTCCNY,LTCCNY,LTCBTC", - "APIKey": "Key", - "APISecret": "Secret", - "BaseCurrencies": "CNY", - "Enabled": true, - "Verbose": false, - "Websocket": false, - "RESTPollingDelay": 10 - }, - { - "Name": "BTCE", - "Pairs": "BTCUSD,BTCRUR,BTCEUR,BTCCNH,BTCGBP,LTCBTC,LTCUSD,LTCRUR,LTCEUR,LTCCNH,LTCGBP,NMCBTC,NMCUSD,NVCBTC,NVCUSD,USDRUR,EURUSD,EURRUR,USDCNH,GDPUSD,PPCBTC,PPCUSD", - "APIKey": "Key", - "APISecret": "Secret", - "BaseCurrencies": "USD,RUB,EUR,CNY,GBP", - "Enabled": true, - "Verbose": false, - "Websocket": false, - "RESTPollingDelay": 10 - }, - { - "Name": "BTC Markets", - "Pairs": "LTCAUD,BTCAUD,LTCBTC", - "APIKey": "Key", - "APISecret": "Secret", - "BaseCurrencies": "AUD", - "Enabled": true, - "Verbose": false, - "Websocket": false, - "RESTPollingDelay": 10 - }, - { - "Name": "Coinbase", - "Pairs": "BTCUSD", - "ClientID": "Password", - "APIKey": "Key", - "APISecret": "Secret", - "BaseCurrencies": "USD,GBP", - "Enabled": true, - "Verbose": false, - "Websocket": true, - "RESTPollingDelay": 10 - }, - { - "Name": "Cryptsy", - "Pairs": "42BTC,42XRP,ACBTC,ACXRP,ACOINBTC,ADTLTC,AEROBTC,AEROXRP,AGSBTC,ALFBTC,ALNBTC,ALNXRP,AMCBTC,ANCBTC,ANCLTC,ANCXRP,APEXBTC,APEXXRP,ARCHBTC,ARGBTC,ARGXRP,ARIBTC,ASCLTC,AURBTC,AURLTC,AURXRP,AXRBTC,BATLTC,BCXBTC,BENBTC,BETBTC,BITBBTC,BLKBTC,BLKLTC,BLKXRP,BLUBTC,BLUXRP,BNCRBTC,BOSTBTC,BQCBTC,BTBBTC,BTBXRP,BTCUSD,BTCDBTC,BTCDXRP,BTEBTC,BTGBTC,BTGXRP,BTMBTC,BTMXRP,BUKBTC,CACHBTC,CAIxBTC,CANNBTC,CANNXRP,CAPBTC,CAPXRP,CASHBTC,CATBTC,CBXBTC,CBXLTC,CBXXRP,CCNBTC,CENTXRP,CINBTC,CINNIBTC,CKCBTC,CKCXRP,CLAMBTC,CLOAKBTC,CLOAKLTC,CLOAKXRP,CLRBTC,CLRXRP,CMCBTC,CNCBTC,CNCLTC,CNCXRP,CNLBTC,COLLTC,COLXRP,COMMBTC,COOLBTC,CPRLTC,CRACKBTC,CRACKXRP,CRAIGBTC,CRAIGXRP,CRCBTC,CRYPTBTC,CRYPTLTC,CRYPTXRP,CSCBTC,CTMLTC,DBLLTC,DEMBTC,DEMXRP,DGBBTC,DGBXRP,DGCBTC,DGCLTC,DGCXRP,DIMELTC,DMCLTC,DMDBTC,DMDXRP,DOGEBTC,DOGELTC,DOGEUSD,DOGEXRP,DOGEDBTC,DRKBTC,DRKLTC,DRKUSD,DRKXRP,DRKCBTC,DRKCXRP,DSBBTC,DTBTC,DTXRP,DVCBTC,DVCLTC,DVCXRP,EACBTC,EACLTC,EACXRP,EFLBTC,ELCBTC,ELPLTC,EMC2BTC,EMC2XRP,EMDBTC,EXCLBTC,EXEBTC,EXEXRP,EZCBTC,EZCLTC,FC2BTC,FFCBTC,FFCXRP,FIBREBTC,FIBREXRP,FLAPLTC,FLAPXRP,FLOLTC,FLOXRP,FLTBTC,FLTXRP,FRACBTC,FRCBTC,FRCXRP,FRKBTC,FRKLTC,FRKXRP,FSTBTC,FSTLTC,FTCBTC,FTCLTC,FTCUSD,FTCXRP,GBBTC,GBXRP,GDCBTC,GLCBTC,GLDBTC,GLDLTC,GLDXRP,GLXBTC,GLYPHBTC,GLYPHLTC,GLYPHXRP,GMELTC,GMLBTC,GUEBTC,GUELTC,HALBTC,HALXRP,HBNBTC,HBNXRP,HTML5LTC,HTML5XRP,HUCBTC,HUCXRP,HVCBTC,HVCXRP,HYPBTC,ICBBTC,ICBXRP,IFCBTC,IFCLTC,IFCXRP,IOCBTC,IOCXRP,IXCBTC,IXCXRP,JBSBTC,JKCBTC,JUDGEBTC,JUDGEXRP,KARMLTC,KARMXRP,KDCBTC,KEYBTC,KEYXRP,KGCBTC,LABBTC,LEAFLTC,LEAFXRP,LGDBTC,LK7BTC,LKYBTC,LKYXRP,LOTLTC,LOTXRP,LSDBTC,LSDXRP,LTBBTC,LTBXRP,LTCBTC,LTCUSD,LTCXRP,LTCDBTC,LTCDXRP,LTCXBTC,LTCXLTC,LXCBTC,LXCXRP,LYCBTC,MAXBTC,MAXLTC,MAXXRP,MECBTC,MECLTC,MECXRP,MEDBTC,MEMLTC,MEOWLTC,MEOWXRP,MINBTC,MINTBTC,MINTXRP,MNBTC,MNCBTC,MNCXRP,MNEBTC,MOONLTC,MOONXRP,MRYBTC,MRYXRP,MSTLTC,MYRBTC,MYRXRP,MYSTBTC,MZCBTC,MZCXRP,NANBTC,NAUTBTC,NAUTXRP,NAVBTC,NAVXRP,NBLBTC,NECBTC,NECXRP,NETBTC,NETLTC,NETXRP,NMBBTC,NMBXRP,NMCBTC,NMCXRP,NOBLBTC,NRBBTC,NRSBTC,NVCBTC,NVCXRP,NXTBTC,NXTLTC,NXTUSD,NXTXRP,NYANBTC,NYANLTC,OPALBTC,OPALXRP,ORBBTC,ORBXRP,OSCBTC,OSCXRP,PHSBTC,PHSXRP,PointsBTC,POTBTC,POTXRP,PPCBTC,PPCLTC,PPCUSD,PPCXRP,PSEUDBTC,PTSBTC,PTSXRP,PXCBTC,PXCLTC,PXCXRP,PYCBTC,QRKBTC,QRKLTC,QRKXRP,RBBTLTC,RDDBTC,RDDLTC,RDDUSD,RDDXRP,REDLTC,RIPOBTC,RPCBTC,RT2BTC,RYCBTC,RZRBTC,RZRLTC,RZRXRP,SAT2BTC,SBCBTC,SBCLTC,SDCBTC,SDCXRP,SFRBTC,SFRXRP,SHADEBTC,SHADEXRP,SHLDBTC,SILKBTC,SILKXRP,SLGBTC,SLGXRP,SMCBTC,SOLEBTC,SPABTC,SPAXRP,SPTBTC,SRCBTC,SRCXRP,SSVBTC,SSVXRP,STRBTC,SUPERBTC,SUPERLTC,SUPERXRP,SWIFTBTC,SXCBTC,SXCLTC,SXCXRP,SYNCBTC,SYSBTC,SYSXRP,TAGBTC,TAGXRP,TAKBTC,TEKBTC,TEKXRP,TESBTC,TESLTC,TESXRP,TGCBTC,TIPSLTC,TIPSXRP,TITBTC,TIXLTC,TORBTC,TRCBTC,TRCXRP,TTCBTC,ULTCBTC,UNBBTC,UNBXRP,UNOBTC,UNOXRP,UROBTC,UROXRP,USDeBTC,USDeXRP,UTCBTC,UTCXRP,UTILBTC,VDOBTC,VIABTC,VIAXRP,VOOTBTC,VRCBTC,VRCLTC,VRCXRP,VTCBTC,VTCLTC,VTCXRP,WCBTC,WCXRP,WDCBTC,WDCLTC,WDCXRP,XAIBTC,XBOTBTC,XBOTXRP,XCBTC,XCLTC,XCXRP,XCASHBTC,XCRBTC,XCRXRP,XJOBTC,XLBBTC,XNCLTC,XPMBTC,XPMLTC,XPMXRP,XPYBTC,XPYUSD,XRPBTC,XRPUSD,XSTBTC,XSTXRP,XXXBTC,XXXXRP,YACBTC,YACLTC,YACXRP,YBCBTC,ZCCBTC,ZEDBTC,ZEITLTC,ZEITXRP,ZETBTC,ZETLTC,ZETXRP,ZRCBTC,ZRCUSD", - "ClientID": "Password", - "APIKey": "Key", - "APISecret": "Secret", - "BaseCurrencies": "USD", - "Enabled": true, - "Verbose": false, - "Websocket": true, - "RESTPollingDelay": 10 - }, - { - "Name": "Huobi", - "Pairs": "BTCCNY,LTCCNY,LTCBTC", - "APIKey": "Key", - "APISecret": "Secret", - "BaseCurrencies": "CNY", - "Enabled": true, - "Verbose": false, - "Websocket": false, - "RESTPollingDelay": 10 - }, - { - "Name": "ITBIT", - "Pairs": "XBTUSD,XBTSGD,XBTEUR", - "APIKey": "Key", - "APISecret": "Secret", - "ClientID": "ClientID", - "BaseCurrencies": "USD,SGD,EUR", - "Enabled": true, - "Verbose": false, - "Websocket": false, - "RESTPollingDelay": 10 - }, - { - "Name": "Kraken", - "Pairs": "XBTEUR,XBTUSD,XBTGBP,XBTJPY,LTCEUR,LTCUSD,EURXVN,USDXVN,XBTLTC,XBTNMC,XBTSTR,XBTXDG,XBTXRP,XBTXVN", - "APIKey": "Key", - "APISecret": "Secret", - "BaseCurrencies": "EUR,USD,GBP,JPY", - "Enabled": true, - "Verbose": false, - "Websocket": false, - "RESTPollingDelay": 10 - }, - { - "Name": "LakeBTC", - "Pairs": "BTCCNY,LTCCNY,LTCBTC", - "APIKey": "Key", - "APISecret": "Secret", - "BaseCurrencies": "CNY", - "Enabled": true, - "Verbose": false, - "Websocket": true, - "RESTPollingDelay": 10 - }, - { - "Name": "OKCOIN China", - "Pairs": "BTCCNY,LTCCNY", - "APIKey": "Key", - "APISecret": "Secret", - "BaseCurrencies": "CNY", - "Enabled": true, - "Verbose": false, - "Websocket": true, - "RESTPollingDelay": 10 - }, - { - "Name": "OKCOIN International", - "Pairs": "BTCUSD,LTCUSD", - "APIKey": "Key", - "APISecret": "Secret", - "BaseCurrencies": "USD", - "Enabled": true, - "Verbose": false, - "Websocket": true, - "RESTPollingDelay": 10 - } - ] + "Name": "Skynet", + "SMSGlobalUsername": "Username", + "SMSGlobalPassword": "Password", + "SMSContacts": [ + { + "Name": "Bob", + "Number": "12345", + "Enabled": false + } + ], + "Exchanges": [ + { + "Name": "ANX", + "AvailablePairs": "BTCUSD,BTCHKD,BTCEUR,BTCCAD,BTCAUD,BTCSGD,BTCJPY,BTCGBP,BTCNZD,LTCBTC,DOGEBTC,STRBTC,XRPBTC", + "EnabledPairs": "BTCUSD,BTCHKD,BTCEUR,BTCCAD,BTCAUD,BTCSGD,BTCJPY,BTCGBP,BTCNZD,LTCBTC,DOGEBTC,STRBTC,XRPBTC", + "APIKey": "Key", + "APISecret": "Secret", + "BaseCurrencies": "USD,HKD,EUR,CAD,AUD,SGD,JPY,GBP,NZD", + "Enabled": true, + "Verbose": false, + "Websocket": false, + "RESTPollingDelay": 10 + }, + { + "Name": "Bitfinex", + "AvailablePairs": "BTCUSD,LTCUSD,DRKUSD", + "EnabledPairs": "BTCUSD,LTCUSD,DRKUSD", + "APIKey": "Key", + "APISecret": "Secret", + "BaseCurrencies": "USD", + "Enabled": true, + "Verbose": false, + "Websocket": false, + "RESTPollingDelay": 10 + }, + { + "Name": "Bitstamp", + "AvailablePairs": "BTCUSD", + "EnabledPairs": "BTCUSD", + "ClientID": "ClientID", + "APIKey": "Key", + "APISecret": "Secret", + "BaseCurrencies": "USD", + "Enabled": true, + "Verbose": false, + "Websocket": true, + "RESTPollingDelay": 10 + }, + { + "Name": "BTC China", + "AvailablePairs": "BTCCNY,LTCCNY,LTCBTC", + "EnabledPairs": "BTCCNY,LTCCNY,LTCBTC", + "APIKey": "Key", + "APISecret": "Secret", + "BaseCurrencies": "CNY", + "Enabled": true, + "Verbose": false, + "Websocket": false, + "RESTPollingDelay": 10 + }, + { + "Name": "BTCE", + "AvailablePairs": "BTCUSD,BTCRUR,BTCEUR,BTCCNH,BTCGBP,LTCBTC,LTCUSD,LTCRUR,LTCEUR,LTCCNH,LTCGBP,NMCBTC,NMCUSD,NVCBTC,NVCUSD,USDRUR,EURUSD,EURRUR,USDCNH,GDPUSD,PPCBTC,PPCUSD", + "EnabledPairs": "BTCUSD,BTCRUR,BTCEUR,BTCCNH,BTCGBP,LTCBTC,LTCUSD,LTCRUR,LTCEUR,LTCCNH,LTCGBP,NMCBTC,NMCUSD,NVCBTC,NVCUSD,USDRUR,EURUSD,EURRUR,USDCNH,GDPUSD,PPCBTC,PPCUSD", + "APIKey": "Key", + "APISecret": "Secret", + "BaseCurrencies": "USD,RUB,EUR,CNY,GBP", + "Enabled": true, + "Verbose": false, + "Websocket": false, + "RESTPollingDelay": 10 + }, + { + "Name": "BTC Markets", + "AvailablePairs": "LTC,BTC", + "EnabledPairs": "LTC,BTC", + "APIKey": "Key", + "APISecret": "Secret", + "BaseCurrencies": "AUD", + "Enabled": true, + "Verbose": false, + "Websocket": false, + "RESTPollingDelay": 10 + }, + { + "Name": "Coinbase", + "AvailablePairs": "BTCUSD,BTCGBP,BTCEUR", + "EnabledPairs": "BTCUSD,BTCGBP,BTCEUR", + "ClientID": "Password", + "APIKey": "Key", + "APISecret": "Secret", + "BaseCurrencies": "USD,GBP,EUR", + "Enabled": true, + "Verbose": false, + "Websocket": true, + "RESTPollingDelay": 10 + }, + { + "Name": "Cryptsy", + "AvailablePairs": "42BTC,42XRP,ACBTC,ACXRP,ACOINBTC,ADTLTC,AEROBTC,AEROXRP,AGSBTC,ALFBTC,ALNBTC,ALNXRP,AMCBTC,ANCBTC,ANCLTC,ANCXRP,APEXBTC,APEXXRP,ARCHBTC,ARGBTC,ARGXRP,ARIBTC,ASCLTC,AURBTC,AURLTC,AURXRP,AXRBTC,BATLTC,BCXBTC,BENBTC,BETBTC,BITBBTC,BLKBTC,BLKLTC,BLKXRP,BLUBTC,BLUXRP,BNCRBTC,BOSTBTC,BQCBTC,BTBBTC,BTBXRP,BTCUSD,BTCDBTC,BTCDXRP,BTEBTC,BTGBTC,BTGXRP,BTMBTC,BTMXRP,BUKBTC,CACHBTC,CAIxBTC,CANNBTC,CANNXRP,CAPBTC,CAPXRP,CASHBTC,CATBTC,CBXBTC,CBXLTC,CBXXRP,CCNBTC,CENTXRP,CINBTC,CINNIBTC,CKCBTC,CKCXRP,CLAMBTC,CLOAKBTC,CLOAKLTC,CLOAKXRP,CLRBTC,CLRXRP,CMCBTC,CNCBTC,CNCLTC,CNCXRP,CNLBTC,COLLTC,COLXRP,COMMBTC,COOLBTC,CPRLTC,CRACKBTC,CRACKXRP,CRAIGBTC,CRAIGXRP,CRCBTC,CRYPTBTC,CRYPTLTC,CRYPTXRP,CSCBTC,CTMLTC,DBLLTC,DEMBTC,DEMXRP,DGBBTC,DGBXRP,DGCBTC,DGCLTC,DGCXRP,DIMELTC,DMCLTC,DMDBTC,DMDXRP,DOGEBTC,DOGELTC,DOGEUSD,DOGEXRP,DOGEDBTC,DRKBTC,DRKLTC,DRKUSD,DRKXRP,DRKCBTC,DRKCXRP,DSBBTC,DTBTC,DTXRP,DVCBTC,DVCLTC,DVCXRP,EACBTC,EACLTC,EACXRP,EFLBTC,ELCBTC,ELPLTC,EMC2BTC,EMC2XRP,EMDBTC,EXCLBTC,EXEBTC,EXEXRP,EZCBTC,EZCLTC,FC2BTC,FFCBTC,FFCXRP,FIBREBTC,FIBREXRP,FLAPLTC,FLAPXRP,FLOLTC,FLOXRP,FLTBTC,FLTXRP,FRACBTC,FRCBTC,FRCXRP,FRKBTC,FRKLTC,FRKXRP,FSTBTC,FSTLTC,FTCBTC,FTCLTC,FTCUSD,FTCXRP,GBBTC,GBXRP,GDCBTC,GLCBTC,GLDBTC,GLDLTC,GLDXRP,GLXBTC,GLYPHBTC,GLYPHLTC,GLYPHXRP,GMELTC,GMLBTC,GUEBTC,GUELTC,HALBTC,HALXRP,HBNBTC,HBNXRP,HTML5LTC,HTML5XRP,HUCBTC,HUCXRP,HVCBTC,HVCXRP,HYPBTC,ICBBTC,ICBXRP,IFCBTC,IFCLTC,IFCXRP,IOCBTC,IOCXRP,IXCBTC,IXCXRP,JBSBTC,JKCBTC,JUDGEBTC,JUDGEXRP,KARMLTC,KARMXRP,KDCBTC,KEYBTC,KEYXRP,KGCBTC,LABBTC,LEAFLTC,LEAFXRP,LGDBTC,LK7BTC,LKYBTC,LKYXRP,LOTLTC,LOTXRP,LSDBTC,LSDXRP,LTBBTC,LTBXRP,LTCBTC,LTCUSD,LTCXRP,LTCDBTC,LTCDXRP,LTCXBTC,LTCXLTC,LXCBTC,LXCXRP,LYCBTC,MAXBTC,MAXLTC,MAXXRP,MECBTC,MECLTC,MECXRP,MEDBTC,MEMLTC,MEOWLTC,MEOWXRP,MINBTC,MINTBTC,MINTXRP,MNBTC,MNCBTC,MNCXRP,MNEBTC,MOONLTC,MOONXRP,MRYBTC,MRYXRP,MSTLTC,MYRBTC,MYRXRP,MYSTBTC,MZCBTC,MZCXRP,NANBTC,NAUTBTC,NAUTXRP,NAVBTC,NAVXRP,NBLBTC,NECBTC,NECXRP,NETBTC,NETLTC,NETXRP,NMBBTC,NMBXRP,NMCBTC,NMCXRP,NOBLBTC,NRBBTC,NRSBTC,NVCBTC,NVCXRP,NXTBTC,NXTLTC,NXTUSD,NXTXRP,NYANBTC,NYANLTC,OPALBTC,OPALXRP,ORBBTC,ORBXRP,OSCBTC,OSCXRP,PHSBTC,PHSXRP,PointsBTC,POTBTC,POTXRP,PPCBTC,PPCLTC,PPCUSD,PPCXRP,PSEUDBTC,PTSBTC,PTSXRP,PXCBTC,PXCLTC,PXCXRP,PYCBTC,QRKBTC,QRKLTC,QRKXRP,RBBTLTC,RDDBTC,RDDLTC,RDDUSD,RDDXRP,REDLTC,RIPOBTC,RPCBTC,RT2BTC,RYCBTC,RZRBTC,RZRLTC,RZRXRP,SAT2BTC,SBCBTC,SBCLTC,SDCBTC,SDCXRP,SFRBTC,SFRXRP,SHADEBTC,SHADEXRP,SHLDBTC,SILKBTC,SILKXRP,SLGBTC,SLGXRP,SMCBTC,SOLEBTC,SPABTC,SPAXRP,SPTBTC,SRCBTC,SRCXRP,SSVBTC,SSVXRP,STRBTC,SUPERBTC,SUPERLTC,SUPERXRP,SWIFTBTC,SXCBTC,SXCLTC,SXCXRP,SYNCBTC,SYSBTC,SYSXRP,TAGBTC,TAGXRP,TAKBTC,TEKBTC,TEKXRP,TESBTC,TESLTC,TESXRP,TGCBTC,TIPSLTC,TIPSXRP,TITBTC,TIXLTC,TORBTC,TRCBTC,TRCXRP,TTCBTC,ULTCBTC,UNBBTC,UNBXRP,UNOBTC,UNOXRP,UROBTC,UROXRP,USDeBTC,USDeXRP,UTCBTC,UTCXRP,UTILBTC,VDOBTC,VIABTC,VIAXRP,VOOTBTC,VRCBTC,VRCLTC,VRCXRP,VTCBTC,VTCLTC,VTCXRP,WCBTC,WCXRP,WDCBTC,WDCLTC,WDCXRP,XAIBTC,XBOTBTC,XBOTXRP,XCBTC,XCLTC,XCXRP,XCASHBTC,XCRBTC,XCRXRP,XJOBTC,XLBBTC,XNCLTC,XPMBTC,XPMLTC,XPMXRP,XPYBTC,XPYUSD,XRPBTC,XRPUSD,XSTBTC,XSTXRP,XXXBTC,XXXXRP,YACBTC,YACLTC,YACXRP,YBCBTC,ZCCBTC,ZEDBTC,ZEITLTC,ZEITXRP,ZETBTC,ZETLTC,ZETXRP,ZRCBTC,ZRCUSD", + "EnabledPairs": "42BTC,42XRP,ACBTC,ACXRP,ACOINBTC,ADTLTC,AEROBTC,AEROXRP,AGSBTC,ALFBTC,ALNBTC,ALNXRP,AMCBTC,ANCBTC,ANCLTC,ANCXRP,APEXBTC,APEXXRP,ARCHBTC,ARGBTC,ARGXRP,ARIBTC,ASCLTC,AURBTC,AURLTC,AURXRP,AXRBTC,BATLTC,BCXBTC,BENBTC,BETBTC,BITBBTC,BLKBTC,BLKLTC,BLKXRP,BLUBTC,BLUXRP,BNCRBTC,BOSTBTC,BQCBTC,BTBBTC,BTBXRP,BTCUSD,BTCDBTC,BTCDXRP,BTEBTC,BTGBTC,BTGXRP,BTMBTC,BTMXRP,BUKBTC,CACHBTC,CAIxBTC,CANNBTC,CANNXRP,CAPBTC,CAPXRP,CASHBTC,CATBTC,CBXBTC,CBXLTC,CBXXRP,CCNBTC,CENTXRP,CINBTC,CINNIBTC,CKCBTC,CKCXRP,CLAMBTC,CLOAKBTC,CLOAKLTC,CLOAKXRP,CLRBTC,CLRXRP,CMCBTC,CNCBTC,CNCLTC,CNCXRP,CNLBTC,COLLTC,COLXRP,COMMBTC,COOLBTC,CPRLTC,CRACKBTC,CRACKXRP,CRAIGBTC,CRAIGXRP,CRCBTC,CRYPTBTC,CRYPTLTC,CRYPTXRP,CSCBTC,CTMLTC,DBLLTC,DEMBTC,DEMXRP,DGBBTC,DGBXRP,DGCBTC,DGCLTC,DGCXRP,DIMELTC,DMCLTC,DMDBTC,DMDXRP,DOGEBTC,DOGELTC,DOGEUSD,DOGEXRP,DOGEDBTC,DRKBTC,DRKLTC,DRKUSD,DRKXRP,DRKCBTC,DRKCXRP,DSBBTC,DTBTC,DTXRP,DVCBTC,DVCLTC,DVCXRP,EACBTC,EACLTC,EACXRP,EFLBTC,ELCBTC,ELPLTC,EMC2BTC,EMC2XRP,EMDBTC,EXCLBTC,EXEBTC,EXEXRP,EZCBTC,EZCLTC,FC2BTC,FFCBTC,FFCXRP,FIBREBTC,FIBREXRP,FLAPLTC,FLAPXRP,FLOLTC,FLOXRP,FLTBTC,FLTXRP,FRACBTC,FRCBTC,FRCXRP,FRKBTC,FRKLTC,FRKXRP,FSTBTC,FSTLTC,FTCBTC,FTCLTC,FTCUSD,FTCXRP,GBBTC,GBXRP,GDCBTC,GLCBTC,GLDBTC,GLDLTC,GLDXRP,GLXBTC,GLYPHBTC,GLYPHLTC,GLYPHXRP,GMELTC,GMLBTC,GUEBTC,GUELTC,HALBTC,HALXRP,HBNBTC,HBNXRP,HTML5LTC,HTML5XRP,HUCBTC,HUCXRP,HVCBTC,HVCXRP,HYPBTC,ICBBTC,ICBXRP,IFCBTC,IFCLTC,IFCXRP,IOCBTC,IOCXRP,IXCBTC,IXCXRP,JBSBTC,JKCBTC,JUDGEBTC,JUDGEXRP,KARMLTC,KARMXRP,KDCBTC,KEYBTC,KEYXRP,KGCBTC,LABBTC,LEAFLTC,LEAFXRP,LGDBTC,LK7BTC,LKYBTC,LKYXRP,LOTLTC,LOTXRP,LSDBTC,LSDXRP,LTBBTC,LTBXRP,LTCBTC,LTCUSD,LTCXRP,LTCDBTC,LTCDXRP,LTCXBTC,LTCXLTC,LXCBTC,LXCXRP,LYCBTC,MAXBTC,MAXLTC,MAXXRP,MECBTC,MECLTC,MECXRP,MEDBTC,MEMLTC,MEOWLTC,MEOWXRP,MINBTC,MINTBTC,MINTXRP,MNBTC,MNCBTC,MNCXRP,MNEBTC,MOONLTC,MOONXRP,MRYBTC,MRYXRP,MSTLTC,MYRBTC,MYRXRP,MYSTBTC,MZCBTC,MZCXRP,NANBTC,NAUTBTC,NAUTXRP,NAVBTC,NAVXRP,NBLBTC,NECBTC,NECXRP,NETBTC,NETLTC,NETXRP,NMBBTC,NMBXRP,NMCBTC,NMCXRP,NOBLBTC,NRBBTC,NRSBTC,NVCBTC,NVCXRP,NXTBTC,NXTLTC,NXTUSD,NXTXRP,NYANBTC,NYANLTC,OPALBTC,OPALXRP,ORBBTC,ORBXRP,OSCBTC,OSCXRP,PHSBTC,PHSXRP,PointsBTC,POTBTC,POTXRP,PPCBTC,PPCLTC,PPCUSD,PPCXRP,PSEUDBTC,PTSBTC,PTSXRP,PXCBTC,PXCLTC,PXCXRP,PYCBTC,QRKBTC,QRKLTC,QRKXRP,RBBTLTC,RDDBTC,RDDLTC,RDDUSD,RDDXRP,REDLTC,RIPOBTC,RPCBTC,RT2BTC,RYCBTC,RZRBTC,RZRLTC,RZRXRP,SAT2BTC,SBCBTC,SBCLTC,SDCBTC,SDCXRP,SFRBTC,SFRXRP,SHADEBTC,SHADEXRP,SHLDBTC,SILKBTC,SILKXRP,SLGBTC,SLGXRP,SMCBTC,SOLEBTC,SPABTC,SPAXRP,SPTBTC,SRCBTC,SRCXRP,SSVBTC,SSVXRP,STRBTC,SUPERBTC,SUPERLTC,SUPERXRP,SWIFTBTC,SXCBTC,SXCLTC,SXCXRP,SYNCBTC,SYSBTC,SYSXRP,TAGBTC,TAGXRP,TAKBTC,TEKBTC,TEKXRP,TESBTC,TESLTC,TESXRP,TGCBTC,TIPSLTC,TIPSXRP,TITBTC,TIXLTC,TORBTC,TRCBTC,TRCXRP,TTCBTC,ULTCBTC,UNBBTC,UNBXRP,UNOBTC,UNOXRP,UROBTC,UROXRP,USDeBTC,USDeXRP,UTCBTC,UTCXRP,UTILBTC,VDOBTC,VIABTC,VIAXRP,VOOTBTC,VRCBTC,VRCLTC,VRCXRP,VTCBTC,VTCLTC,VTCXRP,WCBTC,WCXRP,WDCBTC,WDCLTC,WDCXRP,XAIBTC,XBOTBTC,XBOTXRP,XCBTC,XCLTC,XCXRP,XCASHBTC,XCRBTC,XCRXRP,XJOBTC,XLBBTC,XNCLTC,XPMBTC,XPMLTC,XPMXRP,XPYBTC,XPYUSD,XRPBTC,XRPUSD,XSTBTC,XSTXRP,XXXBTC,XXXXRP,YACBTC,YACLTC,YACXRP,YBCBTC,ZCCBTC,ZEDBTC,ZEITLTC,ZEITXRP,ZETBTC,ZETLTC,ZETXRP,ZRCBTC,ZRCUSD", + "ClientID": "Password", + "APIKey": "Key", + "APISecret": "Secret", + "BaseCurrencies": "USD", + "Enabled": true, + "Verbose": false, + "Websocket": true, + "RESTPollingDelay": 10 + }, + { + "Name": "Huobi", + "AvailablePairs": "BTCCNY,LTCCNY", + "EnabledPairs": "BTCCNY,LTCCNY", + "APIKey": "Key", + "APISecret": "Secret", + "BaseCurrencies": "CNY", + "Enabled": true, + "Verbose": false, + "Websocket": false, + "RESTPollingDelay": 10 + }, + { + "Name": "ITBIT", + "AvailablePairs": "XBTUSD,XBTSGD,XBTEUR", + "EnabledPairs": "XBTUSD,XBTSGD,XBTEUR", + "APIKey": "Key", + "APISecret": "Secret", + "ClientID": "ClientID", + "BaseCurrencies": "USD,SGD,EUR", + "Enabled": true, + "Verbose": false, + "Websocket": false, + "RESTPollingDelay": 10 + }, + { + "Name": "Kraken", + "AvailablePairs": "XBTEUR,XBTUSD,XBTGBP,XBTJPY,LTCEUR,LTCUSD,EURXVN,USDXVN,XBTLTC,XBTNMC,XBTSTR,XBTXDG,XBTXRP,XBTXVN", + "EnabledPairs": "XBTEUR,XBTUSD,XBTGBP,XBTJPY,LTCEUR,LTCUSD,EURXVN,USDXVN,XBTLTC,XBTNMC,XBTSTR,XBTXDG,XBTXRP,XBTXVN", + "APIKey": "Key", + "APISecret": "Secret", + "BaseCurrencies": "EUR,USD,GBP,JPY", + "Enabled": true, + "Verbose": false, + "Websocket": false, + "RESTPollingDelay": 10 + }, + { + "Name": "LakeBTC", + "AvailablePairs": "BTCUSD,BTCCNY", + "EnabledPairs": "BTCUSD,BTCCNY", + "APIKey": "Key", + "APISecret": "Secret", + "BaseCurrencies": "USD,CNY,SEK", + "Enabled": true, + "Verbose": false, + "Websocket": true, + "RESTPollingDelay": 10 + }, + { + "Name": "OKCOIN China", + "AvailablePairs": "BTCCNY,LTCCNY", + "EnabledPairs": "BTCCNY,LTCCNY", + "APIKey": "Key", + "APISecret": "Secret", + "BaseCurrencies": "CNY", + "Enabled": true, + "Verbose": false, + "Websocket": true, + "RESTPollingDelay": 10 + }, + { + "Name": "OKCOIN International", + "AvailablePairs": "BTCUSD,LTCUSD", + "EnabledPairs": "BTCUSD,LTCUSD", + "APIKey": "Key", + "APISecret": "Secret", + "BaseCurrencies": "USD", + "Enabled": true, + "Verbose": false, + "Websocket": true, + "RESTPollingDelay": 10 + } + ] } \ No newline at end of file diff --git a/cryptsyhttp.go b/cryptsyhttp.go index 2b24e661..f90de500 100644 --- a/cryptsyhttp.go +++ b/cryptsyhttp.go @@ -39,7 +39,8 @@ type Cryptsy struct { APIKey, APISecret string TakerFee, MakerFee float64 BaseCurrencies []string - Pairs []string + AvailablePairs []string + EnabledPairs []string } type CryptsyMarket struct { diff --git a/events.go b/events.go index c7487b79..6dd705fa 100644 --- a/events.go +++ b/events.go @@ -126,7 +126,7 @@ func (e *Event) CheckCondition() bool { } else if bot.exchange.itbit.GetName() == e.Exchange { lastPrice = bot.exchange.itbit.GetTicker("XBTUSD").LastPrice } else if bot.exchange.btce.GetName() == e.Exchange { - lastPrice = bot.exchange.btce.GetTicker("btc_usd").Last + lastPrice = bot.exchange.btce.Ticker["btc_usd"].Last } else if bot.exchange.btcmarkets.GetName() == e.Exchange { lastPrice = bot.exchange.btcmarkets.Ticker["BTC"].LastPrice } else if bot.exchange.okcoinChina.GetName() == e.Exchange { diff --git a/huobihttp.go b/huobihttp.go index 118f0bb4..86d64d95 100644 --- a/huobihttp.go +++ b/huobihttp.go @@ -23,7 +23,8 @@ type HUOBI struct { AccessKey, SecretKey string Fee float64 BaseCurrencies []string - Pairs []string + AvailablePairs []string + EnabledPairs []string } type HuobiTicker struct { @@ -74,6 +75,7 @@ func (h *HUOBI) Run() { if h.Verbose { log.Printf("%s Websocket: %s (url: %s).\n", h.GetName(), IsEnabled(h.Websocket), HUOBI_SOCKETIO_ADDRESS) log.Printf("%s polling delay: %ds.\n", h.GetName(), h.RESTPollingDelay) + log.Printf("%s %d currencies enabled: %s.\n", h.GetName(), len(h.EnabledPairs), h.EnabledPairs) } if h.Websocket { @@ -81,23 +83,17 @@ func (h *HUOBI) Run() { } for h.Enabled { - go func() { - HuobiBTC := h.GetTicker("btc") - HuobiBTCLastUSD, _ := ConvertCurrency(HuobiBTC.Last, "CNY", "USD") - HuobiBTCHighUSD, _ := ConvertCurrency(HuobiBTC.High, "CNY", "USD") - HuobiBTCLowUSD, _ := ConvertCurrency(HuobiBTC.Low, "CNY", "USD") - log.Printf("Huobi BTC: Last %f (%f) High %f (%f) Low %f (%f) Volume %f\n", HuobiBTCLastUSD, HuobiBTC.Last, HuobiBTCHighUSD, HuobiBTC.High, HuobiBTCLowUSD, HuobiBTC.Low, HuobiBTC.Vol) - AddExchangeInfo(h.GetName(), "BTC", HuobiBTCLastUSD, HuobiBTC.Vol) - }() - - go func() { - HuobiLTC := h.GetTicker("ltc") - HuobiLTCLastUSD, _ := ConvertCurrency(HuobiLTC.Last, "CNY", "USD") - HuobiLTCHighUSD, _ := ConvertCurrency(HuobiLTC.High, "CNY", "USD") - HuobiLTCLowUSD, _ := ConvertCurrency(HuobiLTC.Low, "CNY", "USD") - log.Printf("Huobi LTC: Last %f (%f) High %f (%f) Low %f (%f) Volume %f\n", HuobiLTCLastUSD, HuobiLTC.Last, HuobiLTCHighUSD, HuobiLTC.High, HuobiLTCLowUSD, HuobiLTC.Low, HuobiLTC.Vol) - AddExchangeInfo(h.GetName(), "LTC", HuobiLTCLastUSD, HuobiLTC.Vol) - }() + for _, x := range h.EnabledPairs { + currency := StringToLower(x[0:3]) + go func() { + ticker := h.GetTicker(currency) + HuobiLastUSD, _ := ConvertCurrency(ticker.Last, "CNY", "USD") + HuobiHighUSD, _ := ConvertCurrency(ticker.High, "CNY", "USD") + HuobiLowUSD, _ := ConvertCurrency(ticker.Low, "CNY", "USD") + log.Printf("Huobi %s: Last %f (%f) High %f (%f) Low %f (%f) Volume %f\n", currency, HuobiLastUSD, ticker.Last, HuobiHighUSD, ticker.High, HuobiLowUSD, ticker.Low, ticker.Vol) + AddExchangeInfo(h.GetName(), StringToUpper(currency), HuobiLastUSD, ticker.Vol) + }() + } time.Sleep(time.Second * h.RESTPollingDelay) } } diff --git a/huobiwebsocket.go b/huobiwebsocket.go index 44115988..75b4327f 100644 --- a/huobiwebsocket.go +++ b/huobiwebsocket.go @@ -163,19 +163,15 @@ func (h *HUOBI) OnConnect(output chan socketio.Message) { log.Printf("%s Connected to Websocket.", h.GetName()) } - msg := h.BuildHuobiWebsocketRequestExtra(HUOBI_SOCKET_REQ_SUBSCRIBE, 100, h.BuildHuobiWebsocketParamsList(HUOBI_SOCKET_MARKET_OVERVIEW, "btccny", "pushLong", "", "", "", "", "")) - result, err := JSONEncode(msg) - if err != nil { - log.Println(err) + for _, x := range h.EnabledPairs { + currency := StringToLower(x) + msg := h.BuildHuobiWebsocketRequestExtra(HUOBI_SOCKET_REQ_SUBSCRIBE, 100, h.BuildHuobiWebsocketParamsList(HUOBI_SOCKET_MARKET_OVERVIEW, currency, "pushLong", "", "", "", "", "")) + result, err := JSONEncode(msg) + if err != nil { + log.Println(err) + } + output <- socketio.CreateMessageEvent("request", string(result), nil, HuobiSocket.Version) } - output <- socketio.CreateMessageEvent("request", string(result), nil, HuobiSocket.Version) - - msg = h.BuildHuobiWebsocketRequestExtra(HUOBI_SOCKET_REQ_SUBSCRIBE, 100, h.BuildHuobiWebsocketParamsList(HUOBI_SOCKET_MARKET_OVERVIEW, "ltccny", "pushLong", "", "", "", "", "")) - result, err = JSONEncode(msg) - if err != nil { - log.Println(err) - } - output <- socketio.CreateMessageEvent("request", string(result), nil, HuobiSocket.Version) } func (h *HUOBI) OnDisconnect(output chan socketio.Message) { diff --git a/itbithttp.go b/itbithttp.go index 3b29ff48..13849576 100644 --- a/itbithttp.go +++ b/itbithttp.go @@ -23,7 +23,8 @@ type ItBit struct { ClientKey, APISecret, UserID string MakerFee, TakerFee float64 BaseCurrencies []string - Pairs []string + AvailablePairs []string + EnabledPairs []string } type ItBitTicker struct { diff --git a/kraken.go b/kraken.go index ca5eac53..337744fc 100644 --- a/kraken.go +++ b/kraken.go @@ -45,7 +45,8 @@ type Kraken struct { ClientKey, APISecret string FiatFee, CryptoFee float64 BaseCurrencies []string - Pairs []string + AvailablePairs []string + EnabledPairs []string } type KrakenResponse struct { diff --git a/lakebtchttp.go b/lakebtchttp.go index 38b0d35e..8fbf285b 100644 --- a/lakebtchttp.go +++ b/lakebtchttp.go @@ -33,7 +33,8 @@ type LakeBTC struct { Email, APISecret string TakerFee, MakerFee float64 BaseCurrencies []string - Pairs []string + AvailablePairs []string + EnabledPairs []string } type LakeBTCTicker struct { diff --git a/main.go b/main.go index af7028a4..ff21551f 100644 --- a/main.go +++ b/main.go @@ -103,7 +103,7 @@ func main() { err = RetrieveConfigCurrencyPairs(bot.config) if err != nil { - log.Println("Fatal error retrieving config currency pairs. Error: ", err) + log.Println("Fatal error retrieving config currency AvailablePairs. Error: ", err) } for _, exch := range bot.config.Exchanges { @@ -117,7 +117,8 @@ func main() { bot.exchange.anx.Verbose = exch.Verbose bot.exchange.anx.Websocket = exch.Websocket bot.exchange.anx.BaseCurrencies = SplitStrings(exch.BaseCurrencies, ",") - bot.exchange.anx.Pairs = SplitStrings(exch.Pairs, ",") + bot.exchange.anx.AvailablePairs = SplitStrings(exch.AvailablePairs, ",") + bot.exchange.anx.EnabledPairs = SplitStrings(exch.EnabledPairs, ",") go bot.exchange.anx.Run() } } else if bot.exchange.btcchina.GetName() == exch.Name { @@ -130,7 +131,8 @@ func main() { bot.exchange.btcchina.Verbose = exch.Verbose bot.exchange.btcchina.Websocket = exch.Websocket bot.exchange.btcchina.BaseCurrencies = SplitStrings(exch.BaseCurrencies, ",") - bot.exchange.btcchina.Pairs = SplitStrings(exch.Pairs, ",") + bot.exchange.btcchina.AvailablePairs = SplitStrings(exch.AvailablePairs, ",") + bot.exchange.btcchina.EnabledPairs = SplitStrings(exch.EnabledPairs, ",") go bot.exchange.btcchina.Run() } } else if bot.exchange.bitstamp.GetName() == exch.Name { @@ -143,7 +145,8 @@ func main() { bot.exchange.bitstamp.Verbose = exch.Verbose bot.exchange.bitstamp.Websocket = exch.Websocket bot.exchange.bitstamp.BaseCurrencies = SplitStrings(exch.BaseCurrencies, ",") - bot.exchange.bitstamp.Pairs = SplitStrings(exch.Pairs, ",") + bot.exchange.bitstamp.AvailablePairs = SplitStrings(exch.AvailablePairs, ",") + bot.exchange.bitstamp.EnabledPairs = SplitStrings(exch.EnabledPairs, ",") go bot.exchange.bitstamp.Run() } } else if bot.exchange.bitfinex.GetName() == exch.Name { @@ -156,7 +159,8 @@ func main() { bot.exchange.bitfinex.Verbose = exch.Verbose bot.exchange.bitfinex.Websocket = exch.Websocket bot.exchange.bitfinex.BaseCurrencies = SplitStrings(exch.BaseCurrencies, ",") - bot.exchange.bitfinex.Pairs = SplitStrings(exch.Pairs, ",") + bot.exchange.bitfinex.AvailablePairs = SplitStrings(exch.AvailablePairs, ",") + bot.exchange.bitfinex.EnabledPairs = SplitStrings(exch.EnabledPairs, ",") go bot.exchange.bitfinex.Run() } } else if bot.exchange.btce.GetName() == exch.Name { @@ -169,7 +173,8 @@ func main() { bot.exchange.btce.Verbose = exch.Verbose bot.exchange.btce.Websocket = exch.Websocket bot.exchange.btce.BaseCurrencies = SplitStrings(exch.BaseCurrencies, ",") - bot.exchange.btce.Pairs = SplitStrings(exch.Pairs, ",") + bot.exchange.btce.AvailablePairs = SplitStrings(exch.AvailablePairs, ",") + bot.exchange.btce.EnabledPairs = SplitStrings(exch.EnabledPairs, ",") go bot.exchange.btce.Run() } } else if bot.exchange.btcmarkets.GetName() == exch.Name { @@ -182,7 +187,8 @@ func main() { bot.exchange.btcmarkets.Verbose = exch.Verbose bot.exchange.btcmarkets.Websocket = exch.Websocket bot.exchange.btcmarkets.BaseCurrencies = SplitStrings(exch.BaseCurrencies, ",") - bot.exchange.btcmarkets.Pairs = SplitStrings(exch.Pairs, ",") + bot.exchange.btcmarkets.AvailablePairs = SplitStrings(exch.AvailablePairs, ",") + bot.exchange.btcmarkets.EnabledPairs = SplitStrings(exch.EnabledPairs, ",") go bot.exchange.btcmarkets.Run() } } else if bot.exchange.coinbase.GetName() == exch.Name { @@ -195,7 +201,8 @@ func main() { bot.exchange.coinbase.Verbose = exch.Verbose bot.exchange.coinbase.Websocket = exch.Websocket bot.exchange.coinbase.BaseCurrencies = SplitStrings(exch.BaseCurrencies, ",") - bot.exchange.coinbase.Pairs = SplitStrings(exch.Pairs, ",") + bot.exchange.coinbase.AvailablePairs = SplitStrings(exch.AvailablePairs, ",") + bot.exchange.coinbase.EnabledPairs = SplitStrings(exch.EnabledPairs, ",") go bot.exchange.coinbase.Run() } } else if bot.exchange.cryptsy.GetName() == exch.Name { @@ -208,7 +215,8 @@ func main() { bot.exchange.cryptsy.Verbose = exch.Verbose bot.exchange.cryptsy.Websocket = exch.Websocket bot.exchange.cryptsy.BaseCurrencies = SplitStrings(exch.BaseCurrencies, ",") - bot.exchange.cryptsy.Pairs = SplitStrings(exch.Pairs, ",") + bot.exchange.cryptsy.AvailablePairs = SplitStrings(exch.AvailablePairs, ",") + bot.exchange.cryptsy.EnabledPairs = SplitStrings(exch.EnabledPairs, ",") go bot.exchange.cryptsy.Run() } } else if bot.exchange.okcoinChina.GetName() == exch.Name { @@ -221,7 +229,8 @@ func main() { bot.exchange.okcoinChina.Verbose = exch.Verbose bot.exchange.okcoinChina.Websocket = exch.Websocket bot.exchange.okcoinChina.BaseCurrencies = SplitStrings(exch.BaseCurrencies, ",") - bot.exchange.okcoinChina.Pairs = SplitStrings(exch.Pairs, ",") + bot.exchange.okcoinChina.AvailablePairs = SplitStrings(exch.AvailablePairs, ",") + bot.exchange.okcoinChina.EnabledPairs = SplitStrings(exch.EnabledPairs, ",") go bot.exchange.okcoinChina.Run() } } else if bot.exchange.okcoinIntl.GetName() == exch.Name { @@ -234,7 +243,8 @@ func main() { bot.exchange.okcoinIntl.Verbose = exch.Verbose bot.exchange.okcoinIntl.Websocket = exch.Websocket bot.exchange.okcoinIntl.BaseCurrencies = SplitStrings(exch.BaseCurrencies, ",") - bot.exchange.okcoinIntl.Pairs = SplitStrings(exch.Pairs, ",") + bot.exchange.okcoinIntl.AvailablePairs = SplitStrings(exch.AvailablePairs, ",") + bot.exchange.okcoinIntl.EnabledPairs = SplitStrings(exch.EnabledPairs, ",") go bot.exchange.okcoinIntl.Run() } } else if bot.exchange.itbit.GetName() == exch.Name { @@ -247,7 +257,8 @@ func main() { bot.exchange.itbit.Verbose = exch.Verbose bot.exchange.itbit.Websocket = exch.Websocket bot.exchange.itbit.BaseCurrencies = SplitStrings(exch.BaseCurrencies, ",") - bot.exchange.itbit.Pairs = SplitStrings(exch.Pairs, ",") + bot.exchange.itbit.AvailablePairs = SplitStrings(exch.AvailablePairs, ",") + bot.exchange.itbit.EnabledPairs = SplitStrings(exch.EnabledPairs, ",") go bot.exchange.itbit.Run() } } else if bot.exchange.kraken.GetName() == exch.Name { @@ -260,7 +271,8 @@ func main() { bot.exchange.kraken.Verbose = exch.Verbose bot.exchange.kraken.Websocket = exch.Websocket bot.exchange.kraken.BaseCurrencies = SplitStrings(exch.BaseCurrencies, ",") - bot.exchange.kraken.Pairs = SplitStrings(exch.Pairs, ",") + bot.exchange.kraken.AvailablePairs = SplitStrings(exch.AvailablePairs, ",") + bot.exchange.kraken.EnabledPairs = SplitStrings(exch.EnabledPairs, ",") go bot.exchange.kraken.Run() } } else if bot.exchange.lakebtc.GetName() == exch.Name { @@ -273,7 +285,8 @@ func main() { bot.exchange.lakebtc.Verbose = exch.Verbose bot.exchange.lakebtc.Websocket = exch.Websocket bot.exchange.lakebtc.BaseCurrencies = SplitStrings(exch.BaseCurrencies, ",") - bot.exchange.lakebtc.Pairs = SplitStrings(exch.Pairs, ",") + bot.exchange.lakebtc.AvailablePairs = SplitStrings(exch.AvailablePairs, ",") + bot.exchange.lakebtc.EnabledPairs = SplitStrings(exch.EnabledPairs, ",") go bot.exchange.lakebtc.Run() } } else if bot.exchange.huobi.GetName() == exch.Name { @@ -286,7 +299,8 @@ func main() { bot.exchange.huobi.Verbose = exch.Verbose bot.exchange.huobi.Websocket = exch.Websocket bot.exchange.huobi.BaseCurrencies = SplitStrings(exch.BaseCurrencies, ",") - bot.exchange.huobi.Pairs = SplitStrings(exch.Pairs, ",") + bot.exchange.huobi.AvailablePairs = SplitStrings(exch.AvailablePairs, ",") + bot.exchange.huobi.EnabledPairs = SplitStrings(exch.EnabledPairs, ",") go bot.exchange.huobi.Run() } } diff --git a/okcoinhttp.go b/okcoinhttp.go index 01806e1c..bc95288f 100644 --- a/okcoinhttp.go +++ b/okcoinhttp.go @@ -29,7 +29,8 @@ type OKCoin struct { RESTErrors map[string]string WebsocketErrors map[string]string BaseCurrencies []string - Pairs []string + AvailablePairs []string + EnabledPairs []string } type OKCoinTicker struct {