2021-10-14 04:53:23 +00:00
|
|
|
---
|
2021-10-17 16:57:23 +00:00
|
|
|
persistence:
|
|
|
|
redis:
|
|
|
|
host: 127.0.0.1
|
|
|
|
port: 6379
|
|
|
|
db: 0
|
2022-01-07 18:40:34 +00:00
|
|
|
|
2022-03-01 13:48:48 +00:00
|
|
|
sessions:
|
|
|
|
binance:
|
|
|
|
exchange: binance
|
|
|
|
envVarPrefix: BINANCE
|
|
|
|
|
2022-01-07 18:40:34 +00:00
|
|
|
# example command:
|
2022-03-01 13:48:48 +00:00
|
|
|
# godotenv -f .env.local -- go run ./cmd/bbgo backtest --sync-from 2020-11-01 --config config/grid.yaml --base-asset-baseline
|
2022-01-07 18:40:34 +00:00
|
|
|
backtest:
|
|
|
|
# for testing max draw down (MDD) at 03-12
|
|
|
|
# see here for more details
|
|
|
|
# https://www.investopedia.com/terms/m/maximum-drawdown-mdd.asp
|
2022-09-11 09:28:54 +00:00
|
|
|
startTime: "2022-05-01"
|
2023-12-19 14:17:33 +00:00
|
|
|
endTime: "2023-11-01"
|
2022-04-15 03:45:01 +00:00
|
|
|
sessions:
|
|
|
|
- binance
|
2022-01-07 18:40:34 +00:00
|
|
|
symbols:
|
2022-05-13 13:56:46 +00:00
|
|
|
- ETHUSDT
|
2022-05-12 12:14:51 +00:00
|
|
|
accounts:
|
2022-03-01 13:48:48 +00:00
|
|
|
binance:
|
|
|
|
balances:
|
2022-05-13 13:56:46 +00:00
|
|
|
ETH: 0.0
|
|
|
|
USDT: 10_000.0
|
2022-01-07 18:40:34 +00:00
|
|
|
|
2021-10-14 04:53:23 +00:00
|
|
|
exchangeStrategies:
|
|
|
|
|
2022-01-09 14:49:54 +00:00
|
|
|
- on: binance
|
2022-01-08 17:20:47 +00:00
|
|
|
bollmaker:
|
2022-05-13 13:56:46 +00:00
|
|
|
symbol: ETHUSDT
|
2021-10-17 16:42:01 +00:00
|
|
|
|
2022-01-09 14:48:34 +00:00
|
|
|
# interval is how long do you want to update your order price and quantity
|
|
|
|
interval: 1m
|
|
|
|
|
|
|
|
# quantity is the base order quantity for your buy/sell order.
|
|
|
|
quantity: 0.05
|
|
|
|
|
2022-09-11 09:28:54 +00:00
|
|
|
# amount is used for fixed-amount order, for example, use fixed 20 USDT order for BTCUSDT market
|
|
|
|
# amount: 20
|
|
|
|
|
2022-01-09 14:48:34 +00:00
|
|
|
# useTickerPrice use the ticker api to get the mid price instead of the closed kline price.
|
|
|
|
# The back-test engine is kline-based, so the ticker price api is not supported.
|
|
|
|
# Turn this on if you want to do real trading.
|
2022-05-12 12:14:51 +00:00
|
|
|
useTickerPrice: true
|
2022-01-09 14:48:34 +00:00
|
|
|
|
|
|
|
# spread is the price spread from the middle price.
|
|
|
|
# For ask orders, the ask price is ((bestAsk + bestBid) / 2 * (1.0 + spread))
|
|
|
|
# For bid orders, the bid price is ((bestAsk + bestBid) / 2 * (1.0 - spread))
|
|
|
|
# Spread can be set by percentage or floating number. e.g., 0.1% or 0.001
|
|
|
|
spread: 0.1%
|
|
|
|
|
|
|
|
# minProfitSpread is the minimal order price spread from the current average cost.
|
|
|
|
# For long position, you will only place sell order above the price (= average cost * (1 + minProfitSpread))
|
|
|
|
# For short position, you will only place buy order below the price (= average cost * (1 - minProfitSpread))
|
2022-01-07 18:40:34 +00:00
|
|
|
minProfitSpread: 0.1%
|
|
|
|
|
2023-01-19 04:15:20 +00:00
|
|
|
# minProfitActivationRate activates MinProfitSpread when position RoI higher than the specified percentage
|
|
|
|
minProfitActivationRate: -10%
|
|
|
|
|
2022-09-11 09:28:54 +00:00
|
|
|
# trendEMA detects the trend by a given EMA
|
|
|
|
# when EMA goes up (the last > the previous), allow buy and sell
|
|
|
|
# when EMA goes down (the last < the previous), disable buy, allow sell
|
|
|
|
# uncomment this to enable it:
|
|
|
|
trendEMA:
|
|
|
|
interval: 1d
|
|
|
|
window: 7
|
|
|
|
maxGradient: 1.5
|
|
|
|
minGradient: 1.01
|
|
|
|
|
2022-09-11 09:38:26 +00:00
|
|
|
# ==================================================================
|
|
|
|
# Dynamic spread is an experimental feature. it will override the fixed spread settings above.
|
|
|
|
#
|
|
|
|
# dynamicSpread enables the automatic adjustment to bid and ask spread.
|
|
|
|
# Choose one of the scaling strategy to enable dynamicSpread:
|
|
|
|
# - amplitude: scales by K-line amplitude
|
|
|
|
# - weightedBollWidth: scales by weighted Bollinger band width (explained below)
|
|
|
|
# ==================================================================
|
2022-05-18 06:31:59 +00:00
|
|
|
#
|
2022-09-11 09:38:26 +00:00
|
|
|
# =========================================
|
|
|
|
# dynamicSpread with amplitude
|
|
|
|
# =========================================
|
2022-05-27 08:51:11 +00:00
|
|
|
# dynamicSpread:
|
2022-08-29 05:38:42 +00:00
|
|
|
# amplitude: # delete other scaling strategy if this is defined
|
|
|
|
# # window is the window of the SMAs of spreads
|
|
|
|
# window: 1
|
|
|
|
# askSpreadScale:
|
|
|
|
# byPercentage:
|
|
|
|
# # exp means we want to use exponential scale, you can replace "exp" with "linear" for linear scale
|
|
|
|
# exp:
|
|
|
|
# # from down to up
|
|
|
|
# domain: [ 0.0001, 0.005 ]
|
|
|
|
# # when in down band, holds 1.0 by maximum
|
|
|
|
# # when in up band, holds 0.05 by maximum
|
|
|
|
# range: [ 0.001, 0.002 ]
|
|
|
|
# bidSpreadScale:
|
|
|
|
# byPercentage:
|
|
|
|
# # exp means we want to use exponential scale, you can replace "exp" with "linear" for linear scale
|
|
|
|
# exp:
|
|
|
|
# # from down to up
|
|
|
|
# domain: [ 0.0001, 0.005 ]
|
|
|
|
# # when in down band, holds 1.0 by maximum
|
|
|
|
# # when in up band, holds 0.05 by maximum
|
|
|
|
# range: [ 0.001, 0.002 ]
|
2022-09-11 09:28:54 +00:00
|
|
|
#
|
2022-09-11 09:38:26 +00:00
|
|
|
# =========================================
|
|
|
|
# dynamicSpread with weightedBollWidth
|
|
|
|
# =========================================
|
|
|
|
# dynamicSpread:
|
2022-09-11 09:28:54 +00:00
|
|
|
# # weightedBollWidth scales spread base on weighted Bollinger bandwidth ratio between default and neutral bands.
|
|
|
|
# #
|
|
|
|
# # Given the default band: moving average bd_mid, band from bd_lower to bd_upper.
|
|
|
|
# # And the neutral band: from bn_lower to bn_upper
|
|
|
|
# # Set the sigmoid weighting function:
|
|
|
|
# # - to ask spread, the weighting density function d_weight(x) is sigmoid((x - bd_mid) / (bd_upper - bd_lower))
|
|
|
|
# # - to bid spread, the weighting density function d_weight(x) is sigmoid((bd_mid - x) / (bd_upper - bd_lower))
|
|
|
|
# # Then calculate the weighted band width ratio by taking integral of d_weight(x) from bx_lower to bx_upper:
|
|
|
|
# # - weighted_ratio = integral(d_weight from bn_lower to bn_upper) / integral(d_weight from bd_lower to bd_upper)
|
|
|
|
# # - The wider neutral band get greater ratio
|
|
|
|
# # - To ask spread, the higher neutral band get greater ratio
|
|
|
|
# # - To bid spread, the lower neutral band get greater ratio
|
|
|
|
# # The weighted ratio always positive, and may be greater than 1 if neutral band is wider than default band.
|
2022-08-30 14:39:03 +00:00
|
|
|
#
|
2022-09-11 09:38:26 +00:00
|
|
|
# weightedBollWidth: # delete other scaling strategy if this is defined
|
2022-09-11 09:28:54 +00:00
|
|
|
# # sensitivity is a factor of the weighting function: 1 / (1 + exp(-(x - bd_mid) * sensitivity / (bd_upper - bd_lower)))
|
2022-08-30 14:39:03 +00:00
|
|
|
# # A positive number. The greater factor, the sharper weighting function. Default set to 1.0 .
|
|
|
|
# sensitivity: 1.0
|
|
|
|
#
|
2022-08-29 05:38:42 +00:00
|
|
|
# askSpreadScale:
|
|
|
|
# byPercentage:
|
|
|
|
# # exp means we want to use exponential scale, you can replace "exp" with "linear" for linear scale
|
|
|
|
# linear:
|
|
|
|
# # from down to up
|
|
|
|
# domain: [ 0.1, 0.5 ]
|
|
|
|
# range: [ 0.001, 0.002 ]
|
|
|
|
# bidSpreadScale:
|
|
|
|
# byPercentage:
|
|
|
|
# # exp means we want to use exponential scale, you can replace "exp" with "linear" for linear scale
|
|
|
|
# linear:
|
|
|
|
# # from down to up
|
|
|
|
# domain: [ 0.1, 0.5 ]
|
|
|
|
# range: [ 0.001, 0.002 ]
|
|
|
|
|
2022-01-09 14:48:34 +00:00
|
|
|
# maxExposurePosition is the maximum position you can hold
|
2022-05-13 13:56:46 +00:00
|
|
|
# +10 means you can hold 10 ETH long position by maximum
|
|
|
|
# -10 means you can hold -10 ETH short position by maximum
|
2022-09-11 09:28:54 +00:00
|
|
|
# uncomment this if you want a fixed position exposure.
|
2022-01-09 14:48:34 +00:00
|
|
|
# maxExposurePosition: 3.0
|
|
|
|
maxExposurePosition: 10
|
|
|
|
|
2022-01-27 00:52:27 +00:00
|
|
|
# dynamicExposurePositionScale overrides maxExposurePosition
|
|
|
|
# for domain,
|
|
|
|
# -1 means -100%, the price is on the lower band price.
|
|
|
|
# if the price breaks the lower band, a number less than -1 will be given.
|
|
|
|
# 1 means 100%, the price is on the upper band price.
|
|
|
|
# if the price breaks the upper band, a number greater than 1 will be given, for example, 1.2 for 120%, and 1.3 for 130%.
|
|
|
|
dynamicExposurePositionScale:
|
|
|
|
byPercentage:
|
|
|
|
# exp means we want to use exponential scale, you can replace "exp" with "linear" for linear scale
|
|
|
|
exp:
|
2022-01-30 16:18:52 +00:00
|
|
|
# from lower band -100% (-1) to upper band 100% (+1)
|
2022-01-27 00:52:27 +00:00
|
|
|
domain: [ -1, 1 ]
|
|
|
|
# when in down band, holds 1.0 by maximum
|
|
|
|
# when in up band, holds 0.05 by maximum
|
2022-01-30 16:18:52 +00:00
|
|
|
range: [ 10.0, 1.0 ]
|
2022-01-27 00:52:27 +00:00
|
|
|
|
2022-01-09 14:53:35 +00:00
|
|
|
# DisableShort means you can don't want short position during the market making
|
|
|
|
# THe short here means you might sell some of your existing inventory.
|
|
|
|
disableShort: true
|
|
|
|
|
2022-01-09 14:48:34 +00:00
|
|
|
# uptrendSkew, like the strongUptrendSkew, but the price is still in the default band.
|
|
|
|
uptrendSkew: 0.8
|
|
|
|
|
|
|
|
# downtrendSkew, like the strongDowntrendSkew, but the price is still in the default band.
|
|
|
|
downtrendSkew: 1.2
|
|
|
|
|
2022-09-11 09:28:54 +00:00
|
|
|
# defaultBollinger is a long-term time frame bollinger
|
|
|
|
# this bollinger band is used for controlling your position (how much you can hold)
|
|
|
|
# when price is near the upper band, it holds less.
|
|
|
|
# when price is near the lower band, it holds more.
|
2021-10-17 16:42:01 +00:00
|
|
|
defaultBollinger:
|
2022-01-27 11:17:00 +00:00
|
|
|
interval: "1h"
|
2021-10-17 16:42:01 +00:00
|
|
|
window: 21
|
|
|
|
bandWidth: 2.0
|
2022-01-09 14:48:34 +00:00
|
|
|
|
|
|
|
# neutralBollinger is the smaller range of the bollinger band
|
|
|
|
# If price is in this band, it usually means the price is oscillating.
|
2021-10-17 16:42:01 +00:00
|
|
|
neutralBollinger:
|
|
|
|
interval: "5m"
|
|
|
|
window: 21
|
2022-01-27 11:17:00 +00:00
|
|
|
bandWidth: 2.0
|
2021-10-14 04:53:23 +00:00
|
|
|
|
2022-01-31 16:41:28 +00:00
|
|
|
# tradeInBand: when tradeInBand is set, you will only place orders in the bollinger band.
|
2022-09-11 09:28:54 +00:00
|
|
|
tradeInBand: true
|
2022-01-31 16:41:28 +00:00
|
|
|
|
2022-01-31 17:43:12 +00:00
|
|
|
# buyBelowNeutralSMA: when this set, it will only place buy order when the current price is below the SMA line.
|
2022-09-11 09:49:24 +00:00
|
|
|
buyBelowNeutralSMA: true
|
2022-01-31 17:43:12 +00:00
|
|
|
|
2023-12-20 04:13:09 +00:00
|
|
|
# emaCross is used for turning buy on/off
|
|
|
|
# when short term EMA cross fast term EMA, turn on buy,
|
|
|
|
# otherwise, turn off buy
|
2023-12-19 14:17:33 +00:00
|
|
|
emaCross:
|
2023-12-19 14:17:53 +00:00
|
|
|
enabled: false
|
2023-12-19 14:17:33 +00:00
|
|
|
interval: 1h
|
|
|
|
fastWindow: 3
|
|
|
|
slowWindow: 12
|
|
|
|
|
2022-07-26 03:01:03 +00:00
|
|
|
exits:
|
2022-01-30 16:18:52 +00:00
|
|
|
|
2022-07-26 03:01:03 +00:00
|
|
|
# roiTakeProfit is used to force taking profit by percentage of the position ROI (currently the price change)
|
|
|
|
# force to take the profit ROI exceeded the percentage.
|
|
|
|
- roiTakeProfit:
|
|
|
|
percentage: 3%
|
2022-01-30 16:18:52 +00:00
|
|
|
|
2022-07-26 03:01:03 +00:00
|
|
|
- protectiveStopLoss:
|
|
|
|
activationRatio: 1%
|
|
|
|
stopLossRatio: 0.2%
|
|
|
|
placeStopOrder: false
|
2022-01-30 16:18:52 +00:00
|
|
|
|
2022-07-26 03:01:03 +00:00
|
|
|
- protectiveStopLoss:
|
|
|
|
activationRatio: 2%
|
|
|
|
stopLossRatio: 1%
|
|
|
|
placeStopOrder: false
|
2022-01-30 16:18:52 +00:00
|
|
|
|
2022-07-26 03:01:03 +00:00
|
|
|
- protectiveStopLoss:
|
|
|
|
activationRatio: 5%
|
|
|
|
stopLossRatio: 3%
|
|
|
|
placeStopOrder: false
|