跳至内容

高级安装后任务

本页面介绍了一些在机器人安装后可以执行的高级任务和配置选项,这些功能在某些环境中可能非常有用。

如果你不清楚这里提到的内容是什么意思,那你可能并不需要它们。

运行多个 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),并更新 WorkingDirectoryExecStart 以匹配你的配置。

注意

某些系统(如 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 系统上,可以将机器人配置为将其日志消息发送到 syslogjournald 系统服务。在 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')。

在许多系统上,syslogrsyslog)会从 journald 获取数据(反之亦然),因此可以同时使用 syslog 或 journald,并且可以通过 journalctl 和 syslog 查看工具来查看消息。你可以根据自己的需要任意组合使用。

对于 rsyslog,可以将机器人产生的消息重定向到一个独立的专用日志文件中。为此,请添加

if $programname startswith "freqtrade" then -/var/log/freqtrade.log

到某个 rsyslog 配置文件中,例如添加到 /etc/rsyslog.d/50-default.conf 文件末尾。

对于 syslogrsyslog),可以启用减少重复消息的模式。这将减少重复消息的数量。例如,当机器人没有其他活动时,多个心跳消息将被合并为单条消息。为此,请在 /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 工具中还有许多其他选项可用于过滤消息,请参阅该工具的手册页。

在许多系统上,syslogrsyslog)会从 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",

      ]
    }

  }
}