Added the ability to enable/disable Cryptocurrencies on Exchanges via config file. A few more exchanges need to be completed.

This commit is contained in:
Adrian Gallagher
2015-05-07 03:40:16 +10:00
parent 7b93fde98f
commit 815b22dbeb
21 changed files with 414 additions and 350 deletions

View File

@@ -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)
}
}

View File

@@ -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 {

View File

@@ -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)
}
}

View File

@@ -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)
}
}

View File

@@ -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 {

View File

@@ -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) {

View File

@@ -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)
}
}

View File

@@ -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) {

View File

@@ -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)

View File

@@ -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

View File

@@ -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
}

View File

@@ -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
}
]
}

View File

@@ -39,7 +39,8 @@ type Cryptsy struct {
APIKey, APISecret string
TakerFee, MakerFee float64
BaseCurrencies []string
Pairs []string
AvailablePairs []string
EnabledPairs []string
}
type CryptsyMarket struct {

View File

@@ -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 {

View File

@@ -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)
}
}

View File

@@ -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) {

View File

@@ -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 {

View File

@@ -45,7 +45,8 @@ type Kraken struct {
ClientKey, APISecret string
FiatFee, CryptoFee float64
BaseCurrencies []string
Pairs []string
AvailablePairs []string
EnabledPairs []string
}
type KrakenResponse struct {

View File

@@ -33,7 +33,8 @@ type LakeBTC struct {
Email, APISecret string
TakerFee, MakerFee float64
BaseCurrencies []string
Pairs []string
AvailablePairs []string
EnabledPairs []string
}
type LakeBTCTicker struct {

44
main.go
View File

@@ -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()
}
}

View File

@@ -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 {