daily progress build

This commit is contained in:
Adrian Gallagher
2019-06-06 17:20:40 +10:00
parent 26795508ff
commit bd8dc47c38
14 changed files with 261 additions and 121 deletions

View File

@@ -33,6 +33,7 @@ type Engine struct {
Exchanges []exchange.IBotExchange
ExchangeCurrencyPairManager *ExchangeCurrencyPairSyncer
OrderManager *OrderManager
PortfolioManager portfolioManager
CommsRelayer *communications.Communications
Connectivity *connchecker.Checker
Shutdown chan bool
@@ -86,11 +87,6 @@ func NewFromSettings(settings *Settings) (*Engine, error) {
return nil, fmt.Errorf("failed to open/create data directory: %s. Err: %s", settings.DataDir, err)
}
err = b.Config.CheckLoggerConfig()
if err != nil {
log.Errorf("Failed to configure logger. Err: %s", err)
}
err = log.SetupLogger()
if err != nil {
log.Errorf("Failed to setup logger. Err: %s", err)
@@ -119,7 +115,7 @@ func ValidateSettings(b *Engine, s *Settings) {
b.Settings.EnableDryRun = s.EnableDryRun
b.Settings.EnableAllExchanges = s.EnableAllExchanges
b.Settings.EnableAllPairs = s.EnableAllPairs
b.Settings.EnablePortfolioWatcher = s.EnablePortfolioWatcher
b.Settings.EnablePortfolioManager = s.EnablePortfolioManager
b.Settings.EnableCoinmarketcapAnalysis = s.EnableCoinmarketcapAnalysis
// TO-DO: FIXME
@@ -159,10 +155,11 @@ func ValidateSettings(b *Engine, s *Settings) {
}
}
b.Settings.EnableConnectivityMonitor = s.EnableConnectivityMonitor
b.Settings.EnableNTPClient = s.EnableNTPClient
b.Settings.EnableTickerRoutine = s.EnableTickerRoutine
b.Settings.EnableOrderbookRoutine = s.EnableOrderbookRoutine
b.Settings.EnableWebsocketRoutine = s.EnableWebsocketRoutine
b.Settings.EnableExchangeSyncManager = s.EnableExchangeSyncManager
b.Settings.EnableTickerSyncing = s.EnableTickerSyncing
b.Settings.EnableOrderbookSyncing = s.EnableOrderbookSyncing
b.Settings.EnableExchangeAutoPairUpdates = s.EnableExchangeAutoPairUpdates
b.Settings.EnableExchangeWebsocketSupport = s.EnableExchangeWebsocketSupport
b.Settings.EnableExchangeRESTSupport = s.EnableExchangeRESTSupport
@@ -222,7 +219,7 @@ func PrintSettings(s *Settings) {
log.Debugf("\t Enable all exchanges: %v", s.EnableAllExchanges)
log.Debugf("\t Enable all pairs: %v", s.EnableAllPairs)
log.Debugf("\t Enable coinmarketcap analaysis: %v", s.EnableCoinmarketcapAnalysis)
log.Debugf("\t Enable portfolio watcher: %v", s.EnablePortfolioWatcher)
log.Debugf("\t Enable portfolio watcher: %v", s.EnablePortfolioManager)
log.Debugf("\t Enable gPRC: %v", s.EnableGRPC)
log.Debugf("\t Enable gRPC Proxy: %v", s.EnableGRPCProxy)
log.Debugf("\t Enable websocket RPC: %v", s.EnableWebsocketRPC)
@@ -230,8 +227,10 @@ func PrintSettings(s *Settings) {
log.Debugf("\t Enable comms relayer: %v", s.EnableCommsRelayer)
log.Debugf("\t Enable event manager: %v", s.EnableEventManager)
log.Debugf("\t Event manager sleep delay: %v", s.EventManagerDelay)
log.Debugf("\t Enable ticker routine: %v", s.EnableTickerRoutine)
log.Debugf("\t Enable orderbook routine: %v", s.EnableOrderbookRoutine)
log.Debugf("\t Enable order manager: %v", s.EnableOrderManager)
log.Debugf("\t Enable exchange sync manager: %v", s.EnableExchangeSyncManager)
log.Debugf("\t Enable ticker syncing: %v", s.EnableTickerSyncing)
log.Debugf("\t Enable orderbook syncing: %v", s.EnableOrderbookSyncing)
log.Debugf("\t Enable websocket routine: %v\n", s.EnableWebsocketRoutine)
log.Debugf("\t Enable NTP client: %v", s.EnableNTPClient)
log.Debugf("- FOREX SETTINGS:")
@@ -266,16 +265,17 @@ func (e *Engine) Start() {
// Sets up internet connectivity monitor
var err error
e.Connectivity, err = connchecker.New(e.Config.ConnectionMonitor.DNSList,
e.Config.ConnectionMonitor.PublicDomainList,
e.Config.ConnectionMonitor.CheckInterval)
if err != nil {
log.Fatalf("Connectivity checker failure: %s", err)
if e.Settings.EnableConnectivityMonitor {
e.Connectivity, err = connchecker.New(e.Config.ConnectionMonitor.DNSList,
e.Config.ConnectionMonitor.PublicDomainList,
e.Config.ConnectionMonitor.CheckInterval)
if err != nil {
log.Fatalf("Connectivity checker failure: %s", err)
}
}
if e.Settings.EnableNTPClient {
if e.Config.NTPClient.Level != -1 {
e.Config.CheckNTPConfig()
NTPTime, errNTP := ntpclient.NTPClient(e.Config.NTPClient.Pool)
currentTime := time.Now()
if errNTP != nil {
@@ -356,10 +356,6 @@ func (e *Engine) Start() {
log.Warn("currency updater system failed to start", err)
}
e.Portfolio = &portfolio.Portfolio
e.Portfolio.Seed(e.Config.Portfolio)
SeedExchangeAccountInfo(GetAllEnabledExchangeAccountInfo().Data)
e.CryptocurrencyDepositAddresses = GetExchangeCryptocurrencyDepositAddresses()
if e.Settings.EnableGRPC {
@@ -375,42 +371,31 @@ func (e *Engine) Start() {
StartWebsocketHandler()
}
if e.Settings.EnablePortfolioWatcher {
go portfolio.StartPortfolioWatcher()
if e.Settings.EnablePortfolioManager {
if err = e.PortfolioManager.Start(); err != nil {
log.Errorf("Fund manager unable to start: %v", err)
}
}
/*
if e.Settings.EnableExchangeSyncManager {
exchangeSyncCfg := CurrencyPairSyncerConfig{
SyncTicker: true,
SyncOrderbook: true,
SyncTicker: e.Settings.EnableTickerSyncing,
SyncOrderbook: e.Settings.EnableOrderbookSyncing,
SyncContinuously: true,
NumWorkers: 15,
}
e.ExchangeCurrencyPairManager, err = NewCurrencyPairSyncer(exchangeSyncCfg)
if err != nil {
log.Warnf("Unable to initialise exchange currency pair syncer. Err: %s", err)
} else {
e.ExchangeCurrencyPairManager.Start()
}
*/
go StartOrderManagerRoutine()
if e.Settings.EnableTickerRoutine {
go TickerUpdaterRoutine()
e.ExchangeCurrencyPairManager, err = NewCurrencyPairSyncer(exchangeSyncCfg)
if err != nil {
log.Warnf("Unable to initialise exchange currency pair syncer. Err: %s", err)
} else {
go e.ExchangeCurrencyPairManager.Start()
}
}
/*
if e.Settings.EnableOrderbookRoutine {
go OrderbookUpdaterRoutine()
}
if e.Settings.EnableWebsocketRoutine {
go WebsocketRoutine()
}
*/
if e.Settings.EnableOrderManager {
go StartOrderManagerRoutine()
}
if e.Settings.EnableEventManager {
go events.EventManger()
@@ -428,9 +413,14 @@ func (e *Engine) Stop() {
e.Config.Portfolio = portfolio.Portfolio
}
if e.PortfolioManager.Started() {
if err := e.PortfolioManager.Stop(); err != nil {
log.Errorf("Fund manager unable to stop. Error: %v", err)
}
}
if !e.Settings.EnableDryRun {
err := e.Config.SaveConfig(e.Settings.ConfigFile)
if err != nil {
log.Error("Unable to save config.")
} else {

View File

@@ -14,17 +14,20 @@ type Settings struct {
EnableAllExchanges bool
EnableAllPairs bool
EnableCoinmarketcapAnalysis bool
EnablePortfolioWatcher bool
EnablePortfolioManager bool
EnableGRPC bool
EnableGRPCProxy bool
EnableWebsocketRPC bool
EnableDeprecatedRPC bool
EnableTickerRoutine bool
EnableOrderbookRoutine bool
EnableWebsocketRoutine bool
EnableCommsRelayer bool
EnableExchangeSyncManager bool
EnableTickerSyncing bool
EnableOrderbookSyncing bool
EnableEventManager bool
EnableOrderManager bool
EnableConnectivityMonitor bool
EnableNTPClient bool
EnableWebsocketRoutine bool
EventManagerDelay time.Duration
Verbose bool

View File

@@ -269,8 +269,9 @@ func LoadExchange(name string, useWG bool, wg *sync.WaitGroup) error {
// SetupExchanges sets up the exchanges used by the Bot
func SetupExchanges() {
var wg sync.WaitGroup
for x := range Bot.Config.Exchanges {
exch := &Bot.Config.Exchanges[x]
exchanges := Bot.Config.GetAllExchangeConfigs()
for x := range exchanges {
exch := exchanges[x]
if CheckExchangeExists(exch.Name) {
e := GetExchangeByName(exch.Name)
if e == nil {

View File

@@ -26,6 +26,14 @@ import (
"github.com/thrasher-/gocryptotrader/utils"
)
// IsOnline returns whether or not the engine has Internet connectivity
func IsOnline() bool {
if Bot.Connectivity == nil {
log.Warnf("IsOnline called but Bot.Connectivity is nil")
}
return Bot.Connectivity.IsConnected()
}
// GetAvailableExchanges returns a list of enabled exchanges
func GetAvailableExchanges() []string {
var enExchanges []string

81
engine/portfolio.go Normal file
View File

@@ -0,0 +1,81 @@
package engine
import (
"errors"
"sync/atomic"
"time"
log "github.com/thrasher-/gocryptotrader/logger"
"github.com/thrasher-/gocryptotrader/portfolio"
)
// vars for the fund manager package
var (
PortfolioSleepDelay = time.Minute
)
type portfolioManager struct {
started int32
stopped int32
shutdown chan struct{}
}
func (p *portfolioManager) Started() bool {
return atomic.LoadInt32(&p.started) == 1
}
func (p *portfolioManager) Start() error {
if atomic.AddInt32(&p.started, 1) != 1 {
return errors.New("portfolio manager already started")
}
log.Debugln("Portfolio manager starting...")
Bot.Portfolio = &portfolio.Portfolio
Bot.Portfolio.Seed(Bot.Config.Portfolio)
p.shutdown = make(chan struct{})
go p.run()
return nil
}
func (p *portfolioManager) Stop() error {
if atomic.AddInt32(&p.stopped, 1) != 1 {
return errors.New("portfolio manager is already stopped")
}
log.Debugln("Portfolio manager shutting down...")
close(p.shutdown)
return nil
}
func (p *portfolioManager) run() {
log.Debugln("Portfolio manager started.")
tick := time.NewTicker(PortfolioSleepDelay)
defer func() {
log.Debugf("Portfolio manager shutdown.")
tick.Stop()
}()
for {
select {
case <-p.shutdown:
return
case <-tick.C:
p.processPortfolio()
}
}
}
func (p *portfolioManager) processPortfolio() {
pf := portfolio.GetPortfolio()
data := pf.GetPortfolioGroupedCoin()
for key, value := range data {
success := pf.UpdatePortfolio(value, key)
if success {
log.Debugf(
"Portfolio manager: Successfully updated address balance for %s address(es) %s\n",
key, value,
)
}
}
SeedExchangeAccountInfo(GetAllEnabledExchangeAccountInfo().Data)
}

View File

@@ -6,6 +6,7 @@ import (
"github.com/thrasher-/gocryptotrader/config"
log "github.com/thrasher-/gocryptotrader/logger"
"github.com/thrasher-/gocryptotrader/portfolio"
)
// RESTfulJSONResponse outputs a JSON response of the response interface
@@ -100,7 +101,8 @@ func RESTGetAllActiveOrderbooks(w http.ResponseWriter, r *http.Request) {
// RESTGetPortfolio returns the Bot portfolio
func RESTGetPortfolio(w http.ResponseWriter, r *http.Request) {
result := Bot.Portfolio.GetPortfolioSummary()
p := portfolio.GetPortfolio()
result := p.GetPortfolioSummary()
err := RESTfulJSONResponse(w, result)
if err != nil {
RESTfulError(r.Method, err)

View File

@@ -466,14 +466,14 @@ func (s *RPCServer) GetPortfolioSummary(ctx context.Context, r *gctrpc.GetPortfo
// AddPortfolioAddress adds an address to the portfolio manager
func (s *RPCServer) AddPortfolioAddress(ctx context.Context, r *gctrpc.AddPortfolioAddressRequest) (*gctrpc.AddPortfolioAddressResponse, error) {
Bot.Portfolio.AddAddress(r.Address, r.Description, currency.NewCode(r.CoinType), r.Balance)
return &gctrpc.AddPortfolioAddressResponse{}, nil
err := Bot.Portfolio.AddAddress(r.Address, r.Description, currency.NewCode(r.CoinType), r.Balance)
return &gctrpc.AddPortfolioAddressResponse{}, err
}
// RemovePortfolioAddress removes an address from the portfolio manager
func (s *RPCServer) RemovePortfolioAddress(ctx context.Context, r *gctrpc.RemovePortfolioAddressRequest) (*gctrpc.RemovePortfolioAddressResponse, error) {
Bot.Portfolio.RemoveAddress(r.Address, r.Description, currency.NewCode(r.CoinType))
return &gctrpc.RemovePortfolioAddressResponse{}, nil
err := Bot.Portfolio.RemoveAddress(r.Address, r.Description, currency.NewCode(r.CoinType))
return &gctrpc.RemovePortfolioAddressResponse{}, err
}
// GetForexProviders returns a list of available forex providers