交易函数

拿到数据、算出信号后,就该下单了。聚宽提供了几个不同粒度的下单函数,核心区别是「你指定的是数量、目标仓位、还是金额」。

四个下单函数

函数含义典型用途
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。 下一步扩展到期货和融资融券:期货与两融函数