diff --git a/brightonpeakhttp.go b/brightonpeakhttp.go new file mode 100644 index 00000000..b587c57e --- /dev/null +++ b/brightonpeakhttp.go @@ -0,0 +1,185 @@ +package main + +import ( + "log" + "time" +) + +const ( + BRIGHTONPEAK_API_URL = "https://api.brightonpeak.com:8400" + BRIGHTONPEAK_WEBSOCKET_URL = "wss://api.brightonpeak.com:8401" +) + +type BrightonPeak struct { + Name string + Enabled bool + Verbose bool + Websocket bool + RESTPollingDelay time.Duration + AuthenticatedAPISupport bool + APIKey, APISecret, ClientID string + TakerFee, MakerFee float64 + BaseCurrencies []string + AvailablePairs []string + EnabledPairs []string + API Alphapoint +} + +func (b *BrightonPeak) SetDefaults() { + b.Name = "Brighton Peak" + b.Enabled = true + b.TakerFee = 0.5 + b.MakerFee = 0.5 + b.Verbose = false + b.Websocket = false + b.RESTPollingDelay = 10 + b.API.APIUrl = BRIGHTONPEAK_API_URL + b.API.WebsocketURL = BRIGHTONPEAK_WEBSOCKET_URL +} + +func (b *BrightonPeak) GetName() string { + return b.Name +} + +func (b *BrightonPeak) SetEnabled(enabled bool) { + b.Enabled = enabled +} + +func (b *BrightonPeak) IsEnabled() bool { + return b.Enabled +} + +func (b *BrightonPeak) SetAPIKeys(apiKey, apiSecret, clientID string) { + b.API.UserID = clientID + b.API.APIKey = apiKey + b.API.APISecret = apiSecret +} + +func (b *BrightonPeak) GetFee(maker bool) float64 { + if maker { + return b.MakerFee + } else { + return b.TakerFee + } +} + +func (b *BrightonPeak) Run() { + if b.Verbose { + log.Printf("%s Websocket: %s. (url: %s).\n", b.GetName(), IsEnabled(b.Websocket), BRIGHTONPEAK_WEBSOCKET_URL) + 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 { + //go b.WebsocketClient() + } + + exchangeProducts, err := b.GetProductPairs() + if err != nil || !exchangeProducts.IsAccepted { + log.Printf("%s Failed to get available products.\n", b.GetName()) + } else { + currencies := []string{} + for _, x := range exchangeProducts.ProductPairs { + currencies = append(currencies, x.Name) + } + diff := StringSliceDifference(b.AvailablePairs, currencies) + if len(diff) > 0 { + exch, err := GetExchangeConfig(b.Name) + if err != nil { + log.Println(err) + } else { + log.Printf("%s Updating available pairs. Difference: %s.\n", b.Name, diff) + exch.AvailablePairs = JoinStrings(currencies, ",") + UpdateExchangeConfig(exch) + } + } + } + + for b.Enabled { + for _, x := range b.EnabledPairs { + ticker, err := b.GetTicker(x) + + if err != nil { + log.Println(err) + continue + } + log.Printf("%s %s Last %f High %f Low %f Volume %f\n", b.GetName(), x, ticker.Last, ticker.High, ticker.Low, ticker.Volume) + AddExchangeInfo(b.GetName(), x[0:3], x[3:], ticker.Last, 0) + } + time.Sleep(time.Second * b.RESTPollingDelay) + } +} + +func (b *BrightonPeak) GetTicker(symbol string) (AlphapointTicker, error) { + return b.API.GetTicker(symbol) +} + +func (b *BrightonPeak) GetTrades(symbol string, startIndex, count int) (AlphapointTrades, error) { + return b.API.GetTrades(symbol, startIndex, count) +} + +func (b *BrightonPeak) GetTradesByDate(symbol string, startIndex, count int) (AlphapointTrades, error) { + return b.API.GetTrades(symbol, startIndex, count) +} + +func (b *BrightonPeak) GetOrderBook(symbol string) (AlphapointOrderbook, error) { + return b.API.GetOrderbook(symbol) +} + +func (b *BrightonPeak) GetProductPairs() (AlphapointProductPairs, error) { + return b.API.GetProductPairs() +} + +func (b *BrightonPeak) GetProducts() (AlphapointProducts, error) { + return b.API.GetProducts() +} + +func (b *BrightonPeak) GreateAccount(firstName, lastName, email, phone, password string) error { + return b.API.CreateAccount(firstName, lastName, email, phone, password) +} + +func (b *BrightonPeak) GetUserInfo() (AlphapointUserInfo, error) { + return b.API.GetUserInfo() +} + +func (b *BrightonPeak) SetUserInfo() {} // to-do + +func (b *BrightonPeak) GetAccountInfo() (AlphapointAccountInfo, error) { + return b.API.GetAccountInfo() +} + +func (b *BrightonPeak) GetAccountTrades(symbol string, startIndex, count int) (AlphapointTrades, error) { + return b.API.GetAccountTrades(symbol, startIndex, count) +} + +func (b *BrightonPeak) GetDepositAddresses() ([]AlphapointDepositAddresses, error) { + return b.API.GetDepositAddresses() +} + +func (b *BrightonPeak) WithdrawCoins(symbol, product string, amount float64, address string) error { + return b.API.WithdrawCoins(symbol, product, amount, address) +} + +func (b *BrightonPeak) CreateOrder(symbol, side string, orderType int, quantity, price float64) (int64, error) { + return b.API.CreateOrder(symbol, side, orderType, quantity, price) +} + +func (b *BrightonPeak) ModifyOrder(symbol string, OrderID, action int64) (int64, error) { + return b.API.ModifyOrder(symbol, OrderID, action) +} + +func (b *BrightonPeak) CancelOrder(symbol string, OrderID int64) (int64, error) { + return b.API.CancelOrder(symbol, OrderID) +} + +func (b *BrightonPeak) CancelAllOrders(symbol string) error { + return b.API.CancelAllOrders(symbol) +} + +func (b *BrightonPeak) GetOrders() ([]AlphapointOpenOrders, error) { + return b.API.GetOrders() +} + +func (b *BrightonPeak) GetOrderFee(symbol, side string, quantity, price float64) (float64, error) { + return b.API.GetOrderFee(symbol, side, quantity, price) +} diff --git a/config_example.json b/config_example.json index 49755576..376da07a 100644 --- a/config_example.json +++ b/config_example.json @@ -61,6 +61,20 @@ "EnabledPairs": "BTCUSD", "BaseCurrencies": "USD" }, + { + "Name": "Brighton Peak", + "Enabled": true, + "Verbose": true, + "Websocket": false, + "RESTPollingDelay": 10, + "AuthenticatedAPISupport": false, + "APIKey": "Key", + "APISecret": "Secret", + "ClientID": "ClientID", + "AvailablePairs": "BTCAUD,LTCAUD,LTCBTC", + "EnabledPairs": "BTCAUD,LTCAUD,LTCBTC", + "BaseCurrencies": "AUD" + }, { "Name": "BTCC", "Enabled": true, diff --git a/events.go b/events.go index 8128df94..e3d3a4c2 100644 --- a/events.go +++ b/events.go @@ -129,6 +129,13 @@ func (e *Event) CheckCondition() bool { } else { lastPrice = result.Last } + } else if bot.exchange.brightonpeak.GetName() == e.Exchange { + result, err := bot.exchange.brightonpeak.GetTicker("BTCUSD") + if err != nil { + lastPrice = 0 + } else { + lastPrice = result.Last + } } else if bot.exchange.coinbase.GetName() == e.Exchange { result, err := bot.exchange.coinbase.GetTicker("BTC-USD") if err != nil { @@ -267,6 +274,7 @@ func CheckEvents() { func IsValidExchange(Exchange string) bool { if bot.exchange.bitfinex.GetName() == Exchange && bot.exchange.bitfinex.IsEnabled() || bot.exchange.bitstamp.GetName() == Exchange && bot.exchange.bitstamp.IsEnabled() || + bot.exchange.brightonpeak.GetName() == Exchange && bot.exchange.brightonpeak.IsEnabled() || bot.exchange.btcc.GetName() == Exchange && bot.exchange.btcc.IsEnabled() || bot.exchange.btce.GetName() == Exchange && bot.exchange.btce.IsEnabled() || bot.exchange.btcmarkets.GetName() == Exchange && bot.exchange.btcmarkets.IsEnabled() || diff --git a/main.go b/main.go index 215df03c..f4d9c42e 100644 --- a/main.go +++ b/main.go @@ -15,6 +15,7 @@ type Exchange struct { btcc BTCC bitstamp Bitstamp bitfinex Bitfinex + brightonpeak BrightonPeak btce BTCE btcmarkets BTCMarkets coinbase Coinbase @@ -97,6 +98,7 @@ func main() { bot.exchange.kraken.SetDefaults() bot.exchange.btcc.SetDefaults() bot.exchange.bitstamp.SetDefaults() + bot.exchange.brightonpeak.SetDefaults() bot.exchange.bitfinex.SetDefaults() bot.exchange.btce.SetDefaults() bot.exchange.btcmarkets.SetDefaults() @@ -181,6 +183,20 @@ func main() { bot.exchange.bitfinex.EnabledPairs = SplitStrings(exch.EnabledPairs, ",") go bot.exchange.bitfinex.Run() } + } else if bot.exchange.brightonpeak.GetName() == exch.Name { + if !exch.Enabled { + bot.exchange.brightonpeak.SetEnabled(false) + } else { + bot.exchange.brightonpeak.AuthenticatedAPISupport = exch.AuthenticatedAPISupport + bot.exchange.brightonpeak.SetAPIKeys(exch.APIKey, exch.APISecret, exch.ClientID) + bot.exchange.brightonpeak.RESTPollingDelay = exch.RESTPollingDelay + bot.exchange.brightonpeak.Verbose = exch.Verbose + bot.exchange.brightonpeak.Websocket = exch.Websocket + bot.exchange.brightonpeak.BaseCurrencies = SplitStrings(exch.BaseCurrencies, ",") + bot.exchange.brightonpeak.AvailablePairs = SplitStrings(exch.AvailablePairs, ",") + bot.exchange.brightonpeak.EnabledPairs = SplitStrings(exch.EnabledPairs, ",") + go bot.exchange.brightonpeak.Run() + } } else if bot.exchange.btce.GetName() == exch.Name { if !exch.Enabled { bot.exchange.btce.SetEnabled(false)