Telegram 监控
本章详细介绍 Freqtrade 的 Telegram Bot 集成,涵盖 Bot 配置、命令列表、自定义消息、告警通知和远程控制功能,帮助读者随时随地监控和管理交易机器人。
Telegram Bot 配置
创建 Telegram Bot
- 在 Telegram 中搜索
@BotFather - 发送
/newbot命令创建新 Bot - 设置 Bot 名称和用户名
- 保存获得的 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_trades | limit | 查看最近的交易记录 |
/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: 正在平仓所有持仓...
安全性建议
- 保护 Token:不要将 Bot Token 提交到代码仓库
- 限制 Chat ID:只允许授权的 Chat ID 控制机器人
- 操作确认:关键操作启用确认机制
- 审计日志:所有远程操作都会记录到日志