交易引擎API介绍
由qxiao创建,最终由qxiao 被浏览 1237 用户
API接口
策略请求接口
context.order(symbol, volume, limit_price=0, order_type=OrderType.MARKET, offset=Offset.NONE)
- 适用市场:股票、期货
- 下单,必须指定标的、下单数量
- param:
- symbol: str 下单标的 000001.SZ/600000.SH/510050.SH/rb2110.SHF
- volume: int 下单数量 大于0为买,小于0为卖
- limit_price: float 下单价格,默认为0表示市价单
- order_type: OrderType 委托类型
- MARKET: 市价指令(默认)
- LIMIT: 限价指令
- offset: 开平方向,股票不需要指定
- Offset.NONE: 自动决定开平方向(上期所会区分平今,内部会自动处理)
- Offser.OPEN: 开仓
- Offset.CLOSE: 平仓
- Offset.CLOSETODAY: 平今
return:int 下单状态码 0:成功,否则失败
代码示例
# 买入平安银行100股 context.order('000001.SZ',100) # 卖出平安银行100股 context.order('000001.SZ',-100)
context.order_percent(symbol, percent, limit_price=0, order_type=OrderType.MARKET)
- 适用市场:股票
- 按比例下单,必须指定标的、资金仓位比例
- param:
- symbol: str 下单标的 000001.SZ/600000.SH
- percent: float 资金仓位比例(内部会使用 context.portfolio.portfolio_value * percent,再用当前close价格得到买卖数量)
- limit_price: float 下单价格
- order_type: 同上
return:int 下单状态码 0:成功否则失败
代码示例
# 买入相当于总资产10%比例的平安银行 context.order_percent('000001.SZ',0.1)
context.order_value(symbol, value, limit_price=0, order_type=OrderType.MARKET)
- 适用市场:股票
- 按价值下单,必须指定标的、资金
- param:
- symbol: str 下单标的 000001.SZ/600000.SH
- value: float 资金量
- limit_price: float 下单价格
- order_type: 同上
return:int 下单状态码 0:成功,否则失败
代码示例
# 买入10000元的平安银行 context.order_value('000001.SZ',10000)
context.order_target(symbol, target, limit_price=0, order_type=OrderType.MARKET)
- 适用市场:股票
- 下单,必须指定标的、目标数量, 多用于清空持仓
- param:
- symbol: str 下单标的 000001.SZA/600000.SHA
- target: int 目标数量
- limit_price: float 下单价格
- order_type: 同上
return:int 下单状态码 0:成功,否则失败
代码示例
# 调整平安银行为500股(可能买入或者卖出) context.order_target('000001.SZ',500)
context.order_target_percent(symbol, target_percent, limit_price=0, order_type=OrderType.MARKET)
- 适用市场:股票
- 按目标比例下单,必须指定标的、资金仓位比例
- param:
- symbol: str 下单标的 000001.SZ/600000.SH
- target_percent: float 目标资金仓位比例
- limit_price: float 下单价格
- order_type: 同上
return:int 下单状态码 0:成功否则失败
代码示例
# 清仓平安银行 context.order_target_percent('000001.SZ',0)
context.buy_open(symbol, volume, limit_price=0, order_type=OrderType.MARKET)
- 适用市场:期货
- 期货下单,买开
- param:
- symbol: str 下单标的 rb2105.SHF, AP2101.CZC, jd2013.DCE, IF2103.CFX
- volume: int 下单数量
- limit_price: float 下单价格
- order_type: 同上
return:int 下单状态码 0:成功,否则失败
代码示例
# 市价开多买入3手rb1901.SHF context.buy_open('rb1901.SHF', 3)
context.sell_close(symbol, volume, limit_price=0, order_type=OrderType.MARKET)
- 适用市场:期货
- 期货下单,卖平,和buy_open配对使用
- param:
- symbol: str 下单标的
- volume: int 下单数量
- limit_price: float 下单价格
- order_type: 同上
return:int 下单状态码 0:成功,否则失败
代码示例
# 市价平多卖出3手rb1901.SHF context.sell_close('rb1901.SHF', 3)
context.sell_open(symbol, volume, limit_price=0, order_type=OrderType.MARKET)
- 适用市场:期货
- 期货下单,卖开
- param:
- symbol: str 下单标的
- volume: int 下单数量
- limit_price: float 下单价格
- order_type: 同上
return:int 下单状态码 0:成功,否则失败
代码示例
# 市价开空买入3手rb1901.SHF context.sell_open('rb1901.SHF', 3)
context.buy_close(symbol, volume, limit_price=0, order_type=OrderType.MARKET)
- 适用市场:期货
- 期货下单,买平,和sell_open配对使用
- param:
- symbol: str 下单标的
- volume: int 下单数量
- limit_price: float 下单价格
- order_type: 同上
return:int 下单状态码 0:成功,否则失败
代码示例
# 市价平空买入3手rb1901.SHF context.buy_close('rb1901.SHF', 3)
context.cancel_order(order_param)
适用市场:股票、期货
取消订单
order_param: order_key or OrderData or OrderCancelReq
return: int 撤单状态码 0:成功,否则失败
代码示例
# 取消当前未完成订单 for order in context.get_open_orders(): context.cancel_order(order)
context.cancel_all()
适用市场:股票、期货
取消当前账户所有未成交订单
return:None
代码示例
# 取消所有未完成订单 context.cancel_all()
context.subscribe(symbol)
- 适用市场:股票、期货
- 订阅标的的行情。tick或者tick2回测,需要在盘前处理函数中每日订阅当天需要的行情。
- param:
- symbol: str 订阅标的,如 000001.SZ/510050.SH/RB2105.SHF
代码示例
# 盘前处理函数中订阅rb1901.SHF的tick行情 context.subscribe('rb1901.SHF')
\
数据获取相关接口
context.get_trading_account()
适用市场:股票、期货
获取资金账户信息,具体参考下面的介绍
return: TradingAccount(StockTradingAccount/FutureTradingAccount)
代码示例
# 获取账户对象 account = context.get_trading_account()
context.get_position(symbol, direction=Direction.NONE, create_if_none=True)
- 适用市场:股票、期货
- 获取指定标的的持仓
- param:
- symbol: str 代码,如600000.SH/000001.SZ/rb2010.SHF/IF2012.CFX/AP2103.CZC
- direction: Direction,持仓方向,如 Direction.LONG/SHORT,此参数只用于期货
- create_if_none: bool 仓位不存在时是否创建新的对象
return:StockPosition/FuturePosition
代码示例
# 获取平安银行持仓情况 pos = context.get_position('000001.SZ')
context.get_positions(symbol, direction=Direction.NONE, create_if_none=True)
- 适用市场:股票、期货
- 获取多个标的的持仓
- param:
- symbol: list[str] 代码列表,如['000001.SZ','000002.SZ']
- direction: Direction,持仓方向,如 Direction.LONG/SHORT,此参数只用于期货
- create_if_none: bool 仓位不存在时是否创建新的对象
return:StockPosition/FuturePosition
代码示例
# 获取多个标的持仓 instruments = ['000001.SZ','000002.SZ'] pos = context.get_positions(instruments) print(pos.get('000001.SZ')) print(pos.get('000002.SZ'))
context.get_account_positions()
适用市场:股票、期货
获取所有持仓
return:Dict[symbol, Position]
代码示例
# 获取账户所有持仓 pos_all = context.get_account_positions()
context.get_open_orders(symbol)
- 适用市场:股票、期货
- 获取当前挂单,即未完全成交订单
- param:
* symbol: str ,指定了标的时,只获取该标的所有挂单
return: List[OrderData]
代码示例
# 获取当前未成交的单子 open_orders = context.get_open_orders()
context.get_orders(symbol)
- 适用市场:股票、期货
- 获取当日所有委托订单
- param:
* symbol: str
return: List[OrderData]
代码示例
# 获取当日所有委托订单 orders = context.get_orders()
context.get_trades(symbol)
- 适用市场:股票、期货
- 获取当日所有成交
- param:
* symbol: str
return: List[TradeData]
代码示例
# 获取当日所有成交订单 trades = context.get_trades()
context.get_dominant(product_code)
- 适用市场:期货
- 获取主力合约,只针对期货
- param:
- product_code:str 期货品种代码 or 期货代码,比如 A,RB,SR
return: str IF2103.CFX, rb2105.SHF
代码示例
# 打印当前主力合约 print(context.get_dominant('RB'))
\
其它接口
context.rebalance_period.is_signal_date(date)
- 适用市场:股票、期货
- 根据调仓周期的配置判断当天是否应该下单
- param:
- date:datetime.date 当天日期
return:bool True-应该下单 False-不应该下单
代码示例
# 不到调仓日直接返回 if not context.rebalance_period.is_signal_date(data.current_dt.date()): return
context.get_trading_day()
适用市场:股票、期货
获取当前交易日
param:无
return:str: YYYYmmdd
代码示例
# 获取当前交易日 trading_day = context.get_trading_day()
context.get_error_msg(error_id)
- 适用市场:股票、期货
- 获取错误信息
- param:
- error_id: 错误代码
return:str 错误信息
代码示例
# 买入失败则打印相关信息 rv = context.order('000001.SZ',500) if rv!=0: print("下单失败:",context.get_error_msg(rv))
context.write_log(content, level="info", stdout=0)
- 适用市场:股票、期货
- 记录日志
- param:
content: str 需要记录的内容
level: str 日志级别 debug/info/warn/error
stdout: 是否打印到标准输出, 小于0不记录日志,等于0不打印日志到前端,等于1时还会打印日志到前端
代码示例
# 打印信息 context.write_log("测试信息", level="info", stdout=1)
context.calc_buy_volume(symbol, price, value)
- 适用市场:股票
- 计算指标标的可买入数量
- param:
symbol: str 证券代码
price: float 指定价格
value: float 指定金额 return: int 可买入数量
代码示例
# 计算以10.2的价格买入2000元的平安银行,能买多少股 num = context.calc_buy_volume('000001.SZ', 10.2, 2000)
context.subscribe_bar(symbols, period, my_handle_bar)
订阅自定义周期回调函数。每周期(period)每个标的调用自定义函数 my_handle_bar。如果是period为1m,则可以把处理逻辑写入handle_data中,无需自定义my_handle_bar函数
适用市场:股票、期货
symbols: list 标的列表 例如 [rb2105.SHF, HC2105.SHF]
period: str 时间周期。支持’1m’, ’ 5m’, ‘10m’, ‘15m’, ‘30m’, ‘60m’, ‘120m’, ‘240m’。
myhandle_bar: func 自定义函数 my_handle_bar(context,bar),context表示策略上下文对象,bar表示 BarData对象
代码示例
# 盘前处理函数 订阅rb1901.SHF的分钟行情 context.subscribe_bar(['rb1901.SHF'], '1m')
\
回测专有接口(模拟/实盘不生效)
context.set_commission(equities_commission=None, futures_commission=None)
- 适用市场:股票、期货
- 设置回测费率,一般股票和期货有不同的费率模式
- param:
- equities_commission: PerOrder or dict like {"buy_cost": 0.0002, "sell_cost": 0.0012}
- futures_commission: PerContract or dict like {"RB": (2, 2, 2)}
return:None
代码示例
# 设置股票手续费,买万三,卖出千1.3,最少5元。一般放到初始化函数里 context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
context.get_commission(symbol)
- 适用市场:期货
- 获取回测费率
- param:
- symbol: str 标的代码
return:CommissionRateData
代码示例
# 打印当前rb1901.SHF手续费设置情况 print(context.get_commission('rb1901.SHF'))
context.set_margin(symbol, margin)
- 适用市场:期货
- 设置回测保证金率,同时影响多头和空头
- param:
- symbol: str 期货品种代码,比如 RB,A,SR
- margin: float 保证金率,比如 0.05
return:None
代码示例
# 设置rb1901.SHF的保证金率为10% context.set_margin('rb1901.SHF', 0.1)
context.get_margin_rate(symbol).long_margin_ratio_by_money
- 适用市场:期货
- 获取多头保证金率
- param:
- symbol: str 期货品种代码,比如 rb2201.SHF
return:float
代码示例
# 打印rb1901.SHF的多头保证金率 print(context.get_margin_rate('rb1901.SHF').long_margin_ratio_by_money)
context.get_margin_rate(symbol).short_margin_ratio_by_money
- 适用市场:期货
- 获取空头保证金率,期货专用(一般多空保证金率一样,取其中一个即可)
- param:
- symbol: str 期货品种代码,比如 rb2201.SHF
return:float
代码示例
# 打印rb1901.SHF的空头保证金率 print(context.get_margin_rate('rb1901.SHF').short_margin_ratio_by_money)
context.get_contract(symbol).multiplier
- 适用市场:期货
- 获取合约乘数
- param:
- symbol: str 期货合约代码,比如 rb2201.SHF
return:float
代码示例
# 打印rb1901.SHF的合约乘数 print(context.get_contract('rb1901.SHF').multiplier)
context.get_contract(symbol).price_tick
- 适用市场:期货
- 获取合约最小变动价格
- param:
- symbol: str 期货合约代码,比如 RB2201.SHF
return:float
代码示例
# 打印rb1901.SHF的最小变动单位 print(context.get_contract('rb1901.SHF').price_tick)
context.set_slippage_value(slippage_type, slippage_value,volume_limit)
- 适用市场:股票、期货
- 设置滑点和成交量比率限制
- param:
slippage_type:
SlippageType.FIXED 固定价位
SlippageType.PERCENT 固定比率
slippage_value: float 滑点值
volume_limit: float 限制最大成交量的比率,1表示不限制
return:None
代码示例
# 设置滑点,买卖各1分钱。同时成交量比率不做限制。 from bigtrader.constant import SlippageType context.set_slippage_value(SlippageType.FIXED, 0.01,1)
context.set_stock_t1(value)
- 适用市场:股票
- 设置股票是否是T1,默认是1
- param:
- value: int 如果设置成 0表示支持T0
return:None
代码示例
# 在初始化函数中设置为t0 context.set_stock_t1(0)
context.set_enable_auto_planed_order(value)
- 适用市场:股票、期货
- 设置是否支持收盘时下单,此函数主要用于分钟级跨日的波段交易策略,日频回测不涉及。
- param:
- value: bool 如果设置成 True表示在收盘时(例如15:00)的下单在下一个开盘时成交,如果为 False,表示收盘的下单作废。
return:None
代码示例
# 设置支持下个开盘时成交 context.set_enable_auto_planed_order(True)
\
回调函数
如下函数系统自动调用,无需手动调用。在使用BigTrader回测模块时,在相应函数中加入处理逻辑即可。
initialize(context):
策略初始化函数,只触发一次。可以在该函数中初始化一些变量,如读取配置等
- context: 策略上下文对象
before_trading(context, data):
策略盘前交易函数,每日盘前触发一次。可以在该函数中一些启动前的准备,如订阅行情等
- context: 策略上下文对象
- data: BarDatas 对象(参考上述 “常用对象说明 1.8 行情访问“)
handle_tick(context, tick):
Tick快照行情通知函数,每个标的的Tick快照行情有变化时则会触发。
- context: 策略上下文对象
- tick: TickData对象
handle_bar(context, bar):
单个Bar行情通知函数,每个标的每个bar时间周期会触发,包括日线和分钟。
- context: 策略上下文对象
- bar: BarData对象
handle_data(context, data):
批量Bar行情通知函数(截面的),每个时间周期会触发,包括日线和分钟。
- context: 策略上下文对象
- data: BarDatas对象
handle_l2trade(context, l2trade_data):
逐笔成交行情通知函数,每笔逐笔成交都会触发,包括上海和深圳。
- context: 策略上下文对象
- l2trade_data: L2TradeData对象
handle_l2order(context, l2order_data):
逐笔委托行情通知函数,每笔逐笔委托都会触发,只深圳有。
- context: 策略上下文对象
- l2order_data: L2OrderData对象
handle_order(context, order):
委托回报通知函数,每个订单状态有变化时会触发。
- context: 策略上下文对象
- order: OrderData对象
handle_trade(context, trade):
成交回报通知函数,有成交时会触发。
- context: 策略上下文对象
- trade: TradeData对象
常见对象
交易账户相关
TradingAccount(StockTradingAccount/FutureTradingAccount)交易账户资金相关,可访问如下属性:
trading_day: 交易日 YYYYmmdd
portfolio_value: 总资产,主要是资金+持仓市值
positions_value: 总持仓市值
available: 可用资金,主要是账户资金-冻结资金
pre_balance: 昨日账户结算净值
balance: 账户资金
frozen_cash: 冻结资金
realized_pnl: 平仓盈亏
total_used_cash: margin + commission + frozen_cash
commission: 今日手续费
margin: 保证金占用
total_margin: 冻结保证金+保证金占用
total_frozen_margin: 冻结保证金
代码示例
# 获取账户信息并打印总资产和可用资金 account = context.get_trading_account() portfolio_value = account.portfolio_value balance = account.balance print("总资产:",account.portfolio_value) print("可用资金:",account.available)
持仓数据相关
Position(StockPosition/FuturePosition)合约持仓数据, 可访问以下属性:
trading_day: 交易日 YYYYmmdd
direction: 持仓方向 Direction.LONG/SHORT
last_price: 最新价
cost_price: 持仓均价
current_qty/amount: 当前数量
avail_qty: 可用数量
today_qty: 今持仓
yd_qty: 昨持仓
frozen_qty: 冻结数量
margin: 保证金占用
market_value: 持仓市值
realized_pnl: 平仓盈亏
long: 多头持仓,期货专用
short: 空头持仓,期货专用
last_sale_date: 上一次交易的日期
代码示例
# 获取平安银行的持仓数据,并打印出持仓数量和当日收盘价 pos = context.get_position('000001.SZ') print("持仓数量:",pos.current_qty) print("当日收盘价:",pos.last_price)
投资组合对象相关
Portfolio投资组合对象,主要为兼容zipline老框架。
positions_value: 持仓市值
portfolio_value: 总资产
cash: 可用资金(即TradingAccount中的available)
actual_cash: 实时资金(即TradingAccount中的balance)
positions: Dict 获取持仓字典,可通过标的获取各持仓对象
代码示例
# 打印账户总资产和可用资金 print("账户总资产:",context.portfolio.portfolio_value) print("账户可用资金:",context.portfolio.cash)
委托数据相关
OrderData委托数据, 可访问以下属性:
trading_day: 交易日 YYYYmmdd
instrument: 合约代码,如 000001/rb2105
exchange: 交易所代码,如 SSE/SZSE/SHFE/CFFEX/SHFE/INE/CZCE/DCE
symbol: 内部合约标识,如 000001.SZ, rb2105.SHF
order_id: 本地委托编号(主要为本地生成)
order_sysid: 柜台/交易所报单编号(服务端生成)
bt_order_sysid: 本地唯一标识的柜台/交易所报单编号
direction: 买卖方向 Direction.LONG/SHORT
offset: 开平标志 Offset.OPEN/CLOSE/CLOSETODAY
order_qty: 委托数量
order_price: 委托限价
filled_qty: 成交数量
order_type: 委托类型 OrderType.LIMIT/MARKET
order_status: 委托状态 OrderStatus.NOTTRADED/ALLTRADED/CANCELLED
order_key: 本地订单唯一标识
order_time: 委托时间
insert_date: 委托日期
status_msg: 委托状态描述
代码示例
# 委托回报处理函数中,打印委托单号,委托数量,成交数量 def bigquant_run(context, order): print(order.order_id) print(order.order_qty) print(order.filled_qty)
成交数据相关
TradeData成交数据, 可访问以下属性:
trading_day: 交易日 YYYYmmdd
instrument: 合约代码,如 000001/rb2105
exchange: 交易所代码,如 SSE/SZSE/SHFE/CFFEX/SHFE/INE/CZCE/DCE
symbol: 内部合约标识,如 000001.SZA, rb2105.SHF
order_id: 本地委托编号(主要为本地生成)
order_sysid: 柜台/交易所报单编号(服务端生成)
bt_order_sysid: 本地唯一标识的柜台/交易所报单编号
trade_id: 成交编号
bt_trade_id: 本地唯一标识的成交编号
direction: 买卖方向 Direction.LONG/SHORT
offset: 开平标志 Offset.OPEN/CLOSE/CLOSETODAY
filled_price: 成交价格
filled_qty: 成交数量
filled_money: 成交金额
trade_time: 成交时间
trade_date: 成交日期
order_key: 本地订单唯一标识
代码示例
# 成交回报处理函数中,打印成交单号,成交价格,成交数量 def bigquant_run(context, trade): print(trade.trade_id) print(trade.filled_price) print(trade.filled_qty)
行情快照数据
TickData行情快照数据, 可访问以下属性:
- trading_day: 交易日 YYYYmmdd
- instrument: 合约代码,如 000001/rb2105
- exchange: 交易所代码,如 SSE/SZSE/SHFE/CFFEX/SHFE/INE/CZCE/DCE
- symbol: 内部合约标识,如 000001.SZ, rb2105.SHF
- last_price: 最新成交价
- volume: 当日累计成交量
- amount: 当日累计成交金额
- open_price: 当日开盘价
- high_price: 当日最高价
- low_price: 当日最低价
- open_interest: 最新持仓量
- bid_priceX: 买盘价格
- bid_volumeX: 买盘数量
- ask_priceX: 卖盘价格
- ask_volumeX: 卖盘数量
- pre_close: 昨收盘(股票里为调整后的价格)
- upper_limit: 涨停价
- lower_limit: 跌停价
- datetime: datetime 当前日期时间
- time: 当前更新时间 HH:MM:SS.fff
- time_int: 当前整数时间 93520500,毫秒精度
行情数据
BarData行情数据, 用在handle_bar回调函数中,可访问以下属性:
- datetime: datetime 当前日期时间
- symbol: 内部合约标识,如 000001.SZ, rb2105.SHF
- amount: 当根bar成交金额
- close: 当根bar收盘价
- high: 当根bar最高价
- low: 当根bar最低价
- open: 当根bar开盘价
- open_interest: 最新持仓量
- trading_day: 交易日期
行情访问
BarDatas K线行情集合对象,用在handle_data回调函数中。注意不是单个bar的 OHLCV 数据,可访问以下属性/方法:
current_dt: datetime 当前日期时间
trading_day_dt: datetime 交易日
current_dominant(code): 获取主力合约代码
get_daily_value(symbol, field): 获取最新日线数据
current(symbol, field): 获取此刻标的指定字段值。对股票而言字段为cn_stock_bar1d表中的字段
history(symbol, fields, count, frequency): 获取此刻以前的历史数据
- symbol: 标的代码
- fields: 单个或多个字段,如 ‘close’ 或 [‘volume’, ‘open_interest‘]。对股票而言字段为cn_stock_bar1d表中的字段
- count: 要获取的bar的数量
- frequency: 频率,如 ‘1d’, ‘1m’
代码示例
# 当前时间 print(data.current_dt) # 平安银行当天收盘价 print(data.current('000001.SZ','close')) # 平安银行当天开盘价、收盘价和成交量 print(data.current('000001.SZ',['open','close','volume'])) # 平安银行过去5天的开盘价和收盘价 print(data.history('000001.SZ', ['open','close'], 5, '1d'))
context 策略对象属性
instruments:List 运行前时指定的代码列表
account_id: str 账户号
portfolio: Portfolio 账户资产组合对象,包含有当前资金和持仓
options: Dict 从回测模块的 ’其他输入数据’ 端口传入的数据
代码示例
print("账户总资产:",context.portfolio.portfolio_value) print("回测标的:",context.instruments)
\
常量定义说明(通过 bigtrader.constant 可 import)
Direction:买卖方向/持仓方向
- LONG: ‘1’ 买(多)
- SHORT: ‘1’ 卖(空)
Offset:开平标志
- OPEN: ‘0’ 开仓
- CLOSE: ‘1’ 平仓
- CLOSETODAY: ‘2’ 平今
OrderType:委托类型
- LIMIT: 限价
- MARKET: 市价
OrderStatus:委托状态
- NOTTRADED: 0 未成交
- PARTTRADED: 1 部分成交
- ALLTRADED: 2 全部成交
- PARTCANCELLED: 3 部分撤单
- CANCELLED: 4 全部撤单
- REJECTED: 5 拒单
- UNKNOWN: 6未知
Frequency:频率
- DAILY: 日级别
- MINUTE: 分钟级别
- TICK: Tick级别
- TICK2: Tick2级别
AdjustType:复权类型
- NONE: 不复权
- PRE: 前复权
- POST: 后复权
Product:产品类别
- NONE: 未知
- EQUITY: 股票
- FUND: 基金
- FUTURE: 期货
- OPTION: 期权
- INDEX: 指数
使用例子:
# 以市价买入平安银行300股
from bigtrader.constant import OrderType
context.order('000001.SZ',300,order_type=OrderType.MARKET)
\