* Initial codes for a trade tracker * Moving everything in a broken fashion * Removes tradetracker. Removes some errors for subsystems * Cleans up some subsystems, renames stuttering types. Removes some global Bot usage * More basic subsystem renaming and file moving * Removes engine dependency from events,ntpserver,ordermanager,comms manager * Exports eventManager, fixes rpcserver. puts rpcserver back for now * Removes redundant error message, further removes engine dependencies * experimental end of day interface usage * adds ability to build the application * Withdraw and event manager handling * cleans up apiserver and communications manager * Cleans up some start/setup processes. Though should separate * More consistency with Setup Start Stop IsRunning funcs * Final consistency pass before testing phase * Fixes engine tests. Fixes stop nil issue * api server tests * Communications manager testing * Connection manager tests and nilsubsystem error * End of day currencypairsyncer tests * Adds databaseconnection/databaseconnection_test.go * Adds withdrawal manager tests * Deposit address testing. Moved orderbook sync first as its more important * Adds test for event manager * More full eventmanager testing * Adds testfile. Enables skipped test. * ntp manager tests * Adds ordermanager tests, Extracts a whole new subsystem from engine and fanangles import cycles * Adds websocket routine manager tests * Basic portfolio manager testing * Fixes issue with currency pair sync startup * Fixes issue with event manager startup * Starts the order manager before backtester starts * Fixes fee tests. Expands testing. Doesnt fix races * Fixes most test races * Resolves data races * Fixes subsystem test issues * currency pair syncer coverage tests * Refactors portfolio. Fixes tests. Withdraw validation Portfolio didn't need to exist with a portfolio manager. Now the porfolio manager is in charge how the portfolio is handled and all portfolio functions are attached to the base instead of just exported at the package level Withdrawal validation occurred at the exchange level when it can just be run at the withdrawal manager level. All withdrawal requests go through that endpoint * lint -fix * golang lint fixes * lints and comments everything * Updates GCT logo, adds documentation for some subsystems * More documentation and more logo updates * Fixes backtesting and apiserver errors encountered * Fixes errors and typos from reviewing * More minor fixes * Changes %h verb to %w * reverbs to %s * Humbly begins reverting to more flat engine package The main reasoning for this is that the subsystem split doesn't make sense in a golang environment. The subsystems are only meant to be used with engine and so by placing them in a non-engine area, it does not work and is inconsistent with the rest of the application's package layout. This will begin salvaging the changes made by reverting to a flat engine package, but maintaining the consistent designs introduced. Further, I will look to remove any TestMains and decrease the scope of testing to be more local and decrease the issues that have been caused from our style of testing. * Manages to re-flatten things. Everything is within its own file * mini fixes * Fixes tests and data races and lints * Updates docs tool for engine to create filename readmes * os -> ioutil * remove err * Appveyor version increase test * Removes tCleanup as its unsupported on appveyor * Adds stuff that I thought was in previous merge master commit * Removes cancel from test * Fixes really fun test-exclusive data race * minor nit fixes * niterinos * docs gen * rm;rf test * Remove typoline. expands startstop helper. Splits apiserver * Removes accidental folder * Uses update instead of replace for order upsert * addresses nits. Renames files. Regenerates documentation. * lint and removal of comments * Add new test for default scenario * Fixes typo * regen docs
GoCryptoTrader Backtester: Backtester package
This backtester package is part of the GoCryptoTrader codebase.
This is still in active development
You can track ideas, planned features and what's in progress on this Trello board: https://trello.com/b/ZAhMhpOy/gocryptotrader.
Join our slack to discuss all things related to GoCryptoTrader! GoCryptoTrader Slack
GoCryptoTrader Backtester
An event-driven backtesting tool to test and iterate trading strategies using historical or custom data.
Features
- Works with all GoCryptoTrader exchanges that support trade/candle retrieval. See candle readme and trade readme for supported exchanges
- CSV data import
- Database data import
- Proof of concept live data running
- Can run strategies against multiple cryptocurrencies
- Can run strategies that can assess multiple currencies simultaneously to make complex decisions
- Dollar cost strategy implementation
- RSI strategy implementation
- Rules customisation via config
.stratfiles - Strategy customisation without requiring recompilation. For example, customising RSI high, low and length values via config
.stratfiles. - Report generation
- Portfolio manager to help size orders based on config rules, risk and candle volume
- Order manager to place orders with customisable slippage estimator
- Helpful statistics to help determine whether a strategy was effective
- Compliance manager to keep snapshots of every transaction and their changes at every interval
How does it work?
- The application will load a
.stratconfig file as specified at runtime - The
.stratconfig file will contain- Start & end dates
- The strategy to run
- The candle interval
- Where the data is to be sourced (API, CSV, database, live)
- Whether to use trade or candle data (readme)
- A nickname for the strategy (to help differentiate between runs/configs using the same strategy)
- The currency/currencies to use
- The exchange(s) to run against
- See readme for a breakdown of all config features
- The GoCryptoTrader Backtester will retrieve the data specified in the config (readme)
- The data is converted into candles and each candle is streamed as a data event.
- The data event is analysed by the strategy which will output a purchasing signal such as
BUY,SELLorDONOTHING(readme) - The purchase signal is then processed by the portfolio manager (readme) which will size the order (readme) and assess risk (readme) before sending it to the exchange
- The exchange order event handler will size to the candle data and run a slippage estimator (readme) and place the order (readme)
- Upon an order being placed, the order is snapshot for analysis in both the statistics package (readme) and the report package (readme)
Cool story, how do I use it?
To run the application using the provided dollar cost average strategy, simply run go run . from gocryptotrader/backtester. An output of the results will be put in the results folder.
How do I create my own config?
There is a config generating helper application under /backtester/config/configbuilder to help you create a .strat file. Read more about it here. There are also a number of tests under /config/config_test.go which generate configs into the examples folder, which if you have code knowledge, can write your own configs programmatically.
How do I create my own strategy?
Creating strategies requires programming skills. Here is a readme on the subject. After reading the readmes, please review the strategies here to gain an understanding on how to write your own.
How does it work technically?
- The readmes linked in the "How does it work" covers the main parts of the application.
- If you are still unsure, please raise an issue, ask a question in our Slack or open a pull request
- Here is an overview

Important notes
- This application is not considered production ready and you may experience issues
- If you encounter any issues, you can raise them in our Slack channel or via Github issues
- Past performance is no guarantee of future results
- While an experimental feature, it is not recommended to ever use live trading and real orders
- Past performance is no guarantee of future results
Please click GoDocs chevron above to view current GoDoc information for this package
Contribution
Please feel free to submit any pull requests or suggest any desired features to be added.
When submitting a PR, please abide by our coding guidelines:
- Code must adhere to the official Go formatting guidelines (i.e. uses gofmt).
- Code must be documented adhering to the official Go commentary guidelines.
- Code must adhere to our coding style.
- Pull requests need to be based on and opened against the
masterbranch.
Donations
If this framework helped you in any way, or you would like to support the developers working on it, please donate Bitcoin to:
bc1qk0jareu4jytc0cfrhr5wgshsq8282awpavfahc