配置机器人¶
Freqtrade 拥有众多可配置的功能和选项。
默认情况下,这些设置通过配置文件进行管理(见下文)。
Freqtrade 配置文件¶
机器人在运行过程中会使用一组配置参数,这些参数共同构成了机器人的配置。通常,机器人会从一个文件(Freqtrade 配置文件)中读取其配置。
默认情况下,机器人会从当前工作目录下的 config.json
文件加载配置。
你可以通过 -c/--config
命令行选项指定机器人使用的其他配置文件。
如果你使用了快速入门方法安装机器人,安装脚本应该已经为你创建了默认的配置文件(config.json
)。
如果没有创建默认配置文件,建议使用 freqtrade new-config --config user_data/config.json
生成一个基础配置文件。
Freqtrade 配置文件需采用 JSON
格式编写。
除了标准的 JSON 语法外,你还可以在配置文件中使用单行 // ...
和多行 /* ... */
注释,以及参数列表中的尾随逗号。
如果你不熟悉 JSON 格式也不用担心——只需用你喜欢的编辑器打开配置文件,修改你需要的参数,保存更改,最后重启机器人或在停止后重新运行即可。机器人在启动时会验证配置文件的语法,如果你编辑时出现错误,会在启动时警告并指出有问题的行。
环境变量¶
可以通过环境变量设置 Freqtrade 配置中的选项。 这会优先于配置文件或策略中的对应值。
环境变量必须以 FREQTRADE__
为前缀,才能被 freqtrade 加载到配置中。
__
作为层级分隔符,因此格式应为 FREQTRADE__{section}__{key}
。
例如,定义 export FREQTRADE__STAKE_AMOUNT=200
会在配置中生成 {stake_amount: 200}
。
更复杂的例子如 export FREQTRADE__EXCHANGE__KEY=<yourExchangeKey>
,用于保护你的交易所密钥安全。这样会将值放入配置的 exchange.key
部分。
使用这种方式,所有配置项都可以通过环境变量设置。
请注意,环境变量会覆盖配置文件中的对应设置,但命令行参数始终具有最高优先级。
常见示例:
FREQTRADE__TELEGRAM__CHAT_ID=<telegramchatid>
FREQTRADE__TELEGRAM__TOKEN=<telegramToken>
FREQTRADE__EXCHANGE__KEY=<yourExchangeKey>
FREQTRADE__EXCHANGE__SECRET=<yourExchangeSecret>
JSON
列表会被解析为 json
,因此你可以如下设置交易对列表:
export FREQTRADE__EXCHANGE__PAIR_WHITELIST='["BTC/USDT", "ETH/USDT"]'
多配置文件¶
可以为机器人指定多个配置文件,或让机器人从标准输入流读取配置参数。
你可以在 add_config_files
中指定额外的配置文件。
该参数指定的文件会在初始配置文件加载后合并。
文件路径相对于初始配置文件解析。
这类似于使用多个 --config
参数,但更简单,无需每次都为所有命令指定所有文件。
编辑器自动补全与校验¶
如果你使用支持 JSON schema 的编辑器,可以通过在配置文件顶部添加以下内容,获得自动补全和校验功能:
{
"$schema": "https://schema.freqtrade.io/schema.json",
}
配置参数¶
下表列出了所有可用的配置参数。
Freqtrade 也可以通过命令行(CLI)参数加载许多选项(可通过 --help
查看详情)。
配置项优先级¶
所有选项的优先级如下:
参数表¶
必填参数标记为 必需,表示必须通过某种方式设置。
策略中的参数¶
以下参数可在配置文件或策略中设置。
配置文件中的值会覆盖策略中的值。
minimal_roi
timeframe
stoploss
max_open_trades
trailing_stop
trailing_stop_positive
trailing_stop_positive_offset
trailing_only_offset_is_reached
use_custom_stoploss
process_only_new_candles
order_types
order_time_in_force
unfilledtimeout
disable_dataframe_checks
use_exit_signal
exit_profit_only
exit_profit_offset
ignore_roi_if_entry_signal
ignore_buying_expired_candle_after
position_adjustment_enable
max_entry_position_adjustment
每笔交易的金额配置¶
有多种方式配置机器人每笔交易使用的 stake 货币数量。所有方法都遵循可交易余额配置的说明。
最小交易金额¶
最小交易金额取决于交易所和交易对,通常可在交易所支持页面查到。
假设 XRP/USD 的最小可交易数量为 20 XRP(由交易所规定),价格为 0.6 美元,则买入该交易对的最小金额为 20 * 0.6 ~= 12
。
该交易所还规定所有订单必须大于 10 美元,但本例不受影响。
为保证安全执行,freqtrade 不允许用 10.1 美元买入,而是确保有足够空间在交易对下方设置止损(加上 amount_reserve_percent
,默认 5%)。
预留 5% 后,最小交易金额约为 12.6 美元(12 * (1 + 0.05)
)。若再考虑 10% 止损,则为约 14 美元(12.6 / (1 - 0.1)
)。
为防止止损过大导致计算值过高,计算出的最小交易金额不会超过实际限制的 1.5 倍。
Dry-run 钱包¶
在 dry-run 模式下,机器人会用模拟钱包执行交易。该钱包的起始余额由 dry_run_wallet
定义(默认 1000)。
对于更复杂的场景,也可以为 dry_run_wallet
分配一个字典,分别定义每种货币的起始余额。
"dry_run_wallet": {
"BTC": 0.01,
"ETH": 2,
"USDT": 1000
}
命令行参数(--dry-run-wallet
)可覆盖配置值,但仅适用于浮点数,字典需在配置文件中设置。
可交易余额¶
默认情况下,机器人假定"总余额 - 1%"可用于交易,使用动态交易金额时,会将总余额按 max_open_trades
平均分配。
freqtrade 会为手续费预留 1%,默认不会动用。
可通过 tradable_balance_ratio
设置"保留"金额。
例如,钱包有 10 ETH,tradable_balance_ratio=0.5
(50%),则机器人最多用 5 ETH 交易,其余不参与。
分配可用资金¶
若在同一交易所账户运行多个机器人,为充分利用复利,可为每个机器人限定起始余额。
可通过设置 available_capital
实现。
假设账户有 10000 USDT,想运行 2 个策略,则设 available_capital=5000
,每个机器人初始资金 5000 USDT。
机器人会将该余额平均分配到 max_open_trades
。
盈利会增加该机器人的持仓,不影响其他机器人。
调整 available_capital
需重载配置。减少资金时不会平仓,差额在交易结束后返还钱包。实际效果取决于调整与平仓间的价格变动。
调整最后一笔交易金额¶
假设可交易余额 1000 USDT,stake_amount=400
,max_open_trades=3
。
机器人会开 2 单,最后一单因余额不足 400 USDT 无法开仓。
可通过 amend_last_stake_amount
设为 True
,使机器人自动将最后一单金额降为可用余额。
如上例:
- 交易1:400 USDT
- 交易2:400 USDT
- 交易3:200 USDT
静态交易金额¶
stake_amount
静态配置每笔交易的金额。
最小配置值为 0.0001,但请查阅交易所最低限额。
该设置与 max_open_trades
联用,最大持仓为 stake_amount * max_open_trades
。
如配置 max_open_trades=3
、stake_amount=0.05
,则最多用 (0.05 BTC x 3) = 0.15 BTC。
动态交易金额¶
也可用动态交易金额,自动将可用余额按允许交易数平均分配。
配置方法:stake_amount="unlimited"
,建议同时设 tradable_balance_ratio=0.99
(99%),以预留手续费。
此时每笔交易金额为:
currency_balance / (max_open_trades - current_open_trades)
如需让机器人用尽所有 stake_currency
(减去 tradable_balance_ratio
),配置如下:
"stake_amount" : "unlimited",
"tradable_balance_ratio": 0.99,
动态交易金额与持仓调整¶
若需在无限持仓下用持仓调整,需在策略中实现 custom_stake_amount
,返回合适的金额。
典型值为建议金额的 25%-50%,具体视策略和预留资金而定。
如持仓调整假设可加仓 2 次,则应预留 66.6667% 作为缓冲。
如假设可加仓 1 次且金额为原始的 3 倍,则 custom_stake_amount
应返回建议金额的 25%,其余 75% 预留。
订单使用的价格¶
常规订单的价格可以通过参数结构 entry_pricing
(用于交易入场)和 exit_pricing
(用于交易出场)来控制。
价格总是在下单前通过查询交易所行情或使用订单簿数据获取。
入场价格¶
入场价格方向¶
配置设置 entry_pricing.price_side
定义了机器人在买入时查看订单簿的哪一侧。
以下显示了一个订单簿:
...
103
102
101 # ask(卖价)
-------------当前价差
99 # bid(买价)
98
97
...
如果 entry_pricing.price_side
设置为 "bid"
,则机器人将使用 99 作为入场价格。
相应地,如果 entry_pricing.price_side
设置为 "ask"
,则机器人将使用 101 作为入场价格。
根据订单方向(做多/做空),这会导致不同的结果。因此,我们建议在此配置中使用 "same"
或 "other"
。
这将产生以下价格矩阵:
方向 | 订单 | 设置 | 价格 | 是否跨越价差 |
---|---|---|---|---|
做多 | 买入 | ask | 101 | 是 |
做多 | 买入 | bid | 99 | 否 |
做多 | 买入 | same | 99 | 否 |
做多 | 买入 | other | 101 | 是 |
做空 | 卖出 | ask | 101 | 否 |
做空 | 卖出 | bid | 99 | 是 |
做空 | 卖出 | same | 101 | 否 |
做空 | 卖出 | other | 99 | 是 |
使用订单簿的另一侧通常可以保证订单更快成交,但机器人也可能支付比必要更多的费用。 即使使用限价买单,也很可能适用吃单费用而不是挂单费用。 此外,价差"另一侧"的价格高于订单簿中"买价"侧的价格,因此订单行为类似于市价单(但有一个最高价格限制)。
启用订单簿的入场价格¶
当启用订单簿入场(entry_pricing.use_order_book=True
)时,Freqtrade 从订单簿获取 entry_pricing.order_book_top
个条目,并使用在配置的订单簿侧(entry_pricing.price_side
)上指定的条目作为入场价格。1 表示订单簿中最顶部的条目,2 将使用订单簿中的第二个条目,以此类推。
未启用订单簿的入场价格¶
以下部分使用 side
作为配置的 entry_pricing.price_side
(默认为 "same"
)。
当不使用订单簿(entry_pricing.use_order_book=False
)时,如果最佳 side
价格低于行情中的 last
成交价,Freqtrade 将使用行情中的最佳 side
价格。否则(当 side
价格高于 last
价格时),它将基于 entry_pricing.price_last_balance
计算 side
和 last
价格之间的比率。
entry_pricing.price_last_balance
配置参数控制这一点。值为 0.0
将使用 side
价格,而 1.0
将使用 last
价格,介于两者之间的值将在卖价和最后价格之间进行插值。
检查市场深度¶
当启用检查市场深度(entry_pricing.check_depth_of_market.enabled=True
)时,入场信号将基于订单簿每侧的深度(所有数量的总和)进行过滤。
订单簿 bid
(买入)侧深度除以订单簿 ask
(卖出)侧深度,然后将得到的差值与该参数的值 entry_pricing.check_depth_of_market.bids_to_ask_delta
进行比较。只有当订单簿差值大于或等于配置的差值时,才会执行入场订单。
出场价格¶
出场价格方向¶
配置设置 exit_pricing.price_side
定义了机器人在出场时查看价差的哪一侧。
以下显示了一个订单簿:
...
103
102
101 # ask(卖价)
-------------当前价差
99 # bid(买价)
98
97
...
如果 exit_pricing.price_side
设置为 "ask"
,则机器人将使用 101 作为出场价格。
相应地,如果 exit_pricing.price_side
设置为 "bid"
,则机器人将使用 99 作为出场价格。
根据订单方向(做多/做空),这会导致不同的结果。因此,我们建议在此配置中使用 "same"
或 "other"
。
这将产生以下价格矩阵:
方向 | 订单 | 设置 | 价格 | 是否跨越价差 |
---|---|---|---|---|
做多 | 卖出 | ask | 101 | 否 |
做多 | 卖出 | bid | 99 | 是 |
做多 | 卖出 | same | 101 | 否 |
做多 | 卖出 | other | 99 | 是 |
做空 | 买入 | ask | 101 | 是 |
做空 | 买入 | bid | 99 | 否 |
做空 | 买入 | same | 99 | 否 |
做空 | 买入 | other | 101 | 是 |
启用订单簿的出场价格¶
当启用订单簿出场(exit_pricing.use_order_book=True
)时,Freqtrade 从订单簿获取 exit_pricing.order_book_top
个条目,并使用在配置的订单簿侧(exit_pricing.price_side
)上指定的条目作为交易出场价格。
1 表示订单簿中最顶部的条目,2 将使用订单簿中的第二个条目,以此类推。
未启用订单簿的出场价格¶
以下部分使用 side
作为配置的 exit_pricing.price_side
(默认为 "ask"
)。
当不使用订单簿(exit_pricing.use_order_book=False
)时,如果最佳 side
价格高于行情中的 last
成交价,Freqtrade 将使用行情中的最佳 side
价格。否则(当 side
价格低于 last
价格时),它将基于 exit_pricing.price_last_balance
计算 side
和 last
价格之间的比率。
exit_pricing.price_last_balance
配置参数控制这一点。值为 0.0
将使用 side
价格,而 1.0
将使用最后价格,介于两者之间的值将在 side
和最后价格之间进行插值。
市价单定价¶
使用市价单时,价格应配置为使用订单簿的"正确"一侧,以允许真实的价格检测。 假设入场和出场都使用市价单,必须使用类似以下的配置:
"order_types": {
"entry": "market",
"exit": "market"
// ...
},
"entry_pricing": {
"price_side": "other",
// ...
},
"exit_pricing":{
"price_side": "other",
// ...
},
显然,如果只有一方使用限价单,则可以使用不同的价格组合。
更多配置细节¶
理解 minimal_roi¶
minimal_roi
配置参数为 JSON 对象,键为分钟数,值为最小收益率(比例)。
示例:
"minimal_roi": {
"40": 0.0, # 40 分钟后只要不亏损就退出
"30": 0.01, # 30 分钟后至少盈利 1% 就退出
"20": 0.02, # 20 分钟后至少盈利 2% 就退出
"0": 0.04 # 立即盈利 4% 就退出
},
大多数策略文件已包含最优的 minimal_roi
。
该参数可在策略或配置文件中设置,配置文件优先。
若两者都未设置,则默认 1000%({"0": 10}
),即除非盈利 1000% 否则不退出。
理解 force_entry_enable¶
force_entry_enable
配置参数允许通过 Telegram 和 REST API 使用强制建仓命令(/forcelong
、/forceshort
)。
出于安全考虑,默认禁用,启用时 freqtrade 会在启动时警告。
例如,发送 /forceenter ETH/BTC
,机器人会买入该交易对并持有,直到出现常规退出信号(ROI、止损、/forceexit)。
部分策略下此功能风险较大,请谨慎使用。
详见 telegram 文档。
忽略过期 K 线¶
使用较大周期(如 1h)且 max_open_trades
较低时,最后一根 K 线可能在交易位空出时被处理。此时买入信号可能已过最佳时机。
可通过设置 ignore_buying_expired_candle_after
,指定买入信号过期秒数。
如策略用 1h 周期,只想在新 K 线前 5 分钟买入,可如下配置:
{
//...
"ignore_buying_expired_candle_after": 300,
// ...
}
使用市价单时请仔细阅读市价单定价章节。
order_types.stoploss_on_exchange_interval
非必填,若不确定请勿更改。更多止损机制详见止损文档。
若启用 order_types.stoploss_on_exchange
,且手动取消了交易所止损单,机器人会重新挂单。
若止损在交易所挂单失败,将触发"紧急退出",默认用市价单平仓。可通过 order_types
字典中的 emergency_exit
更改,但不建议。
理解 order_time_in_force¶
order_time_in_force
配置参数定义订单在交易所的执行策略。
常见有:
GTC(Good Till Canceled):
默认策略,订单会一直保留,直到被用户取消。可全部或部分成交,未成交部分会一直挂单。
FOK(Fill Or Kill):
若订单未能立即且全部成交,则被交易所取消。
IOC(Immediate Or Canceled):
与 FOK 类似,但可部分成交,未成交部分自动取消。
PO(Post only):
仅作为挂单,若不能作为挂单则取消。即订单必须至少挂在盘口一段时间。
请查看交易所文档了解您的交易所支持的有效时间值。
time_in_force 配置¶
order_time_in_force
参数为字典,包含买入和卖出的策略。
可在配置文件或策略中设置。
配置文件中设置的值会覆盖策略中的值,遵循常规的优先级规则。
可选值:GTC
(默认)、FOK
、IOC
。
"order_time_in_force": {
"entry": "GTC",
"exit": "GTC"
},
请勿随意更改,除非你了解不同策略对交易所的影响。
法币转换¶
Freqtrade 使用 Coingecko API 将币值转换为法币,用于 Telegram 报告。
法币可通过配置文件的 fiat_display_currency
设置。
移除 fiat_display_currency
可跳过 coingecko 初始化,不会显示法币转换,对机器人运行无影响。
法币可用值¶
fiat_display_currency
配置参数设置 Telegram 报告中币转法币的基准货币。
可用值:
"AUD", "BRL", "CAD", "CHF", "CLP", "CNY",
"CZK", "DKK", "EUR", "GBP", "HKD", "HUF",
"IDR", "ILS", "INR", "JPY", "KRW", "MXN",
"MYR", "NOK", "NZD", "PHP", "PKR", "PLN",
"RUB", "SEK", "SGD", "THB", "TRY", "TWD",
"ZAR", "USD"
除法币外,还支持部分加密货币:
"BTC", "ETH", "XRP", "LTC", "BCH", "BNB"
Coingecko 限流问题¶
部分 IP 段下,coingecko 限流严重。此时可在配置中添加 coingecko API key。
{
"fiat_display_currency": "USD",
"coingecko": {
"api_key": "your-api",
"is_demo": true
}
}
Freqtrade 支持 Coingecko Demo 和 Pro API key。
Coingecko API key 非机器人运行必需,仅用于 Telegram 报告中的币转法币,通常无需 key 也可用。
使用交易所 Websocket¶
Freqtrade 可通过 ccxt.pro 消费交易所 websocket。
Freqtrade 旨在确保数据始终可用。
若 websocket 连接失败(或被禁用),机器人会回退到 REST API。
如遇到疑似 websocket 问题,可通过 exchange.enable_ws
关闭(默认 true)。
"exchange": {
// ...
"enable_ws": false,
// ...
}
如需使用代理,详见代理配置。
正在逐步上线,确保机器人稳定。目前仅限 ohlcv 数据流,且仅支持部分交易所,后续会持续增加。
使用 Dry-run 模式¶
建议先用 Dry-run 模式运行机器人,观察策略表现。
Dry-run 模式下不会动用真实资金,仅做实时模拟。
- 编辑
config.json
配置文件。 - 将
dry_run
设为 true,并指定db_url
。
"dry_run": true,
"db_url": "sqlite:///tradesv3.dryrun.sqlite",
- 移除交易所
API key
和secret
(可填空或假值):
"exchange": {
"name": "binance",
"key": "key",
"secret": "secret",
//"password": "", // 可选,并非所有交易所都需要
// ...
}
Dry-run
模式下满意后,可切换到生产模式。
Dry-run
模式下有模拟钱包,起始资金为 dry_run_wallet
(默认 1000)。
Dry-run 注意事项¶
- API key 可选。仅执行只读操作(不会更改账户状态)。
- 钱包(
/balance
)基于dry_run_wallet
模拟。 - 订单为模拟,不会提交到交易所。
- 市价单按下单时盘口成交量成交,最大滑点 5%。
- 限价单在价格达到目标时成交,或按
unfilledtimeout
超时设置取消。 - 限价单若与市价差超 1%,会转为市价单立即成交。
- 配合
stoploss_on_exchange
时,假定止损价成交。 - 未成交订单(非已成交交易,后者存数据库)在机器人重启后仍保留,假定未成交。
切换到生产模式¶
生产模式下,机器人会动用真实资金。请谨慎操作,错误策略可能导致全部亏损。
切换到生产模式时,建议使用不同/全新数据库,避免 dry-run
交易影响真实资金和统计。
配置交易所账户¶
需在交易所网站创建 API Key(通常为 key
和 secret
,部分还需 password
),并填入配置文件或通过 freqtrade new-config
命令输入。
API Key 仅在实盘(生产模式)下必需,dry-run
模式可填空。
切换到生产模式¶
编辑 config.json
文件。
将 dry_run 设为 false,并根据需要调整数据库 URL:
"dry_run": false,
填入交易所 API key(可用假 key):
{
"exchange": {
"name": "binance",
"key": "af8ddd35195e9dc500b9a6f799f6f5c93d89193b",
"secret": "08a9dc6db3d7b53e1acebd9275677f4b0a04f1a5",
//"password": "", // 可选,并非所有交易所都需要
// ...
}
//...
}
请务必阅读交易所文档,了解各交易所的特殊配置。
建议用第二个配置文件存放 API key。
将上述片段放入新文件(如 config-private.json
),主配置文件仅存通用设置。
启动时用 freqtrade trade --config user_data/config.json --config user_data/config-private.json <...>
加载密钥。
切勿与他人分享私密配置文件或交易所密钥!
Freqtrade 使用代理¶
如需为 freqtrade 配置代理,导出 HTTP_PROXY
和 HTTPS_PROXY
环境变量:
export HTTP_PROXY="http://addr:port"
export HTTPS_PROXY="http://addr:port"
freqtrade
代理交易所请求¶
如需为交易所连接配置代理,需在 ccxt 配置中指定:
{
"exchange": {
"ccxt_config": {
"httpsProxy": "http://addr:port",
"wsProxy": "http://addr:port",
}
}
}
更多代理类型请查阅 ccxt 代理文档。
下一步¶
现在你已配置好 config.json,下一步请启动机器人。