# ptrade_api **Repository Path**: vw12_admin/ptrade_api ## Basic Information - **Project Name**: ptrade_api - **Description**: ptrade交易的api文档 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-03-29 - **Last Updated**: 2025-03-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ptrade_api #### 介绍 ptrade交易的api文档 #### 软件架构 Ptrade量化交易API接口文档是一款由恒生电子开发的量化交易平台,专为高净值和机构投资者提供的专业投资软件。 Ptrade量化交易系统是恒生电子下属子公司云纪网络推出的一款专业投资软件,旨在为高净值和机构投资者提供包括普通交易、篮子交易、日内回转交易、算法交易、量化投研/回测/实盘在内的多种交易工具,以帮助用户大幅提升交易效率。具体介绍如下: 功能模块与特点 实时行情:Ptrade提供实时行情显示功能,让用户能够即时了解市场动态并做出相应的交易决策。 手动交易:除了量化交易,Ptrade还支持手动交易功能,为用户提供了灵活的交易方式。 智能工具:Ptrade内置了类似券商APP中的智能条件单功能,例如网购交易、埋单交易、拐点交易等,工具参数丰富,可满足多样化的交易需求。 策略编写与回测:在量化模块中,用户可以运用Python编写策略并进行回测,支持将回测成功的策略投入实盘运行。 性能优势:Ptrade系统同时对接券商的普通柜台系统和极速交易系统,性能卓越,能有效地提高交易速度和效率。 量化功能与交易类型支持 交易类型丰富:Ptrade的量化功能不仅支持普通交易,还包括融资融券交易、期货和期权交易,几乎满足了量化投资者所有的交易需求。 策略运行机制:量化策略可以上传至券商专用服务器运行,下单速度快,无需开启客户端也可执行诸如自动新股申购或国债逆回购等操作。 技术与语言支持 编程语言:Ptrade支持使用Python进行策略的编写与回测,这使得它对程序员尤为友好,同时也符合现代量化交易的主流需求。 API接口:Ptrade为开发者提供了详尽的API接口文档,方便用户调用各类交易和数据接口,实现自动化交易和数据分析。 运行环境与硬件配置 操作系统:Ptrade兼容Windows 7及以上的操作系统,这确保了其广泛的适用性。 硬件要求:推荐配置为双核CPU、2G主频、4G内存和500G硬盘,这显示出Ptrade对硬件的要求并不苛刻,便于大多数投资者使用。 用户体验与支持 界面友好:Ptrade注重用户体验,其界面设计直观易用,新手也能快速上手操作。 专业支持:部分券商提供专业技术人员和团队支持,并建立了量化软件沟通群,以便及时响应和解答用户在使用过程中遇到的问题 #### 安装教程 qmt模拟盘 您好! 国金证券QMT测试账号信息: 登录账号:55002767 登录密码:259800 QMT交易测试客户端下载链接 链接:https://download.gjzq.com.cn/temp/organ/gjzqqmt_ceshi.rar  国金证券ptrade测试账号信息: 登录账号:55001193 登录密码:259800 ptrade交易测试客户端下载链接 链接:https://download.gjzq.com.cn/temp/organ/gjzqptrade_ceshi.rar  测试时间10:00--17:00 如有什么问题,请和我们联系。微信15117320079 #### 使用说明 ### 一使用说明 ### 1新建策略 1. 新建策略 开始回测和交易前需要先新建策略,点击下图中左上角标识进行策略添加。可以选择不同的业务类型(比如股票),然后给策略设定一个名称,添加成功后可以在默认策略模板基础上进行策略编写。 ![输入图片说明](image.png) ### 2新建回测 策略添加完成后就可以开始进行回测操作了。回测之前需要对开始时间、结束时间、回测资金、回测基准、回测频率几个要素进行设定,设定完毕后点击保存。然后再点击回测按键,系统就会开始运行回测,回测的评价指标、收益曲线、日志都会在界面中展现。 ![输入图片说明](image2.png) ### 3新建交易 交易界面点击新增按键进行新增交易操作,策略方案中的对象为所有策略列表中的策略,给本次交易设定名称并点击确定后系统就开始运行交易了 ![输入图片说明](image3.png) 交易开始运行后,可以实时看到总资产和可用资金情况,同时可以在交易列表查询交易状态。 ![输入图片说明](image4.png) 交易开始运行后,可以点击交易详情,查看策略评价指标、交易明细、持仓明细、交易日志 ![输入图片说明](image5.png) ### 4策略运行周期 - 回测支持日线级别、分钟级别运行,详见handle_data方法。 交易支持日线级别、分钟级别、tick级别运行,日线级别和分钟级别详见handle_data方法,tick级别运行详见run_interval和tick_data方法。 频率:日线级别 当选择日线频率时,回测和交易都是每天运行一次,运行时间为每天盘后。 频率:分钟级别 当选择分钟频率时,回测和交易都是每分钟运行一次,运行时间为每根分钟K线结束。 频率:tick级别 当选择tick频率时,交易最小频率可以达到3秒运行一次。 ### 5策略运行时间 - 盘前运行: 9:30分钟之前为盘前运行时间,交易环境支持运行在run_daily中指定交易时间(如time='09:15')运行的函数;回测环境和交易环境支持运行before_trading_start函数 盘中运行: 9:31(回测)/9:30(交易)~15:00分钟为盘中运行时间,分钟级别回测环境和交易环境支持运行在run_daily中指定交易时间(如time='14:30')运行的函数;回测环境和交易环境支持运行handle_data函数;交易环境支持运行run_interval函数 盘后运行: 15:30分钟为盘后运行时间,回测环境和交易环境支持运行after_trading_end函数(该函数为定时运行);15:00之后交易环境支持运行在run_daily中指定交易时间(如time='15:10')运行的函数, ### 6交易策略委托下单时间 使用order系列接口进行股票委托下单,将直接报单到柜台。 ### 7回测支持业务类型 - 目前所支持的业务类型: 1.普通股票买卖(单位:股)。 2.可转债买卖(单位:张,T+0)。 3.融资融券担保品买卖(单位:股)。 4.期货投机类型交易(单位:手,T+0)。 5.LOF基金买卖(单位:股)。 6.ETF基金买卖(单位:股)。 ### 8交易支持业务类型 - 目前所支持的业务类型: 1.普通股票买卖(单位:股)。 2.可转债买卖(具体单位请咨询券商,T+0)。 3.融资融券交易(单位:股)。 4.ETF申赎、套利(单位:份)。 5.国债逆回购(单位:份)。 6.期货投机类型交易(单位:手,T+0)。 7.LOF基金买卖(单位:股)。 8.ETF基金买卖(单位:股)。 9.期权交易(单位:手)。 ### 二开始写策略 ### 1简单但是完整的策略 先来看一个简单但是完整的策略: ``` def initialize(context): set_universe('600570.SS') def handle_data(context, data): pass ``` - 一个完整策略只需要两步: set_universe: 设置我们要操作的股票池,上面的例子中,只操作一支股票: '600570.SS',恒生电子。所有的操作只能对股票池的标的进行。 实现一个函数: handle_data。 这是一个完整的策略,但是我们没有任何交易,下面我们来添加一些交易 ### 2添加一些交易 ``` def initialize(context): g.security = '600570.SS' # 是否创建订单标识 g.flag = False set_universe(g.security) def handle_data(context, data): if not g.flag: order(g.security, 1000) g.flag = True ``` - 这个策略里,当我们没有创建订单时就买入1000股'600570.SS',具体的下单API请看order函数。这里我们有了交易,但是只是无意义的交易,没有依据当前的数据做出合理的分析。 ### 3实用的策略 - 下面我们来看一个真正实用的策略 在这个策略里,我们会根据历史价格做出判断: 如果上一时间点价格高出五天平均价1%,则全仓买入 如果上一时间点价格低于五天平均价,则空仓卖出 ``` def initialize(context): g.security = '600570.SS' set_universe(g.security) def handle_data(context, data): security = g.security sid = g.security # 取得过去五天的历史价格 df = get_history(5, '1d', 'close', security, fq=None, include=False) # 取得过去五天的平均价格 average_price = round(df['close'][-5:].mean(), 3) # 取得上一时间点价格 current_price = data[sid]['close'] # 取得当前的现金 cash = context.portfolio.cash # 如果上一时间点价格高出五天平均价1%, 则全仓买入 if current_price > 1.01*average_price: # 用所有 cash 买入股票 order_value(g.security, cash) log.info('buy %s' % g.security) # 如果上一时间点价格低于五天平均价, 则空仓卖出 elif current_price < average_price and get_position(security).amount > 0: # 卖出所有股票,使这只股票的最终持有量为0 order_target(g.security, 0) log.info('sell %s' % g.security) ``` ### 4模拟盘和实盘注意事项 - 关于持久化 为什么要做持久化处理 服务器异常、策略优化等诸多场景,都会使得正在进行的模拟盘和实盘策略存在中断后再重启的需求,但是一旦交易中止后,策略中存储在内存中的全局变量就清空了,因此通过持久化处理为量化交易保驾护航必不可少。 量化框架持久化处理 使用pickle模块保存股票池、账户信息、订单信息、全局变量g定义的变量等内容。 注意事项: 框架会在before_trading_start(隔日开始)、handle_data、after_trading_end事件后触发持久化信息更新及保存操作; 券商升级/环境重启后恢复交易时,框架会先执行策略initialize函数再执行持久化信息恢复操作。如果持久化信息保存有策略定义的全局对象g中的变量,将会以持久化信息中的变量覆盖掉initialize函数中初始化的该变量。 全局变量g中不能被序列化的变量将不会被保存。您可在initialize中初始化该变量时名字以'__'开头; 涉及到IO(打开的文件,实例化的类对象等)的对象是不能被序列化的; 全局变量g中以'__'开头的变量为私有变量,持久化时将不会被保存; **示例** ``` class Test(object): count = 5 def print_info(self): self.count += 1 log.info("a" * self.count) def initialize(context): g.security = "600570.SS" set_universe(g.security) # 初始化无法被序列化类对象,并赋值为私有变量,落地持久化信息时跳过保存该变量 g.__test_class = Test() def handle_data(context, data): # 调用私有变量中定义的方法 g.__test_class.print_info() ``` **策略中持久化处理方法** 使用pickle模块保存 g 对象(全局变量) ``` import pickle from collections import defaultdict NOTEBOOK_PATH = '/home/fly/notebook/' ''' 持仓N日后卖出,仓龄变量每日pickle进行保存,重启策略后可以保证逻辑连贯 ''' def initialize(context): #尝试启动pickle文件 try: with open(NOTEBOOK_PATH+'hold_days.pkl','rb') as f: g.hold_days = pickle.load(f) #定义空的全局字典变量 except: g.hold_days = defaultdict(list) g.security = '600570.SS' set_universe(g.security) # 仓龄增加一天 def before_trading_start(context, data): if g.hold_days: g.hold_days[g.security] += 1 # 每天将存储仓龄的字典对象进行pickle保存 def handle_data(context, data): if g.security not in list(context.portfolio.positions.keys()) and g.security not in g.hold_days: order(g.security, 100) g.hold_days[g.security] = 1 if g.hold_days: if g.hold_days[g.security] > 5: order(g.security, -100) del g.hold_days[g.security] with open(NOTEBOOK_PATH+'hold_days.pkl','wb') as f: pickle.dump(g.hold_days,f,-1) ``` ### **三策略引擎简介** ### **1业务流程框架** - ptrade量化引擎以事件触发为基础,通过初始化事件(initialize)、盘前事件(before_trading_start)、盘中事件(handle_data)、盘后事件(after_trading_end)来完成每个交易日的策略任务。 initialize和handle_data是一个允许运行策略的最基础结构,也就是必选项,before_trading_start和after_trading_end是可以按需运行的。 handle_data仅满足日线和分钟级别的盘中处理,tick级别的盘中处理则需要通过tick_data或者run_interval来实现。 ptrade还支持委托主推事件(on_order_response)、交易主推事件(on_trade_response),可以通过委托和成交的信息来处理策略逻辑,是tick级的一个补充。 除了以上的一些事件以外,ptrade也支持通过定时任务来运行策略逻辑,可以通过run_daily接口实现。 ![输入图片说明](image6.png) 1. initialize(必选) ``` initialize(context) ``` - 使用场景 该函数仅在回测、交易模块可用 接口说明 该函数用于初始化一些全局变量,是策略运行的唯二必须定义函数之一。 注意事项: - 可调用接口 set_universe(回测/交易) set_benchmark(回测/交易) set_commission(回测) set_fixed_slippage(回测) set_slippage(回测) set_volume_ratio(回测) set_limit_mode(回测) set_yesterday_position(回测) run_daily(回测/交易) run_interval(交易) get_trading_day(研究/回测/交易) get_all_trades_days(研究/回测/交易) get_trade_days(交易) convert_position_from_csv(回测) get_user_name(回测/交易) is_trade(回测/交易) get_research_path(回测/交易) permission_test(交易) set_future_commission(回测(期货)) set_margin_rate(回测(期货)) get_margin_rate(回测(期货)) create_dir(回测/交易) set_parameters(回测/交易) **参数** context: Context对象,存放有当前的账户及持仓信息; **返回** None **示例** ``` def initialize(context): #g为全局对象 g.security = '600570.SS' set_universe(g.security) def handle_data(context, data): order('600570.SS',100) ``` 2. **before_trading_start(可选)** ``` before_trading_start(context, data) ``` - 使用场景 该函数仅在回测、交易模块可用 接口说明 该函数在每天开始交易前被调用一次,用于添加每天都要初始化的信息,如无盘前初始化需求,该函数可以在策略中不做定义。 注意事项: 在回测中,该函数在每个回测交易日8:30分执行。 在交易中,该函数在开启交易时立即执行,从隔日开始每天9:10分(默认)执行。 当在9:10前开启交易时,受行情未更新原因在该函数内调用实时行情接口会导致数据有误。可通过在该函数内sleep至9:10分或调用实时行情接口改为run_daily执行等方式进行避免。 **可调用接口** - set_universe(回测/交易) get_Ashares(研究/回测/交易) set_yesterday_position(回测) get_stock_info(研究/回测/交易) get_index_stocks(研究/回测/交易) get_fundamentals(研究/回测/交易) get_trading_day(回测/交易) get_all_trades_days(研究/回测/交易) get_trade_days(研究/回测/交易) get_history(回测/交易) get_price(研究/回测/交易) get_individual_entrust(交易) get_individual_transaction(交易) convert_position_from_csv(回测) get_stock_name(研究/回测/交易) get_stock_status(研究/回测/交易) get_stock_exrights(研究/回测/交易) get_stock_blocks(研究/回测/交易) get_etf_list(交易) get_industry_stocks(研究/回测/交易) get_user_name(回测/交易) get_cb_list(交易) get_deliver(交易) get_fundjour(交易) get_research_path(回测/交易) get_market_list(研究/回测/交易) get_market_detail(研究/回测/交易) permission_test(交易) get_trade_name(交易) set_future_commission(回测(期货)) set_margin_rate(回测(期货)) get_margin_rate(回测(期货)) get_instruments(回测/交易(期货)) get_MACD(回测/交易) get_KDJ(回测/交易) get_RSI(回测/交易) get_CCI(回测/交易) create_dir(回测/交易) get_opt_objects(研究/回测/交易(期权)) get_opt_last_dates(研究/回测/交易(期权)) get_opt_contracts(研究/回测/交易(期权)) get_contract_info(研究/回测/交易(期权)) set_parameters(回测/交易) get_cb_info(研究/交易) get_enslo_security_info(交易) get_ipo_stocks(交易) **参数** - context: Context对象,存放有当前的账户及持仓信息; data:保留字段暂无数据; **返回** none **示例** ``` def initialize(context): #g为全局变量 g.security = '600570.SS' set_universe(g.security) def before_trading_start(context, data): log.info(g.security) def handle_data(context, data): order('600570.SS',100) ``` 3. **handle_data(必选)** #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)