问题描述
使用Ptrade内置的send_qywx函数向自己的企业微信账号发送消息,Ptrade终端显示“企业微信消息发送成功”,但实际上企业微信收不到消息。
解决方案
在Ptrade量化交易平台中使用 send_qywx 函数发送企业微信消息时,如果终端日志显示“发送成功”但实际手机端未收到消息,通常是由于券商机房网络限制或企业微信后台配置拦截导致的。因为函数本身只负责发起HTTP请求,若请求被静默拦截或企微服务端拒绝,代码层面可能不会抛出异常。
以下是详细的排查步骤和解决方法:
1. 券商机房网络限制(最常见原因)
原因分析:
Ptrade的实盘和模拟盘通常运行在券商的托管机房中。为了交易安全,绝大多数券商的机房是严格的内网环境,禁止直接访问外部互联网。当 send_qywx 尝试向腾讯企业微信的API服务器发送请求时,数据包直接被券商防火墙拦截丢弃,但底层网络库可能因为超时设置或静默丢包而返回了假阳性的“成功”状态。
解决方法:
- 咨询券商客服/客户经理:直接询问当前Ptrade环境是否开放了访问外网(特别是企业微信API域名
qyapi.weixin.qq.com)的权限。 - 申请开通网络白名单:部分券商允许客户申请开通特定域名的访问权限,您可以尝试提交申请。
2. 企业微信后台“企业可信IP”未配置
原因分析:
如果您使用的是企业微信的“自建应用”来发送消息,企业微信官方出于安全考虑,要求必须在后台配置企业可信IP(IP白名单)。如果Ptrade服务器的公网出口IP不在该白名单内,企业微信服务器会拒绝接收该消息。
解决方法:
- 联系券商获取您所在Ptrade服务器的公网出口IP地址。
- 登录 企业微信管理后台。
- 进入 应用管理 -> 找到您创建的自建应用 -> 找到 企业可信IP 配置项。
- 将Ptrade服务器的IP地址填入并保存。
3. 接收人(ToUser)或可见范围配置错误
原因分析:
- 发送消息时指定的接收人账号(UserID)拼写错误。
- 该自建应用的“可见范围”没有包含您要发送的接收人。
解决方法:
- 核对代码中传入的接收人ID是否与企业微信后台“通讯录”中的账号完全一致(注意大小写)。
- 在企业微信后台检查该应用的可见范围,确保接收人或接收人所在的部门在可见范围内。
4. 替代方案:使用邮件通知
如果券商明确表示绝对不开放外网访问,您将无法直接使用 send_qywx。此时可以考虑使用Ptrade内置的邮件发送功能作为替代(部分券商会开放特定邮箱如QQ邮箱的SMTP端口)。
邮件发送示例代码:
def initialize(context):
# 设置邮件信息 (需咨询券商是否支持)
# 参数: 邮箱地址, SMTP授权码, 邮件主题
set_email_info("[email protected]", "your_smtp_code", "【Ptrade量化提醒】")
def handle_data(context, data):
# 在需要触发通知的地方调用
send_email("策略触发买入信号:600570.SS")
总结建议
遇到此类问题,第一步应直接联系您的券商技术支持,确认当前Ptrade环境的网络策略。如果是网络隔离导致的,任何代码层面的修改都无法生效;如果是IP白名单问题,则需要配合券商获取IP并在企微后台完成配置。