🚀 AI 一键生成 ptrade 策略代码

PTrade 实盘必备:如何在交易前使用 permission_test 函数检查账户权限?

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

问题描述

如何在开始交易前检查账户是否具有相应权限?

解决方案

在 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

注意事项

  1. 环境区分permission_test 是交易专用接口。在编写策略时,建议使用 is_trade() 函数进行判断,避免在回测环境中调用该接口导致报错或产生无意义的日志。
  2. 异常处理:建议将权限检查代码包裹在 try...except 块中,防止因柜台连接超时或接口异常导致策略直接崩溃停止运行。
  3. 辅助验证:除了 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() 查询两融资金)来侧面验证特定权限。