CTP 账户与交易数据

连接配置、同步状态、资金、持仓、订单和成交。

本页目录

交易凭据仅在本地使用。先从期货公司获取交易前置、AppID 和 AuthCode,再创建 CtpAccount。SDK 登录后会自动确认当日结算。

创建账户并等待同步

import os
import time
from exsdk import ExApi, CtpAccount

account = CtpAccount(
    broker_id=os.environ["CTP_BROKER_ID"],
    user_id=os.environ["CTP_USER_ID"],
    password=os.environ["CTP_PASSWORD"],
    front_url=os.environ["CTP_FRONT_URL"],
    app_id=os.environ["CTP_APP_ID"],
    auth_code=os.environ["CTP_AUTH_CODE"],
)
with ExApi(os.environ["EXSDK_TOKEN"], account) as api:
    funds = api.watch_account()
    positions = api.watch_position()
    orders = api.watch_order()
    trades = api.watch_trade()
    deadline = time.time() + 60
    while api.trading_status() != "READY":
        if not api.wait_update(deadline=deadline):
            raise TimeoutError("CTP 账户同步未在预期时间内完成")
    print("可用资金", funds.data().available)
    print("持仓映射", positions.data())

六个账户字段均必填、非空、不能包含 NUL。前置地址必须以 tcp:// 开头;不要填入行情前置代替交易前置。

交易状态

状态含义与操作
SYNCING首次登录或重连后同步中,尚不能提交委托
READY登录及一致性同步完成,可提交委托,但不保证资金或行情是即时值
DISCONNECTEDCTP 连接中断,旧快照仍保留,不作为当前状态
ERROR无法自动恢复,需要处理错误并新建 ExApi

trading_status() 读取最近发布状态,不主动查询。资金默认每 5 秒安排刷新,实际到达可能更晚。一次成交引起的订单成交量、成交和持仓更新会在同一轮发布,资金更新可能在后续轮次才到达。

只读映射的正确访问

positions = api.watch_position(symbol)
orders = api.watch_order(symbol)
trades = api.watch_trade(symbol)

# 上述创建动作放在循环之前。
while api.wait_update():
    if api.trading_status() != "READY":
        continue
    position = positions.data().get(symbol)
    if position is not None:
        print(position.pos_long, position.available_long)
    for order_id, order in orders.data().items():
        print(order_id, order.status)
    for trade_id, trade in trades.data().items():
        print(trade_id, trade.price, trade.volume)

持仓按合约代码索引,订单按本地 order_id 索引,成交按 CTP TradeID 索引。即使指定单个合约,data() 仍返回 Mapping。可提前观察尚无持仓的合约;持仓归零后仍保留对象。

订单与成交只包含当前交易日普通投机记录,包括同一账户其他客户端产生的记录。字段含义、未知值和单位详见 数据字典。

断线与同步

重连期间不发布部分查询结果;恢复 READY 后提交一致快照。data() 不会因断线自动清空,但旧数据不能表示当前账户状态。在非 READY 时本地下单拒绝通过返回结果说明,不改写订单快照。

接口说明依据 exsdk 1.1.2 的公开接口与本地使用指南整理。