股票交易函数

下单是策略的执行末端。PTrade 提供一组语义清晰的交易函数:按数量、按金额、调到目标量、调到目标市值,覆盖绝大多数下单意图。本章把这组函数和配套的撤单、订单查询、tick 下单、IPO 打新等一次讲清。

一、基础下单函数

四个最常用的函数,按「按数量 / 按金额」和「增量 / 目标」两维区分:

函数含义用法
order(security, amount, limit_price=None)按数量买卖正数买入、负数卖出;不传价用最新价
order_value(security, value, limit_price=None)按金额买卖正数买入对应金额、负数卖出
order_target(security, amount, limit_price=None)调到目标数量最终持仓变为 amount
order_target_value(security, value, limit_price=None)调到目标市值最终持仓市值变为 value
def handle_data(context, data):
    # 以最新价买入 100 股
    order('600570.SS', 100)
    # 以 39 元限价买 100 股
    order('600570.SS', 100, limit_price=39)
    # 用全部现金买入
    order_value('600570.SS', context.portfolio.cash)
    # 持仓调整到 1000 股(多买少卖自动算)
    order_target('600570.SS', 1000)
    # 清仓
    order_target('600570.SS', 0)
    # 持仓市值调到 5 万
    order_target_value('600570.SS', 50000)

几个关键点:

  • 回测中股票按 100 股取整、可转债按 10 张取整;order_target('600570.SS', 0) 清仓不受整手限制。
  • order 支持国债逆回购:方向为卖出(amount 为负),最小 10 张(1000 元)。
  • 限价单价格必须符合品种精度(股票 0.01、可转债/ETF 0.001),否则委托失败。

实盘慎用 order_target / order_target_value:回测中成交后持仓瞬时更新,但实盘持仓同步有约 6 秒延迟,连续调用会造成重复下单。实盘若要用,须自行加订单/持仓同步管理。

二、市价委托

order_market 用交易所市价类型委托,仅交易可用

order_market(security, amount, market_type, limit_price=None)

market_type 取值(上证支持 0/1/2/4,深证支持 0/2/3/4/5):

含义
0对手方最优价格
1最优五档即时成交剩余转限价
2本方最优价格
3即时成交剩余撤销
4最优五档即时成交剩余撤销
5全额成交或撤单
# 以 35 元保护限价按对手方最优价买 100 股(上证需传 limit_price)
order_market('600570.SS', 100, 0, 35)
# 深证按全额成交或撤单买 100 股
order_market('000001.SZ', 100, 5)

三、tick 级下单

tick_data 中用 order_tick 按盘口档位下单,仅交易 + 仅 tick_data 内可用

order_tick(sid, amount, priceGear='1', limit_price=None)
  • priceGear:level1 支持 '1'~'5'(买档)和 '-1'~'-5'(卖档),level2 扩展到 10 档。
  • 同时传 priceGearlimit_price 时以 limit_price 为准。
def tick_data(context, data):
    order_tick('600570.SS', -100, '1')        # 以买一档卖出
    order_tick('600570.SS', 100, '-2')        # 以卖二档买入
    order_tick('600570.SS', 100, limit_price=56.5)  # 以指定价下单

四、撤单

函数含义
cancel_order(order_param)撤本策略订单,入参为 Order 对象或 order_id(回测+交易)
cancel_order_ex(order_param)撤账户当日订单,入参为 get_all_orders() 返回的单条 dict(仅交易)
def handle_data(context, data):
    _id = order('600570.SS', 100, limit_price=30)
    cancel_order(_id)

五、订单查询

函数含义场景
get_order(order_id)查指定编号订单回测 + 交易
get_orders(security=None)查本策略全部订单回测 + 交易
get_open_orders(security=None)查本策略未完成订单回测 + 交易
get_all_orders(security=None)查账户当日全部订单(含非本交易)仅交易
get_trades()查当日已成交明细回测 + 交易
# 撤掉账户所有可撤委托(仅交易)
for o in get_all_orders():
    if o['status'] in ['2', '7']:     # '2'已报 '7'部成
        cancel_order_ex(o)

六、IPO 打新

ipo_stocks_order(submarket_type=None, black_stocks=None) 一键申购当日新股(仅交易):

  • submarket_type0 上证普通、1 科创板、2 深证普通、3 创业板、4 可转债。
  • black_stocks:黑名单,可不带尾缀。
# 申购全部上证普通新股
ipo_stocks_order(submarket_type=0)
# 申购全部,但排除指定代码
ipo_stocks_order(black_stocks=['787001.SS', '783012.SS'])

七、盘后固定价委托

仅 PTrade 客户端 + 股票交易可用,用于科创板/创业板盘后定价交易:

after_trading_order(security, amount, entrust_price)       # 盘后委托
after_trading_cancel_order(order_param)                    # 盘后撤单

entrust_price 必传。配合 run_daily 在 15:00~15:30 之间触发。

八、ETF 申赎与篮子

函数含义
etf_purchase_redemption(etf_code, amount, limit_price=None)单只 ETF 申购(正数)/赎回(负数)
etf_basket_order(etf_code, amount, price_style=None, position=True, info=None)ETF 成分券篮子下单

etf_basket_orderprice_style 可设 'B1'~'B5' / 'S1'~'S5' / 'new'(买/卖档/最新价),info 可逐券指定现金替代、持仓替代和限价。

# 篮子买入 1 份 50ETF,用卖三档价
etf_basket_order('510050.SS', 1, price_style='S3', position=True)

小结

  • 基础下单四件套:order(数量)、order_value(金额)、order_target(目标量)、order_target_value(目标市值)。
  • 实盘慎用 target 系列,注意持仓同步延迟;市价和 tick 下单仅在交易可用。
  • cancel_order 撤本策略单、cancel_order_ex 撤账户任意单;用 get_orders / get_trades 追踪状态。下一步学会取行情和数据:获取信息函数