Telegram 监控

本章详细介绍 Freqtrade 的 Telegram Bot 集成,涵盖 Bot 配置、命令列表、自定义消息、告警通知和远程控制功能,帮助读者随时随地监控和管理交易机器人。

Telegram Bot 配置

创建 Telegram Bot

  1. 在 Telegram 中搜索 @BotFather
  2. 发送 /newbot 命令创建新 Bot
  3. 设置 Bot 名称和用户名
  4. 保存获得的 API Token
# BotFather 对话示例
User: /newbot
BotFather: Alright, choose a name for your bot.
User: My Trading Bot
BotFather: Now choose a username for your bot. Must end in 'bot'.
User: my_trading_bot
BotFather: Done! Your bot's token: 1234567890:ABCdefGHIjklmNOPqrstUVwxyz

获取 Chat ID

# 方法 1:向 Bot 发送一条消息后,通过 API 获取
curl https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates
# 返回结果中的 chat.id 就是你的 Chat ID

# 方法 2:使用 freqtrade 启动后查看日志
# 启动时日志会显示 Telegram chat_id

配置文件

{
    "telegram": {
        "enabled": true,
        "token": "1234567890:ABCdefGHIjklmNOPqrstUVwxyz",
        "chat_id": "123456789",
        "notification_parameters": {}
    }
}

推荐使用环境变量配置敏感信息:

export FREQTRADE__TELEGRAM__ENABLED=true
export FREQTRADE__TELEGRAM__TOKEN="1234567890:ABCdefGHIjklmNOPqrstUVwxyz"
export FREQTRADE__TELEGRAM__CHAT_ID="123456789"

命令列表

基础命令

命令参数说明
/start-启动 Bot,显示欢迎信息
/stop-停止交易机器人
/status-查看当前持仓状态
/profit-查看盈利统计
/balance-查看交易所账户余额
/daily-查看每日盈亏
/weekly-查看每周盈亏
/monthly-查看每月盈亏
/performance-查看各交易对表现
/count-查看当前开仓数量
/version-查看 Freqtrade 版本
/help-查看帮助信息

交易控制命令

命令参数说明
/forcesell <trade_id>all / trade_id强制平仓
/forcebuy <pair> [rate]交易对强制开仓
/reload_config-重新加载配置
/cancel_open_order <trade_id>trade_id取消未成交订单
/show_config-显示当前配置
/show_tradeslimit查看最近的交易记录
/delete_trade <trade_id>trade_id删除交易记录
/logs [limit]行数查看最近日志
/whitelist-查看白名单交易对
/blacklist-查看黑名单
/blacklist_add <pair>交易对添加交易对到黑名单
/blacklist_delete <pair>交易对从黑名单移除交易对

FreqAI 相关命令

命令说明
/freqaimodel查看当前使用的 FreqAI 模型信息
/freqai_train手动触发 FreqAI 模型重新训练

锁定与解锁命令

/locks           # 查看当前的锁定情况
/lock <pair>     # 锁定某个交易对,停止交易
/unlock <pair>   # 解锁交易对

自定义消息

使用自定义消息模板

from freqtrade.strategy import IStrategy
from freqtrade.persistence import Trade

class NotificationStrategy(IStrategy):
    def populate_indicators(self, dataframe, metadata):
        return dataframe

    def custom_stoploss(self, pair, trade, current_time,
                        current_rate, current_profit, **kwargs):
        # 在止损触发时发送自定义通知
        if current_profit < -0.05:
            self.send_msg(f"⚠️ {pair} 跌幅超过5%,当前盈亏: {current_profit:.2%}")
        return -0.10

    def confirm_trade_entry(self, pair, order_type, amount, rate,
                           time_in_force, current_time, entry_tag, side, **kwargs):
        # 发送开仓通知
        self.send_msg(f"📈 开仓 {side}: {pair}\n数量: {amount}\n价格: {rate}")
        return True

    def confirm_trade_exit(self, pair, trade, order_type, amount, rate,
                          time_in_force, exit_reason, current_time, **kwargs):
        # 发送平仓通知
        profit_pct = trade.calc_profit_ratio(rate) * 100
        self.send_msg(f"📉 平仓 {pair}\n理由: {exit_reason}\n盈亏: {profit_pct:.2f}%")
        return True

通知参数配置

{
    "telegram": {
        "enabled": true,
        "token": "YOUR_TOKEN",
        "chat_id": "YOUR_CHAT_ID",
        "notification_parameters": {
            "entry": "填充开仓通知格式",
            "entry_fill": "开仓成交通知",
            "entry_cancel": "开仓取消通知",
            "exit": {
                "buy": "行情触发卖出",
                "sell": "策略触发卖出",
                "stoploss": "止损触发",
                "roi": "ROI 止盈",
                "force_sell": "手动强平"
            },
            "exit_fill": "平仓成交通知",
            "exit_cancel": "平仓取消通知",
            "status": "持仓状态",
            "warning": "警告消息",
            "startup": "启动通知",
            "protections": "保护触发通知",
            "buy_confirmation": "开仓确认请求",
            "sell_confirmation": "平仓确认请求",
            "strategy_msg": "策略自定义消息"
        }
    }
}

自定义通知格式

{
    "telegram": {
        "notification_parameters": {
            "entry": "📈 开仓通知\n交易对: {pair}\n价格: {open_date}\n金额: {stake_amount} {stake_currency}\n方向: {side}",
            "entry_fill": "✅ 开仓成交\n交易对: {pair}\n成交价: {open_rate}\n金额: {stake_amount} {stake_currency}",
            "exit_fill": "✅ 平仓成交\n交易对: {pair}\n成交价: {close_rate}\n盈亏: {profit_ratio:.2%}\n持有时间: {trade_duration}",
            "exit": "📉 平仓信号\n交易对: {pair}\n理由: {exit_reason}"
        }
    }
}

可用的模板变量:

变量说明
{pair}交易对
{open_date}开仓时间
{close_date}平仓时间
{open_rate}开仓价格
{close_rate}平仓价格
{stake_amount}投入金额
{stake_currency}投入币种
{profit_ratio}盈亏比例
{profit_abs}绝对盈亏
{trade_duration}持仓时长
{exit_reason}退出原因
{side}方向(long/short)
{current_rate}当前价格

告警通知

关键告警类型

Freqtrade 会自动发送以下关键告警:

# 止损告警
⚠️ 止损触发: BTC/USDT @ 42000, 亏损 5.2%

# 启动/停止通知
🚀 Freqtrade 已启动 (策略: MyStrategy)
🛑 Freqtrade 已停止

# 异常告警
❌ API 连接异常: binance, 10秒后重试
⚠️ 余额不足: 需要 100 USDT,可用 50 USDT

# 风控通知
🔒 交易对锁定: ETH/USDT (连续亏损)
🔓 交易对解锁: SOL/USDT (锁定到期)

自定义告警规则

在策略中实现自定义告警:

def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    pair = metadata["pair"]

    # 检测异常波动
    volatility = dataframe["close"].pct_change().rolling(10).std()
    current_vol = volatility.iloc[-1]
    avg_vol = volatility.mean()

    if current_vol > avg_vol * 3:
        self.send_msg(
            f"⚠️ {pair} 波动率异常\n"
            f"当前波动率: {current_vol:.4f}\n"
            f"平均波动率: {avg_vol:.4f}\n"
            f"倍率: {current_vol/avg_vol:.1f}x"
        )

    # 检测连续亏损
    trades = Trade.get_trades_proxy(pair=pair)
    recent_losses = sum(
        1 for t in trades[-5:]
        if t.calc_profit_ratio() < 0
    )
    if recent_losses >= 3:
        self.send_msg(
            f"⚠️ {pair} 连续 {recent_losses} 笔亏损, 建议关注"
        )

    return dataframe

远程控制

远程控制操作

通过 Telegram 命令实现远程控制:

# 停止交易
/stop

# 重启交易
/start

# 强制平仓所有持仓
/forcesell all

# 强制买入
/forcebuy BTC/USDT

# 锁定交易对
/lock ETH/USDT

# 查看当前持仓
/status

# 查看账户余额
/balance

# 重新加载配置
/reload_config

强制开仓确认

配置需要确认的强制操作:

{
    "telegram": {
        "enabled": true,
        "token": "YOUR_TOKEN",
        "chat_id": "YOUR_CHAT_ID",
        "notification_parameters": {
            "buy_confirmation": true,
            "sell_confirmation": true
        }
    }
}

启用确认后,执行 /forcesell 等操作时需要 Bot 确认:

User: /forcesell all
Bot: 确认要平仓所有持仓吗? (当前 3 个持仓)
User: 是
Bot: 正在平仓所有持仓...

安全性建议

  1. 保护 Token:不要将 Bot Token 提交到代码仓库
  2. 限制 Chat ID:只允许授权的 Chat ID 控制机器人
  3. 操作确认:关键操作启用确认机制
  4. 审计日志:所有远程操作都会记录到日志