本方案由 EasyQuant AI量化助手 提供。
问题背景
策略实盘中,下单前必须了解当前是否持仓、持仓成本是多少、可卖数量是否充足。PTrade 可使用 get_position() 查询单只股票持仓,使用 get_positions() 批量查询账户持仓。PTrade API 文档
查询单只股票持仓
def initialize(context):
g.security = "510300.SS"
set_universe([g.security])
def handle_data(context, data):
security = g.security
position = get_position(security)
if position is None or position.amount <= 0:
log.info("%s 当前没有持仓" % security)
return
current_price = data[security].price
cost_price = position.cost_basis
profit_rate = current_price / cost_price - 1
log.info(
"代码=%s,持仓=%s,可卖=%s,成本=%.3f,现价=%.3f,浮动收益=%.2f%%"
% (
security,
position.amount,
position.enable_amount,
cost_price,
current_price,
profit_rate * 100
)
)
查询全部持仓
def print_all_positions():
positions = get_positions()
if not positions:
log.info("当前账户没有持仓")
return
for stock, position in positions.items():
log.info(
"代码=%s,持仓=%s,可卖=%s,成本=%.3f"
% (
stock,
position.amount,
position.enable_amount,
position.cost_basis
)
)
用可卖数量控制卖出
def sell_position(security):
position = get_position(security)
if position is None:
log.info("%s 无持仓,无法卖出" % security)
return
if position.enable_amount <= 0:
log.info("%s 无可卖数量,可能受T+1限制" % security)
return
order_id = order_target(security, 0)
if order_id:
log.info("%s 卖出委托已提交:%s" % (security, order_id))
else:
log.info("%s 卖出委托提交失败" % security)
注意事项
-
amount是总持仓数量,enable_amount是当前可卖数量。 -
A 股当天买入的股票通常不能当天卖出,因此不能只用总持仓判断。
-
cost_basis是持仓成本价,可用于计算持仓收益率。 -
查询到持仓不代表订单已经全部成交,实盘还应结合订单和成交信息判断。
总结
PTrade 查询持仓的核心是 get_position() 和 get_positions()。在买卖前使用持仓成本、可卖数量和当前价格做校验,可降低重复下单和卖出失败的概率。

1243

被折叠的 条评论
为什么被折叠?



