基本功能示例
大约 7 分钟
老虎Open API SDK提供了丰富的接口来调用老虎的服务,本章节将对老虎API的核心功能进行一一演示:包括查询行情,订阅行情,以及调用API进行交易 ror
查询行情
以下为一个最简单的调用老虎API的示例,演示了如何调用Open API来主动查询股票行情。接下来的例子分别演示了如何调用Open API来进行交易与订阅行情。
除上述基础功能外,Open API还支持查询、交易多个市场的不同标的,以及其他复杂请求。对于其他Open API支持的接口和请求,请在快速入门后阅读文档正文获取列表及使用方法,并参考快速入门以及文档中的例子进行调用
为方便直接复制运行,以下的说明采用注释的形式
from tigeropen.common.consts import (Language, # 语言
Market, # 市场
BarPeriod, # k线周期
QuoteRight) # 复权类型
from tigeropen.tiger_open_config import TigerOpenClientConfig
from tigeropen.common.util.signature_utils import read_private_key
from tigeropen.quote.quote_client import QuoteClient
# 查询行情的操作通过QuoteClient对象的成员方法实现,所以调用相关行情接口之前需要先初始化QuoteClient,具体代码如下:
# 首先通过自定义的函数生成配置文件, 函数get_client_config会返回一个包含初始化行情对象所需要的用户信息的ClientConfig对象
# 用来传入行情对象QuoteClient构造函数中,以进行QuoteClient的初始化。
# 也可选择使用tigeropen.tiger_open_config.get_client_config()函数生成用户配置对象
def get_client_config():
"""
https://quant.itigerup.com/#developer 开发者信息获取
"""
client_config = TigerOpenClientConfig()
# 如果是windowns系统,路径字符串前需加 r 防止转义, 如 read_private_key(r'C:\Users\admin\tiger.pem')
client_config.private_key = read_private_key('填写私钥PEM文件的路径')
client_config.tiger_id = '替换为tigerid'
client_config.account = '替换为账户,建议使用模拟账户'
client_config.language = Language.zh_CN #可选,不填默认为英语'
# client_config.timezone = 'US/Eastern' # 可选时区设置
return client_config
# 调用上方定义的函数生成用户配置ClientConfig对象
client_config = get_client_config()
# 随后传入配置参数对象来初始化QuoteClient
quote_client = QuoteClient(client_config)
# 完成初始化后,就可以调用quote_client方法来使用调用QuoteClient对象的get_stock_brief方法来查询股票行情了
# 此处以美国股票为例,关于其他支持的市场及标的类型,请参考文档的基本操作部分。
# 对于使用多台设备调用API的用户,需先调用grab_quote_permission进行行情权限的抢占,详情请见基本操作-行情类-通用-grab_quote_permission方法说明
permissions = quote_client.grab_quote_permission()
#输出list类型的行情权限权限列表
print(permissions)
# 调用API查询股票行情
stock_price = quote_client.get_stock_briefs(['00700'])
# 查询行情函数会返回一个包含当前行情快照的pandas.DataFrame对象,见返回示例。具体字段含义参见get_stock_briefs方法说明
print(stock_price)
返回示例
symbol ask_price ask_size bid_price bid_size pre_close latest_price \
0 00700 326.4 15300 326.2 26100 321.80 326.4
latest_time volume open high low status
0 1547516984730 2593802 325.00 326.80 323.20 NORMAL
订阅行情
除了选择主动查询的方式(见快速入门-查询行情部分),Open API还支持订阅-接受推送的方式来接收行情等信息,具体请见下例。此示例实现了订阅苹果与AMD股票行情,将行情快照输出在console,持续30秒后取消订阅,并且断开与服务器的连接的过程。
需要注意的是,订阅推送相关的请求均为异步处理,故需要用户自定义回调函数,与中间函数进行绑定。某个事件发生,或有最新信息更新被服务器推送时,程序会自动调用用户自定义的回调函数并传入返回接口返回的数据,由用户自定义的回调函数来处理数据。
import time
from tigeropen.push.push_client import PushClient
from tigeropen.tiger_open_config import TigerOpenClientConfig
from tigeropen.push.pb.QuoteBasicData_pb2 import QuoteBasicData
def get_client_config():
"""
https://quant.itigerup.com/#developer 开发者信息获取
"""
client_config = TigerOpenClientConfig()
client_config.private_key = read_private_key('填写私钥PEM文件的路径')
client_config.tiger_id = '替换为tigerid'
client_config.account = '替换为账户,建议使用模拟账户'
return client_config
#首先定义回调函数,本例中为简单起见,仅使用print输出传入的数据
def on_quote_changed(frame: QuoteBasicData):
"""
行情基本数据回调
example:
symbol: "00700"
type: BASIC
timestamp: 1677742483530
serverTimestamp: 1677742483586
avgPrice: 365.37
latestPrice: 363.8
latestPriceTimestamp: 1677742483369
latestTime: "03-02 15:34:43"
preClose: 368.8
volume: 12674730
amount: 4630947968
open: 368.2
high: 369
low: 362.4
marketStatus: "交易中"
mi {
p: 363.8
a: 365.37
t: 1677742440000
v: 27300
h: 364
l: 363.6
}
"""
print(frame)
print(frame.latestPrice)
#定义订阅成功与否的回调函数
def subscribe_callback(frame):
"""
订阅成功与否的回调
"""
print(f'subscribe callback:{frame}')
#定义取消订阅成功事件的回调函数
def unsubscribe_callback(frame):
"""
取消订阅成功与否的回调
"""
print(f'unsubscribe callback:{frame}')
#定义连接建立事件的回调函数
def connect_callback(frame):
"""连接建立回调"""
print('connected')
def disconnect_callback():
"""连接断开回调. 此处利用回调进行重连"""
for t in range(1, 20):
try:
print('disconnected, reconnecting')
push_client.connect(client_config.tiger_id, client_config.private_key)
except:
print('connect failed, retry')
time.sleep(t)
else:
print('reconnect success')
return
print('reconnect failed, please check your network')
if __name__ == "__main__":
#首先通过工具函数生成配置文件
client_config = get_client_config()
#初始化PushClient
protocol, host, port = client_config.socket_host_port
push_client = PushClient(host, port, use_ssl=(protocol == 'ssl'), use_protobuf=True)
#绑定回调函数,推送类方法均为异步响应,需要绑定回调函数处理数据,下面绑定行情变动回调函数
push_client.quote_changed = on_quote_changed
# 绑定订阅成功与否的回调
push_client.subscribe_callback = subscribe_callback
# 退订成功与否的回调
push_client.unsubscribe_callback = unsubscribe_callback
# 断线重连回调
push_client.disconnect_callback = disconnect_callback
# 建立连接
push_client.connect(client_config.tiger_id, client_config.private_key)
# 订阅行情推送,此处以苹果与AMD为例
push_client.subscribe_quote(['AAPL', 'AMD'])
# 等待推送
time.sleep(30)
#取消订阅
push_client.unsubscribe_quote()
#断开链接
push_client.disconnect()
交易下单
交易是Open API的另一个主要功能。此例展示了如何使用Open API对美股老虎证券TIGR下市价单:
from tigeropen.common.consts import (Language, # 语言
Market, # 市场
BarPeriod, # k线周期
QuoteRight) # 复权类型
from tigeropen.tiger_open_config import TigerOpenClientConfig
from tigeropen.common.util.signature_utils import read_private_key
from tigeropen.trade.trade_client import TradeClient
# 查询账户与交易相关的操作通过TradeClient对象的成员的方法实现,所以调用相关行情接口之前需要先初始化TradeClient,具体代码如下:
# 首先通过自定义的函数生成配置文件, 函数get_client_config会返回一个包含初始化行情对象所需要的用户信息的ClientConfig对象,
# 用来传入行情对象TradeClient构造函数中,以进行TradeClient的初始化。
# 也可选择使用tigeropen.tiger_open_config.get_client_config()函数生成用户配置对象
def get_client_config():
"""
https://quant.itigerup.com/#developer 开发者信息获取
"""
client_config = TigerOpenClientConfig()
client_config.private_key = read_private_key('填写私钥PEM文件的路径')
client_config.tiger_id = '替换为tigerid'
client_config.account = '替换为账户,建议使用模拟账户'
client_config.language = Language.zh_CN #可选,不填默认为英语
return client_config
# 调用上方定义的函数生成用户配置ClientConfig对象
client_config = get_client_config()
# 随后传入配置参数对象来初始化TradeClient
trade_client = TradeClient(client_config)
from tigeropen.common.consts import Market, SecurityType, Currency
from tigeropen.common.util.contract_utils import stock_contract
#下单需要先初始化一个contract对象,contract对象中保存着合约信息,详情请见合约对象。创建contract对象的方法请参考文档 基本操作-交易类-获取合约 部分,示例如下:
#方法1: 直接本地构造contract对象。 期货 contract 的构造方法请参考文档 基本操作-交易类-获取合约 部分
contract = stock_contract(symbol='TIGR', currency='USD')
#方法2: 联网方式获取Contract对象,此方法仅针对股票
stock_contract = trade_client.get_contracts(symbol='SPY')[0]
#以下为目前支持的几种订单类型对象
from tigeropen.common.util.order_utils import (market_order, # 市价单
limit_order, # 限价单
stop_order, # 止损单
stop_limit_order, # 限价止损单
trail_order, # 移动止损单
order_leg) # 附加订单
#创建订单对象,订单对象中保存了下单所需的账户、目标合约等信息,详情请见订单对象。这里以限价单为例
stock_order = market_order(account=client_config.account, # 下单账户,可以使用标准、环球、或模拟账户
contract = stock_contract, # 第1步中获取的合约对象
action = 'BUY',
quantity = 100)
#提交订单。注意:提交订单前,order对象的id为None, 提交成功后, order对象的id会变为全局订单id
trade_client.place_order(stock_order)
print(stock_order)
返回示例
Order({'account': '164644', 'id': 14275856193552384, 'order_id': None, 'parent_id': None, 'order_time': None, 'reason': None, 'trade_time': None, 'action': 'BUY', 'quantity': 100, 'filled': 0, 'avg_fill_price': 0, 'commission': None, 'realized_pnl': None, 'trail_stop_price': None, 'limit_price': 100, 'aux_price': None, 'trailing_percent': None, 'percent_offset': None, 'order_type': 'LMT', 'time_in_force': None, 'outside_rth': None, 'contract': SPY/STK/USD, 'status': 'NEW', 'remaining': 100})
补充说明
对于支持的其他类型的订单,请参考文档 对象-Order对象 中的说明