3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在期货量化交易中,由于期货行情瞬息万变,直接使用最新价(Last Price)进行限价单申报往往容易因为价格跳动而导致无法即时成交。为了提高成交率并控制交易成本,交易者通常需要进行滑点控制与超价申报。
本文将详细介绍如何在 PTrade 平台中利用 API 实现期货委托的滑点控制与超价申报技巧。
滑点控制(Slippage Control):
在回测阶段,可以通过 set_fixed_slippage 或 set_slippage 来模拟真实交易中的滑点损耗,使回测结果更贴近实盘。在实盘阶段,滑点控制是指在下单时限制最大可接受的偏离价格,避免在高波动行情下以极差的价格成交。
超价申报(Over-price Bidding):
为了确保限价单(Limit Order)能够立即成交,在买入开仓时,使用比当前最新价或卖一价稍高的价格申报;在卖出开仓时,使用比当前最新价或买一价稍低的价格申报。这个主动让利的溢价空间即为“超价”。
在 PTrade 中进行期货交易,主要使用以下四个基础下单接口:
buy_open(contract, amount, limit_price):多开(买入开仓)sell_close(contract, amount, limit_price, close_today):多平(卖出平仓)sell_open(contract, amount, limit_price):空开(卖出开仓)buy_close(contract, amount, limit_price, close_today):空平(买入平仓)价格精度注意:不同期货品种的最小变动价位(每一跳价格)不同。在进行超价申报时,必须参考对应品种的最小变动单位(可通过
get_instruments获取tick_size),避免报出非法价格导致废单。
以下是一个完整的 PTrade 策略示例,展示了如何在盘中通过获取实时行情快照,计算超价并进行滑点控制下单:
# -*- coding: utf-8 -*-
def initialize(context):
# 订阅需要交易的期货合约(以沪铜 CU 和股指期货 IF 为例)
g.security = ['CU2112.XSGE', 'IF2112.CCFX']
set_universe(g.security)
# 设置回测滑点(固定滑点,买入时成交价增加,卖出时成交价减少)
if not is_trade():
set_fixed_slippage(fixedslippage=2.0) # 模拟2元的固定滑点
def handle_data(context, data):
# 示例:对沪铜合约进行超价买入开仓
contract = 'CU2112.XSGE'
# 1. 获取合约的上市具体信息,查询其最小变动价位
instr_info = get_instruments(contract)
if instr_info is None:
return
# 假设获取不到则默认一跳为 10 (沪铜通常为10元/吨)
tick_size = getattr(instr_info, 'tick_size', 10.0)
# 2. 获取当前行情快照
snapshot = get_snapshot(contract)
if not snapshot or contract not in snapshot:
log.warning(f"无法获取 {contract} 的行情快照")
return
market_data = snapshot[contract]
last_price = market_data.get('last_px', 0.0)
ask_price_1 = market_data.get('offer_grp', {}).get(1, [0.0])[0] # 卖一价
if last_price <= 0.0:
return
# 3. 计算超价申报价格
# 设定超价跳数,例如:在卖一价的基础上往上加 2 跳(主动追价,确保成交)
slippage_ticks = 2
base_price = ask_price_1 if ask_price_1 > 0.0 else last_price
target_limit_price = base_price + (tick_size * slippage_ticks)
# 4. 执行超价买入开仓
# 检查当前持仓,若无持仓则开仓
pos = get_position(contract)
if pos.amount == 0:
log.info(f"当前最新价: {last_price}, 卖一价: {ask_price_1}, 最小变动单位: {tick_size}")
log.info(f"执行超价申报,申报价格: {target_limit_price} (超价 {slippage_ticks} 跳)")
# 发送多开委托
order_id = buy_open(contract, 1, limit_price=target_limit_price)
if order_id:
log.info(f"委托发送成功,订单ID: {order_id}")
target_limit_price 后,建议与 get_snapshot 返回的 up_px(涨停价)和 down_px(跌停价)进行对比裁剪,防止报单超出交易所规定的价格范围。get_open_orders 接口,在委托发出一定时间(如 3 秒)后,若仍未成交,则调用 cancel_order 撤单并重新计算价格申报。set_fixed_slippage 模拟的滑点仅影响回测账面收益;实盘中的滑点控制完全取决于您下单时传入的 limit_price 偏离度。