问题描述
解决方案
在 ptrade 量化交易平台中,order、order_target、order_value 和 order_target_value 是四个最常用的股票委托下单函数。它们的主要区别在于控制下单的维度(数量 vs 价值/金额)以及下单的逻辑(增量/相对量 vs 目标量/绝对量)。
以下是这四个函数的详细对比与解析:
1. 核心区别速览
| 函数名 | 控制维度 | 下单逻辑 | 适用场景 |
|---|---|---|---|
order |
数量 (股/张) | 增量买卖:买入或卖出指定数量的标的。 | 明确知道要买卖多少股时(如:买入1000股)。支持国债逆回购。 |
order_target |
数量 (股/张) | 目标数量:自动计算差额,使最终持仓达到指定数量。 | 调仓到固定股数时(如:将持仓调整至5000股)。 |
order_value |
价值 (元) | 增量买卖:买入或卖出指定金额的标的。 | 按固定金额加减仓时(如:加仓10000元)。 |
order_target_value |
价值 (元) | 目标价值:自动计算差额,使最终持仓市值达到指定金额。 | 资金比例调仓时(如:将某只股票的仓位调整至50000元)。 |
2. 函数详解与代码示例
(1) order(security, amount, limit_price=None) - 按数量买卖
- 说明:最基础的下单函数。
amount为正数表示买入,负数表示卖出。 - 特例:这是四个函数中唯一支持国债逆回购的函数(逆回购需传入负数,且绝对值>=10)。
- 示例:
# 买入 1000 股恒生电子
order('600570.SS', 1000)
# 卖出 500 股恒生电子
order('600570.SS', -500)
# 以 39 元限价买入 100 股
order('600570.SS', 100, limit_price=39)
(2) order_target(security, amount, limit_price=None) - 指定目标数量买卖
- 说明:系统会自动获取当前持仓,并计算需要买入或卖出的差额,使得最终持仓数量等于
amount。 - 示例:
# 假设当前持有 600570.SS 股票 200 股
# 执行下句后,系统会自动买入 800 股,使最终持仓达到 1000 股
order_target('600570.SS', 1000)
# 清仓该股票(目标数量设为 0)
order_target('600570.SS', 0)
(3) order_value(security, value, limit_price=None) - 指定目标价值买卖
- 说明:按金额下单。系统会根据当前最新价(或限价)计算出能买卖的股数(向下取整到100的倍数)。
value为正数表示买入,负数表示卖出。 - 示例:
# 买入价值约 10000 元的恒生电子股票
order_value('600570.SS', 10000)
# 卖出价值约 5000 元的恒生电子股票
order_value('600570.SS', -5000)
(4) order_target_value(security, value, limit_price=None) - 指定持仓市值买卖
- 说明:系统会自动计算当前该股票的持仓市值,并买入或卖出差额部分,使得最终持仓市值接近
value。 - 示例:
# 假设当前持有 600570.SS 市值 20000 元
# 执行下句后,系统会自动买入约 30000 元的股票,使总市值达到 50000 元
order_target_value('600570.SS', 50000)
# 清仓该股票(目标市值设为 0)
order_target_value('600570.SS', 0)
3. 实盘交易中的重要注意事项(避坑指南)
在使用带有 target 字眼的函数(order_target 和 order_target_value)时,在实盘/模拟盘交易环境中需要特别谨慎:
- 持仓同步时滞导致重复下单:
- 实盘中,柜台返回持仓数据通常有延迟(例如 6 秒左右)。
- 如果在短时间内(如一个
handle_data周期内或连续的 tick 中)多次调用order_target,由于持仓数量尚未更新,系统会认为目标未达成,从而重复发送买入/卖出委托。
- 未成交订单的影响:
- 如果第一笔委托未完全成交且未撤单,再次调用
order_target时,引擎可能不会将“在途委托”计算在内,同样会导致重复下单。
- 如果第一笔委托未完全成交且未撤单,再次调用
建议:
- 在低频策略(如日线调仓)中使用
target类函数较为安全。 - 在高频策略或分钟/Tick级策略中,建议优先使用
order或order_value,并在代码中自行维护一个逻辑仓位变量,或者在下单前严格检查get_open_orders()(未完成订单)和get_position()(当前持仓),以避免重复下单风险。