tqsdk.api - 框架及核心业务¶
天勤接口的PYTHON封装, 提供以下功能
连接行情和交易服务器或天勤终端的websocket扩展接口, 接收行情及交易推送数据
在内存中存储管理一份完整的业务数据(行情+交易), 并在接收到新数据包时更新内存数据
通过一批函数接口, 支持用户代码访问业务数据
发送交易指令
PYTHON SDK使用文档: https://doc.shinnytech.com/pysdk/latest/
天勤vscode插件使用文档: https://doc.shinnytech.com/pysdk/latest/devtools/vscode.html
天勤用户论坛: https://www.shinnytech.com/qa/
-
class
tqsdk.api.
TqApi
(account: Union[TqAccount, tqsdk.sim.TqSim, None] = None, auth: Optional[str] = None, url: Optional[str] = None, backtest: Union[tqsdk.backtest.TqBacktest, tqsdk.backtest.TqReplay, None] = None, web_gui: [<class 'bool'>, <class 'str'>] = False, debug: Optional[str] = None, loop: Optional[asyncio.events.AbstractEventLoop] = None, _ins_url=None, _md_url=None, _td_url=None)¶ 天勤接口及数据管理类
该类中所有参数只针对天勤外部IDE编写使用, 在天勤内使用 api = TqApi() 即可指定为当前天勤终端登录用户
通常情况下, 一个线程中 应该只有一个 TqApi的实例, 它负责维护网络连接, 接收行情及账户数据, 并在内存中维护业务数据截面
创建天勤接口实例
- Args:
- account (None/TqAccount/TqSim): [可选]交易账号:
- auth (str): [可选]用户权限认证对象
用户权限认证对象为天勤用户论坛的邮箱和密码,中间以英文逗号分隔,例如: "tianqin@qq.com,123456"
- url (str): [可选]指定服务器的地址
backtest (TqBacktest/TqReplay): [可选] 进入时光机,此时强制要求 account 类型为
TqSim
TqBacktest
: 传入 TqBacktest 对象,进入回测模式 在回测模式下, TqBacktest 连接 wss://openmd.shinnytech.com/t/md/front/mobile 接收行情数据, 由 TqBacktest 内部完成回测时间段内的行情推进和 K 线、Tick 更新.TqReplay
: 传入 TqReplay 对象, 进入复盘模式 在复盘模式下, TqReplay 会在服务器申请复盘日期的行情资源, 由服务器推送复盘日期的行情.
debug(str): [可选] 指定一个日志文件名, 将调试信息输出到指定文件. 默认不输出.
loop(asyncio.AbstractEventLoop): [可选]使用指定的 IOLoop, 默认创建一个新的.
- web_gui(bool/str): [可选]是否启用 图形化界面 功能, 默认不启用. 启用图形化界面传入参数web_gui = True会每次以随机端口生成网页,也可以直接设置本机IP端口为网页地址参考example 6
为了图形化界面能够接收到程序传输的数据并且刷新,在程序中,需要循环调用 api.wait_update的形式去更新和获取数据
推荐打开图形化界面的浏览器为Google Chrome 或 Firefox
Example1:
# 使用实盘帐号直连行情和交易服务器 from tqsdk import TqApi, TqAccount api = TqApi(TqAccount("H海通期货", "022631", "123456"))
Example2:
# 使用模拟帐号直连行情服务器 from tqsdk import TqApi, TqSim api = TqApi(TqSim()) # 不填写参数则默认为 TqSim() 模拟账号
Example3:
# 进行策略回测 from datetime import date from tqsdk import TqApi, TqBacktest api = TqApi(backtest=TqBacktest(start_dt=date(2018, 5, 1), end_dt=date(2018, 10, 1)))
Example4:
# 进行策略复盘 from datetime import date from tqsdk import TqApi, TqReplay api = TqApi(backtest=TqReplay(replay_dt=date(2019, 12, 16)))
Example5:
# 开启 web_gui 功能,使用默认参数True from tqsdk import TqApi api = TqApi(web_gui=True)
Example6:
# 开启 web_gui 功能,使用本机IP端口固定网址生成 from tqsdk import TqApi api = TqApi(web_gui="http://127.0.0.1:9876")
-
copy
() → tqsdk.api.TqApi¶ 创建当前TqApi的一个副本. 这个副本可以在另一个线程中使用
- Returns:
TqApi
: 返回当前TqApi的一个副本. 这个副本可以在另一个线程中使用
-
close
() → None¶ 关闭天勤接口实例并释放相应资源
Example:
# m1901开多3手 from tqsdk import TqApi from contextlib import closing with closing(TqApi()) as api: api.insert_order(symbol="DCE.m1901", direction="BUY", offset="OPEN", volume=3)
-
get_quote
(symbol: str) → tqsdk.objs.Quote¶ 获取指定合约的盘口行情.
- Args:
- symbol (str): 指定合约代码。注意:天勤接口从0.8版本开始,合约代码格式变更为 交易所代码.合约代码 的格式. 可用的交易所代码如下:
CFFEX: 中金所
SHFE: 上期所
DCE: 大商所
CZCE: 郑商所
INE: 能源交易所(原油)
- Returns:
Quote
: 返回一个盘口行情引用. 其内容将在wait_update()
时更新.注意: 在 tqsdk 还没有收到行情数据包时, 此对象中各项内容为 NaN 或 0
Example:
# 获取 SHFE.cu1812 合约的报价 from tqsdk import TqApi api = TqApi() quote = api.get_quote("SHFE.cu1812") print(quote.last_price) while api.wait_update(): print(quote.last_price) # 预计的输出是这样的: nan 24575.0 24575.0 ...
-
get_kline_serial
(symbol: Union[str, List[str]], duration_seconds: int, data_length: int = 200, chart_id: Optional[str] = None) → pandas.core.frame.DataFrame¶ 获取k线序列数据
请求指定合约及周期的K线数据. 序列数据会随着时间推进自动更新
- Args:
- symbol (str/list of str): 指定合约代码或合约代码列表.
str: 一个合约代码
list of str: 合约代码列表 (一次提取多个合约的K线并根据相同的时间向第一个合约(主合约)对齐)
duration_seconds (int): K线数据周期, 以秒为单位。例如: 1分钟线为60,1小时线为3600,日线为86400。 注意: 周期在日线以内时此参数可以任意填写, 在日线以上时只能是日线(86400)的整数倍
data_length (int): 需要获取的序列长度。默认200根, 返回的K线序列数据是从当前最新一根K线开始往回取data_length根。 每个序列最大支持请求 8964 个数据
chart_id (str): [可选]指定序列id, 默认由 api 自动生成
注:关于传入合约代码列表 获取多合约K线的说明:
1 主合约的字段名为原始K线数据字段,从第一个副合约开始,字段名在原始字段后加数字,如第一个副合约的开盘价为 "open1" , 第二个副合约的收盘价为 "close2"。
2 每条K线都包含了订阅的所有合约数据,即:如果任意一个合约(无论主、副)在某个时刻没有数据(即使其他合约在此时有数据), 则不能对齐,此多合约K线在该时刻那条数据被跳过,现象表现为K线不连续(如主合约有夜盘,而副合约无夜盘,则生成的多合约K线无夜盘时间的数据)。
3 若设置了较大的序列长度参数,而所有可对齐的数据并没有这么多,则序列前面部分数据为NaN(这与获取单合约K线且数据不足序列长度时情况相似)。
4 若主合约与副合约的交易时间在所有合约数据中最晚一根K线时间开始往回的 8964*周期 时间段内完全不重合,则无法生成多合约K线,程序会报出获取数据超时异常。
5 回测暂不支持 获取多合约K线, 若在回测时获取多合约K线,程序会报出获取数据超时异常。
6 datetime、duration是所有合约公用的字段,则未单独为每个副合约增加一份副本,这两个字段使用原始字段名(即没有数字后缀)。
- Returns:
pandas.DataFrame: 本函数总是返回一个 pandas.DataFrame 实例. 行数=data_length, 包含以下列:
id: 1234 (k线序列号)
datetime: 1501080715000000000 (K线起点时间(按北京时间),自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线结束时刻的持仓量)
Example1:
# 获取 SHFE.cu1812 的1分钟线 from tqsdk import TqApi api = TqApi() klines = api.get_kline_serial("SHFE.cu1812", 60) print(klines.iloc[-1].close) while True: api.wait_update() print(klines.iloc[-1].close) # 预计的输出是这样的: 50970.0 50970.0 50960.0 ...
Example2:
# 获取按时间对齐的多合约K线 from tqsdk import TqApi api = TqApi() # 获取 CFFEX.IF1912 按照K线时间向 SHFE.au2006 对齐的K线 klines = api.get_kline_serial(["SHFE.au2006", "CFFEX.IF2006"], 5, data_length=10) print("多合约K线:", klines.iloc[-1]) while True: api.wait_update() if api.is_changing(klines.iloc[-1], ["close1", "close"]): # 判断任何一个收盘价是否有更新 dif = klines.close1 - klines.close # 使用对齐的K线直接计算价差等数据 print("价差序列:", dif)
Example3:
# 使用tqsdk自带的时间转换函数, 将最后一根K线的纳秒时间转换为 datetime.datetime 类型 from tqsdk import tafunc ... klines = api.get_kline_serial("DCE.jd2001", 10) kline_time = tafunc.time_to_datetime(klines.iloc[-1]["datetime"]) # datetime.datetime 类型值 print(type(kline_time), kline_time) print(kline_time.year, kline_time.month, kline_time.day, kline_time.hour, kline_time.minute, kline_time.second) ...
-
get_tick_serial
(symbol: str, data_length: int = 200, chart_id: Optional[str] = None) → pandas.core.frame.DataFrame¶ 获取tick序列数据
请求指定合约的Tick序列数据. 序列数据会随着时间推进自动更新
- Args:
symbol (str): 指定合约代码.
data_length (int): 需要获取的序列长度。每个序列最大支持请求 8964 个数据
chart_id (str): [可选]指定序列id, 默认由 api 自动生成
- Returns:
pandas.DataFrame: 本函数总是返回一个 pandas.DataFrame 实例. 行数=data_length, 包含以下列:
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 (持仓量)
Example:
# 获取 SHFE.cu1812 的Tick序列 from tqsdk import TqApi api = TqApi() serial = api.get_tick_serial("SHFE.cu1812") while True: api.wait_update() print(serial.iloc[-1].bid_price1, serial.iloc[-1].ask_price1) # 预计的输出是这样的: 50860.0 51580.0 50860.0 51580.0 50820.0 51580.0 ...
-
insert_order
(symbol: str, direction: str, offset: str, volume: int, limit_price: Optional[float] = None, order_id: Optional[str] = None) → tqsdk.objs.Order¶ 发送下单指令. 注意: 指令将在下次调用
wait_update()
时发出- Args:
symbol (str): 拟下单的合约symbol, 格式为 交易所代码.合约代码, 例如 "SHFE.cu1801"
direction (str): "BUY" 或 "SELL"
offset (str): "OPEN", "CLOSE" 或 "CLOSETODAY" (上期所和原油分平今/平昨, 平今用"CLOSETODAY", 平昨用"CLOSE"; 其他交易所直接用"CLOSE" 按照交易所的规则平仓)
volume (int): 需要下单的手数
limit_price (float): [可选]下单价格, 默认市价单 (上期所、原油和中金所不支持市价单, 需填写此参数值)
order_id (str): [可选]指定下单单号, 默认由 api 自动生成
- Returns:
Order
: 返回一个委托单对象引用. 其内容将在wait_update()
时更新.
Example:
# 市价开3手 DCE.m1809 多仓 from tqsdk import TqApi api = TqApi() order = api.insert_order(symbol="DCE.m1809", direction="BUY", offset="OPEN", volume=3) while True: api.wait_update() print("单状态: %s, 已成交: %d 手" % (order.status, order.volume_orign - order.volume_left)) # 预计的输出是这样的: 单状态: ALIVE, 已成交: 0 手 单状态: ALIVE, 已成交: 0 手 单状态: FINISHED, 已成交: 3 手 ...
-
cancel_order
(order_or_order_id: Union[str, tqsdk.objs.Order]) → None¶ 发送撤单指令. 注意: 指令将在下次调用
wait_update()
时发出- Args:
order_or_order_id (str/
Order
): 拟撤委托单或单号
Example:
# 挂价开3手 DCE.m1809 多仓, 如果价格变化则撤单重下,直到全部成交 from tqsdk import TqApi api = TqApi() quote = api.get_quote("DCE.m1809") order = {} while True: api.wait_update() # 当行情有变化且当前挂单价格不优时,则撤单 if order and api.is_changing(quote) and order.status == "ALIVE" and quote.bid_price1 > order.limit_price: print("价格改变,撤单重下") api.cancel_order(order) # 当委托单已撤或还没有下单时则下单 if (not order and api.is_changing(quote)) or (api.is_changing(order) and order.volume_left != 0 and order.status == "FINISHED"): print("下单: 价格 %f" % quote.bid_price1) order = api.insert_order(symbol="DCE.m1809", direction="BUY", offset="OPEN", volume=order.get("volume_left", 3), limit_price=quote.bid_price1) if api.is_changing(order): print("单状态: %s, 已成交: %d 手" % (order.status, order.volume_orign - order.volume_left)) # 预计的输出是这样的: 下单: 价格 3117.000000 单状态: ALIVE, 已成交: 0 手 价格改变,撤单重下 下单: 价格 3118.000000 单状态: ALIVE, 已成交: 0 手 单状态: FINISHED, 已成交: 3 手 ...
-
get_account
() → tqsdk.objs.Account¶ 获取用户账户资金信息
- Returns:
Account
: 返回一个账户对象引用. 其内容将在wait_update()
时更新.
Example:
# 获取当前浮动盈亏 from tqsdk import TqApi api = TqApi() account = api.get_account() print(account.float_profit) # 预计的输出是这样的: 2180.0 2080.0 2080.0 ...
-
get_position
(symbol: Optional[str] = None) → tqsdk.objs.Entity¶ 获取用户持仓信息
- Args:
symbol (str): [可选]合约代码, 不填则返回所有持仓
- Returns:
Position
: 当指定了 symbol 时, 返回一个持仓对象引用. 其内容将在wait_update()
时更新.不填 symbol 参数调用本函数, 将返回包含用户所有持仓的一个tqsdk.objs.Entity对象引用, 使用方法与dict一致, 其中每个元素的key为合约代码, value为
Position
。注意: 为保留一些可供用户查询的历史信息, 如 volume_long_yd(本交易日开盘前的多头持仓手数) 等字段, 因此服务器会返回当天已平仓合约( pos_long 和 pos_short 等字段为0)的持仓信息
Example:
# 获取 DCE.m1809 当前浮动盈亏 from tqsdk import TqApi api = TqApi() position = api.get_position("DCE.m1809") print(position.float_profit_long + position.float_profit_short) while api.wait_update(): print(position.float_profit_long + position.float_profit_short) # 预计的输出是这样的: 300.0 330.0 ...
-
get_order
(order_id: Optional[str] = None) → tqsdk.objs.Entity¶ 获取用户委托单信息
- Args:
order_id (str): [可选]单号, 不填单号则返回所有委托单
- Returns:
Order
: 当指定了order_id时, 返回一个委托单对象引用. 其内容将在wait_update()
时更新.不填order_id参数调用本函数, 将返回包含用户所有委托单的一个tqsdk.objs.Entity对象引用, 使用方法与dict一致, 其中每个元素的key为委托单号, value为
Order
注意: 在刚下单后, tqsdk 还没有收到回单信息时, 此对象中各项内容为空
Example:
# 获取当前总挂单手数 from tqsdk import TqApi api = TqApi() orders = api.get_order() while True: api.wait_update() print(sum(order.volume_left for oid, order in orders.items() if order.status == "ALIVE")) # 预计的输出是这样的: 3 3 0 ...
-
get_trade
(trade_id: Optional[str] = None) → tqsdk.objs.Entity¶ 获取用户成交信息
- Args:
trade_id (str): [可选]成交号, 不填成交号则返回所有委托单
- Returns:
Trade
: 当指定了trade_id时, 返回一个成交对象引用. 其内容将在wait_update()
时更新.不填trade_id参数调用本函数, 将返回包含用户当前交易日所有成交记录的一个tqsdk.objs.Entity对象引用, 使用方法与dict一致, 其中每个元素的key为成交号, value为
Trade
推荐优先使用
trade_records()
获取某个委托单的相应成交记录, 仅当确有需要时才使用本函数.
-
wait_update
(deadline: Optional[float] = None) → None¶ 等待业务数据更新
调用此函数将阻塞当前线程, 等待天勤主进程发送业务数据更新并返回
- 注: 它是TqApi中最重要的一个函数, 每次调用它时都会发生这些事:
实际发出网络数据包(如行情订阅指令或交易指令等).
尝试从服务器接收一个数据包, 并用收到的数据包更新内存中的业务数据截面.
让正在运行中的后台任务获得动作机会(如策略程序创建的后台调仓任务只会在wait_update()时发出交易指令).
如果没有收到数据包,则挂起等待.
- Args:
deadline (float): [可选]指定截止时间,自unix epoch(1970-01-01 00:00:00 GMT)以来的秒数(time.time())。默认没有超时(无限等待)
- Returns:
bool: 如果收到业务数据更新则返回 True, 如果到截止时间依然没有收到业务数据更新则返回 False
- 注意:
天勤终端里策略日志窗口输出的内容由每次调用wait_update()时发出.
由于存在网络延迟, 因此有数据更新不代表之前发出的所有请求都被处理了, 例如:
from tqsdk import TqApi api = TqApi() quote = api.get_quote("SHFE.cu1812") api.wait_update() print(quote.datetime)
可能输出 ""(空字符串), 表示还没有收到该合约的行情
-
is_changing
(obj: Any, key: Union[str, List[str], None] = None) → 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): [可选]需要判断的字段,默认不指定
不指定: 当该obj下的任意字段有更新时返回True, 否则返回 False.
str: 当该obj下的指定字段有更新时返回True, 否则返回 False.
list of str: 当该obj下的指定字段中的任何一个字段有更新时返回True, 否则返回 False.
- Returns:
bool: 如果本次业务数据更新包含了待判定的数据则返回 True, 否则返回 False.
Example:
# 追踪 SHFE.cu1812 的最新价更新 from tqsdk import TqApi api = TqApi() quote = api.get_quote("SHFE.cu1812") print(quote.last_price) while True: api.wait_update() if api.is_changing(quote, "last_price"): print(quote.last_price) # 以上代码运行后的输出是这样的: 51800.0 51810.0 51800.0 ...
-
is_serial_ready
(obj: pandas.core.frame.DataFrame) → bool¶ 判断是否已经从服务器收到了所有订阅的数据
- Args:
obj (pandas.Dataframe): K线数据
- Returns:
bool: 返回 True 表示已经从服务器收到了所有订阅的数据
Example:
# 判断是否已经从服务器收到了最后 3000 根 SHFE.cu1812 的分钟线数据 from tqsdk import TqApi api = TqApi() klines = api.get_kline_serial("SHFE.cu1812", 60, data_length=3000) while True: api.wait_update() print(api.is_serial_ready(klines)) # 预计的输出是这样的: False False True True ...
-
create_task
(coro: asyncio.coroutines.coroutine) → _asyncio.Task¶ 创建一个task
一个task就是一个协程,task的调度是在 wait_update 函数中完成的,如果代码从来没有调用 wait_update,则task也得不到执行
- Args:
coro (coroutine): 需要创建的协程
Example:
# 一个简单的task import asyncio from tqsdk import TqApi async def hello(): await asyncio.sleep(3) print("hello world") api = TqApi() api.create_task(hello()) while True: api.wait_update() #以上代码将在3秒后输出 hello world
-
register_update_notify
(obj: Optional[Any] = None, chan: Optional[TqChan] = None) → tqsdk.api.TqChan¶ 注册一个channel以便接受业务数据更新通知
调用此函数将返回一个channel, 当obj更新时会通知该channel
推荐使用 async with api.register_update_notify() as update_chan 来注册更新通知
如果直接调用 update_chan = api.register_update_notify() 则使用完成后需要调用 await update_chan.close() 避免资源泄漏
- Args:
obj (any/list of any): [可选]任意业务对象, 包括 get_quote 返回的 quote, get_kline_serial 返回的 k_serial, get_account 返回的 account 等。默认不指定,监控所有业务对象
chan (TqChan): [可选]指定需要注册的channel。默认不指定,由本函数创建
Example:
# 获取 SHFE.cu1812 合约的报价 from tqsdk import TqApi async def demo(): quote = api.get_quote("SHFE.cu1812") async with api.register_update_notify(quote) as update_chan: async for _ in update_chan: print(quote.last_price) api = TqApi() api.create_task(demo()) while True: api.wait_update() #以上代码将输出 nan 51850.0 51850.0 51690.0 ...
-
set_replay_speed
(speed: float = 10.0) → None¶ 调整复盘服务器行情推进速度
- Args:
speed (float): 复盘服务器行情推进速度, 默认为 10.0
-
draw_text
(base_k_dataframe: pandas.core.frame.DataFrame, text: str, x: Optional[int] = None, y: Optional[float] = None, id: Optional[str] = None, board: str = 'MAIN', color: Union[str, int] = 'red') → None¶ 配合天勤使用时, 在天勤的行情图上绘制一个字符串
- Args:
base_k_dataframe (pandas.DataFrame): 基础K线数据序列, 要绘制的K线将出现在这个K线图上. 需要画图的数据以附加列的形式存在
text (str): 要显示的字符串
x (int): X 坐标, 以K线的序列号表示. 可选, 缺省为对齐最后一根K线,
y (float): Y 坐标. 可选, 缺省为最后一根K线收盘价
id (str): 字符串ID, 可选. 以相同ID多次调用本函数, 后一次调用将覆盖前一次调用的效果
board (str): 选择图板, 可选, 缺省为 "MAIN" 表示绘制在主图
- color (str/int): 文本颜色, 可选, 缺省为 "red"
str : 符合 CSS Color 命名规则的字符串, 例如: "red", "#FF0000", "#FF0000FF", "rgb(255, 0, 0)", "rgba(255, 0, 0, .5)"
int : 十六进制整数表示颜色, ARGB, 例如: 0xffff0000
Example:
# 在主图最近K线的最低处标一个"最低"文字 klines = api.get_kline_serial("SHFE.cu1905", 86400) indic = np.where(klines.low == klines.low.min())[0] value = klines.low.min() api.draw_text(klines, "测试413423", x=indic, y=value, color=0xFF00FF00)
-
draw_line
(base_k_dataframe: pandas.core.frame.DataFrame, x1: int, y1: float, x2: int, y2: float, id: Optional[str] = None, board: str = 'MAIN', line_type: str = 'LINE', color: Union[str, int] = 'red', width: int = 1) → None¶ 配合天勤使用时, 在天勤的行情图上绘制一个直线/线段/射线
- Args:
base_k_dataframe (pandas.DataFrame): 基础K线数据序列, 要绘制的K线将出现在这个K线图上. 需要画图的数据以附加列的形式存在
x1 (int): 第一个点的 X 坐标, 以K线的序列号表示
y1 (float): 第一个点的 Y 坐标
x2 (int): 第二个点的 X 坐标, 以K线的序列号表示
y2 (float): 第二个点的 Y 坐标
id (str): 字符串ID, 可选. 以相同ID多次调用本函数, 后一次调用将覆盖前一次调用的效果
board (str): 选择图板, 可选, 缺省为 "MAIN" 表示绘制在主图
line_type ("LINE" | "SEG" | "RAY"): 画线类型, 可选, 默认为 LINE. LINE=直线, SEG=线段, RAY=射线
- color (str/int): 线颜色, 可选, 缺省为 "red"
str : 符合 CSS Color 命名规则的字符串, 例如: "red", "#FF0000", "#FF0000FF", "rgb(255, 0, 0)", "rgba(255, 0, 0, .5)"
int : 十六进制整数表示颜色, ARGB, 例如: 0xffff0000
width (int): 线宽度, 可选, 缺省为 1
-
draw_box
(base_k_dataframe: pandas.core.frame.DataFrame, x1: int, y1: float, x2: int, y2: float, id: Optional[str] = None, board: str = 'MAIN', bg_color: Union[str, int] = 'black', color: Union[str, int] = 'red', width: int = 1) → None¶ 配合天勤使用时, 在天勤的行情图上绘制一个矩形
- Args:
base_k_dataframe (pandas.DataFrame): 基础K线数据序列, 要绘制的K线将出现在这个K线图上. 需要画图的数据以附加列的形式存在
x1 (int): 矩形左上角的 X 坐标, 以K线的序列号表示
y1 (float): 矩形左上角的 Y 坐标
x2 (int): 矩形右下角的 X 坐标, 以K线的序列号表示
y2 (float): 矩形右下角的 Y 坐标
id (str): ID, 可选. 以相同ID多次调用本函数, 后一次调用将覆盖前一次调用的效果
board (str): 选择图板, 可选, 缺省为 "MAIN" 表示绘制在主图
- bg_color (str/int): 填充颜色, 可选, 缺省为 "black"
str : 符合 CSS Color 命名规则的字符串, 例如: "red", "#FF0000", "#FF0000FF", "rgb(255, 0, 0)", "rgba(255, 0, 0, .5)"
int : 十六进制整数表示颜色, ARGB, 例如: 0xffff0000
- color (str/int): 边框颜色, 可选, 缺省为 "red"
str : 符合 CSS Color 命名规则的字符串, 例如: "red", "#FF0000", "#FF0000FF", "rgb(255, 0, 0)", "rgba(255, 0, 0, .5)"
int : 十六进制整数表示颜色, ARGB, 例如: 0xffff0000
width (int): 边框宽度, 可选, 缺省为 1
Example:
# 给主图最后5根K线加一个方框 klines = api.get_kline_serial("SHFE.cu1905", 86400) api.draw_box(klines, x1=-5, y1=klines.iloc[-5].close, x2=-1, y2=klines.iloc[-1].close, width=1, color=0xFF0000FF, bg_color=0x8000FF00)
-
class
tqsdk.api.
TqAccount
(broker_id: str, account_id: str, password: str, front_broker: Optional[str] = None, front_url: Optional[str] = None)¶ 天勤实盘类
创建天勤实盘实例
- Args:
broker_id (str): 期货公司, 可以在天勤终端中查看期货公司名称
account_id (str): 帐号
password (str): 密码
front_broker(str): [可选]CTP交易前置的Broker ID, 用于连接次席服务器, eg: "2020"
front_url(str): [可选]CTP交易前置地址, 用于连接次席服务器, eg: "tcp://1.2.3.4:1234/"
-
class
tqsdk.api.
TqChan
(api: tqsdk.api.TqApi, last_only: bool = False)¶ 用于协程间通讯的channel
创建channel实例
- Args:
last_only (bool): 为True时只存储最后一个发送到channel的对象
-
async
close
() → None¶ 关闭channel
关闭后send将不起作用,recv在收完剩余数据后会立即返回None
-
async
send
(item: Any) → None¶ 异步发送数据到channel中
- Args:
item (any): 待发送的对象
-
send_nowait
(item: Any) → None¶ 尝试立即发送数据到channel中
- Args:
item (any): 待发送的对象
- Raises:
asyncio.QueueFull: 如果channel已满则会抛出 asyncio.QueueFull
-
async
recv
() → Any¶ 异步接收channel中的数据,如果channel中没有数据则一直等待
- Returns:
any: 收到的数据,如果channel已被关闭则会立即收到None
-
recv_nowait
() → Any¶ 尝试立即接收channel中的数据
- Returns:
any: 收到的数据,如果channel已被关闭则会立即收到None
- Raises:
asyncio.QueueFull: 如果channel中没有数据则会抛出 asyncio.QueueEmpty
-
recv_latest
(latest: Any) → Any¶ 尝试立即接收channel中的最后一个数据
- Args:
latest (any): 如果当前channel中没有数据或已关闭则返回该对象
- Returns:
any: channel中的最后一个数据