3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 ptrade 量化交易平台中,查询资金和持仓信息是策略编写的基础。理解其与柜台的同步逻辑对于避免重复下单、计算可用资金至关重要。以下是详细的逻辑解析:
资金信息主要通过上下文对象 context.portfolio 获取。引擎会在后台自动与柜台进行同步。
context.portfolio.cash (不包含冻结资金)context.portfolio.portfolio_value (持仓市值 + 现金)context.portfolio.positions_value持仓信息可以通过 context 对象或专门的 API 函数获取:
context.portfolio.positions 返回一个字典,key 是标的代码,value 是 Position 对象。可以遍历获取所有持仓。get_position(security) 函数,返回指定标的的 Position 对象。包含 amount (总持仓)、enable_amount (可用数量) 等属性。get_positions(security_list) 函数,返回包含多个标的持仓信息的字典。ptrade 引擎的资金和持仓数据是与券商柜台进行同步的,但并非绝对的实时无延迟。这主要受限于券商柜台的配置和网络通信:
context.portfolio.cash 和 get_position 返回的数据可能需要几秒钟才会更新。order_target 或 order_target_value,由于持仓未及时更新,极易导致重复下单。为了避免同步时滞带来的问题,建议在策略中自行维护订单状态,或者避免在极短时间内对同一标的进行基于持仓的目标调仓。
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 1. 查询资金
available_cash = context.portfolio.cash
log.info(f"当前可用资金: {available_cash}")
# 2. 查询持仓
pos = get_position(g.security)
log.info(f"{g.security} 总持仓: {pos.amount}, 可用持仓: {pos.enable_amount}")
# 3. 安全的下单逻辑示例
# 假设我们要买入,先判断资金是否充足
current_price = data[g.security]['close']
if available_cash > current_price * 100:
order(g.security, 100)
# 注意:下单后,available_cash 和 pos.amount 不会立即改变,需等待柜台同步
总结:ptrade 的资金和持仓查询非常便捷,但开发者必须牢记**“柜台同步存在约 6 秒时滞”**这一关键逻辑,在编写高频或依赖精确持仓的策略时做好状态管理。