3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 PTrade 量化交易平台中,order_value 和 order_target_value 都是基于金额(价值)来进行下单的函数,但它们的核心逻辑和使用场景有本质的区别。
简单来说:
order_value 是增量操作(我要再买/卖多少钱)。order_target_value 是目标操作(我要让持仓变成多少钱)。以下是详细的对比解析:
该函数用于买入或卖出指定金额的股票。它不关心你当前持有多少,只关心你现在想增加或减少多少资金的仓位。
value / price (向下取整到100股)。order_value('600570.SS', 10000)。该函数用于调整持仓,使其最终市值达到指定的金额。系统会自动计算当前持仓市值与目标市值的差额,然后进行买入或卖出。
目标价值 > 当前持仓市值:系统会自动买入差额部分。目标价值 < 当前持仓市值:系统会自动卖出差额部分。目标价值 = 当前持仓市值:系统不进行操作。target_value - current_holding_value。order_target_value('600570.SS', 10000)。order_target_value('600570.SS', 0) 常用于清仓某只股票。假设当前账户持有 0股 “恒生电子”(600570.SS),股价为 50元。
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# -------------------------------------------------
# 场景 A:使用 order_value
# -------------------------------------------------
# 第一天:买入 10000 元
# 结果:持仓市值 10000 元
order_value(g.security, 10000)
# 第二天:再次调用 order_value 买入 10000 元
# 结果:持仓市值 20000 元 (10000 + 10000)
order_value(g.security, 10000)
# -------------------------------------------------
# 场景 B:使用 order_target_value
# -------------------------------------------------
# 第一天:调整持仓至 10000 元
# 结果:持仓市值 10000 元 (从0买入10000)
order_target_value(g.security, 10000)
# 第二天:再次调用 order_target_value 至 10000 元
# 结果:持仓市值 10000 元 (因为已经达标,系统不进行任何操作)
order_target_value(g.security, 10000)
# 第三天:调整持仓至 0 元
# 结果:持仓市值 0 元 (系统自动卖出所有持仓)
order_target_value(g.security, 0)
| 特性 | order_value | order_target_value |
|---|---|---|
| 操作性质 | 增量操作 (加仓/减仓) | 目标导向 (调仓) |
| 正负值含义 | 正数买入,负数卖出 | 必须为正数(代表目标市值),0代表清仓 |
| 依赖持仓 | 不依赖,只看传入金额 | 强依赖,需读取当前持仓计算差额 |
| 适用场景 | 定投、金字塔加仓、网格交易 | 调仓再平衡、固定比例仓位管理、止盈止损清仓 |
特别注意(实盘交易风险):
在实盘交易中使用 order_target_value 需要谨慎。
由于柜台返回的持仓数据可能有延迟(通常约6秒),如果在短时间内连续调用 order_target_value,系统可能因为读取到旧的持仓数据而重复下单。
order_target 系列函数,请确保逻辑上不会在同一分钟或极短时间内对同一标的多次触发,或者自行维护一个本地的持仓变量进行校验。Q: 如果我想清空某只股票的仓位,应该用哪个函数?
A: 使用 order_target_value(security, 0) 或 order_target(security, 0) 是最方便的清仓方法。如果使用 order_value,你需要先查询当前持仓市值,然后传入负的该数值,计算比较麻烦且容易有误差。
Q: 这两个函数下单时会自动取整吗?
A: 是的。PTrade 会根据股票价格,将计算出的股数自动向下取整到 100股 的整数倍(对于股票交易)。例如计算出需要买入 150 股,实际只会买入 100 股。
Q: order_target_value 会考虑在途订单(已委托未成交)吗?
A: 在回测中,引擎通常会考虑在途订单以避免重复买入。但在实盘交易中,依赖于柜台返回的持仓信息,如果之前的订单刚成交但柜台数据未同步,可能会导致计算偏差。因此建议在实盘中尽量避免高频调用此函数。