高级安装后任务¶
本页面介绍了一些在机器人安装后可以执行的高级任务和配置选项,这些功能在某些环境中可能非常有用。
如果你不清楚这里提到的内容是什么意思,那你可能并不需要它们。
运行多个 Freqtrade 实例¶
本节将向你展示如何在同一台机器上同时运行多个机器人。
需要考虑的事项¶
- 使用不同的数据库文件。
- 使用不同的 Telegram 机器人(需要多个不同的配置文件;仅在启用 Telegram 时适用)。
- 使用不同的端口(仅在启用 Freqtrade REST API 服务器时适用)。
不同的数据库文件¶
为了跟踪你的交易、利润等信息,Freqtrade 使用 SQLite 数据库来存储各种类型的数据,例如你过去的交易记录以及当前持有的仓位。这不仅可以帮助你追踪收益,更重要的是,当机器人进程被重启或意外终止时,仍能保留正在进行的交易活动记录。
默认情况下,Freqtrade 会为模拟交易和实盘交易使用不同的数据库文件(前提是配置文件或命令行参数中均未指定数据库 URL)。在实盘交易模式下,默认数据库为 tradesv3.sqlite,而在模拟交易模式下则为 tradesv3.dryrun.sqlite。
用于指定这些文件路径的可选参数是 --db-url,该参数需要一个有效的 SQLAlchemy URL。因此,当你仅使用配置文件和策略参数在模拟模式下启动机器人时,以下两条命令的效果是相同的。
freqtrade trade -c MyConfig.json -s MyStrategy
# is equivalent to
freqtrade trade -c MyConfig.json -s MyStrategy --db-url sqlite:///tradesv3.dryrun.sqlite
这意味着,如果你在两个不同的终端中运行 trade 命令,例如在一个实例中测试 USDT 交易,另一个实例中测试 BTC 交易,则必须为它们使用不同的数据库。
如果你指定的数据库 URL 对应的数据库不存在,Freqtrade 将会创建一个你指定名称的新数据库。因此,为了使用自定义策略分别测试 BTC 和 USDT 作为质押货币的交易,你可以使用以下命令(在两个独立的终端中执行):
# Terminal 1:
freqtrade trade -c MyConfigBTC.json -s MyCustomStrategy --db-url sqlite:///user_data/tradesBTC.dryrun.sqlite
# Terminal 2:
freqtrade trade -c MyConfigUSDT.json -s MyCustomStrategy --db-url sqlite:///user_data/tradesUSDT.dryrun.sqlite
相反,如果你希望在生产模式下执行相同的操作,则还必须创建至少一个新数据库(除了默认数据库之外),并指定“实时”数据库的路径,例如:
# Terminal 1:
freqtrade trade -c MyConfigBTC.json -s MyCustomStrategy --db-url sqlite:///user_data/tradesBTC.live.sqlite
# Terminal 2:
freqtrade trade -c MyConfigUSDT.json -s MyCustomStrategy --db-url sqlite:///user_data/tradesUSDT.live.sqlite
有关使用 sqlite 数据库的更多信息,例如手动添加或删除交易,请参考 SQL 速查表。
使用 Docker 运行多个实例¶
要使用 Docker 运行多个 freqtrade 实例,你需要编辑 docker-compose.yml 文件,并将所有想要的实例作为独立服务添加。请记住,你可以将配置拆分为多个文件,因此建议将配置模块化,这样当你需要修改所有机器人共用的设置时,可以在单个配置文件中完成。
---
version: '3'
services:
freqtrade1:
image: freqtradeorg/freqtrade:stable
# image: freqtradeorg/freqtrade:develop
# Use plotting image
# image: freqtradeorg/freqtrade:develop_plot
# Build step - only needed when additional dependencies are needed
# build:
# context: .
# dockerfile: "./docker/Dockerfile.custom"
restart: always
container_name: freqtrade1
volumes:
- "./user_data:/freqtrade/user_data"
# Expose api on port 8080 (localhost only)
# Please read the https://www.freqtrade.io/en/latest/rest-api/ documentation
# before enabling this.
ports:
- "127.0.0.1:8080:8080"
# Default command used when running `docker compose up`
command: >
trade
--logfile /freqtrade/user_data/logs/freqtrade1.log
--db-url sqlite:////freqtrade/user_data/tradesv3_freqtrade1.sqlite
--config /freqtrade/user_data/config.json
--config /freqtrade/user_data/config.freqtrade1.json
--strategy SampleStrategy
freqtrade2:
image: freqtradeorg/freqtrade:stable
# image: freqtradeorg/freqtrade:develop
# Use plotting image
# image: freqtradeorg/freqtrade:develop_plot
# Build step - only needed when additional dependencies are needed
# build:
# context: .
# dockerfile: "./docker/Dockerfile.custom"
restart: always
container_name: freqtrade2
volumes:
- "./user_data:/freqtrade/user_data"
# Expose api on port 8080 (localhost only)
# Please read the https://www.freqtrade.io/en/latest/rest-api/ documentation
# before enabling this.
ports:
- "127.0.0.1:8081:8080"
# Default command used when running `docker compose up`
command: >
trade
--logfile /freqtrade/user_data/logs/freqtrade2.log
--db-url sqlite:////freqtrade/user_data/tradesv3_freqtrade2.sqlite
--config /freqtrade/user_data/config.json
--config /freqtrade/user_data/config.freqtrade2.json
--strategy SampleStrategy
你可以使用任意命名约定,freqtrade1 和 2 只是示例名称。请注意,如上所述,每个实例必须使用不同的数据库文件、端口映射和 Telegram 配置。
使用不同的数据库系统¶
Freqtrade 使用 SQLAlchemy,它支持多种不同的数据库系统。因此,理论上支持大量数据库系统。Freqtrade 不依赖也不安装任何额外的数据库驱动程序。请参阅 SQLAlchemy 文档 中关于相应数据库系统的安装说明。
以下系统已经过测试,并已知可与 freqtrade 正常工作:
- sqlite(默认)
- PostgreSQL
- MariaDB
警告
使用以下任一数据库系统时,即表示你已了解如何管理此类系统。Freqtrade 团队不会为这些数据库系统的设置、维护(或备份)提供任何支持。
PostgreSQL¶
安装命令:pip install psycopg2-binary
使用方式:... --db-url postgresql+psycopg2://<用户名>:<密码>@localhost:5432/<数据库名>
Freqtrade 在启动时会自动创建所需的表。
如果你运行多个 Freqtrade 实例,则必须为每个实例设置独立的数据库,或使用不同的用户/模式进行连接。
MariaDB / MySQL¶
Freqtrade 通过使用 SQLAlchemy 支持 MariaDB,而 SQLAlchemy 支持多种不同的数据库系统。
安装命令:pip install pymysql
使用方式:... --db-url mysql+pymysql://<用户名>:<密码>@localhost:3306/<数据库名>
将机器人配置为 systemd 服务运行¶
将 freqtrade.service 文件复制到你的 systemd 用户目录(通常是 ~/.config/systemd/user),并更新 WorkingDirectory 和 ExecStart 以匹配你的配置。
注意
某些系统(如 Raspbian)不会从用户目录加载服务单元文件。在这种情况下,请将 freqtrade.service 复制到 /etc/systemd/user/(需要超级用户权限)。
之后,你可以使用以下命令启动守护进程:
systemctl --user start freqtrade
为了使该服务持久运行(即使用户登出后仍运行),你需要为你的 freqtrade 用户启用 linger 功能。
sudo loginctl enable-linger "$USER"
如果你将机器人作为服务运行,可以使用 systemd 服务管理器作为软件看门狗,监控 freqtrade 机器人的状态,并在发生故障时自动重启。如果在配置中设置了 internals.sd_notify 参数为 true,或使用了命令行选项 --sd-notify,机器人将通过 sd_notify(systemd 通知)协议向 systemd 发送心跳消息,并在其状态改变时(运行中、暂停或已停止)通知 systemd。
freqtrade.service.watchdog 文件包含一个服务单元配置文件的示例,该示例使用 systemd 作为看门狗。
注意
如果机器人在 Docker 容器中运行,则机器人与 systemd 服务管理器之间的 sd_notify 通信将无法工作。
高级日志记录¶
Freqtrade 使用 Python 提供的默认 logging 模块。在这方面,Python 支持广泛的日志配置,远超此处所能涵盖的范围。
如果在 freqtrade 配置中未提供 log_config,则默认启用默认日志格式(带颜色的终端输出)。使用 --logfile logfile.log 将启用 RotatingFileHandler。
如果你对日志格式或 RotatingFileHandler 的默认设置不满意,可以通过在 freqtrade 配置文件中添加 log_config 配置来自定义日志记录。
默认配置大致如下所示,默认情况下文件处理器已定义但未启用,因为 filename 被注释掉了。取消注释此行并提供有效的路径/文件名即可启用。
{
"log_config": {
"version": 1,
"formatters": {
"basic": {
"format": "%(message)s"
},
"standard": {
"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
}
},
"handlers": {
"console": {
"class": "freqtrade.loggers.ft_rich_handler.FtRichHandler",
"formatter": "basic"
},
"file": {
"class": "logging.handlers.RotatingFileHandler",
"formatter": "standard",
// "filename": "someRandomLogFile.log",
"maxBytes": 10485760,
"backupCount": 10
}
},
"root": {
"handlers": [
"console",
// "file"
],
"level": "INFO",
}
}
}
高亮的行
上述代码块中的高亮行定义了 Rich 处理器,并应一起使用。格式化器 "standard" 和 "file" 将属于 FileHandler。
每个处理器必须使用一个已定义的格式化器(通过名称),其类必须可用,并且必须是有效的 logging 类。要实际使用某个处理器,它必须出现在 "root" 段内的 "handlers" 列表中。如果省略此部分,freqtrade 将不会输出任何内容(至少在未配置的处理器中如此)。
显式日志配置
我们建议将日志配置从主 freqtrade 配置文件中分离出来,并通过多配置文件功能提供给机器人。这可以避免不必要的代码重复。
在许多 Linux 系统上,可以将机器人配置为将其日志消息发送到 syslog 或 journald 系统服务。在 Windows 上也可以将日志发送到远程 syslog 服务器。为此,可以使用 --logfile 命令行选项的特殊值。
记录到 syslog¶
要将 Freqtrade 日志消息发送到本地或远程的 syslog 服务,请使用 "log_config" 设置选项来配置日志记录。
{
// ...
"log_config": {
"version": 1,
"formatters": {
"syslog_fmt": {
"format": "%(name)s - %(levelname)s - %(message)s"
}
},
"handlers": {
// Other handlers?
"syslog": {
"class": "logging.handlers.SysLogHandler",
"formatter": "syslog_fmt",
// Use one of the other options above as address instead?
"address": "/dev/log"
}
},
"root": {
"handlers": [
// other handlers
"syslog",
]
}
}
}
可能需要配置额外的日志处理器,以便同时在控制台中输出日志。
Syslog 使用方法¶
日志消息将以 user 设施发送到 syslog。因此,你可以使用以下命令查看它们:
tail -f /var/log/user,或者- 安装一个功能全面的图形化查看器(例如,Ubuntu 的 'Log File Viewer')。
在许多系统上,syslog(rsyslog)会从 journald 获取数据(反之亦然),因此可以同时使用 syslog 或 journald,并且可以通过 journalctl 和 syslog 查看工具来查看消息。你可以根据自己的需要任意组合使用。
对于 rsyslog,可以将机器人产生的消息重定向到一个独立的专用日志文件中。为此,请添加
if $programname startswith "freqtrade" then -/var/log/freqtrade.log
到某个 rsyslog 配置文件中,例如添加到 /etc/rsyslog.d/50-default.conf 文件末尾。
对于 syslog(rsyslog),可以启用减少重复消息的模式。这将减少重复消息的数量。例如,当机器人没有其他活动时,多个心跳消息将被合并为单条消息。为此,请在 /etc/rsyslog.conf 中设置:
# Filter duplicated messages
$RepeatedMsgReduction on
Syslog 地址配置¶
syslog 地址可以是 Unix 域套接字(套接字文件名),也可以是 UDP 套接字说明,后者由 IP 地址和 UDP 端口组成,中间用 : 字符分隔。
以下是可能地址的一些示例:
"address": "/dev/log"—— 使用/dev/log套接字将日志发送到 syslog(rsyslog),适用于大多数系统。"address": "/var/run/syslog"—— 使用/var/run/syslog套接字将日志发送到 syslog(rsyslog)。在 macOS 上使用此选项。"address": "localhost:514"—— 使用 UDP 套接字将日志发送到本地 syslog,前提是其正在监听 514 端口。"address": "<ip>:514"—— 将日志发送到指定 IP 地址和 514 端口的远程 syslog。在 Windows 上可用于向外部 syslog 服务器进行远程日志记录。
已弃用 —— 通过命令行配置 syslog
--logfile syslog:<syslog_address> —— 使用 <syslog_address> 作为 syslog 地址,将日志消息发送到 syslog 服务。
syslog 地址可以是 Unix 域套接字(套接字文件名),也可以是 UDP 套接字说明,后者由 IP 地址和 UDP 端口组成,中间用 : 字符分隔。
以下是一些可能用法的示例:
--logfile syslog:/dev/log—— 使用/dev/log套接字将日志发送到 syslog(rsyslog),适用于大多数系统。--logfile syslog—— 同上,是/dev/log的快捷写法。--logfile syslog:/var/run/syslog—— 使用/var/run/syslog套接字将日志发送到 syslog(rsyslog)。在 macOS 上使用此选项。--logfile syslog:localhost:514—— 使用 UDP 套接字将日志发送到本地 syslog,前提是其正在监听 514 端口。--logfile syslog:<ip>:514—— 将日志发送到指定 IP 地址和 514 端口的远程 syslog。在 Windows 上可用于向外部 syslog 服务器进行远程日志记录。
记录到 journald¶
这需要安装 cysystemd Python 包作为依赖(pip install cysystemd),但该包在 Windows 上不可用。因此,运行在 Windows 上的机器人无法使用 journald 日志功能。
要将 Freqtrade 的日志消息发送到 journald 系统服务,请在配置中添加以下配置片段。
{
// ...
"log_config": {
"version": 1,
"formatters": {
"journald_fmt": {
"format": "%(name)s - %(levelname)s - %(message)s"
}
},
"handlers": {
// Other handlers?
"journald": {
"class": "cysystemd.journal.JournaldLogHandler",
"formatter": "journald_fmt",
}
},
"root": {
"handlers": [
// ..
"journald",
]
}
}
}
可能需要配置额外的日志处理器,以便同时在控制台中输出日志。
日志消息将以 user 设施(facility)发送到 journald。你可以使用以下命令查看它们:
journalctl -f—— 显示发送到journald的 Freqtrade 日志消息,以及其他由journald收集的日志消息。journalctl -f -u freqtrade.service—— 当机器人作为systemd服务运行时,可使用此命令。
在 journalctl 工具中还有许多其他选项可用于过滤消息,请参阅该工具的手册页。
在许多系统上,syslog(rsyslog)会从 journald 获取数据(反之亦然),因此可以同时使用 --logfile syslog 或 --logfile journald,并可通过 journalctl 和 syslog 查看工具来查看消息。你可以根据需要以任意方式组合使用。
已弃用 - 通过命令行配置 journald
要将 Freqtrade 日志消息发送到 journald 系统服务,请使用 --logfile 命令行选项,并采用以下格式指定值:
--logfile journald —— 将日志消息发送到 journald。
日志格式为 JSON¶
你还可以将默认输出流配置为使用 JSON 格式。fmt_dict 属性定义了 JSON 输出的键,以及 Python logging LogRecord 属性。
以下配置会将默认输出更改为 JSON 格式。不过,此格式化程序也可与 RotatingFileHandler 结合使用。我们建议保留一种人类可读的格式。
{
// ...
"log_config": {
"version": 1,
"formatters": {
"json": {
"()": "freqtrade.loggers.json_formatter.JsonFormatter",
"fmt_dict": {
"timestamp": "asctime",
"level": "levelname",
"logger": "name",
"message": "message"
}
}
},
"handlers": {
// Other handlers?
"jsonStream": {
"class": "logging.StreamHandler",
"formatter": "json"
}
},
"root": {
"handlers": [
// ..
"jsonStream",
]
}
}
}