交易接口
策略算出信号后要落地成单子。PythonGo 的交易接口都封装在 BaseStrategy 里,本章按「下单 → 平仓 → 撤单 → 查询 → 回调」的顺序讲清楚。
一、报单函数 send_order
send_order 是最常用的开仓报单函数,返回报单编号(-1 表示失败):
order_id = self.send_order(
exchange=self.params_map.exchange,
instrument_id=self.params_map.instrument_id,
volume=2,
price=tick.last_price + 1, # 超价 1 跳
order_direction="buy", # "buy" 买 / "sell" 卖
order_type="GFD", # GFD 限价 / FAK / FOK
investor="", # 留空用默认账号
hedgeflag="1", # 1 投机(默认)
market=False # False 限价单 / True 市价单
)
| 参数 | 类型 | 含义 | 默认 |
|---|---|---|---|
exchange / instrument_id | str | 交易所 / 合约 | 必填 |
volume | int | 手数 | 必填 |
price | float | 价格 | 必填 |
order_direction | Literal["buy","sell"] | 方向 | 必填 |
order_type | Literal["GFD","FAK","FOK"] | 报单指令 | "GFD" |
hedgeflag | Literal["1"~"5"] | 投机套保标志(1 投机) | "1" |
market | bool | 是否市价单 | False |
memo | Any | 报单备注(回调里可识别) | None |
order_direction用语义化的"buy"/"sell",框架内部再转成交易所的0/1。这是新版对旧版的改进。
二、自动平仓 auto_close_position
平仓要区分今昨仓(尤其上期所),auto_close_position 自动处理平今优先逻辑:
self.auto_close_position(
exchange=self.params_map.exchange,
instrument_id=self.params_map.instrument_id,
volume=abs(position.net_position),
price=tick.bid_price1,
order_direction="sell",
shfe_close_first=False # True 则上期所平昨仓优先
)
参数和 send_order 基本一致,多一个 shfe_close_first(上期所平仓昨仓优先)。当既平了昨仓又平了今仓时,只返回最后一次平仓的报单编号。
如果需要精确控制开平标志,可以用底层
make_order_req,手动传offset("0"开 /"1"平 /"3"平今)。
三、撤单 cancel_order
result = self.cancel_order(order_id=123)
# -1: 报单编号不存在; 0: 撤单请求发送成功(不代表已撤成功)
撤单是异步的——请求发出后,真正撤单成功会通过 on_cancel 回调通知。
四、持仓与资金查询
| 方法 | 含义 | 返回 |
|---|---|---|
get_position(instrument_id, hedgeflag="1", simple=False) | 查单合约双向持仓 | Position |
get_all_position(simple=False) | 查所有账号全部持仓(v2025.1112+) | 嵌套字典 |
get_account_fund_data(investor) | 查账号资金 | AccountData |
get_instrument_data(exchange, instrument_id) | 查合约信息(合约乘数等) | InstrumentData |
get_investor_data(index=1) | 查投资者信息 | InvestorData |
get_instruments_by_product(exchange, product_id, raw_data=True) | 查品种下所有合约 | 列表 |
position = self.get_position(self.params_map.instrument_id)
if position.net_position > 0:
# 有多头持仓,死叉时平仓
self.auto_close_position(
exchange=self.params_map.exchange,
instrument_id=self.params_map.instrument_id,
volume=position.net_position,
price=tick.bid_price1,
order_direction="sell"
)
Position 对象关键字段
Position 含 long / short(多/空单向持仓,类型 Position_p)和 net_position(净持仓)、position(总持仓)。Position_p 里最常用的是 position(总持仓量)、close_available(可平)、open_avg_price(开仓均价)、position_profit(持仓盈亏)。
get_position的simple=True返回实时持仓(无延迟),但缺少position_cost、close_profit等字段,按需选择。
五、报单回调
报单发出后,状态变化会通过回调推送:
| 回调 | 触发时机 | 参数 |
|---|---|---|
on_order(order: OrderData) | 报单状态变化(成交、撤单等) | OrderData |
on_trade(trade: TradeData, log=False) | 报单成交 | TradeData |
on_cancel(order: CancelOrderData) | 收到撤单推送 | CancelOrderData |
on_error(error: dict) | 报单错误或代码运行错误 | 含 errCode/errMsg/orderID |
def on_order(self, order: OrderData) -> None:
super().on_order(order)
if order.status == "全部成交":
self.output(f"成交 {order.instrument_id} {order.traded_volume} 手")
elif order.status in ("部成部撤", "已撤销"):
self.output(f"报单 {order.order_id} 已撤")
def on_error(self, error: dict) -> None:
super().on_error(error)
self.output("错误:", error)
on_error 里如果有 orderID 键,说明是报单错误(如资金不足、超仓位);否则是代码运行错误。errCode 为 0004 时是撤单错误。
六、trading 开关
self.trading(bool)控制报单函数是否真正对外发单。设为 False 后调用 send_order 也不会下单。on_start 会自动设为 True,on_stop 设为 False。你可以临时用它做「只看信号不下单」的模拟。
小结
send_order 开仓、auto_close_position 平仓(平今优先)、cancel_order 撤单、get_position 查持仓;
状态变化走 on_order / on_trade / on_cancel / on_error 回调。下一步看完整实战:
策略示例。