交易接口

策略算出信号后要落地成单子。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_idstr交易所 / 合约必填
volumeint手数必填
pricefloat价格必填
order_directionLiteral["buy","sell"]方向必填
order_typeLiteral["GFD","FAK","FOK"]报单指令"GFD"
hedgeflagLiteral["1"~"5"]投机套保标志(1 投机)"1"
marketbool是否市价单False
memoAny报单备注(回调里可识别)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 对象关键字段

Positionlong / short(多/空单向持仓,类型 Position_p)和 net_position(净持仓)、position(总持仓)。Position_p 里最常用的是 position(总持仓量)、close_available(可平)、open_avg_price(开仓均价)、position_profit(持仓盈亏)。

get_positionsimple=True 返回实时持仓(无延迟),但缺少 position_costclose_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 键,说明是报单错误(如资金不足、超仓位);否则是代码运行错误。errCode0004 时是撤单错误。

六、trading 开关

self.tradingbool)控制报单函数是否真正对外发单。设为 False 后调用 send_order 也不会下单。on_start 会自动设为 Trueon_stop 设为 False。你可以临时用它做「只看信号不下单」的模拟。

小结

send_order 开仓、auto_close_position 平仓(平今优先)、cancel_order 撤单、get_position 查持仓; 状态变化走 on_order / on_trade / on_cancel / on_error 回调。下一步看完整实战: 策略示例