Algorithmic trading bot based on grademark's backtest.ts
Still in development.
Currently, only BitMEX exchanges are supported.
Added new feature @cats/cli .
- InfluxDB 2.2
- MariaDB 10.5
- Node.js 16.15.0
- Infrastructure
- InfluxDB 2.2 must be installed and run collector
- MariaDB 10.5 must be installed and run apollo-server.
- Define your trading strategy
mariadb and influxdb setup automatically.
docker compose up -d
git clone https://github.com/Seungwoo321/cats.git
cd cats/packages/cats-cli
npm link
cats --version
npm install
npm run build
npm run lint:fix
# dev
npm run dev:apollo -w @cats/apollo-server
# production
npm run serve:apollo -w @cats/apollo-server
- Usage 1. one line:
cats collector \
--exchange-id bitmex \
--exchange-mode production \
--symbol BTC/USD:BTC \
--timeframe 1h \
--startDate "2022-01-01 00:00:00" \
--endDate "2022-07-13 00:00:00" \
--token cats
- Usage 2. interactive:
cats collector
? Enter a token to access Influx2 (http://localhost:8086) 2QR9pFvw6sNxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
? Please select the exchange to collect Bitmex
? exchangeMode: test
? Please select an symbol BTC/USD:BTC
? Please select a time unit 5 min
? Select a start date: 2022-06-01 12:00:00
? Select a end date: 2022-06-07 08:38:00
Colleting data... |████████████████████████████████████████| 100% || 20/20 Requsts
- Usage 1. one line:
## command
cats create test-bot \
--symbol BTC/USD:BTC \
--strategy a \
--timeframe 1d \
--exchange-id bitmex
--exchange-access-key <api-key> \
--exchagne-secret-key <secret-key> \
--exchange-mode test
## ouptut
Successfully registered.
run command: cats list test-bot
- Usage 2. interactive:
## command
$ cats create test-bot
? Please select the exchange to be used by ccxt Bitmex
? exchangeMode: test
? Enter the exchange API KEY to be used by ccxt <api-key>
? Enter the exchange SECRET KEY to be used by ccxt <secret-key>
? Please select an symbol BTC/USD:BTC
? Please select a time unit 1 day
? Please select a strategy name a
## ouptut
Successfully registered.
run command: cats list test-bot
Both methods work the same
DEBUG=trading:bitmex,execution-trading:bitmex cats run test-bot
For example, write the strategy name a as:
// strategy/a.js
require('data-forge-indicators')
module.exports = {
// required
entryRule: async (enterPostion, args) => {
if (/** If you want to enter a long position */) {
await enterPosition({ symbol: args.parameters.symbol, direction: 'long', entryPrice: args.parameters.entryPrice })
} else if (/** If you want to enter a short position */) {
await enterPosition({ symbol: args.parameters.symbol, direction: 'short', entryPrice: args.parameters.entryPrice })
}
},
// required
exitRule: async (exitPosition, args) => {
if (args.position.direction === 'long') {
if (/** If you want to exit long position */) {
await exitPosition(args.parameters.symbol)
}
} else {
if (/** If you want to exit short position */) {
await exitPosition(args.parameters.symbol)
}
}
},
// option
stopLoss: args => {
return args.entryPrice * (5 / 100)
},
// option
trailingStopLoss: args => {
return args.entryPrice * (5 / 100)
},
// option
prepIndicators: ({ inputSeries }) => {
if (!inputSeries.toArray().length) {
return inputSeries
}
// If you want to add "Moving Average"
const sma20 = inputSeries
.deflate(bar => bar.close)
.sma(20)
inputSeries = inputSeries.withSeries('sma20', movingAverage)
.skip(20)
const sma60 = inputSeries
.deflate(bar => bar.close)
.sma(60)
inputSeries = inputSeries.withSeries('sma60', movingAverage)
.skip(60)
const sma60 = inputSeries
.deflate(bar => bar.close)
.sma(120)
inputSeries = inputSeries.withSeries('sma60', movingAverage)
.skip(120)
return inputSeries
}
}
// strategy/index.js
const a = require('./a')
module.exports = {
a
}
$ cats --help
Usage: cats <command> [options]
Options:
-V, --version output the version number
-h, --help display help for command
Commands:
create [options] <bot-name> Configure variables to run the bot application.
list [options] [bot-name] List the bot application configured. Require --all flags or [bot name].
delete [options] [bot-name] Delete the bot application configured. Require --all flags or [bot name].
run [options] <bot-name> run bot created app
serve <bot-name> pm2 start <bot-name>
pm2 pm2 installed in devDependencies
collector [options] Collect candles from exchanges into influxdb.
help [command] display help for command
Run cats <command> --help for detailed usage of given command.
$ cats create --help
Usage: cats create [options] <bot-name>
Configure variables to run the bot application.
Options:
--symbol <symbol> currency symbol to apply automatic trading
--strategy <strategy> trading strategy e.g ...
--timeframe <timeframe> trading cycle. e.g 30m,1h,4h,1d
--exchange-id <exchangeId> ccxt for EXCHANGE_ID - https://docs.ccxt.com/en/latest/manual.html#instantiation
--exchange-api-key <exchangeApiKey> ccxt for EXCHANGE_API_KEY - https://docs.ccxt.com/en/latest/manual.html#instantiation
--exchange-secret-key <exchangeSecretKey> ccxt for EXCHANGE_SECRET_KEY - https://docs.ccxt.com/en/latest/manual.html#instantiation
--exchange-mode <exchangeMode> ccxt for enable exchange’s sandbox - https://docs.ccxt.com/en/latest/manual.html#testnets-and-sandbox-environments
-h, --help display help for command
$ cats list --help
Usage: cats list [options] [bot-name]
List the bot application configured. Require --all flags or [bot name].
Options:
-a, --all List all settings.
-h, --help display help for command
$ cats delete --help
Usage: cats delete [options] [bot-name]
Delete the bot application configured. Require --all flags or [bot name].
Options:
-a, --all Delete all settings.
-h, --help display help for command
$ cats run --help
Usage: cats run [options] <bot-name>
run bot created app
Options:
--symbol <symbol> currency symbol to apply automatic trading
--strategy <strategy> trading strategy e.g ...
--timeframe <timeframe> trading cycle. e.g 30m,1h,4h,1d
-c, --capital <capital> starting capital. currency is XBt (Satoshi)
-f, --force force to apply capital
--skip first only skip
-h, --help display help for command
$ cats serve --help
Usage: cats serve [options] <bot-name>
pm2 start <bot-name>
Options:
-c, --capital <capital> starting capital. currency is XBt (Satoshi)
-f, --force force to apply capital
-h, --help display help for command
$ cats collector --help
Usage: cats collector [options]
Collect candles from exchanges into influxdb.
Options:
--exchange-id <exchangeId> exchange Name to collect data. eg. bitmex
--exchange-mode <exchangeMode> ccxt for enable exchange’s sandbox - https://docs.ccxt.com/en/latest/manual.html#testnets-and-sandbox-environments
--symbol <symbol> currency symbol
--timeframe <timeframe> trading cycle
--startDate <startDate> data collection start date
--endDate <endDate> data collection end date
--token <influxdb-token> Token for access Influxdb (localhost:8086)
-h, --help display help for command
$ cats backtest --help
Usage: cats backtest [options]
backtesting grademark - https://github.com/Grademark/grademark
Options:
--exchange-id <exchangeId> exchange Name to collect data. eg. bitmex
--exchange-mode <exchangeMode> ccxt for enable exchange’s sandbox - https://docs.ccxt.com/en/latest/manual.html#testnets-and-sandbox-environments
--symbol <symbol> currency symbol
--strategy <strategy> trading strategy e.g ...
--timeframe <timeframe> trading cycle
--startDate <startDate> backtest start date
--endDate <endDate> backtest end date
--token <token> Token for access Influxdb (localhost:8086)
-c, --capital <capital> starting capital. currency is XBt (Satoshi)
-h, --help display help for command
MIT