问题描述
解决方案
在 PTrade 量化交易平台中,要在开始交易前检查账户是否具有相应权限,主要使用 permission_test 接口。
该接口通常在策略初始化阶段(initialize)或每日盘前阶段(before_trading_start)调用,用于验证当前环境和账户是否具备交易能力。
核心接口说明
- 接口名称:
permission_test() - 适用范围: 仅在交易模块(实盘或模拟盘)可用,回测中通常不使用或无实际意义。
- 功能: 测试当前策略绑定的资金账号是否具有交易权限。
策略代码示例
以下代码展示了如何在策略初始化时检查权限,并结合 get_user_name 确认当前登录的资金账号。
def initialize(context):
"""
初始化函数,策略启动时执行一次
"""
# 设置股票池(示例)
g.security = '600570.SS'
set_universe(g.security)
# 定义一个全局变量用于标记权限状态
g.has_permission = False
# 仅在交易模式下进行权限检查
if is_trade():
check_trading_permission(context)
else:
log.info("当前为回测模式,跳过交易权限检查。")
g.has_permission = True
def check_trading_permission(context):
"""
自定义函数:执行权限和账户检查
"""
try:
# 1. 获取当前登录的资金账号
user_name = get_user_name()
log.info("当前登录资金账号: %s" % user_name)
if user_name is None:
log.error("未获取到资金账号,请检查登录状态!")
return
# 2. 调用 permission_test 测试权限
# 注意:permission_test 具体返回内容可能因券商柜台差异而不同
# 通常成功时返回 True 或非空对象,失败抛出异常或返回 False
res = permission_test()
log.info("权限测试接口返回结果: %s" % res)
if res:
g.has_permission = True
log.info("账户权限检查通过,策略准备就绪。")
else:
g.has_permission = False
log.warning("账户权限检查未通过 (permission_test 返回 False/None)。")
except Exception as e:
g.has_permission = False
log.error("权限检查过程中发生异常: %s" % e)
# 可以在此处添加发送邮件通知的代码,如 set_email_info 和 send_email
def before_trading_start(context, data):
"""
盘前处理函数,每日开盘前调用
"""
if is_trade() and not g.has_permission:
log.warning("警告:当前账户未通过权限检查,今日可能无法正常交易。")
def handle_data(context, data):
"""
盘中运行函数
"""
# 如果没有权限,则不执行交易逻辑
if not g.has_permission:
return
# 正常的交易逻辑示例
# ...
pass
注意事项
- 环境区分:
permission_test是交易专用接口。在编写策略时,建议使用is_trade()函数进行判断,避免在回测环境中调用该接口导致报错或产生无意义的日志。 - 异常处理:建议将权限检查代码包裹在
try...except块中,防止因柜台连接超时或接口异常导致策略直接崩溃停止运行。 - 辅助验证:除了
permission_test,使用get_user_name()获取资金账号也是一种有效的验证手段,确保策略运行在预期的账户上。
Q&A
Q: permission_test 接口在回测模式下调用会发生什么?
A: 根据 PTrade 文档,permission_test 仅在交易模块可用。在回测模式下调用可能会报错或返回 None,因此建议配合 is_trade() 判断使用。
Q: 如果 permission_test 返回失败,我该怎么办?
A: 如果返回失败,通常意味着账户未登录、柜台连接断开或账户被冻结。建议在策略中添加日志记录(log.error),并可以通过 set_email_info 配置邮件报警,及时通知策略管理者检查 PTrade 终端的登录状态。
Q: 是否可以指定检查某个特定市场的权限(如期货或股票)?
A: 标准的 permission_test() 通常是通用的连通性测试。如果需要区分业务类型,可以通过 get_business_type() 获取当前策略的业务类型(如 'stock', 'future'),或者尝试调用对应市场的查询接口(如 get_crdt_fund() 查询两融资金)来侧面验证特定权限。