龙听期货论坛's Archiver

龙听 发表于 2024-3-6 16:07

东方财富(Python/C++量化) - context - 上下文对象

context是策略运行上下文环境对象,该对象将会在你的算法策略的任何方法之间做传递。用户可以通过context定义多种自己需要的属性,也可以查看context固有属性,context结构如下图:

[img]http://p.algo2.net/2024/0306/a3c41f13982f1.png[/img]

context.symbols - 订阅代码集合

通过subscribe行情订阅函数, 订阅代码会生成一个代码集合

函数原型:[code]context.symbols[/code]返回值:

[img]http://p.algo2.net/2024/0306/77c7e7913c06c.png[/img]

示例:[code]subscribe(symbols=['SHSE.600519', 'SHSE.600419'], frequency='60s')
context.symbols[/code]返回:[code]{'SHSE.600519', 'SHSE.600419'}[/code]context.now - 当前时间

实时模式返回当前本地时间, 回测模式返回当前回测时间

函数原型:[code]context.now[/code]返回值:

[img]http://p.algo2.net/2024/0306/985a69f8b38a5.png[/img]

示例:[code]context.now[/code]返回:[code]2020-09-01 09:40:00+08:00[/code]context.data - 数据滑窗

获取订阅的bar或tick滑窗,数据为包含当前时刻推送bar或tick的前count条bar或者tick数据

原型:[code]context.data(symbol,frequency,count,fields)[/code][img]http://p.algo2.net/2024/0306/7fb94967acb39.png[/img]

返回值:

[img]http://p.algo2.net/2024/0306/aede7fdff191e.png[/img]

订阅tick时

示例:[code]Subcribe_data = context.data(symbol='SHSE.600000', frequency='tick', count=2)[/code]输出:[code][{'symbol': 'SHSE.600000', 'open': 9.680000305175781, 'high': 9.720000267028809, 'low': 9.619999885559082, 'price': 9.630000114440918, 'quotes': [{'bid_p': 9.630000114440918, 'bid_v': 360197, 'ask_p': 9.640000343322754, 'ask_v': 124200}, {'bid_p': 9.619999885559082, 'bid_v': 1265300, 'ask_p': 9.649999618530273, 'ask_v': 172859}, {'bid_p': 9.609999656677246, 'bid_v': 1030400, 'ask_p': 9.65999984741211, 'ask_v': 233400}, {'bid_p': 9.600000381469727, 'bid_v': 1200000, 'ask_p': 9.670000076293945, 'ask_v': 150700}, {'bid_p': 9.59000015258789, 'bid_v': 208000, 'ask_p': 9.680000305175781, 'ask_v': 199543}], 'cum_volume': 29079145, 'cum_amount': 280888066.0, 'last_amount': 963.0, 'last_volume': 100, 'created_at': datetime.datetime(2020, 11, 20, 11, 30, 1, 400000, tzinfo=tzfile('PRC')), 'cum_position': 0, 'trade_type': 0}, {'quotes': [{'bid_p': 9.630000114440918, 'bid_v': 315497, 'ask_p': 9.640000343322754, 'ask_v': 125900}, {'bid_p': 9.619999885559082, 'bid_v': 1291300, 'ask_p': 9.649999618530273, 'ask_v': 177959}, {'bid_p': 9.609999656677246, 'bid_v': 1035000, 'ask_p': 9.65999984741211, 'ask_v': 233400}, {'bid_p': 9.600000381469727, 'bid_v': 1213300, 'ask_p': 9.670000076293945, 'ask_v': 150700}, {'bid_p': 9.59000015258789, 'bid_v': 212100, 'ask_p': 9.680000305175781, 'ask_v': 173943}, {'bid_p': 0, 'bid_v': 0, 'ask_p': 0, 'ask_v': 0}, {'bid_p': 0, 'bid_v': 0, 'ask_p': 0, 'ask_v': 0}, {'bid_p': 0, 'bid_v': 0, 'ask_p': 0, 'ask_v': 0}, {'bid_p': 0, 'bid_v': 0, 'ask_p': 0, 'ask_v': 0}, {'bid_p': 0, 'bid_v': 0, 'ask_p': 0, 'ask_v': 0}], 'symbol': 'SHSE.600000', 'created_at': datetime.datetime(2020, 11, 20, 13, 0, 2, 430000, tzinfo=tzfile('PRC')), 'price': 9.630000114440918, 'open': 9.680000305175781, 'high': 9.720000267028809, 'low': 9.619999885559082, 'cum_volume': 29171845, 'cum_amount': 281780897.0, 'cum_position': 0, 'last_amount': 892831.0, 'last_volume': 92700, 'trade_type': 0, 'receive_local_time': 1605863292.163}][/code]订阅bar时

示例:[code]Subcribe_data = context.data(symbol='SHSE.600000', frequency='60s', count=2, fields='symbol,open,close,volume,eob')[/code]输出:[code]  symbol         open         close        volume         eob
SHSE.600000    12.64000     12.65000      711900   2017-06-30 15:00:00
SHSE.600000    12.64000     12.62000      241000   2017-07-03 09:31:00[/code]注意:

1.所得数据按eob时间正序排列。
2.不支持传入多个symbol或frequency,若输入多个,则返回空dataframe。
3.若fields查询字段包含无效字段,返回KeyError错误。

Tips:context.data()与bar一起使用时的区别和联系

以订阅‘SHSE.600519’股票日频数据为例,在on_bar()中同时输出bar和context.data()。

当订阅的滑窗大小(count)为1时,bar返回的数据和context.data返回的数据是相同的
当订阅的滑窗大小(count)大于1时,bar返回的数据为最新的一条;而context.data()返回的数据是count条,其中最后一条和bar返回的数据相同
也就是说,无论订阅滑窗大小如何设置,bar每次只返回一条最新数据,而context.data()返回数据条数等于count,并且最后一条为最新数据。


context.account - 账户信息

可通过此函数获取账户资金信息及持仓信息。

原型:[code]context.account(account_id=None)[/code]参数:

[img]http://p.algo2.net/2024/0306/d112617ae86a7.png[/img]


返回值:

返回类型为account - 账户对象。

示例-获取当前持仓:[code]# 所有持仓
Account_positions = context.account().positions()
# 指定持仓
Account_position = context.account().position(symbol='SHSE.600519',side = PositionSide_Long)[/code]返回值:

[img]http://p.algo2.net/2024/0306/198e7640959c9.png[/img]

注意:

没有持仓的情况下, 用context.account().positions()查总持仓, 返回空列表, 用context.account().position()查单个持仓,返回None

输出[code]# 所有持仓输出
[{'account_id': 'd7443a53-f65b-11ea-bb9d-484d7eaefe55', 'symbol': 'SHSE.600419', 'side': 1, 'volume': 2200, 'volume_today': 100, 'vwap': 16.43391600830338, 'amount': 36154.61521826744, 'fpnl': -2362.6138754940007, 'cost': 36154.61521826744, 'available': 2200, 'available_today': 100, 'created_at': datetime.datetime(2020, 9, 1, 9, 40, tzinfo=tzfile('PRC')), 'updated_at': datetime.datetime(2020, 9, 30, 9, 40, tzinfo=tzfile('PRC')), 'account_name': '', 'vwap_diluted': 0.0, 'price': 0.0, 'order_frozen': 0, 'order_frozen_today': 0, 'available_now': 0, 'market_value': 0.0, 'last_price': 0.0, 'last_volume': 0, 'last_inout': 0, 'change_reason': 0, 'change_event_id': '', 'has_dividend': 0}, {'account_id': 'd7443a53-f65b-11ea-bb9d-484d7eaefe55', 'symbol': 'SHSE.600519', 'side': 1, 'volume': 1100, 'vwap': 1752.575242219682, 'amount': 1927832.7664416502, 'fpnl': -110302.84700805641, 'cost': 1927832.7664416502, 'available': 1100, 'created_at': datetime.datetime(2020, 9, 1, 9, 40, tzinfo=tzfile('PRC')), 'updated_at': datetime.datetime(2020, 9, 15, 9, 40, tzinfo=tzfile('PRC')), 'account_name': '', 'volume_today': 0, 'vwap_diluted': 0.0, 'price': 0.0, 'order_frozen': 0, 'order_frozen_today': 0, 'available_today': 0, 'available_now': 0, 'market_value': 0.0, 'last_price': 0.0, 'last_volume': 0, 'last_inout': 0, 'change_reason': 0, 'change_event_id': '', 'has_dividend': 0}]
# 指定持仓输出
{'account_id': 'd7443a53-f65b-11ea-bb9d-484d7eaefe55', 'symbol': 'SHSE.600519', 'side': 1, 'volume': 1100, 'vwap': 1752.575242219682, 'amount': 1927832.7664416502, 'fpnl': -110302.84700805641, 'cost': 1927832.7664416502, 'available': 1100, 'created_at': datetime.datetime(2020, 9, 1, 9, 40, tzinfo=tzfile('PRC')), 'updated_at': datetime.datetime(2020, 9, 15, 9, 40, tzinfo=tzfile('PRC')), 'account_name': '', 'volume_today': 0, 'vwap_diluted': 0.0, 'price': 0.0, 'order_frozen': 0, 'order_frozen_today': 0, 'available_today': 0, 'available_now': 0, 'market_value': 0.0, 'last_price': 0.0, 'last_volume': 0, 'last_inout': 0, 'change_reason': 0, 'change_event_id': '', 'has_dividend': 0}[/code]例-获取当前账户资金:[code]context.account().cash[/code]返回值:

[img]http://p.algo2.net/2024/0306/160e19f29fb8e.png[/img]

输出[code]{'account_id': 'd7443a53-f65b-11ea-bb9d-484d7eaefe55', 'nav': 1905248.2789094353, 'pnl': -94751.72109056474, 'fpnl': -94555.35135529494, 'frozen': 1963697.3526980684, 'available': 36106.277566661825, 'cum_inout': 2000000.0, 'cum_trade': 1963697.3526980684, 'cum_commission': 196.3697352698069, 'last_trade': 1536.1536610412597, 'last_commission': 0.153615366104126, 'created_at': datetime.datetime(2020, 9, 1, 8, 0, tzinfo=tzfile('PRC')), 'updated_at': datetime.datetime(2020, 9, 30, 9, 40, tzinfo=tzfile('PRC')), 'account_name': '', 'currency': 0, 'order_frozen': 0.0, 'balance': 0.0, 'market_value': 0.0, 'cum_pnl': 0.0, 'last_pnl': 0.0, 'last_inout': 0.0, 'change_reason': 0, 'change_event_id': ''}[/code]例-获取账户连接状态:[code]context.account().status[/code]输出[code]state: 3[/code]context.parameters - 动态参数

获取所有动态参数

函数原型:[code]context.parameters[/code]返回值:

[img]http://p.algo2.net/2024/0306/00526d44b6ccb.png[/img]

示例-添加动态参数和查询所有设置的动态参数[code]add_parameter(key='k_value', value=context.k_value, min=0, max=100, name='k值阀值', intro='k值阀值',group='1', readonly=False)
context.parameters[/code]输出[code]{'k_value': {'key': 'k_value', 'value': 80.0, 'max': 100.0, 'name': 'k值阀值', 'intro': 'k值阀值', 'group': '1', 'min': 0.0, 'readonly': False}}[/code]context.xxxxx - 自定义属性

通过自定义属性设置参数, 随context全局变量传入策略各个事件里[code]context.my_value = 100000000[/code]返回值:

[img]http://p.algo2.net/2024/0306/14680686af0c3.png[/img]

例-输出自定义属性[code]print(context.my_value)[/code]输出[code]100000000[/code]

页: [1]