问题描述
看了以前关于模拟盘发微信的一些问答,想确认一下:
1、是否和log.info的语法一致?又或print?
2、微信消息每人每天自定义消息不超过 5 条, 超出会失败;需要更多条数可以使用积分兑换————大VIP也有限制??
3、下单通知:60条/天,如果超出部分设置邮件接收,用什么API?
4、消息长度不得超过 200 个字符, 也不能包含回测和换行这些特殊字符,否则会发送失败——什么叫回测 特殊字符??
解决方案
关于您对 JoinQuant 模拟盘 send_message 函数的疑问,以下是详细的解答:
1. send_message 的语法是否和 log.info 或 print 一致?
不完全一致。
log.info()和print()支持传入多个参数,或者使用逗号分隔,底层会自动格式化。例如:log.info("买入", security, "数量", amount)。send_message(message, channel='weixin')的第一个参数message必须是一个完整的字符串。如果您需要拼接变量,必须先在 Python 中将字符串格式化好,再传给send_message。
正确用法示例:
# 使用 % 格式化
send_message("买入股票:%s,数量:%d" % (security, amount))
# 使用 format 格式化
send_message("买入股票:{},数量:{}".format(security, amount))
# 使用 f-string (Python 3.6+)
send_message(f"买入股票:{security},数量:{amount}")
2. 自定义消息每天 5 条的限制,VIP也有限制吗?
根据聚宽官方的规则,基础限制是每个账号每天 5 条。如果需要更多条数,官方文档明确指出“需要更多条数可以使用积分兑换”。
对于 VIP 用户,通常平台会赠送大量积分,或者在 VIP 权益中包含更高的调用额度。建议您直接使用账户内的积分去兑换额外的微信通知条数,或者联系聚宽官方客服确认您当前 VIP 等级对应的具体免积分额度。
3. 下单通知超出 60 条/天,如何用邮件接收?
JoinQuant 官方 API 没有提供专门的 send_email 函数。但是,聚宽的 Python 环境支持标准的 Python 库。您可以使用 Python 自带的 smtplib 和 email 模块来编写自定义的邮件发送函数。
邮件发送示例代码:
import smtplib
from email.mime.text import MIMEText
from email.header import Header
def send_custom_email(subject, content):
sender = 'your_email@qq.com' # 您的发件邮箱
password = 'your_auth_code' # 您的邮箱授权码
receiver = 'receiver_email@qq.com' # 接收邮箱
message = MIMEText(content, 'plain', 'utf-8')
message['From'] = Header("量化策略报警", 'utf-8')
message['To'] = Header("管理员", 'utf-8')
message['Subject'] = Header(subject, 'utf-8')
try:
# 以 QQ 邮箱为例
smtpObj = smtplib.SMTP_SSL('smtp.qq.com', 465)
smtpObj.login(sender, password)
smtpObj.sendmail(sender, [receiver], message.as_string())
smtpObj.quit()
log.info("邮件发送成功")
except Exception as e:
log.error(f"邮件发送失败: {e}")
注意:涉及到网络连接的对象(如 SMTP 连接)不能保存在 g 变量中被序列化,建议每次发送时建立连接,发送后关闭。
4. 不能包含“回测”和换行这些特殊字符是什么意思?
这是一个错别字。官方文档的本意是**“回车” (Carriage Return, \r)** 和 “换行” (Line Feed, \n)。
微信的接口在接收 send_message 传过去的字符串时,如果字符串内部包含了 \n 或者 \r 这种控制排版的特殊字符,会导致 JSON 解析或接口校验失败,从而发送不成功。
错误示例:
# 包含换行符 \n,会导致发送失败
send_message("今日策略执行完毕。\n当前总资产:100000")
正确示例:
# 用逗号或空格替代换行符
send_message("今日策略执行完毕,当前总资产:100000")
请确保您传入的 message 是一个纯粹的单行字符串,长度不超过 200 个字符。