tqsdk2.api - 框架及核心业务

class tqsdk2.TqApi(self: tqsdk2.tqsdk2.TqApi, account: object = None, auth: object = None, backtest: object = None, web_gui: object = False, debug: object = False, disable_print: bool = False, _md_url: str = '', _srandom: int = 0, _mock_date_time: int = 0) None

创建天勤2 接口实例.

Args:
account (None/TqSim/TqKq/TqKqStock/TqAccount/TqCtp/TqRohon): [可选] 交易账号:
  • None: 账号将根据环境变量决定, 默认为 :py:class: ~tqsdk2.TqSim

  • TqSim : 使用 TqApi 自带的本地模拟账号

  • TqKq : 使用快期账号登录,直连行情和快期模拟交易服务器, 需提供 auth 参数

  • TqKqStock : 使用快期账号登录,直连行情和快期股票模拟交易服务器, 需提供 auth 参数

  • TqAccount : 使用实盘账号, 直连行情和交易中继服务器, 需提供期货公司/帐号/密码

  • TqCtp : 使用实盘账号, 直连行情和期货公司 CTP 交易服务器, 需提供期货公司/帐号/密码

  • TqRohon : 直连融航资管柜台

auth (TqAuth/str): [必填] 用户信易账户

  • TqAuth : 信易账户类,例如:TqAuth("tianqin@qq.com", "123456"), 您可以通过 https://account.shinnytech.com 进行注册管理

debug(bool/str): [可选] 是否将调试信息输出到指定文件,默认值为 False

disable_print(bool): [可选] 是否禁用调试信息输出,默认值为 False

backtest(TqBacktest): [可选] 进入时光机,此时强制要求 account 类型为 TqSim
  • TqBacktest : 传入 TqBacktest 对象,进入回测模式, 在回测模式下, 由 TqBacktest 内部完成回测时间段内的行情推进和 K 线、Tick 更新.

web_gui(bool/str): [可选]是否启用图形化界面功能, 默认不启用.
  • 启用图形化界面传入参数 web_gui=True 会每次以随机端口生成网页,也可以直接设置本机IP和端口 web_gui=[ip]:port 为网页地址,ip 可选,默认为 0.0.0.0,参考example 6

  • 为了图形化界面能够接收到程序传输的数据并且刷新,在程序中,需要循环调用 api.wait_update的形式去更新和获取数据

  • 推荐打开图形化界面的浏览器为Google Chrome 或 Firefox

Returns:

TqApi: 返回当前TqApi的一个副本

Example1:

# 使用实盘帐号直连行情和交易服务器
from tqsdk2 import TqApi, TqAuth, TqAccount
api = TqApi(TqAccount("H海通期货", "022631", "123456"), auth=TqAuth("信易账户", "账户密码"))

方法列表

__init__(self[, account, auth, backtest, ...])

创建天勤2 接口实例.

cancel_order(self[, order_or_order_id, account])

发送撤单指令, 注意: 与 TqSdk 不同, TqSdk2 撤单指令会立即发出, 无需等待用户调用 wait_update() 函数

close(self)

关闭天勤接口实例并释放相应资源

get_account(self[, account, trading_unit])

获取用户账户资金信息

get_kline_serial(self[, symbol, ...])

获取tick序列数据

get_order(*args, **kwargs)

Overloaded function.

get_position(*args, **kwargs)

Overloaded function.

get_quote(self, symbol)

获取指定合约的盘口行情

get_quote_list(self, symbols)

获取指定合约列表的盘口行情.

get_tick_serial(self[, symbol, data_length])

获取指定时间段内的 K 线序列.

get_trade(*args, **kwargs)

Overloaded function.

get_trading_unit(self)

查询交易单元信息.

insert_order(self[, symbol, direction, ...])

发送下单指令, 注意: 与 TqSdk 不同, TqSdk2 下单指令会立即发出, 无需等待用户调用 wait_update() 函数

is_changing(*args, **kwargs)

Overloaded function.

query_cont_quotes(self[, exchange_id, ...])

根据填写的参数筛选,返回主力连续合约对应的标的合约列表.

query_options(self[, underlying_symbol, ...])

发送合约服务请求查询,查询符合条件的期权列表,并返回查询结果.

query_quotes(self[, ins_class, exchange_id, ...])

根据相应的参数发送合约服务请求查询,并返回查询结果.

wait_update(self[, deadline])

等待业务数据更新.

get_trading_status(self, symbol)

获取指定合约的交易状态

get_margin_rates(self, symbol[, account])

获取指定合约的保证金率

wait_update(self: tqsdk2.tqsdk2.TqApi, deadline: float = 0.0) bool

等待业务数据更新.

调用此函数将阻塞当前线程, 等待天勤主进程发送业务数据更新并返回

注: 它是 TqApi 中最重要的一个函数, 每次调用它时都会发生这些事:

刷新最新的账户状态信息, 包括账户下订阅的行情、tick 和 Klines 数据.

若启动了调仓工具模块, 则执行一次调仓条件判断和下单.

Args:

deadline (float): [可选]指定截止时间,自unix epoch(1970-01-01 00:00:00 GMT)以来的秒数(time.time()), 默认没有超时(无限等待).

get_account(self: tqsdk2.tqsdk2.TqApi, account: object = None, trading_unit: int = 0) tqsdk2.tqsdk2.Account

获取用户账户资金信息

Args:

account (TqAccount/TqKq/TqRohon/TqCtp/TqSim): [可选] 指定获取账户资金信息的账户实例, 多账户模式下, 该参数必须指定

trading_unit (int): [可选] 交易单元编号

Returns:

Account: 返回一个账户对象引用. 其内容将在 wait_update() 时更新

get_position(*args, **kwargs)

Overloaded function.

  1. get_position(self: tqsdk2.tqsdk2.TqApi, symbol: str, account: object = None, trading_unit: int = 0) -> tqsdk2.tqsdk2.Position

    获取用户持仓信息

    Args:

    symbol (str): [可选]合约代码, 不填则返回所有持仓

    account (TqAccount/TqKq/TqSim/TqCtp/TqRohon): [可选]指定发送下单指令的账户实例, 多账户模式下,该参数必须指定

    trading_unit (int): [可选] 交易单元编号

    Returns:

    Position: 当指定了 symbol 时, 返回一个持仓对象引用. 其内容将在 wait_update() 时更新 不填 symbol 参数调用本函数, 将返回包含用户所有持仓的一个集合对象的引用, 使用方法与 dict 一致, 其中每个元素的 key 为合约代码, value 为 Position

  2. get_position(self: tqsdk2.tqsdk2.TqApi, account: object = None, trading_unit: int = 0) -> tqsdk2.tqsdk2.Positions

get_order(*args, **kwargs)

Overloaded function.

  1. get_order(self: tqsdk2.tqsdk2.TqApi, order_id: str, account: object = None, trading_unit: int = 0) -> tqsdk2.tqsdk2.Order

    获取用户委托单信息

    Args:

    order_id (str): [可选] 委托单号, 不填单号则返回所有委托单

    account (TqAccount/TqKq/TqSim/TqCtp/TqRohon): [可选]指定发送下单指令的账户实例, 多账户模式下,该参数必须指定

    trading_unit (int): [可选] 交易单元编号

    Returns:
    Order:
    • 当指定了order_id时, 返回一个委托单对象引用. 其内容将在 wait_update() 时更新.

    • 不填 order_id 参数调用本函数, 将返回包含用户所有委托单的一个集合对象的引用, 使用方法与 dict 一致, 其中每个元素的 key 为委托单号, value 为 Order

  2. get_order(self: tqsdk2.tqsdk2.TqApi, account: object = None, trading_unit: int = 0) -> tqsdk2.tqsdk2.Orders

get_trade(*args, **kwargs)

Overloaded function.

  1. get_trade(self: tqsdk2.tqsdk2.TqApi, trade_id: str, account: object = None, trading_unit: int = 0) -> tqsdk2.tqsdk2.Trade

    获取用户成交信息

    Args:

    trade_id (str): [可选] 成交合同编号, 不填成交号则返回所有委托单

    account (TqAccount/TqKq/TqSim/TqCtp/TqRohon): [可选]指定发送下单指令的账户实例, 多账户模式下,该参数必须指定

    trading_unit (int): [可选] 交易单元编号

    Returns:
    Trade:
    • 当指定了 trade_id 时, 返回一个成交对象引用. 其内容将在 wait_update() 时更新.

    • 不填 trade_id 参数调用本函数, 将返回包含用户当前交易日所有成交记录的集合对象的引用, 使用方法与 dict 一致, 其中每个元素的 key 为成交号, value 为 Trade

  2. get_trade(self: tqsdk2.tqsdk2.TqApi, account: object = None, trading_unit: int = 0) -> tqsdk2.tqsdk2.Trades

get_quote(self: tqsdk2.tqsdk2.TqApi, symbol: str) tqsdk2.tqsdk2.Quote

获取指定合约的盘口行情

Args:
symbol (str): 指定合约代码, 合约代码格式为 交易所代码.合约代码. 可用的交易所代码如下:
  • CFFEX: 中金所

  • SHFE: 上期所

  • DCE: 大商所

  • CZCE: 郑商所

  • INE: 能源交易所(原油)

  • SSE: 上交所

  • SZSE: 深交所

Returns:

Quote: 返回一个盘口行情引用, 其内容将在 wait_update() 时更新, 注意: 在 tqsdk 还没有收到行情数据包时, 此对象中各项内容为 NaN 或 0

get_quote_list(self: tqsdk2.tqsdk2.TqApi, symbols: List[str]) List[tqsdk2.tqsdk2.Quote]

获取指定合约列表的盘口行情.

Args:

symbols (list of str): 合约代码列表

Returns:

list of Quote: 返回一个列表,每个元素为指定合约盘口行情引用。

get_kline_serial(self: object, symbol: str = '', duration_seconds: int = 60, data_length: int = 200) object

获取tick序列数据

Args:

symbol (str): 指定合约代码。当前只支持单个合约

duration_seconds (int): K 线数据周期, 以秒为单位。例如: 1 分钟线为 60,1 小时线为 3600,日线为 86400。

注意: 周期在日线以内时此参数可以任意填写, 在日线以上时只能是日线(86400)的整数倍

data_length (int): 需要获取的序列长度。每个序列最大支持请求 8000 个数据

Returns:

pandas.DataFrame: 本函数总是返回一个 pandas.DataFrame 实例。包含以下列: - id: 1234 (k线序列号)

  • datetime: 1501074872000000000 (tick从交易所发出的时间(按北京时间),自unix epoch(1970-01-01 00:00:00 GMT)以来的纳秒数)

  • open: 51450.0 (K线起始时刻的最新价)

  • high: 51450.0 (K线时间范围内的最高价)

  • low: 51450.0 (K线时间范围内的最低价)

  • close: 51450.0 (K线结束时刻的最新价)

  • volume: 11 (K线时间范围内的成交量)

  • open_oi: 27354 (K线起始时刻的持仓量)

  • close_oi: 27355 (K线结束时刻的持仓量)

get_tick_serial(self: object, symbol: str = '', data_length: int = 200) object
获取指定时间段内的 K 线序列.

请求指定合约的Tick序列数据. 序列数据会随着时间推进自动更新

Args:

symbol (str): 指定合约代码

data_length (int): 需要获取的序列长度。每个序列最大支持请求 8000 个数据

chart_id (str): [可选]指定序列id, 默认由 api 自动生成

Returns:

pandas.DataFrame: 本函数总是返回一个 pandas.DataFrame 实例, 包含以下列: - id: 12345 tick序列号

  • datetime: 1501074872000000000 (tick从交易所发出的时间(按北京时间),自unix epoch(1970-01-01 00:00:00 GMT)以来的纳秒数)

  • last_price: 3887.0 (最新价)

  • average: 3820.0 (当日均价)

  • highest: 3897.0 (当日最高价)

  • lowest: 3806.0 (当日最低价)

  • ask_price1: 3886.0 (卖一价)

  • ask_volume1: 3 (卖一量)

  • bid_price1: 3881.0 (买一价)

  • bid_volume1: 18 (买一量)

  • volume: 7823 (当日成交量)

  • amount: 19237841.0 (成交额)

  • open_interest: 1941 (持仓量)

insert_order(self: tqsdk2.tqsdk2.TqApi, symbol: str = '', direction: str = '', offset: str = '', volume: int = 0, limit_price: object = None, account: object = None, trading_unit: int = 0) tqsdk2.tqsdk2.Order

发送下单指令, 注意: 与 TqSdk 不同, TqSdk2 下单指令会立即发出, 无需等待用户调用 wait_update() 函数

Args:

symbol (str): 拟下单的合约symbol, 格式为 交易所代码.合约代码, 例如 "SHFE.cu1801"

direction (str): "BUY" 或 "SELL"

offset (str): "OPEN", "CLOSE" 或 "CLOSETODAY" (上期所和原油分平今/平昨, 平今用"CLOSETODAY", 平昨用"CLOSE"; 其他交易所直接用"CLOSE" 按照交易所的规则平仓)

volume (int): 下单交易数量, 期货为下单手数

account (TqAccount/TqKq/TqSim/TqCtp/TqRohon): [可选]指定发送下单指令的账户实例, 多账户模式下,该参数必须指定

trading_unit(int): [可选] 交易单元编号

cancel_order(self: tqsdk2.tqsdk2.TqApi, order_or_order_id: object = None, account: object = None) None

发送撤单指令, 注意: 与 TqSdk 不同, TqSdk2 撤单指令会立即发出, 无需等待用户调用 wait_update() 函数

Args:

order_or_order_id (str): 拟撤委托单或单号

account (TqAccount/TqKq/TqSim/TqCtp/TqRohon): [可选]指定发送下单指令的账户实例, 多账户模式下,该参数必须指定

is_changing(*args, **kwargs)

Overloaded function.

  1. is_changing(self: tqsdk2.tqsdk2.TqApi, arg0: object, arg1: str) -> bool

    判定 obj 最近是否有更新

    当业务数据更新导致 wait_update 返回后可以使用该函数判断 本次业务数据更新是否包含特定obj或其中某个字段 关于判断K线更新的说明: 当生成新K线时,其所有字段都算作有更新,若此时执行 api.is_changing(klines.iloc[-1]) 则一定返回True。

    Args:

    obj (any): 任意业务对象, 包括 get_quote 返回的 quote, get_kline_serial 返回的 k_serial, get_account 返回的 account 等

    key (str/list of str): [可选]需要判断的字段,默认不指定

    Returns:

    bool: 如果本次业务数据更新包含了待判定的数据则返回 True, 否则返回 False

  2. is_changing(self: tqsdk2.tqsdk2.TqApi, arg0: object, arg1: list) -> bool

  3. is_changing(self: tqsdk2.tqsdk2.TqApi, arg0: object) -> bool

get_trading_unit(self: tqsdk2.tqsdk2.TqApi) List[int]

查询交易单元信息.

Returns:

返回截止到现在有储存过数据的交易单元列表(有开仓委托但未成交的节点视为未存储过数据).

query_quotes(self: tqsdk2.tqsdk2.TqApi, ins_class: str = '', exchange_id: str = '', product_id: str = '', expired: object = None, has_night: object = None) List[str]

根据相应的参数发送合约服务请求查询,并返回查询结果.

Args:
ins_class (str): [可选] 合约类型
  • FUTURE: 期货

  • CONT: 主连

  • COMBINE: 组合

  • INDEX: 指数

  • OPTION: 期权

  • STOCK: 股票

exchange_id (str): [可选] 交易所
  • CFFEX: 中金所

  • SHFE: 上期所

  • DCE: 大商所

  • CZCE: 郑商所

  • INE: 能源交易所(原油)

  • SSE: 上交所

  • SZSE: 深交所

product_id (str): [可选] 品种(股票、期权不能通过 product_id 筛选查询)

expired (bool): [可选] 是否已下市

has_night (bool): [可选] 是否有夜盘,默认为 None。
  • None 表示筛选结果既包括有夜盘品种也包括无夜盘品种

  • True 表示筛选结果只包括有夜盘品种

  • False 表示筛选结果只包括无夜盘品种

Returns:

list: 符合筛选条件的合约代码的列表,例如: ["SHFE.cu2012", "SHFE.au2012", "SHFE.wr2012"]

query_options(self: tqsdk2.tqsdk2.TqApi, underlying_symbol: str = '', option_class: str = '', exercise_year: int = 0, exercise_month: int = 0, strike_price: float = 0.0, expired: object = None, has_A: object = None) List[str]

发送合约服务请求查询,查询符合条件的期权列表,并返回查询结果.

Args:

underlying_symbol (str): 标的合约

option_class (str): [可选] 期权类型
  • CALL: 看涨期权

  • PUT: 看跌期权

exercise_year (int): [可选] 最后行权日年份

exercise_month (int): [可选] 最后行权日月份

strike_price (float): [可选] 行权价格

expired (bool): [可选] 是否下市

has_A (bool): [可选] 是否含有A,输入True代表只含A的期权,输入False代表不含A的期权,默认为None不做区分

Returns:

list: 符合筛选条件的合约代码的列表,例如: ["SHFE.cu2012C24000", "SHFE.cu2012P24000"]

query_cont_quotes(self: tqsdk2.tqsdk2.TqApi, exchange_id: str = '', product_id: str = '', has_night: object = None) List[str]

根据填写的参数筛选,返回主力连续合约对应的标的合约列表.

Args:
exchange_id (str): [可选] 交易所
  • CFFEX: 中金所

  • SHFE: 上期所

  • DCE: 大商所

  • CZCE: 郑商所

  • INE: 能源交易所(原油)

  • SSE: 上交所

  • SZSE: 深交所

product_id (str): [可选] 品种(股票、期权不能通过 product_id 筛选查询)

has_night (bool): [可选] 是否有夜盘,默认为 None。
  • None 表示筛选结果既包括有夜盘品种也包括无夜盘品种

  • True 表示筛选结果只包括有夜盘品种

  • False 表示筛选结果只包括无夜盘品种

Returns:

list: 符合筛选条件的合约代码的列表,例如: ["SHFE.cu2012", "SHFE.au2012", "SHFE.wr2012"]

query_all_level_options(self: tqsdk2.tqsdk2.TqApi, underlying_symbol: str, underlying_price: float, option_class: str, exercise_year: int = 0, exercise_month: int = 0, has_A: object = None) List[List[str]]

发送合约服务请求查询,查询符合条件的期权列表,返回全部的实值、平值、虚值期权

Args:

underlying_symbol (str): [必填] 标的合约 (目前每个标的只对应一个交易所的期权)

underlying_price (float): [必填] 标的价格,该价格用户输入可以是任意值,例如合约最新价,最高价,开盘价等然后以该值去对比实值/虚值/平值期权

option_class (str): [必填] 期权类型
  • CALL: 看涨期权

  • PUT: 看跌期权

exercise_year (int): [可选] 最后行权日年份

exercise_month (int): [可选] 最后行权日月份

has_A (bool): [可选] 是否含有A,输入True代表只含A的期权,输入False代表不含A的期权,默认为None不做区分

Returns:

返回三个列表,分别为实值期权列表、平值期权列表、虚值期权列表。其中,平值期权列表只包含一个元素。

对于看涨期权,返回的实值期权列表、平值期权列表、虚值期权列表其期权行权价依此递增;

对于看跌期权,返回的实值期权列表、平值期权列表、虚值期权列表其期权行权价依此递减。

注:当选择平值期权时,会按以下逻辑进行选择:

  1. 根据用户传入参数来生成一个期权列表,在这个期权列表中来选择是否有和传入价格相比的平值期权并返回

  2. 如果没有符合的平值期权,则取行权价距离传入价格绝对值相差最小的期权作为平值期权

  3. 如果存在最近的两个期权的行权价到传入价格的绝对值最小且相等,则取虚值的那个期权作为平值期权,其他档位期权依次展开

Example:

from tqsdk2 import TqApi, TqAuth, TqAccount

api = TqApi(auth=TqAuth("信易账户", "账户密码"))
quote = api.get_quote("SHFE.au2112")
in_money_options, at_money_options, out_of_money_options = api.query_all_level_options("SHFE.au2112", quote.last_price, "CALL")
print(in_money_options)  # 实值期权列表
print(at_money_options)  # 平值期权列表
print(out_of_money_options)  # 虚值期权列表

api.close()
get_trading_status(self: tqsdk2.tqsdk2.TqApi, symbol: str) tqsdk2.tqsdk2.TradingStatus

获取指定合约的交易状态

Args:

symbol (str): 合约

Returns:

交易状态的引用, 对于每个在交易所交易的品种,它在任意时刻都处于以下三种状态之一.

  • AUCTIONORDERING : 集合竞价报单, 允许用户报单, 报单不会立即成交, 而是等到集合竞价撮合阶段成交

  • CONTINOUS : 连续交易. 主要的交易时段

  • NOTRADING : 非交易时段, 例如午休时间、收盘时间、集合竞价撮合. 不允许用户报单

Example:

# 集合竞价报单阶段进行开盘抢单
from tqsdk2 import TqApi, TqAuth, TqAccount

account = TqCtp(front_url, front_broker, app_id, auth_code, account_id, password)
api = TqApi(account = account, auth=TqAuth("信易账户", "账户密码"))
ts = api.get_trading_status("SHFE.cu2201")
while True:
  api.wait_update()
  if ts.trade_status == "AUCTIONORDERING":
    order = api.insert_order("SHFE.cu2201","BUY","OPEN", 1, 71400)
    break

api.close()
get_margin_rates(self: tqsdk2.tqsdk2.TqApi, symbol: str, account: object = None) List[float]

获取指定合约的保证金率

该方法仅支持直连 CTP 柜台时使用。受限制于 CTP 柜台的流控机制(每秒 1 笔), 短时间发送大量查询指令后, 后续查询指令将会排队等待。 为了避免盘中的查询等待时间, 建议盘前启动程序, 对标的合约提前进行查询。

Args:

symbol (str): 合约

account (TqCtp): [可选]指定发送下单指令的账户实例, 多账户模式下,该参数必须指定

Returns:

rates (list) 合约保证金信息, 格式: [合约多仓保证金率, 合约空仓保证金率]

Example:

from tqsdk2 import TqApi, TqAuth, TqCtp

account = TqCtp(front_url, front_broker, app_id, auth_code, account_id, password)
api = TqApi(account = account, auth=TqAuth("信易账户", "账户密码"))
rate = api.get_margin_rates("SHFE.cu2201")
print(rate)

api.close()