Files
gocryptotrader/backtester/main.go
Ryan O'Hara-Reid a2381310da 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
2021-07-29 14:42:28 +10:00

134 lines
3.1 KiB
Go

package main
import (
"flag"
"fmt"
"os"
"path/filepath"
"github.com/thrasher-corp/gocryptotrader/backtester/backtest"
"github.com/thrasher-corp/gocryptotrader/backtester/common"
"github.com/thrasher-corp/gocryptotrader/backtester/config"
gctconfig "github.com/thrasher-corp/gocryptotrader/config"
"github.com/thrasher-corp/gocryptotrader/engine"
gctlog "github.com/thrasher-corp/gocryptotrader/log"
"github.com/thrasher-corp/gocryptotrader/signaler"
)
func main() {
var configPath, templatePath, reportOutput string
var printLogo, generateReport bool
wd, err := os.Getwd()
if err != nil {
fmt.Printf("Could not get working directory. Error: %v.\n", err)
os.Exit(1)
}
flag.StringVar(
&configPath,
"configpath",
filepath.Join(
wd,
"config",
"examples",
"dca-api-candles.strat"),
"the config containing strategy params")
flag.StringVar(
&templatePath,
"templatepath",
filepath.Join(
wd,
"report",
"tpl.gohtml"),
"the report template to use")
flag.BoolVar(
&generateReport,
"generatereport",
true,
"whether to generate the report file")
flag.StringVar(
&reportOutput,
"outputpath",
filepath.Join(
wd,
"results"),
"the path where to output results")
flag.BoolVar(
&printLogo,
"printlogo",
true,
"print out the logo to the command line, projected profits likely won't be affected if disabled")
flag.Parse()
var bt *backtest.BackTest
var cfg *config.Config
fmt.Println("reading config...")
cfg, err = config.ReadConfigFromFile(configPath)
if err != nil {
fmt.Printf("Could not read config. Error: %v.\n", err)
os.Exit(1)
}
if printLogo {
fmt.Print(common.ASCIILogo)
}
path := gctconfig.DefaultFilePath()
if cfg.GoCryptoTraderConfigPath != "" {
path = cfg.GoCryptoTraderConfigPath
}
var bot *engine.Engine
flags := map[string]bool{
"tickersync": false,
"orderbooksync": false,
"tradesync": false,
"ratelimiter": true,
"ordermanager": false,
}
bot, err = engine.NewFromSettings(&engine.Settings{
ConfigFile: path,
EnableDryRun: true,
EnableAllPairs: true,
EnableExchangeHTTPRateLimiter: true,
}, flags)
if err != nil {
fmt.Printf("Could not load backtester. Error: %v.\n", err)
os.Exit(-1)
}
bt, err = backtest.NewFromConfig(cfg, templatePath, reportOutput, bot)
if err != nil {
fmt.Printf("Could not setup backtester from config. Error: %v.\n", err)
os.Exit(1)
}
if cfg.DataSettings.LiveData != nil {
go func() {
err = bt.RunLive()
if err != nil {
fmt.Printf("Could not complete live run. Error: %v.\n", err)
os.Exit(-1)
}
}()
interrupt := signaler.WaitForInterrupt()
gctlog.Infof(gctlog.Global, "Captured %v, shutdown requested.\n", interrupt)
bt.Stop()
} else {
err = bt.Run()
if err != nil {
fmt.Printf("Could not complete run. Error: %v.\n", err)
os.Exit(1)
}
}
err = bt.Statistic.CalculateAllResults()
if err != nil {
gctlog.Error(gctlog.BackTester, err)
os.Exit(1)
}
if generateReport {
err = bt.Reports.GenerateReport()
if err != nil {
gctlog.Error(gctlog.BackTester, err)
}
}
}