交易函数
拿到数据、算出信号后,就该下单了。聚宽提供了几个不同粒度的下单函数,核心区别是「你指定的是数量、目标仓位、还是金额」。
四个下单函数
| 函数 | 含义 | 典型用途 |
|---|---|---|
order(security, amount) | 按股数买卖(正买负卖) | 精确控制手数 |
order_target(security, amount) | 调到目标数量 | 一次性调到指定仓位 |
order_value(security, value) | 按金额买卖(正买负卖) | 按资金量下单 |
order_target_value(security, value) | 调到目标金额 | 按权重调仓最常用 |
# 买入 100 股
order('000001.XSHE', 100)
# 卖出全部,目标数量为 0
order_target('000001.XSHE', 0)
# 用 1 万元买入
order_value('000001.XSHE', 10000)
# 调整该股仓位到总资产的 20%
total = context.portfolio.total_value
order_target_value('000001.XSHE', total * 0.2)
通用参数
四个函数共享以下参数:
| 参数 | 说明 |
|---|---|
style | 下单方式,None(默认市价单)或 LimitOrderStyle(10.0) 限价单 |
side | 'long' / 'short',股票只支持多头 |
pindex | 子账户序号(多账户时用,默认 0) |
close_today | 期货平今仓标志(仅部分交易所生效) |
订单类型 OrderStyle
| 类型 | 用法 |
|---|---|
| 市价单 | MarketOrderStyle() 或 style=None;科创板需传保护价 MarketOrderStyle(10) |
| 限价单 | LimitOrderStyle(10.0),以 10 元挂单 |
| 止损市价单 | StopMarketOrderStyle('stop_loss', stop_price) |
| 止盈限价单 | StopLimitOrderStyle('take_profit', stop_price, limit_price) |
order('000001.XSHE', 100, LimitOrderStyle(10.0)) # 10 元限价买入
order('688001.XSHG', 100, MarketOrderStyle(10)) # 科创板市价,保护价 10
撤单与订单查询
| 函数 | 含义 |
|---|---|
cancel_order(order) | 撤销订单(传 Order 对象或 order_id) |
get_open_orders() | 当天所有未完成订单(dict,key 是 order_id) |
get_orders(security, status) | 当天所有订单,可按标的/状态筛选 |
get_trades() | 当天所有成交记录(一个订单可能分多次成交) |
def after_trading_end(context):
for _order in get_open_orders().values():
cancel_order(_order)
for t in get_trades().values():
log.info('成交:%s @ %s' % (t.security, t.price))
批量下单
batch_submit_orders(orders) 一次提交一篮子订单,内部会逐个验资验券,任一失败则整体失败:
orders = [
{'security': '000001.XSHE', 'amount': 100, 'pindex': 0},
{'security': '600660.XSHG', 'amount': 100, 'pindex': 0},
]
batch_submit_orders(orders)
账户与持仓对象
下单后通过 context 查看账户和持仓:
context.portfolio.available_cash # 可用资金
context.portfolio.total_value # 总资产
context.portfolio.positions_value # 持仓市值
context.portfolio.positions # 持仓字典 {code: Position}
单个持仓 Position 的常用属性:
| 属性 | 含义 |
|---|---|
total_amount | 总仓位(不含挂单冻结) |
closeable_amount | 可卖出数量 |
avg_cost | 当前持仓成本 |
price | 最新价 |
value | 持仓市值 |
for code, pos in context.portfolio.positions.items():
log.info('%s: 持仓 %s, 成本 %s' % (code, pos.total_amount, pos.avg_cost))
下单失败常见原因
下单函数返回 None 表示失败,常见原因:
- 标的停牌、退市、未上市或代码错误。
- 数量调整后为 0(如资金不足买不够一手)。
- 给股票开了空单(股票不支持
side='short')。 - 选择了不存在的
pindex(没建多账户却传了大于 0 的序号)。 - 科创板市价单未指定保护价。
小结
四个下单函数:order 按数、order_target 目标数、order_value 按金额、order_target_value 目标金额。
限价用 LimitOrderStyle,撤单用 cancel_order,查订单用 get_orders,持仓看 context.portfolio.positions。
下一步扩展到期货和融资融券:期货与两融函数。