问题描述
解决方案
在PTrade中,要实现交易后自动发送邮件通知,主要依赖于两个核心API函数:set_email_info(配置邮箱)和 send_email(发送邮件)。
重要提示:
- 根据PTrade文档,该功能仅在“交易”模块(实盘/模拟盘)可用,回测环境中无法发送邮件。
- 目前PTrade通常仅支持QQ邮箱作为发送方。
- 你需要获取QQ邮箱的SMTP授权码(不是QQ密码)。
以下是具体的实现步骤和代码示例。
核心步骤
- 配置邮箱 (
initialize):在策略初始化时,使用set_email_info设置发送方邮箱地址、SMTP授权码和邮件主题。 - 发送通知 (
on_trade_response):推荐使用on_trade_response(成交主推回调)函数。当订单真实成交时,该函数会被触发,此时调用send_email发送具体成交内容。
策略代码示例
def initialize(context):
# 1. 设置要操作的股票
g.security = '600570.SS'
set_universe(g.security)
# 2. 【关键】配置邮件信息
# 参数1:发送方邮箱(通常仅支持QQ邮箱,且接收方也是此邮箱)
# 参数2:SMTP授权码(需登录QQ邮箱网页版 -> 设置 -> 账户 -> 开启POP3/SMTP服务获取)
# 参数3:邮件统一标题
# 请将下方的 "你的QQ号" 和 "你的SMTP授权码" 替换为真实信息
email_address = "[email protected]"
smtp_code = "abcdefg123456"
email_subject = "【PTrade策略】交易成交提醒"
# 调用API设置
set_email_info(email_address, smtp_code, email_subject)
# 设置一个标志位用于测试下单
g.traded = False
def handle_data(context, data):
# 示例:简单的下单逻辑
if not g.traded:
# 买入 100 股
order(g.security, 100)
g.traded = True
# 注意:这里也可以调用 send_email,但这里只能通知“已报单”,不能确认“已成交”
# send_email(f"策略已触发下单:买入 {g.security}")
def on_trade_response(context, trade_list):
"""
成交主推回调函数
当有订单成交时,系统会自动调用此函数,trade_list 包含成交详情
"""
for trade in trade_list:
# 解析成交信息
stock_code = trade.get('stock_code') # 股票代码
amount = trade.get('business_amount') # 成交数量
price = trade.get('business_price') # 成交价格
direction = trade.get('entrust_bs') # 方向:1-买,2-卖
# 转换方向描述
dir_str = "买入" if str(direction) == '1' else "卖出"
# 3. 【关键】构建邮件内容并发送
content = (
f"交易时间: {trade.get('business_time')}\n"
f"标的: {stock_code}\n"
f"操作: {dir_str}\n"
f"价格: {price}\n"
f"数量: {amount}\n"
f"金额: {trade.get('business_balance')}"
)
# 发送邮件
send_email(content)
log.info(f"已发送成交邮件:{content}")
详细配置说明
1. 获取 SMTP 授权码
你不能直接使用QQ邮箱的登录密码,必须使用授权码:
- 登录电脑版 QQ邮箱。
- 点击顶部的 设置 -> 账号。
- 向下滚动找到 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。
- 开启 POP3/SMTP服务。
- 按照提示发送短信验证,系统会生成一串字符(如
abcd efgh ijkl mnop),这就是 SMTP授权码。
2. 函数说明
set_email_info(email_address, smtp_code, email_subject):- 必须在
initialize中调用。 - 如果配置错误,后续的
send_email将不会生效。
- 必须在
send_email(content):content是邮件的正文内容,支持字符串。- 该函数可以在
handle_data、on_trade_response或tick_data中调用。
3. 为什么推荐用 on_trade_response?
如果在 handle_data 的 order 语句后直接发邮件,只能代表策略发出了委托,并不代表成交(可能因为废单、资金不足、没有对手盘而失败)。
使用 on_trade_response 可以确保只有在真实成交发生时才通知你,信息更准确。
常见问题 (Q&A)
Q: 回测时能收到邮件吗?
A: 不能。PTrade 的邮件功能仅在交易模块(实盘或仿真交易)中开放,回测阶段调用这些函数通常会被忽略或报错。
Q: 可以发送给别人的邮箱吗?
A: set_email_info 的第一个参数既是发送者也是接收者。通常 PTrade 限制只能自己发给自己(即发件人和收件人必须一致),且主要支持 QQ 邮箱。具体限制请咨询你所在的券商,不同券商的 PTrade 版本权限可能略有不同。
Q: 邮件发送失败怎么办?
A:
- 检查
set_email_info中的邮箱和授权码是否正确(注意授权码不要有空格)。 - 检查券商服务器是否允许外网访问邮件端口(极少数机构版可能会限制)。
- 检查是否发送过于频繁,短时间内大量发送可能会被邮件服务商屏蔽。