问题描述
解决方案
在PTrade回测系统中,限价单(Limit Order)如果没有达到指定价格,是不会成交的。
以下是关于回测中限价单成交机制的详细说明:
1. 限价单的成交原则
限价单是指您在下单时指定了具体的成交价格(limit_price)。在回测撮合时,系统会严格按照以下逻辑判断是否成交:
- 买入限价单:只有当市场价格 低于或等于 您设定的限价时,才会成交。
- 例如:现价10元,您下限价单9元买入。如果当天(或当前K线周期内)最低价始终高于9元,则该订单不会成交。
- 卖出限价单:只有当市场价格 高于或等于 您设定的限价时,才会成交。
- 例如:现价10元,您下限价单11元卖出。如果当天(或当前K线周期内)最高价始终低于11元,则该订单不会成交。
2. PTrade回测中的特殊机制
在PTrade的回测环境中,除了价格优先原则外,还有以下重要规则:
- 日内有效(Day Order):
在回测模式下,所有的委托单默认均为“当日有效”。这意味着,如果您下的限价单在当天的交易时间内没有满足成交条件(即未成交或仅部分成交),系统会在当天收盘后自动撤销该未完成的订单。该订单不会保留到第二个交易日。 - 撮合逻辑:
- 日线回测:系统通常使用当天的最高价(High)和最低价(Low)来判断限价单是否在成交范围内。
- 分钟回测:系统会根据每一分钟K线的价格数据进行撮合判断。
3. 代码示例
如果您希望在策略中下限价单,可以使用 order 函数并传入 limit_price 参数:
def handle_data(context, data):
# 获取当前价格
current_price = data['600570.SS']['close']
# 假设我们想以比当前价格低 2% 的价格挂单买入
target_price = current_price * 0.98
# 下限价单
# 如果后续行情没有跌到 target_price,这笔订单在回测中将不会成交,并在收盘后自动作废
order('600570.SS', 100, limit_price=target_price)
总结
不会成交。 只要市场价格未触及您设定的限价,订单就会一直处于“未成交(Open)”状态,直到当天交易结束被系统自动撤单。
Q&A
Q: 回测中未成交的限价单会自动转入第二天吗?
A: 不会。 PTrade回测机制中,未成交的订单会在当天收盘后自动取消,不会延续到下一个交易日。如果您希望第二天继续挂单,需要在第二天的策略逻辑中重新下单。
Q: 如何查询当天未成交的订单?
A: 您可以使用 get_open_orders() 函数来获取当前所有未完成的订单对象,并通过检查其状态来判断是否成交。
Q: 如果我想无论价格多少都必须成交,应该怎么办?
A: 您应该使用市价单(不设置 limit_price,或者在实盘交易函数中使用 order_market),或者将限价单的价格设置得非常宽泛(例如买入时设置涨停价,卖出时设置跌停价),以确保成交。