GCT: general updates across codebase (#699)

* orderbook: export orderbook nodes for external strategy inspection

* orderbook: Add in methods for locking and unlocking multiple books at the same time e.g. book1.LockWith(book2); defer book1.UnlockWith(book2)

* include waiting functionality for depth change alert

* backtester: add word.

* log: include logger changes to impl with downstream integration

* engine: reduce params for loading exchange

* assort: rm verbose in tests, change wording in ob, expose sync.waitgroup for ext. sync options

* ticker: reduce map look ups and contention when using RW mutex when there are over 80% writes adds find last function to get the latest rate

* engine/syncmanager: add in waitgroup for step over for external package calls

* cleaup

* engine: linter fix

* currency/fx: include all references to fiat currencies to default

* orderbook: Add in fields to Unsafe type for strategies to detect potential out of sync book operations

* syncmanager: changed config variable to display correct time

* ordermanager: Add time when none provided

* currency/manager: update getasset param to get enabled assets for minor optimizations

* ftx: use get all wallet balances for a better accounts breakdown

* orderbook: unlock in reverse order

* bithumb: fixes bug on market buy and sell orders

* bithumb: fix bug for nonce is also time window sensitive

* bithumb: get orders add required parameter

* bithumb: Add asset type to account struct

* currency: improve log output when checking currency and it fails

* bithumb: Add error return on incomplete pair

* ticker:unexport all service related methods

* ticker/currency: fixes

* orderbook: fix comment

* engine: revert variable name in LoadExchange method

* sync_manager: fix panic when enabling disabling manager

* engine: fix naming convention of exported function and comments

* engine: update comment

* orderbook: fix comment for unsafe type
This commit is contained in:
Ryan O'Hara-Reid
2021-07-29 14:42:28 +10:00
committed by GitHub
parent 4f5ab42bd8
commit a2381310da
64 changed files with 842 additions and 562 deletions

View File

@@ -4,9 +4,28 @@ import (
"errors"
"fmt"
"io"
"strings"
"time"
)
var (
errEmptyLoggerName = errors.New("cannot have empty logger name")
errSubLoggerAlreadyregistered = errors.New("sub logger already registered")
)
// NewSubLogger allows for a new sub logger to be registered.
func NewSubLogger(name string) (*SubLogger, error) {
if name == "" {
return nil, errEmptyLoggerName
}
name = strings.ToUpper(name)
_, ok := subLoggers[name]
if ok {
return nil, errSubLoggerAlreadyregistered
}
return registerNewSubLogger(name), nil
}
func newLogger(c *Config) *Logger {
return &Logger{
Timestamp: c.AdvancedSettings.TimeStampFormat,
@@ -53,7 +72,7 @@ func CloseLogger() error {
return GlobalLogFile.Close()
}
func validSubLogger(s string) (bool, *subLogger) {
func validSubLogger(s string) (bool, *SubLogger) {
if v, found := subLoggers[s]; found {
return true, v
}

View File

@@ -122,8 +122,8 @@ func splitLevel(level string) (l Levels) {
return
}
func registerNewSubLogger(logger string) *subLogger {
temp := subLogger{
func registerNewSubLogger(logger string) *SubLogger {
temp := SubLogger{
name: strings.ToUpper(logger),
output: os.Stdout,
}

View File

@@ -2,6 +2,7 @@ package log
import (
"bytes"
"errors"
"io/ioutil"
"os"
"strings"
@@ -224,7 +225,7 @@ func TestNewLogEvent(t *testing.T) {
func TestInfo(t *testing.T) {
w := &bytes.Buffer{}
tempSL := subLogger{
tempSL := SubLogger{
"TESTYMCTESTALOT",
splitLevel("INFO|WARN|DEBUG|ERROR"),
w,
@@ -262,3 +263,22 @@ func TestSubLoggerName(t *testing.T) {
t.Error("Unexpected SUBLOGGER in output")
}
}
func TestNewSubLogger(t *testing.T) {
_, err := NewSubLogger("")
if !errors.Is(err, errEmptyLoggerName) {
t.Fatalf("received: %v but expected: %v", err, errEmptyLoggerName)
}
sl, err := NewSubLogger("TESTERINOS")
if !errors.Is(err, nil) {
t.Fatalf("received: %v but expected: %v", err, nil)
}
Debug(sl, "testerinos")
_, err = NewSubLogger("TESTERINOS")
if !errors.Is(err, errSubLoggerAlreadyregistered) {
t.Fatalf("received: %v but expected: %v", err, errSubLoggerAlreadyregistered)
}
}

View File

@@ -85,7 +85,9 @@ type Levels struct {
Info, Debug, Warn, Error bool
}
type subLogger struct {
// SubLogger defines a sub logger can be used externally for packages wanted to
// leverage GCT library logger features.
type SubLogger struct {
name string
Levels
output io.Writer

View File

@@ -6,7 +6,7 @@ import (
)
// Info takes a pointer subLogger struct and string sends to newLogEvent
func Info(sl *subLogger, data string) {
func Info(sl *SubLogger, data string) {
fields := getFields(sl)
if fields == nil {
return
@@ -19,7 +19,7 @@ func Info(sl *subLogger, data string) {
}
// Infoln takes a pointer subLogger struct and interface sends to newLogEvent
func Infoln(sl *subLogger, v ...interface{}) {
func Infoln(sl *SubLogger, v ...interface{}) {
fields := getFields(sl)
if fields == nil {
return
@@ -32,12 +32,12 @@ func Infoln(sl *subLogger, v ...interface{}) {
}
// Infof takes a pointer subLogger struct, string & interface formats and sends to Info()
func Infof(sl *subLogger, data string, v ...interface{}) {
func Infof(sl *SubLogger, data string, v ...interface{}) {
Info(sl, fmt.Sprintf(data, v...))
}
// Debug takes a pointer subLogger struct and string sends to multiwriter
func Debug(sl *subLogger, data string) {
func Debug(sl *SubLogger, data string) {
fields := getFields(sl)
if fields == nil {
return
@@ -50,7 +50,7 @@ func Debug(sl *subLogger, data string) {
}
// Debugln takes a pointer subLogger struct, string and interface sends to newLogEvent
func Debugln(sl *subLogger, v ...interface{}) {
func Debugln(sl *SubLogger, v ...interface{}) {
fields := getFields(sl)
if fields == nil {
return
@@ -63,12 +63,12 @@ func Debugln(sl *subLogger, v ...interface{}) {
}
// Debugf takes a pointer subLogger struct, string & interface formats and sends to Info()
func Debugf(sl *subLogger, data string, v ...interface{}) {
func Debugf(sl *SubLogger, data string, v ...interface{}) {
Debug(sl, fmt.Sprintf(data, v...))
}
// Warn takes a pointer subLogger struct & string and sends to newLogEvent()
func Warn(sl *subLogger, data string) {
func Warn(sl *SubLogger, data string) {
fields := getFields(sl)
if fields == nil {
return
@@ -81,7 +81,7 @@ func Warn(sl *subLogger, data string) {
}
// Warnln takes a pointer subLogger struct & interface formats and sends to newLogEvent()
func Warnln(sl *subLogger, v ...interface{}) {
func Warnln(sl *SubLogger, v ...interface{}) {
fields := getFields(sl)
if fields == nil {
return
@@ -94,12 +94,12 @@ func Warnln(sl *subLogger, v ...interface{}) {
}
// Warnf takes a pointer subLogger struct, string & interface formats and sends to Warn()
func Warnf(sl *subLogger, data string, v ...interface{}) {
func Warnf(sl *SubLogger, data string, v ...interface{}) {
Warn(sl, fmt.Sprintf(data, v...))
}
// Error takes a pointer subLogger struct & interface formats and sends to newLogEvent()
func Error(sl *subLogger, data ...interface{}) {
func Error(sl *SubLogger, data ...interface{}) {
fields := getFields(sl)
if fields == nil {
return
@@ -112,7 +112,7 @@ func Error(sl *subLogger, data ...interface{}) {
}
// Errorln takes a pointer subLogger struct, string & interface formats and sends to newLogEvent()
func Errorln(sl *subLogger, v ...interface{}) {
func Errorln(sl *SubLogger, v ...interface{}) {
fields := getFields(sl)
if fields == nil {
return
@@ -125,7 +125,7 @@ func Errorln(sl *subLogger, v ...interface{}) {
}
// Errorf takes a pointer subLogger struct, string & interface formats and sends to Debug()
func Errorf(sl *subLogger, data string, v ...interface{}) {
func Errorf(sl *SubLogger, data string, v ...interface{}) {
Error(sl, fmt.Sprintf(data, v...))
}
@@ -147,7 +147,7 @@ func enabled() bool {
return false
}
func getFields(sl *subLogger) *logFields {
func getFields(sl *SubLogger) *logFields {
if !enabled() {
return nil
}

View File

@@ -4,33 +4,33 @@ import "io"
// Global vars related to the logger package
var (
subLoggers = map[string]*subLogger{}
subLoggers = map[string]*SubLogger{}
Global *subLogger
BackTester *subLogger
ConnectionMgr *subLogger
CommunicationMgr *subLogger
APIServerMgr *subLogger
ConfigMgr *subLogger
DatabaseMgr *subLogger
DataHistory *subLogger
GCTScriptMgr *subLogger
OrderMgr *subLogger
PortfolioMgr *subLogger
SyncMgr *subLogger
TimeMgr *subLogger
WebsocketMgr *subLogger
EventMgr *subLogger
DispatchMgr *subLogger
Global *SubLogger
BackTester *SubLogger
ConnectionMgr *SubLogger
CommunicationMgr *SubLogger
APIServerMgr *SubLogger
ConfigMgr *SubLogger
DatabaseMgr *SubLogger
DataHistory *SubLogger
GCTScriptMgr *SubLogger
OrderMgr *SubLogger
PortfolioMgr *SubLogger
SyncMgr *SubLogger
TimeMgr *SubLogger
WebsocketMgr *SubLogger
EventMgr *SubLogger
DispatchMgr *SubLogger
RequestSys *subLogger
ExchangeSys *subLogger
GRPCSys *subLogger
RESTSys *subLogger
RequestSys *SubLogger
ExchangeSys *SubLogger
GRPCSys *SubLogger
RESTSys *SubLogger
Ticker *subLogger
OrderBook *subLogger
Trade *subLogger
Ticker *SubLogger
OrderBook *SubLogger
Trade *SubLogger
)
// logFields is used to store data in a non-global and thread-safe manner