股票交易函数
下单是策略的执行末端。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 档。- 同时传
priceGear和limit_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_type:0上证普通、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_order 的 price_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追踪状态。下一步学会取行情和数据:获取信息函数。