问题描述
我如果在模拟交易设置了滑点,是否每笔买卖交易都自动扣除滑点来计算结果?又或是仅限于市价单,而限价单不在此列?
解决方案
在 JoinQuant(聚宽)平台的模拟交易和回测中,设置了滑点(set_slippage)后,并不是所有交易都会简单地“自动扣除”滑点。滑点是否生效以及如何生效,严格取决于您的订单类型(市价单 vs 限价单)以及订单的撮合状态。
具体规则如下:
1. 市价单(Market Order)
市价单会完全受到滑点设置的影响。
当您下达市价单时,系统会默认您愿意以当前市场价格加上一定的滑点成本来保证成交。
- 买入/开多:成交价 = 最新价 + 滑点
- 卖出/开空:成交价 = 最新价 - 滑点
(注:如果超出了涨跌停限制,市价单可能会被撤销或部分撤销)
2. 限价单(Limit Order)
限价单是否受滑点影响,取决于它是在下单瞬间“立即成交”还是变成了“挂单”。
-
情况 A:下单瞬间立即成交(受滑点影响)
当您下达限价单时,系统会首先尝试按“最新价 ± 滑点”进行撮合。如果这个加了滑点后的价格优于或等于您的委托限价,订单会立即成交,此时的成交价是“最新价 ± 滑点”。
例如:最新价10.0元,滑点0.1元。您下达了10.2元的限价买单。因为 10.0 + 0.1 = 10.1元 <= 10.2元,所以会立即以 10.1元 成交。这里体现了滑点。 -
情况 B:挂单后撮合(不受滑点影响)
如果在下单瞬间,加了滑点后的价格无法满足您的限价条件,该订单就会变成挂单。在后续的分钟 Bar 或 Tick 撮合中,只要市场价格达到了您的触发条件,成交价将严格等于您的委托价,不再额外扣除滑点。
例如:最新价10.0元,您下达了9.8元的限价买单。订单挂单。当后续价格跌破9.8元时,您的订单会严格以 9.8元 成交。
3. 特殊情况:启用盘口撮合(仅限模拟交易)
如果您在模拟交易中开启了盘口撮合模式(set_option('match_with_order_book', True)):
- 系统将直接根据真实的对手盘盘口(买一/卖一等)的价格和数量进行撮合。
- 在这种模式下,您通过
set_slippage设置的固定滑点或百分比滑点将不再起作用,因为真实的盘口价差已经自带了“真实滑点”。
总结
- 市价单:每笔都受滑点影响。
- 限价单:只有在下单瞬间能立即撮合成交的那部分受滑点影响;一旦挂单,后续成交严格按委托价执行,不再计算滑点。