3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在PTrade量化交易平台中,判断当前登录账户是否开通了两融(融资融券)权限,主要使用 permission_test() 函数。
该函数通常在策略初始化阶段(initialize)或盘前阶段(before_trading_start)调用,用于设置全局标志位,从而决定后续策略逻辑是执行两融交易还是普通股票交易。
permission_test()True:表示账户具有两融权限。False:表示账户没有两融权限。以下是一个完整的策略示例,展示了如何在初始化时检查权限,并在交易逻辑中根据权限决定是进行“融资买入”还是“普通买入”。
def initialize(context):
"""
策略初始化函数
"""
# 设置股票池
g.security = '600570.SS'
set_universe(g.security)
# 定义一个全局变量,用于存储是否有两融权限
g.has_margin_permission = False
# 检查两融权限
check_account_permission(context)
def check_account_permission(context):
"""
自定义函数:检查账户权限
"""
# permission_test() 仅在交易模式下有效
# 在回测模式下,通常由回测参数配置决定账户类型,此函数可能无法准确反映回测设置
# 这里使用 try-except 结构是为了防止在不支持的环境下报错
try:
if permission_test():
g.has_margin_permission = True
log.info("【权限检查】当前账户已开通两融权限,将尝试使用信用账户接口。")
else:
g.has_margin_permission = False
log.info("【权限检查】当前账户未开通两融权限,将仅使用普通账户接口。")
except Exception as e:
# 如果在回测或其他不支持该函数的环境中
log.info("【权限检查】无法检测两融权限(可能是回测环境),默认设置为False。错误信息: %s" % str(e))
g.has_margin_permission = False
def handle_data(context, data):
"""
盘中运行函数
"""
security = g.security
# 示例交易逻辑:简单的买入操作
# 假设我们要买入 100 股
amount = 100
# 根据权限选择不同的下单接口
if g.has_margin_permission:
# --- 拥有两融权限,尝试融资买入 ---
# 1. 查询融资标的列表,确认该股票是否可融资
margincash_stocks = get_margincash_stocks()
if security in margincash_stocks:
# 2. 查询最大可融资买入数量
max_open = get_margincash_open_amount(security)
# 注意:get_margincash_open_amount 返回的是字典
max_amount = max_open.get(security, 0)
if max_amount >= amount:
log.info("【两融交易】融资买入: %s, 数量: %s" % (security, amount))
# 融资买入接口
margincash_open(security, amount)
else:
log.info("【两融交易】融资额度不足或不可买入,最大可买: %s" % max_amount)
else:
log.info("【两融交易】标的 %s 不在融资标的列表中,无法融资买入" % security)
else:
# --- 无两融权限,使用普通买入 ---
log.info("【普通交易】普通买入: %s, 数量: %s" % (security, amount))
# 普通买入接口
order(security, amount)
环境差异:
permission_test() 是专门为实盘交易设计的接口。辅助判断方法:
permission_test(),你也可以通过尝试获取信用资产信息来侧面验证。例如调用 get_margin_assert(),如果返回了有效的字典数据(包含 total_debit 等字段),则说明是两融账户;如果返回空字典或 None,则通常意味着没有两融权限。标的检查:
get_margincash_stocks()(融资标的)或 get_marginsec_stocks()(融券标的)检查目标股票是否在标的池中。Q: permission_test() 在回测模式下返回什么?
A: 在回测模式下,该函数通常不可用或行为未定义(取决于具体的PTrade版本和券商部署环境)。在回测中,你应该通过设置回测配置中的“账户类型”来模拟两融环境,而不是依赖代码检测。
Q: 如果我有两融权限,可以混用 order() 和 margincash_open() 吗?
A: 可以。两融账户通常包含“普通买卖”和“信用交易”两种功能。
order() 会使用自有资金进行担保品买入(普通买入)。margincash_open() 会使用融资额度进行买入。order() 买入的股票会成为担保品。Q: 如何查询我的融资可用额度?
A: 可以使用 get_margin_assert() 函数,查看返回字典中的 fin_enable_quota(融资可用额度)字段。