问题描述
解决方案
在PTrade中,要在产生交易信号时自动发送通知,可以使用 send_email(发送邮件)和 send_qywx(发送企业微信)这两个接口。
重要提示:
- 仅限实盘:这两个功能通常仅在交易(实盘)模式下可用,回测模式下无法发送真实的邮件或消息。
- 邮件配置:发送邮件前,通常需要在
initialize中配置发件人信息(目前主要支持QQ邮箱)。 - 企业微信配置:
send_qywx通常需要您的资金账号与券商提供的企业微信服务或PTrade客户端进行了绑定,具体需咨询您的开户券商是否支持该功能。
以下是具体的实现步骤和代码示例。
1. 发送邮件配置 (set_email_info)
在 initialize 函数中,使用 set_email_info 配置发件箱信息。
- email_address: 发件人邮箱地址(通常也是收件人)。
- smtp_code: 邮箱的SMTP授权码(不是邮箱登录密码)。需登录QQ邮箱网页版 -> 设置 -> 账户 -> 开启POP3/SMTP服务 -> 获取授权码。
- email_subject: 邮件主题前缀。
2. 发送消息接口
send_email(content): 发送邮件,content为邮件正文内容(字符串)。send_qywx(content): 发送企业微信消息,content为消息内容(字符串)。
3. 策略代码示例
以下是一个完整的策略示例。该策略在买入股票时,会同时触发邮件和企业微信通知。
def initialize(context):
# 设置要操作的股票,例如:恒生电子
g.security = '600570.SS'
set_universe(g.security)
# 【邮件设置】仅在实盘交易中生效
# 参数1:邮箱地址(推荐QQ邮箱)
# 参数2:SMTP授权码(请在QQ邮箱设置中获取,非登录密码)
# 参数3:邮件主题
# 注意:请将下方的 "[email protected]" 和 "your_smtp_code" 替换为您自己的信息
set_email_info("[email protected]", "your_smtp_code", "【PTrade交易提醒】")
# 设置一个标志位,防止重复买入(仅作演示用)
g.bought = False
def handle_data(context, data):
# 获取当前时间字符串,用于消息内容
current_time = str(context.blotter.current_dt)
# 简单的交易逻辑:如果尚未买入,则买入
if not g.bought:
# 下单买入 100 股
order(g.security, 100)
g.bought = True
# --- 构建消息内容 ---
# 获取股票名称
stock_name = get_stock_name(g.security)
# 获取最新价
current_price = data[g.security]['price']
# 拼接消息字符串 (Python 3.5 兼容写法)
msg_content = "时间: %s\n代码: %s (%s)\n操作: 买入 100 股\n成交价: %s" % (
current_time,
g.security,
stock_name[g.security],
current_price
)
# --- 发送通知 ---
# 1. 发送邮件
# 注意:需先在 initialize 中配置 set_email_info
try:
send_email(msg_content)
log.info("邮件发送指令已执行")
except Exception as e:
log.error("邮件发送失败: %s" % str(e))
# 2. 发送企业微信
# 注意:需券商端支持并绑定账号
try:
send_qywx(msg_content)
log.info("企业微信发送指令已执行")
except Exception as e:
log.error("企业微信发送失败: %s" % str(e))
# 卖出逻辑示例(可选)
# if g.bought and ...:
# order_target(g.security, 0)
# send_email("卖出通知...")
常见问题排查
-
邮件发送失败:
- 检查
set_email_info中的邮箱地址是否正确。 - 检查 SMTP授权码 是否正确(注意不是QQ密码)。
- 确认券商服务器的网络环境是否允许连接外部SMTP服务器(部分机构版PTrade可能限制外网访问,需联系券商IT确认)。
- 检查
-
企业微信收不到消息:
- 确认您的PTrade账号是否已在券商处绑定了企业微信推送服务。
- 检查
send_qywx函数是否在当前券商版本的API白名单中。
-
回测没反应:
- 这是正常现象。为了防止骚扰和误报,通知类函数在回测环境中通常会被系统自动忽略或屏蔽。请在仿真交易或实盘交易中测试。
Q&A
Q: 如何获取QQ邮箱的SMTP授权码?
A: 登录QQ邮箱网页版,点击顶部的“设置”,选择“账户”标签页。向下滚动找到“POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务”区域,开启“POP3/SMTP服务”。开启时会要求验证密保,验证通过后会显示一串字符,这就是SMTP授权码。
Q: 除了QQ邮箱,支持其他邮箱吗?
A: PTrade的 set_email_info 接口主要针对QQ邮箱进行了优化和测试。虽然理论上SMTP协议通用,但其他邮箱(如163、Gmail)可能因为端口、SSL加密方式或服务器白名单限制而无法发送。建议优先使用QQ邮箱。
Q: send_email 和 send_qywx 可以在 tick_data 函数中使用吗?
A: 可以。这两个函数在 handle_data(分钟/日线级)和 tick_data(Tick级)中均可调用。如果在 tick_data 中使用,请务必做好逻辑控制,避免因Tick数据刷新过快导致短时间内发送大量重复邮件,从而被邮箱服务商封禁。