🚀 AI 一键生成 ptrade 策略代码

如何用 PTrade API 发送自定义策略信号与报告?(send_email, send_qywx)

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

问题描述

我的策略在产生交易信号时,如何让它自动给我发一封邮件或者企业微信消息?

解决方案

在PTrade中,要在产生交易信号时自动发送通知,可以使用 send_email(发送邮件)和 send_qywx(发送企业微信)这两个接口。

重要提示:

  1. 仅限实盘:这两个功能通常仅在交易(实盘)模式下可用,回测模式下无法发送真实的邮件或消息。
  2. 邮件配置:发送邮件前,通常需要在 initialize 中配置发件人信息(目前主要支持QQ邮箱)。
  3. 企业微信配置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("卖出通知...")

常见问题排查

  1. 邮件发送失败

    • 检查 set_email_info 中的邮箱地址是否正确。
    • 检查 SMTP授权码 是否正确(注意不是QQ密码)。
    • 确认券商服务器的网络环境是否允许连接外部SMTP服务器(部分机构版PTrade可能限制外网访问,需联系券商IT确认)。
  2. 企业微信收不到消息

    • 确认您的PTrade账号是否已在券商处绑定了企业微信推送服务。
    • 检查 send_qywx 函数是否在当前券商版本的API白名单中。
  3. 回测没反应

    • 这是正常现象。为了防止骚扰和误报,通知类函数在回测环境中通常会被系统自动忽略或屏蔽。请在仿真交易或实盘交易中测试。

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_emailsend_qywx 可以在 tick_data 函数中使用吗?
A: 可以。这两个函数在 handle_data(分钟/日线级)和 tick_data(Tick级)中均可调用。如果在 tick_data 中使用,请务必做好逻辑控制,避免因Tick数据刷新过快导致短时间内发送大量重复邮件,从而被邮箱服务商封禁。