mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-14 07:26:47 +00:00
* 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
134 lines
3.1 KiB
Go
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)
|
|
}
|
|
}
|
|
}
|