3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在PTrade中,要在产生交易信号时自动发送通知,可以使用 send_email(发送邮件)和 send_qywx(发送企业微信)这两个接口。
重要提示:
initialize 中配置发件人信息(目前主要支持QQ邮箱)。send_qywx 通常需要您的资金账号与券商提供的企业微信服务或PTrade客户端进行了绑定,具体需咨询您的开户券商是否支持该功能。以下是具体的实现步骤和代码示例。
set_email_info)在 initialize 函数中,使用 set_email_info 配置发件箱信息。
send_email(content): 发送邮件,content 为邮件正文内容(字符串)。send_qywx(content): 发送企业微信消息,content 为消息内容(字符串)。以下是一个完整的策略示例。该策略在买入股票时,会同时触发邮件和企业微信通知。
def initialize(context):
# 设置要操作的股票,例如:恒生电子
g.security = '600570.SS'
set_universe(g.security)
# 【邮件设置】仅在实盘交易中生效
# 参数1:邮箱地址(推荐QQ邮箱)
# 参数2:SMTP授权码(请在QQ邮箱设置中获取,非登录密码)
# 参数3:邮件主题
# 注意:请将下方的 "your_email@qq.com" 和 "your_smtp_code" 替换为您自己的信息
set_email_info("your_email@qq.com", "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 中的邮箱地址是否正确。企业微信收不到消息:
send_qywx 函数是否在当前券商版本的API白名单中。回测没反应:
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数据刷新过快导致短时间内发送大量重复邮件,从而被邮箱服务商封禁。