🚀 AI 一键生成 ptrade 策略代码

如何在 PTrade 策略中实现交易信号的邮件或企业微信提醒?

ptrade | 发布时间: 2025/11/28
以下内容由 EasyQuant 生成。

问题描述

我的量化策略在执行买卖后,如何能自动发一封邮件通知我?

解决方案

在PTrade中,要实现交易后自动发送邮件通知,主要依赖于两个核心API函数:set_email_info(配置邮箱)和 send_email(发送邮件)。

重要提示:

  1. 根据PTrade文档,该功能仅在“交易”模块(实盘/模拟盘)可用,回测环境中无法发送邮件。
  2. 目前PTrade通常仅支持QQ邮箱作为发送方。
  3. 你需要获取QQ邮箱的SMTP授权码(不是QQ密码)。

以下是具体的实现步骤和代码示例。

核心步骤

  1. 配置邮箱 (initialize):在策略初始化时,使用 set_email_info 设置发送方邮箱地址、SMTP授权码和邮件主题。
  2. 发送通知 (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邮箱的登录密码,必须使用授权码:

  1. 登录电脑版 QQ邮箱
  2. 点击顶部的 设置 -> 账号
  3. 向下滚动找到 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务
  4. 开启 POP3/SMTP服务
  5. 按照提示发送短信验证,系统会生成一串字符(如 abcd efgh ijkl mnop),这就是 SMTP授权码

2. 函数说明

  • set_email_info(email_address, smtp_code, email_subject):
    • 必须在 initialize 中调用。
    • 如果配置错误,后续的 send_email 将不会生效。
  • send_email(content):
    • content 是邮件的正文内容,支持字符串。
    • 该函数可以在 handle_dataon_trade_responsetick_data 中调用。

3. 为什么推荐用 on_trade_response

如果在 handle_dataorder 语句后直接发邮件,只能代表策略发出了委托,并不代表成交(可能因为废单、资金不足、没有对手盘而失败)。
使用 on_trade_response 可以确保只有在真实成交发生时才通知你,信息更准确。

常见问题 (Q&A)

Q: 回测时能收到邮件吗?
A: 不能。PTrade 的邮件功能仅在交易模块(实盘或仿真交易)中开放,回测阶段调用这些函数通常会被忽略或报错。

Q: 可以发送给别人的邮箱吗?
A: set_email_info 的第一个参数既是发送者也是接收者。通常 PTrade 限制只能自己发给自己(即发件人和收件人必须一致),且主要支持 QQ 邮箱。具体限制请咨询你所在的券商,不同券商的 PTrade 版本权限可能略有不同。

Q: 邮件发送失败怎么办?
A:

  1. 检查 set_email_info 中的邮箱和授权码是否正确(注意授权码不要有空格)。
  2. 检查券商服务器是否允许外网访问邮件端口(极少数机构版可能会限制)。
  3. 检查是否发送过于频繁,短时间内大量发送可能会被邮件服务商屏蔽。