## 快速开始 ## 欢迎使用Auto-Trader Matlab ToolBox(以下简称Matlab工具箱) Matlab工具箱提供一系列基于Matlab的API,实现数据查询,账户信息查询,交易下单,策略回测,实盘交易,止盈止损等功能。 以下内容中带有"▲" 的表示为只能在`策略结构`中使用,**无法在命令行中使用** 如以下的内容无法解决您的问题,可以通过[社区](https://www.digquant.com.cn/forum.php?mod=forumdisplay&fid=3)告诉我们,谢谢 ### Matlab工具箱的安装 ### Matlab工具箱内嵌于Auto-Trader(以下简称AT)的安装程序中,无需要额外安装,只需要将Matlab工具箱加载到Matlab的环境中,即可开始您的Matlab量化交易之路。<font color=red size=2>注意:目前Matlab工具箱仅支持64位版本(x64),Matlab 2013a以上版本</font> 在Matlab环境中添加Matlab工具箱的路径,点击Set Path — Add Folder 添加对应的路径即可 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/api_document/api_document/Matlab设定路径.png) ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/api_document/api_document/Matlab设定路径2.png) 如果您不清楚AT的安装路径,可以在AT界面上点击打开Matlab,完成相关的配置,程序将自动添加Matlab工具箱的路径到Matlab的环境中 ### Matlab工具箱的使用 ### Matlab工具箱的已经自动完成Matlab与AT的通讯设置,您直接调用对应的API即可。 <font color=red>当您使用 Matlab工具箱时,需要保持Auto-Trader客户端保持打开且正常登陆。</font> ### API的使用结构 ### ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/api_document/api_document/atrader+Matlab+API.png) # 快速创建我的策略 # ### 数据事件驱动策略 ### ---------- 以下的代码片段是一个非常简单的例子,在接收到15分钟K线后,在下一根K线开盘时买入一手螺纹钢(15:00收盘时直接撤单不成交) 主策略函数代码: ```matlab function matlab_example_test(bInit,bDayBegin,cellPar)% % 三个参数的形式固定 if bInit % 判定是否策略开启启动 % 行情注册,15分钟的K线 traderRegKData('min',15); else % 策略启动后,安排市价下单 % 使用第一个账户,第一个标的,下单量为1手,价格为0(市价单),市价单,并标记该订单为‘buy1’ traderBuyV2(1, 1, 1, 0,'market','buy1'); end end ``` 执行脚本: ```matlab clear all; clc; % 设定回测账户 AccountList(1) = {'FutureBackReplay'}; % 设定标的资产 TargetList(1).Market = 'SHFE'; TargetList(1).Code = 'RB0000'; % 螺纹钢主力连续 % 设定初始资金和费率,滑点等 traderSetBacktest(1000000, 0.000026,0.02,0); % 按照15分钟的频率运行回测 traderRunBacktestV2('matlab_example_test',@matlab_example_test, {},AccountList,TargetList,'tick',1,20180101,20180102,'FWard'); ``` 整个策略需要5步: 1.定义主策略函数,通过`if bInit`判断是否策略开始 2.若`bIint`为True则注册数据频率 3.若`bInit`为False则运行下单逻辑 4.设定账户以及标的以及[`traderSetBacktest`](#traderSetBacktest)设定初始资金和费率滑点等 5.运行[`traderRunBacktestV2`](#traderRunBacktestV2) ### 时间序列策略 ### ---------- 在注册数据的时候,接收到推送数据并创建数据滑动窗口,按照窗口大小加载数据到新推送的数据,在新的数据推送时会自动刷新数据 策略函数代码: ```matlab function matlab_example_test(bInit,bDayBegin,cellPar)% global idexD % 三个参数的形式固定 if bInit % 判定是否策略开启启动 % 行情注册,15分钟的K线 idexD=traderRegKData('min',15); else % 构建数据滑窗,扩充新推送的15分钟K线到最近的5根K线 iddexD = api.traderGetRegKData(idexD, 5, False) end end ``` 执行脚本: ```matlab clear all; clc; % 设定回测账户 AccountList(1) = {'FutureBackReplay'}; % 设定 TargetList(1).Market = 'SHFE'; TargetList(1).Code = 'RB0000'; % 螺纹钢主力连续 % 设定初始资金和费率,滑点等 traderSetBacktest(1000000, 0.000026,0.02,0); % 按照15分钟的频率运行回测 traderRunBacktestV2('matlab_example_test',@matlab_example_test, {},AccountList,TargetList,'tick',1,20180101,20180102,'FWard'); ``` 整个策略需要5步: 1.定义主策略函数,定义全局变量,通过`if bIint`判断是否策略开始 2.若`bInit`为True则注册数据频率并将其保存在全局变量中 3.若`bInit`为False则利用全局变量和[`traderGetRegKData`](#traderGetRegKData)构建数据滑窗 4.设定账户以及标的以及[`traderSetBacktest`](#traderSetBacktest)设定初始资金和费率滑点等 5.运行[`traderRunBacktestV2`](#traderRunBacktestV2) ### 多个标的多个周期 ### ---------- 通过指定多个标的,注册数据时注册不同周期,可以实现多个标的多个周期的策略框架 策略函数代码: ```matlab function matlab_example_test(bInit,bDayBegin,cellPar)% global idexD; global idexD2; % 三个参数的形式固定 if bInit % 判定是否策略开启启动 % 行情注册,15分钟的K线和5分钟的K线 idexD=traderRegKData('min',15); idexD2=traderRegKData('min',5); else % 扩充新推送的两个周期K线到最近的5根K线 Data1=traderGetRegKData(idexD, 5, False); Data2=traderGetRegKData(idexD2, 5, False); end end ``` 执行脚本: ```matalb clear all; clc; % 设定回测账户 AccountList(1) = {'FutureBackReplay'}; % 设定 TargetList(1).Market = 'SHFE'; TargetList(1).Code = 'RB0000'; % 螺纹钢主力连续 % 设定初始资金和费率,滑点等 traderSetBacktest(1000000, 0.000026,0.02,0); % 按照15分钟的频率运行回测 traderRunBacktestV2('matlab_example_test',@matlab_example_test, {},AccountList,TargetList,'min',15,20180101,20180102,'FWard'); ``` 整个策略需要5步: 1.定义主策略函数,通过`if bInit`判断是否策略开始 2.若`bIint`为True则注册数据频率 3.若`bInit`为False则运行下单逻辑 4.设定账户以及标的以及[`traderSetBacktest`](#traderSetBacktest)设定初始资金和费率滑点等、 5.运行[`traderRunBacktestV2`](#traderRunBacktestV2) ### 使用多个账户交易 ### ---------- 在Matlab工具箱中,回测账户只有1个,可以用于股票和期货,以及两者的混合交易,模拟账户或者实盘账户可以用户自己添加,通过自定义的账户名划分。 模拟交易和实盘交易使用[`traderRunRealTradeV2`](#traderRunRealTradeV2)不同账户下单通过` HandleIdx `的序列号来执行 策略函数代码: ```matlab function matlab_example_test(bInit,bDayBegin,cellPar)% global idexD; % 三个参数的形式固定 if bInit % 判定是否策略开启启动 % 行情注册,15分钟的K线和5分钟的K线 idexD=traderRegKData('min',15); idexD2=traderRegKData('min',5); else % 通过不同账户下单交易,通过HandleIdx使用不同索引号 % 策略启动后,安排市价下单,使用FutureSimAcc这个账户下单 traderBuyV2(1, 1, 1, 0,'market', 'buy_FSA') % 策略启动后,安排市价下单,使用NewAccount这个账户下单 traderBuyV2(2, 1,1, 0,'market', 'buy_FSA') end end ``` 执行脚本函数 ```matlab clear all; clc; % 设定回测账户, AccountList(1)={'FutureSimAcc'}; AccountList(2)={'NewAccount'}; % 设定标的资产 TargetList(1).Market = 'SHFE'; TargetList(1).Code = 'RB0000'; % 螺纹钢主力连续 % 按照15分钟的频率运行回测 traderRunRealTradeV2('matlab_example_test',@matlab_example_test, {},AccountList,TargetList,'min',15,20180101,'FWard'); ``` ### 回测模式和实时模式 ### ---------- AT里面提供两种模式,回测模式(BackTest)和实时模式(RealTrade),对应两种API,分别是 [`traderRunBacktestV2`](#traderRunBacktestV2)和 [`traderRunRealTradeV2`](#traderRunRealTradeV2) **回测模式** 回测模式中使用的必须是回测账户,并且可以通过[`traderSetBacktest`](#traderSetBacktest)设定初始资金,手续费,滑点等。类似于以下的代码: 策略函数代码: ```matlab function matlab_example_test(bInit,bDayBegin,cellPar)% % 三个参数的形式固定 if bInit % 判定是否策略开启启动 % 行情注册,15分钟的K线 traderRegKData('min',15); else % 策略启动后,安排市价下单 % 使用第一个账户,第一个标的资产,下单量为1手,价格为0(市价单),市价单,并标记该订单为‘buy1’ traderBuyV2(1, 1, 1, 0,'market','buy1'); end end ``` 执行脚本: ```matlab clear all; clc; % 设定回测账户 AccountList(1) = {'FutureBackReplay'}; % 设定 TargetList(1).Market = 'SHFE'; TargetList(1).Code = 'RB0000'; % 螺纹钢主力连续 % 设定初始资金和费率,滑点等 traderSetBacktest(1000000, 0.000026,0.02,0); % 按照15分钟的频率运行回测 traderRunBacktestV2('matlab_example_test',@matlab_example_test, {},AccountList,TargetList,'min',15,20180101,20180102,'FWard'); ``` **实时模式** 实时模式中使用的必须是模拟账户或者实盘账户,模拟账户在AT客户端上可以直接设置,账户根据账户名称进行匹配跟踪。实时模式不能对手续费等进行设置,按照服务器端设定进行交易 策略函数代码: ```matlab function matlab_example_test(bInit,bDayBegin,cellPar)% global idexD; % 三个参数的形式固定 if bInit % 判定是否策略开启启动 % 行情注册,15分钟的K线和5分钟的K线 idexD=traderRegKData('min',15); else % 通过不同账户下单交易,通过HandleIdx使用不同索引号 % 策略启动后,安排市价下单,使用FutureSimAcc这个账户下单 traderBuyV2(1, 1, 1, 0,'market', 'buy_FSA') end end ``` 执行脚本函数 ```matlab clear all; clc; % 设定回测账户, AccountList(1)={'FutureSimAcc'}; % 设定标的资产 TargetList(1).Market = 'SHFE'; TargetList(1).Code = 'RB0000'; % 螺纹钢主力连续 % 按照15分钟的刷新频率运行策略 traderRunRealTradeV2('matlab_example_test',@matlab_example_test, {},AccountList,TargetList,'min',15,20180101,'FWard'); ``` ### 提取数据研究 ### ---------- 如果只想提取数据,无需实时数据驱动策略,不用通过策略结构逻辑,在AT运行的前提下,直接使用查询类的函数就可以获取 代码如下: traderGetTargetInfo('SHFE','rb0000') 返回: ```matlab ans = struct with fields: Market: 'shfe' Code: 'rb0000' Name: '螺钢1810' Type: 2 Multiple: 10 MinMove: 1 TradingFeeOpen: 1.0905e-04 TradingFeeClose: 1.0905e-04 TradingFeeCloseToday: 1.0905e-04 LongMargin: 0.1600 ShortMargin: 0.1600 TargetMarket: '' TargetCode: '' OptionType: '' CallOrPut: '' ListDate: 20171017 LastTradingDate: 20181015 EndDate: 4.3433e-311 ExerciseDate: 4.3437e-311 DeliveryDate: 1.5915e-314 CMUnit: 2.9644e-323 ExercisePrice: 0 MarginUnit: 1.5221e-315 ``` ### 多因子模型 ### ---------- Matlab工具箱里内嵌了大量经过清洗的因子数据(具体见数据介绍),用户可以在策略结构中直接调用 主策略函数: ```matlab function matlab_example_test(bInit,bDayBegin,cellPar)% global idexD; global factor1 % 三个参数的形式固定 if bInit % 判定是否策略开启启动 % 行情注册,1day级别的K线 idexD=traderRegKData('day',1); % 因子注册,调用AT内部自带的BP因子‘PE','CETOP' factor1=traderRegFactor('PE','CETOP'); else % 调用注册的因子 fa=traderGetRegFactor(factor1,1) end end ``` 执行脚本: ```matlab clear all; clc; % 设定回测账户, AccountList(1) = {'FutureBackReplay'}; % 设定标的资产,以沪深300指数的成分股作为标的 TargetList=traderGetCodeList('HS300') % 按照1day的频率运行回测 traderRunBacktestV2('matlab_example_test',@matlab_example_test, {},AccountList,TargetList,'day',1,20180123,20180125,'FWard'); ``` 代码解析: 1.定义主策略函数,通过`if bInit`判断是否策略开始 2.若`bIint`为True则注册数据频率 3.在策略结构中使用BP因子,需要先注册,和行情推送的方式一样 4.支持一次性注册多个因子 ### 获取回测完策略的绩效 ### ---------- Matlab工具箱中提供专门的API,可以让用户在策略回测完后,提取回测绩效报告的字段。提取回测策略的绩效报告需要依赖回测策略的ID,策略回测的ID可以通过两种方式获得: **回测语句完成后返回策略ID** ```matlab clear all; clc; % 设定回测账户, AccountList(1) = {'FutureBackReplay'}; % 设定标的资产,以沪深300指数的成分股作为标的 TargetList=traderGetCodeList('HS300') % 按照1day的频率运行回测 StrategyID = traderRunBacktestV2('matlab_example_test',@matlab_example_test, {},AccountList,TargetList,'day',1,20180123,20180125,'FWard'); ``` 代码解析: 1. 通过回测入口函数 [`traderRunBacktestV2`](#traderRunBacktestV2) 运行回测后返回策略ID 1. 只有回测完成才会返回策略ID;回测中断,回测发生错误都不会返回策略ID **回测后获取AT里的策略列表** ```matlab traderGetStrategyID() ``` 返回 ```matlab ans = 1×3 struct array with fields: StrategyName StrategyID ``` 代码解析: 1.[`traderGetStrategyID`](#traderGetStrategyID) 获取的策略ID是当前AT客户端中,策略回测页面存在,并且可以提取绩效报告的策略ID 2.当AT客户端中策略回测中策略的Tab被关闭,或者AT重启后,策略ID失效 3.通过此方式不必依赖策略回测入口函数 [`traderRunBacktestV2`](#traderRunBacktestV2) 获取策略ID 4.只有回测成功,回测结束,绩效计算完成的策略才会返回策略ID **通过策略ID获取回测的绩效报告信息字段** 以下代码是通过策略ID获取策略回测报告信息 ```matlab result=traderGetPerformance('6488216908083490844') result = struct with fields: …… ``` 1.回测完成但是绩效没有计算完毕的策略获取绩效报告字段会返回空的struct 2.策略ID可以通过上面两种方式获取 <span id="structure"></span> # 策略程序框架 # Matlab工具箱的策略逻辑分为两个部分: - 主策略函数(**策略结构**) - 执行操作脚本 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/api_document/api_document/Matlab策略运行逻辑.png) 策略主策略函数主要是定义策略的逻辑,包括数据注册,下单逻辑,每一次刷新都会运行一次该函数。所有带“▲”或者不带“▲”标记的API都可以在此函数内使用。 执行操作函数主要是定义策略具体使用的账户,标的,以及策略运行的模式(回测\\实时交易),是整个策略的入口。带有“▲”标记的API不可以在这里或者命令行使用。 ### 主策略函数定义 ### ---------- 通过自定义主函数名初始化策略,策略启动时会通过函数名传递给执行脚本进行调用。函数的输入参数格式固定,为` bInit` ,` bDayBegin `和 `cellPar` 固定三个。在主函数中应该实现的步骤: **参数入参** - 分别为` bInit `,` bDayBegin `和` cellPar` 固定三个。 - ` bInit `:在策略逻辑运行前为1,当开始判断是否下单后,该变量为0. - ` bDayBegin` : 在一天的第一根Bar为1,其他时刻为0 - ` cellPar` : 两种模式下的外部参数都将通过cellPar来传递,以cell的形式 **定义全局变量** 通过使用`global`关键字可以定义全局变量,在整个策略中进行传递,一般需要传递的全局变量包括: - 行情数据注册的返回值 - 计算止盈止损 - 其他需要在不同函数之间使用的变量 **分配参数cellPar对应的变量** 通过索引号分配 `cellPar `中的变量,索引号根据策略模式入口函数(backtest和realtrade)中输入的参数顺序来决定(具体见[`traderRunBacktestV2`](#traderRunBacktestV2)和[`traderRunRealTradeV2`](#traderRunRealTradeV2)的API解析) **初始化** 利用 `bInit `来判定策略开启时刻,所有与行情有关的数据都在初始化过程中实现,使得策略逻辑中,行情与仓位的逻辑分离,一切与行情有关的数据通过初始化定义,Matlab工具箱可以通过多线程,多进程快速提升数据处理的速度,使得策略运算速度大幅提升。 - <font color=red>不能在策略其他地方对行情数据,因子数据注册!!</font> **行情数据的注册** 为了使用并行运算以增加回测和运算效率,行情数据注册在策略初始化的时候需要指定且不能再策略过程中进行修改,并使用全局变量储存行情注册返回的数据值 - <font color=red>支持同时对多个周期的行情数据注册</font> **BP因子数据的注册** 当在策略中使用AT自带的BP因子时(因子解析见数据介绍),在初始化过程中通过[`traderRegFactor`](#traderRegFactor)函数将因子函数定义的逻辑与行情数据结合,使用全局变量储存因子数据返回的数据值。 **行情数据处理** 在完成初始化后,可以在主函数中添加自己的交易逻辑,包括使用历史数据计算,下单交易,止盈止损等等 ### 执行操作脚本定义 ### ---------- 1.交易策略的启动入口函数,交易类策略都需要使用[`traderRunBacktestV2`](#traderRunBacktestV2) 或者 [`traderRunRealTradeV2`](#traderRunRealTradeV2)(仅仅在提取数据做研究的情况下不需要调用) 2.非策略核心参数(暴露的参数)在执行操作函数中定义,后面的所有调参操作不会对主策略函数的结构和逻辑产生不可估计的影响,保证参数与策略逻辑独立。 **参数变量定义赋值** 在主策略函数中可能用到的变量,通过主策略函数的参数`cellPar` 传递。这些暴露的变量函数可以在执行函数中赋值,并相应传递回主策略函数 **交易账户定义赋值** 通过struct或者cell的方式,定义策略中需要使用到的账户名 **标的资产定义** 通过struct或者cell的方式定义需要使用的标的资产代码(具体代码见) **设定回测的细节(只适用于回测模式)** 通过[`traderSetBacktest`](#traderSetBacktest)函数设定回测资金,费率,滑点以及限价单以及市价单的成交方式 **运行模式选择** 根据回测还是实时模式,选择 [`traderRunBacktestV2`](#traderRunBacktestV2)或者[`traderRunRealTradeV2`](#traderRunRealTradeV2) **定义策略名** 定义策略名作为AT中回测、实时交易时,绩效展示的策略名字 **设定策略的刷新频率** 设定策略刷新的频率,分为频率以及频数 **策略入参** 将策略名,主策略函数,账户,标的资产,参数变量,刷新频率,以及开始时间,结束时间作为参数进入回测\\实时交易 # 重要概念 # ### Date - 日期 ### ---------- Matlab工具箱的日期有两种格式,所有API都满足以下的设定 1.日期作为参数入参,使用整型,如20180405 2.日期作为函数结果返回,使用datanum格式,用户可以通过datestr,datetime等MATLAB内置函数随意转换 ### Time - 时间 ### ---------- Matlab工具箱里使用的时间是matlab的双精度浮点时间 ### Targetlist - 标的代码 ### ---------- 使用struct结构体,分别以Market和Code作为关键字,其中‘Market’:交易所代码,‘Code’:交易标的代码 **交易所代码** 目前Matlab工具箱支持6交易所以及上海国际能源交易中心,代码缩写如下: |市场中文名| 市场代码| |:- |:- | |上交所| SSE| |深交所| SZSE |中金所| CFFEX |上期所 |SHFE |大商所 |DCE |郑商所 |CZCE |上海国际能源交易中心 |INE **交易标的代码** 交易标的代码只交易所给出的交易标的代码,包括股票、期货、期权、指数、基金等代码。 具体的代码请参考各个交易所给出的证券代码定义 ### 运行模式选择 ### ---------- 策略运行支持两种模式,实时模式和回测模式,分别对应两个不同API,用户在使用时需要选择 **实时模式** 实时行情服务器推送的实时行情,只在交易时段提供,可以根据账户类型使用模拟账户进行模拟交易,或者使用实盘账户进行真实交易 **回测模式** 注册指定时段,指定交易代码,指定数据类型的行情,行情服务器将按照指定条件全速回放对应的行情数据,适用于策略回测阶段,快速验证策略的绩效是否符合预期。 为了更好完成回测,Matlab工具箱提供了让回测更细化的设定函数[` traderSetBacktest`](#traderSetBacktest),可以对滑点,手续费率,初始资金以及限价单市价单的成交方式进行设定,实现更加精准回测,杜绝未来函数。 ### 策略主函数 ### ---------- 策略主函数指的是策略的主体部分,包括实现行情注册,因子注册,逻辑运算以及交易相关设置,在AT的结构里,策略的调参,不应该在策略主函数中进行,完成逻辑判断工作后,可以封装成黑箱,保证策略的私密性。 ### 执行操作函数 ### ---------- 执行操作函数指的是对策略主函数的实例应用,包括参数变量赋值,回测和实时模式的调用,策略主函数名会以关键字参数的形式进入到执行操作函数中。 ### OrderID - 委托订单号 ### ---------- 每个交易函数都会返回一个委托订单号,从1开始,不断叠加,策略重新启动将使得OrderID重置,从1开始计数。主要用于止盈止损交易函数中做订单管理 # 重要参数 # 重要参数是在Matlab工具箱中特殊场景所使用,可能为AT特有策略结构的参数,因此在这里特意说明 ### 策略注册频率和策略刷新频率 ### ---------- Matlab工具箱在数据处理上面提供了完全开放的时间序列处理方式,让用户在处理多周期,策略内跟踪止盈止损更加方便和直接。因此在两组API里面提供了两个频率 ,分别在策略函数入口处的策略刷新频率,以及在注册数据[`traderRegKData`](#traderRegKData)函数下的注册频率 **策略的注册频率** 在 [`traderRegKData`](#traderRegKData) 里使用的频率指的是AT为用户准备数据行情数据的周期频率,一般而言对应于策略的数据周期,就是用户在策略逻辑计算中使用的数据频率 % 行情注册,15分钟的K线和5分钟的K线 idexD=traderRegKData('min',15); idexD2=traderRegKData('min',5); **策略刷新频率** 在策略入口处的[`traderRunBacktestV2`](#traderRunBacktestV2)或者 [`traderRunRealTradeV2`](#traderRunRealTradeV2)中使用的频率参数指的是刷新数据的频率,具体指的是设定程序触发的频率,策略程序在接收到刷新数据设定的频率数据之后,就会启动策略逻辑。 % 按照15分钟的频率运行回测 traderRunRealTradeV2('matlab_example_test',@matlab_example_test, {},AccountList,TargetList,'min',15,20180101,'FWard'); 用户在使用过程中允许注册数据与刷新数据的频率不一致,但刷新数据的周期必须不大于注册数据的周期,如以下代码: 策略函数: function matlab_example_test(bInit,bDayBegin,cellPar)% global idexD; % 三个参数的形式固定 if bInit % 判定是否策略开启启动 % 行情注册,15分钟的K线 idexD=traderRegKData('min',15); else % 通过不同账户下单交易,通过HandleIdx使用不同索引号 % 策略启动后,安排市价下单,使用FutureSimAcc这个账户下单 traderBuyV2(1, 1, 1, 0,'market', 'buy_FSA') end end 执行函数: clear all; clc; % 设定回测账户, AccountList(1) = {'FutureSimAcc'}; AccountList(2)={'NewAccount'}; % 设定标的资产 TargetList(1).Market = 'SHFE'; TargetList(1).Code = 'RB0000'; % 螺纹钢主力连续 % 设定初始资金和费率,滑点等 traderSetBacktest(1000000, 0.000026,0.02,0); % 按照1分钟的频率运行回测 traderRunBacktestV2('matlab_example_test',@matlab_example_test, {},AccountList,TargetList,'min',1,20180101,20180201'FWard'); 代码说明: 1.以1分钟设定刷新数据的频率,代表策略主函数会在每1分钟之后运行一次 2.以15分钟设定注册数据的频率,代表策略需要的是15分钟级别的K线数据以进行逻辑运算操作 **注册数据与刷新数据频率的规则对比** |刷新数据频率 |注册数据频率 |是否合法| |:-|:-|:-| |1 min |5 min |√| |1 min |1 day |√| |5 min |1 min |√| |1day |30 min |x| |1 day |1 day |√| ### HandleIdx - 账户句柄索引号 ### 常出现在账户信息查询类函数语句中,交易下单以及止盈止损的操作中,作为函数参数,代表使用那个账户进行交易的索引号 ### TargetIdx - 标的资产索引 ### 只适用于在行情注册后,接受到数据里标的资产的索引号,常出现在行情注册后,提取数据,交易下单,以及账户信息查询 策略函数: function matlab_example_test(bInit,bDayBegin,cellPar)% global idexD; % 三个参数的形式固定 if bInit % 判定是否策略开启启动 % 行情注册,5分钟的K线 idexD=traderRegKData('min',5); else % 获取账户的信息情况 % 在traderRunBacktestV2中AccountList有2个账户,使用第一个账户,所以索引号为1 % 多个账户则索引号增加 % 使用账户FutureBackReplay进行实时交易 (validcash, handlistcap, orderfrozen, marginfrozen, positionprofit)=traderGetAccountInfoV2(1) % 获取标的资产的情况 % traderRunBacktestV2中TargetList只有一个参数,所以索引号为1 % 多个标的资产时,索引号增加 % 返回螺纹钢主连在当前5分钟bar的信息 info=traderGetTargetInfoV2(1) end end 执行脚本: clear all; clc; % 设定实时交易账户, AccountList(1) = {'FutureSimAcc'}; AccountList(2)={'NewAccount'}; % 设定标的资产 TargetList(1).Market = 'SHFE'; TargetList(1).Code = 'RB0000'; % 螺纹钢主力连续 % 设定初始资金和费率,滑点等 traderSetBacktest(1000000, 0.000026,0.02,0); % 按照15分钟的频率运行回测 traderRunBacktestV2('matlab_example_test',@matlab_example_test, {},AccountList,TargetList,'min',1,20180101,20180201'FWard'); ### cellPar - 参数传递 ### 用于在策略入口处会使用到的变量的传载体,对应于` varFunParamter `参数的内容,使得变量可以在策略主函数和执行操作函数之间相通,以索引号的方式可以在策略主函数中传递,参与策略的运算和执行,从而在进行策略调整时,不需要调整策略本身的内容,将对外的参数进行修改即可。如下例子: 主策略程序: function matlab_example_test(bInit,bDayBegin,cellPar)% % 三个参数的形式固定 global idexD; % 通过cellpar,传递执行脚本中定义的变量到主策略程序中 stoploss = cellPar{1} initialcash = cellPar{2} if bInit % 判定是否策略开启启动 % 行情注册,5分钟的K线 idexD=traderRegKData('min',5); else % 获取账户的信息情况 % 在traderRunBacktestV2中AccountList有2个账户,使用第一个账户,所以索引号为1 % 多个账户则索引号增加 % 使用账户FutureBackReplay进行实时交易 (validcash, handlistcap, orderfrozen, marginfrozen, positionprofit)=traderGetAccountInfoV2(1) % 如果动态权益少于初始资金的80%,触发止损,全部平仓 if handlistcap < initialcash * (1 - stoploss) traderCloseAllV2(1) end end end 执行脚本: clear all; clc; % 设计止损位置和初始资金 % 在策略外修改可以避免参数与策略逻辑混合 stoploss = 0.2; initialcash = 1000000; % 设定回测账户, AccountList(1) = {'FutureBackReplay'}; % 设定标的资产 TargetList(1).Market = 'SHFE'; TargetList(1).Code = 'RB0000'; % 螺纹钢主力连续 % 设定初始资金和费率,滑点等 traderSetBacktest(initialcash, 0.000026,0.02,0); % 按照15分钟的频率运行回测 traderRunBacktestV2('matlab_example_test',@matlab_example_test, {stoploss,initialcash},AccountList,TargetList,'min',1,20180101,20180201'FWard'); ### FillUp - 数据补齐 ### 只适用于注册数据后构建数据滑窗的函数语句 traderGetRegKData 中,常用于股票停牌,或者其他原因导致在正常交易日内,标的行情数据缺失从而对滑窗大小进行补充设定。 True——严格按照时间序列,补齐每个时间点位置,不对缺失数据进行甄别,返回相应滑窗大小的序列数据 False——按照交易逻辑,忽略缺失数据的时间长度,根据滑窗大小取相应长度数据 主策略函数: function matlab_example_test(bInit,bDayBegin,cellPar)% % 三个参数的形式固定 global idexD; global factor1 % 通过cellpar,传递执行脚本中定义的变量到主策略程序中 stoploss = cellPar{1}; initialcash = cellPar{2}; if bInit % 判定是否策略开启启动 % 行情注册,1day级别的K线 idexD=traderRegKData('day',1); % 因子注册,调用AT内部自带的BP因子‘PE' factor1=traderRegFactor('PE'); else % 扩充新推送的1day-K线到最近的5根K线 % 乐视网停牌时间为20170415-20180123, 20180124开始复牌交易 % Fillup为true,严格按照时间轴,取的时间为23号前5天 idexD_1 = traderGetRegKData(idexD, 5, true); % traderGetRegKData返回的结构中,第一行为时间 % 清除早于回测时间而返回的NaN idexD_1(:,isnan(idexD_1(1,:)))=[]; % 将datanum时间戳转换为字符串时间 date_true=datestr(idexD_1(1,:)) % Fillup为false,按照交易逻辑,取得第一个时间为最近交易日20170414,超出回测范围,数据返回NaN idexD_2 = traderGetRegKData(idexD, 5, false); idexD_2(:,isnan(idexD_2(1,:)))=[]; date_false=datestr(idexD_2(1,:)) % 调用注册的因子 % 因子的时间序列和K线无关 fa=traderGetRegFactor(factor1,1) end end 执行脚本: clear all; clc; % 设计止损位置和初始资金 stoploss = 0.2; initialcash = 1000000; % 设定回测账户, AccountList(1) = {'FutureBackReplay'}; % 设定标的资产 TargetList(1).Market = 'SZSE'; TargetList(1).Code = '300104'; % 乐视网 % 按照15分钟的频率运行回测 % 乐视网停牌时间为20170415-20180123, 20180124开始复牌交易 traderRunBacktestV2('matlab_example_test',@matlab_example_test, {stoploss,initialcash},AccountList,TargetList,'day',1,20180123,20180125,'FWard'); 在MATLAB中返回: date_true = '23-Jan-2018 15:00:00' date_false = 0×11 empty char array date_true = 2×20 char array '23-Jan-2018 15:00:00' '24-Jan-2018 15:00:00' date_false = '24-Jan-2018 15:00:00' date_true = 3×20 char array '23-Jan-2018 15:00:00' '24-Jan-2018 15:00:00' '25-Jan-2018 15:00:00' date_false = 2×20 char array '24-Jan-2018 15:00:00' '25-Jan-2018 15:00:00' # 数据结构 # 在AT中,数据分为以下几个类别: - 行情数据 - 交易信息数据 - 基本面信息数据 - 风险模型数据 - BP因子数据 ## 行情数据 ## ### 历史Tick数据 ### ---------- 通过[` traderGetTickData`](#traderGetTickData)来获取 N为Tick数据的时间点数量 |字段名|类型|说明| |:- | :-| :- | |Time|N*1 float型数组|时间列表以Matlab datanum形式存储| |Price|N*1 float型数组 |成交价,每个元素对应time中时间点的成交价| |volume|N*1 float型数组 |成交量,每个元素对应time中时间点的累计成交量| |volumetick| N*1 float型数组 | 当前tick的成交量| |turnover| N*1 float型数组| 成交金额, 每个元素对应time中时间点的换手率| |openinterest| N*1 float型数组|持仓量 每个元素对应time中时间点的持仓量| |bidprice |N*5 float型数组|买价, 对应time中时间点的前五档委托买价| |bidvolume| N*5 float型数组 |买量 对应time中时间点的前五档委托买量| |askprice| N*5 float型数组 |卖价 对应time中时间点的前五档委托卖价| |askvolume| N*5 float型数组 |卖量 对应time中时间点的前五档委托卖量| ### 历史Bar数据 ### ---------- 通过[`traderGetKData`](#traderGetKData)来获取 N为Bar数据的数量 |字段名|类型|说明| | :- | :- | :- | |Time|N*1 float型数组|bar的时间以Matlab日期数字形式存储| |Open|N*1 float型数组 |bar的开盘价| |High|N*1 float型数组 |bar的最高价| |Low| N*1 float型数组 |bar的最低价| |Close| N*1 float型数组|bar的收盘价| |volume| N*1 float型数组|bar的成交量| |turnover |N*1 float型数组|bar的成交金额| |openinterest| N*1 float型数组 |bar的持仓量| ### 当前bar ### ---------- 通过在策略结构中使用 [`traderGetCurrentBarV2`](#traderGetCurrentBarV2) 来获取 |字段名|类型|说明| | :- | :-| :- | |BarNumber| float| 当前Bar位置,day级别相对于开始时间而言,min级别相对于当日开盘位置| |BarTime| float| 当前Bar时间,datanum格式| ### 当前Tick ### ---------- 通过在策略结构中使用 [`traderGetCurrentTick`](#traderGetCurrentTick) 来获取 |字段名|类型|说明| | :- | :- | :- | |Time|N*1 float型数组|时间列表以Matlab datanum形式存储| |Price|N*1 float型数组 |成交价,每个元素对应time中时间点的成交价| |volume|N*1 float型数组 |成交量,每个元素对应time中时间点的累计成交量| |volumetick| N*1 float型数组 | 当前tick的成交量| |turnover| N*1 float型数组| 成交金额, 每个元素对应time中时间点的换手率| |openinterest| N*1 float型数组|持仓量 每个元素对应time中时间点的持仓量| |bidprice |N*5 float型数组|买价, 对应time中时间点的前五档委托买价| |bidvolume| N*5 float型数组 |买量 对应time中时间点的前五档委托买量| |askprice| N*5 float型数组 |卖价 对应time中时间点的前五档委托卖价| |askvolume| N*5 float型数组 |卖量 对应time中时间点的前五档委托卖量| ### 标的信息数据 ### ---------- 通过 [`traderGetTargetInfo`](#traderGetTargetInfo) 和 [`traderGetTargetInfoV2`](#traderGetTargetInfoV2)来获取 |字段名|类型|说明| | :- | :- | :- | |Market| char| 市场 |Code |char |合约代码 |Name |char |标的名称 |Type |float |标的类型1 股票, 2 期货, 3 期权 |Multiple| float |合约乘数 |MinMove| float |最小变动单位 |TradingFeeOpen |float| 开仓手续费率 |TradingFeeClose |float| 平仓手续费率 |TradingFeeCloseToday| float| 当日平仓手续费 |LongMargin| float |多方保证金率 |ShortMargin| float |空方保证金率 |LastTradingDate| float |最后交易日 |以下为期权专用 |TargetMarket| char |对标标的市场 |TargetCode |char |对标标的代码 |OptionType |char |期权类型(暂未提供) |CallOrPut |float |认购认沽 |ListDate |float |首个交易日 |EndDate |float |最后交易日 |ExerciseDate| float |期权行权日 |DeliveryDate| float |行权交割日 |CMUnit |float| 合约单位 |ExercisePrice| float |期权行权价 |MarginUnit |float |单位保证金 ## 交易信息 ## ### 账户信息 ### ---------- 通过[`traderGetAccountInfoV2`](#traderGetAccountInfoV2)、[`traderGetAccountPositionV2`](#traderGetAccountPositionV2)以及[`traderGetAccountPositionDirV2`](#traderGetAccountPositionDirV2),在策略运行过程中获取以下信息字段 |字段名|类型|说明| | :- | :-| :- | |Position |float| 当前多头或者空头持仓 |Frozen| float| 当前多头或者空头冻结持仓 |AvgPrice |float |当前多头或者空头平均价格 |ValidCash |float |账户当前可用资金 |HandListCap |float| 账户当前总动态权益 |OrderFrozen |float| 下单冻结资金总额 |MarginFrozen |float| 保证金冻结资金总额 |PositionProfit |float| 持仓盈亏 ### 订单信息 ### ---------- 通过各种交易函数返回的订单号,用于止盈止损,以及其他订单类信息的查询 |字段名 |类型 |说明| | :- | :- | :- | |orderID |float| 订单号| ## 基本面信息 ## Matlab工具提供丰富的基本面信息数据,分为新版和旧版的API,旧版的API将在未来被逐步淘汰,请用户使用新版的API,具体可见数据字典页面。 ### 旧版数据结构 ### ---------- 基本面数据存在在数据库中,以表的方式存放,一次只能查询单个表的数据,根据查询的数据类型,分为3个不同的API,对应不同的数据类型 **标的相关的日期序列数据** 这里存放的数据大多数与交易相关,从而衍生的数据,存放的方式为以交易日历索引,目前只支持针对单标的查询,根据查询的开始日期和结束日期,返回对应的数据 通过[`traderGetHistorySet`](#traderGetHistorySet)可以获取 |字段名|类型|说明| | :- | :- | :- | |Date|cell| 交易日历| |数据库字段|cell|根据数据库内容返回| **标的相关的状态类数据** 这里存放的数据大多数与股票相关的基本面数据,类似于财务报表数据以及一些公司的基本状态数据,与交易日无明显关系。存放的方式为以标的索引,支持多标的查询,根据查询的开始日期和结束日期,返回对应的数据 通过[`traderGetFundamentalSet`](#traderGetFundamentalSet)可以获取 |字段名 |类型 |说明| | :- | :- | :- | |Market|cell|标的市场代码| |Code|cell| 标的证券代码| |Date|cell|数据库的日期索引变量| |数据库字段|cell|根据数据库内容返回| **整个市场的日期序列数据** 这里存放的数据大多数是整个市场,板块与交易相关,从而衍生的数据,存放的方式为以交易日历索引,根据查询的开始日期和结束日期,返回对应的数据 通过[`traderGetMarketSet`](#traderGetMarketSet)可以获取 |字段名 |类型 |说明| | :- | :- | :- | |Date|cell|数据库的日期索引变量| |数据库字段|cell|根据数据库内容返回| ### 新版数据结构 ### ---------- Matlab工具箱的新版基本面信息数据提供四大类型的数据,每个类型下可能还存在分类,每个具体的数据单独形成API |一级分类|一级分类说明|二级分类|二级分类说明| | :- | :- | :- | :- | |fdmt|财务报表|bs|资产负债表| |fdmt|财务报表|is|利润表| |fdmt|财务报表|cf|现金流量表| |fdmt|财务报表|note|附注信息| |fdmt|财务报表|indicator|财务指标| |fdmt|财务报表|expectation|业绩预期| |mkt|行情衍生数据|——|——| |company|公司行为|info|基本信息| |company|公司行为|personel|人员信息| |company|公司行为|fid|投融资分红| |company|公司行为|equity|股本股东| |company|公司行为|ipo|首发信息| |company|公司行为|restricted|限售解禁| |company|公司行为|matters|重大事项| 用户在调用对应的API时,需要带上其层级关系,方能调用。 如获取财务数据中的资产负债表的一版工商业资产负债表的最新数据:`fdmt.bs.bs_latest` ## 风险模型数据 ## Matlab工具箱提供基于Barra风险模型思想设计的风险模型数据,每个具体的数据单独形成API |一级分类|一级分类说明|二级分类|二级分类说明| | :- | :- | :- | :- || |rm|风险模型|——|——| 用户在调用对应的API时,需要带上其层级关系,方能调用。 如获取风险模型数据中的个股对风格因子以及行业因子的暴露:`rm.exposure` ## BP因子数据 ## BP因子数据是存放在数据库的因子数据,AT用户可以通过API直接调用而无需自己从基本面数据清洗形成因子。每个挂牌交易的股票,每个交易日,在不同因子库里都有对应的因子数值 通过[`traderGetFactor`](#traderGetFactor)和[`traderGetRegFactor`](#traderGetRegFactor)来获取 |字段名|类型|说明| | :- | :- | :- | |Date|cell|时间列表以Matlab datanum形式存储| |TargetList|struct |包含Market和Code两个字段| |Data|double |因子数值矩阵| # API介绍 # ## 数据查询 ## <span id="traderGetCodeList"></span> ### traderGetCodeList -获取指数,行业板块的成分股信息### ---------- - 函数说明:获得指数(包含权重和成分股)、行业板块(没有权重,只有成分股),包括成分股及权重等信息 - 语法: `traderGetCodeList(block,varargin)` - 输入参数: |字段名 |类型 |说明| |:-|:-|:-| |block |char |1.<a href="https://www.digquant.com.cn/documents/11" target="_blank">指数名称</a>,如`'hs300'`可获得沪深300指数的权重与成分股。 2.<a href="https://www.digquant.com.cn/documents/12" target="_blank">行业名称</a>,如`'SWDZ1'`可获取申万电子一级行业的成分股。 3.特殊字段,如:`'index'`:获取所有指数列表;`'plate_industry'`:获取行业列表;`'sse, szse, cffex, shfe, dce, czce'`: 取各交易所品种代码,`'sse'`和 `'szse'`会拿到交易所里的指数以及其他标的,如债券等等;`'sse_a,szse_a'`: 取上海证券交易所和深圳证券交易所的A股;`'cffex000, cffex001, shfe000, shfe001'`: 取商品期货交易所主力, 次主力合约代码。 |varargin |整型|输入的时间日期,缺失时为当前时间点 - 输出参数: struct结构体,包含以下字段 |字段 |类型 |说明| |:-|:-|:-| |Market|char|指数所属交易所代码,行业为空 |Code|char|指数的代码or行业首字母简称 |Name|char|行业或指数的详细名称 |BlockName|double|行业或指数简称 |Weight|double|权重 - 示例: 1.获取所有指数的情况 a = tradetGetCodeList('index') 2.获取所有行业的情况 a = tradetGetCodeList('plate_industry') 返回: a = 1×722 struct array with fields: Market Code Name BlockName Weight b = 1×503 struct array with fields: Market Code Name BlockName Weight <span id="traderGetCodeListSet"></span> ### traderGetCodeListSet -获取一段时间内指数行业板块的成分股集合### ---------- - 函数说明:获取一段时间内指数行业板块的所有成分股集合 - 语法: `traderGetCodeListSet(Block, BeginDate, EndDate)` - 输入参数: |字段名 |类型 |说明| |:-|:-|:-| |block |char |1.<a href="https://www.digquant.com.cn/documents/11" target="_blank">指数名称</a>,如`'hs300'`可获得沪深300指数的权重与成分股。 2.<a href="https://www.digquant.com.cn/documents/12" target="_blank">行业名称</a>,如`'SWDZ1'`可获取申万电子一级行业的成分股。| |BeginDate|整型|开始日期| |EndDate|整型|开始日期| - 输出参数: struct结构体,包含以下字段 |字段 |类型 |说明| |:-|:-|:-| |Market|char|指数所属交易所代码,行业为空 |Code|char|指数的代码or行业首字母简称 |Name|char|行业或指数的详细名称 |BlockName|double|行业或指数简称 - 示例: 获取沪深300指数从20160802到20180802所有成分股信息 traderGetCodeListSet('hs300', 20160802, 20180802); 返回: ans = 1×399 struct array with fields: Market Code Name BlockName <span id="traderGetCurrentBarV2"></span> ### ▲ traderGetCurrentBarV2 - 获取当前bar信息 ### ---------- - 函数说明:(在[策略结构](#structure)中使用)根据策略刷新获得当前bar的信息 - 语法 `traderGetCurrentBarV2() ` - 输入参数: 无 - 输出参数: 返回两个变量,每个变量的含义如下 |变量名 |类型| 说明| | :- | :- |:-| |barNumber|整数|当前Bar的序列号,若刷新频率为日频,则返回的顺序是当前时间到开始日期的交易日序列;若非日频,则返回当天开盘至今的序列号| |barTime|double|Bar时间点,以Datenums形式存储| - 例子: 获取标的当前刷新时间点bar的位置和Bar的时间,按15分钟的频率在20180102至20180103运行回测 [barNumber, barTime]= traderGetCurrentBarV2() 返回: barNumber = 1 barTime = 7.3706e+05 barNumber = 2 barTime = 7.3706e+05 <span id="traderGetCurrentTickV2"></span> ### ▲ traderGetCurrentTickV2 - 获取当前tick信息 ### ---------- - 函数说明:(在[策略结构](#structure)中使用)根据标的资产查询当前刷新时刻的Tick数据 - 语法: `traderGetCurrentTickV2(TargetIdx)` - 输入参数: |字段名 |类型| 说明| | - | :- |:-| |TargetIdx| 整数|标的资产索引 - 输出结构: 多变量,其中每个变量的意义如下: |变量名|类型|说明| | :- | :- | :- | |Time|N*1 double型数组|时间列表以Matlab datanum形式存储| |Price|N*1 double型数组 |当前tick的成交价| |volume|N*1 double型数组 |当天至当前tick的累计成交量(忽略集合竞价部分)| |volumetick| N*1 double型数组 | 当前tick成交量| |turnover| N*1 double型数组| 当前tick的成交金额| |openinterest| N*1 double型数组|当前tick的持仓量| |bidprice |N*5 double型数组|当前tick的前五档委托买价(买一到买五)| |bidvolume| N*5 double型数组 |当前tick的前五档委托买量(买一到买五)| |askprice| N*5 double型数组 |当前tick的前五档委托卖价(卖一到卖五)| |askvolume| N*5 double型数组 |当前tick的委托卖量(卖一到卖五)| - 例子: 获取标的资产当前刷新时间点的tick数据情况 [TickNumber, Time, Price, Volume, VolumeTick, OpenInterest, BidPrice, BidVolume, AskPrice, AskVolume] = traderGetCurrentTickV2(1) 返回: TickNumber = 1 Time = 7.3706e+05 Price = 12.6200 Volume = 3046 VolumeTick = 2147 OpenInterest = 0 BidPrice = 12.6100 12.6000 12.5900 12.5800 12.5700 BidVolume = 54283 100 40200 41100 20700 AskPrice = 12.6200 12.6300 12.6400 12.6500 12.6600 AskVolume = 17800 47868 11400 89000 25700 <span id="traderGetFactor"></span> ### traderGetFactor - 获取BP因子### ---------- - 函数说明:根据标的资产,因子名称,返回因子的数值矩阵 - 语法: `traderGetFactor(FactorName, TargetList, BeginDate, EndDate)`; - 输入参数: |字段名 |类型| 说明| | - | :- |:-| |FactorName|char|<a href="https://www.digquant.com.cn/documents/2" target="_blank">BP因子名称</a>,只支持单个因子名 |TargetList|结构体|包含两个字段,Market,Code |BeginDate|整型|开始日期| |EndDate|整型|结束日期| - 输出结构: 返回3个变量,每个变量的意义如下: |变量名 |类型| 说明| | - | :- |:-| | Date| cell|交易日历序列 |TargetList| 结构体|标的资产列表 |Data| float|因子矩阵,行为日期,列为对应的标的 - 例子: 使用两个标的,获取其PE这个因子的数值 TargetList(1).Market = 'sse'; TargetList(1).Code = '600000'; % 浦发银行 TargetList(2).Market = 'sse'; TargetList(2).Code = '601699'; % 潞安环能 [Date, targetList, Data] = traderGetFactor('PE', TargetList, 20170101,20170201) 返回: Date = 736698 736699 736700 736701 736704 736705 736706 736707 736708 736711 736712 736713 736714 736715 736718 736719 736720 736721 targetList = 1×2 struct array with fields: Market Code Data = 1.0e+05 * 7.36700 00010 0111 7.36700 00010 0113 7.36700 00010 0116 7.36700 00010 0115 7.36700 00010 0115 7.36700 00010 0118 7.36710 00010 0120 7.36710 00010 0117 7.36710 00010 0116 7.36710 00010 0119 7.36710 00010 0118 7.36710 00010 0121 7.36710 00010 0121 7.36710 00010 0121 7.36720 00010 0123 7.36720 00010 0126 7.36720 00010 0125 7.36720 00010 0129 <span id="traderGetFundamentalSet"></span> ### (旧)traderGetFundamentalSet - 获取基本面信息数据 ### ---------- - 函数说明:根据标的资产,表名,字段名,开始日期和结束日期来获取数据库中的获取基本面信息数据 - 语法: `traderGetFundamentalSet(TargetList,CatName,ItemName,BeginDate,EndDate)` - 输入参数: |字段名 |类型| 说明| | - | :- |:-| |TargetList|结构体|包含Market和Code字段 |CatName| char|表名,具体请看<a href="https://www.digquant.com.cn/documents/6" target="_blank">数据介绍</a> |ItemName|char|字段名,具体请看<a href="https://www.digquant.com.cn/documents/6" target="_blank">数据介绍</a> |BeginDate| 整型, 如 20140608 |开始日期 |EndDate|整型, 如 20140609, 为 0 时取到当天|结束日期 - 输出结构: struct结构体,每个字段数据的长度与数据库中日期有关,其中每个字段的意义如下: |字段名|类型|说明| | - | :- | :- | |Market| char 数组|市场类型 |Code| char 数组|品种代码 |Date|double|时间以Matlab datenum日期数字形式存储| |对应查询的字段名|any|根据数据库的内容返回 - 例子: 获取潞安环能(601699)和东阿阿胶(000423)从20160101到20180101日,在表FS_DER中的{'WorkCapital','NWorkCapital','IC','TRe'}字段,分别对应为{营运资本,净营运资本,投入资本,留存收益} targetlist(1).Market='sse'; targetlist(2).Market='szse'; targetlist(1).Code='601699';% 潞安环能 targetlist(2).Code='000423';% 东阿阿胶 % 营运资本,净营运资本,投入资本,留存收益 result=traderGetFundamentalSet(targetlist,'FS_DER',{'WorkCapital','NWorkCapital','IC','TRe'},20160101,20180101) 返回: result = 16×1 struct array with fields: Market Code EndDate WorkCapital NWorkCapital IC TRe 注意: 1.行业可以作为标的进行查询,具体的行业代码见traderGetCodeList('plate_industry') 2.支持一次查询多个标的 <span id="traderGetHistorySet"></span> ### (旧)traderGetHistorySet - 获取日期序列数据### ---------- - 函数说明:根据标的资产,表名,字段名,开始日期和结束日期来获取数据库中的日期序列数据 - 语法: `traderGetHistorySet(Market,Code,CatName,ItemName,BeginDate,EndDate)` - 输入参数: |字段名 |类型| 说明| | - | :- |:-| |Market| char 数组|市场类型 |Code| char 数组|品种代码, |CatName| char|表名,具体请看<a href="https://www.digquant.com.cn/documents/13" target="_blank">数据介绍</a> |ItemName|char|字段名,具体请看<a href="https://www.digquant.com.cn/documents/13" target="_blank">数据介绍</a> |BeginDate| 整型, 如 20140608 |开始日期 |EndDate|整型, 如 20140609, 为 0 时取到当天|结束日期 - 输出结构: struct结构体,每个字段的长度与数据库中日期有关,其中每个字段的意义如下: |字段名|类型|说明| | - | :- | :- | |Date|double|时间以Matlab日期数字形式存储| |对应查询的字段名|any|根据数据库的内容返回 - 例子: 获取601699从20180401到20180501日,在表MKT_EQU_FLOW_ORDER中的{'InflowS','InflowM','InflowL','InflowXL'}字段,分别对应为{资金流入(小单),资金流入(中单),资金流入(大单),资金流入(超大单)} data=traderGetHistorySet('sse','601699','MKT_EQU_FLOW_ORDER',{'InflowS','InflowM','InflowL','InflowXL'},20180401,20180501) 返回: data = 18×1 struct array with fields: TradeDate InflowS InflowM InflowL InflowXL 注意: 1.行业可以作为标的进行查询,具体的行业代码见traderGetCodeList('plate_industry') 2.不支持一次查询多个标的 <span id="traderGetKData"></span> ### traderGetKData - 获取历史K线数据### ---------- - 函数说明:根据标的资产,频率,开始日期和结束日期获取bar行情信息 - 语法: `traderGetKData(Market, Code, KFrequency, KFreNum, BeginDate, EndDate, Filledup, FQ);` - 输入参数: |字段名 |类型| 说明| | - | :- |:-| |Market| char 数组|市场类型 |Code| char 数组|品种代码, |KFrequency| char数组|K 线的时间级别, 如 'day', 'min' |KFreNum|整数|K 线的频率 |BeginDate| 整型, 如 20140608 |开始日期 |EndDate|整型, 如 20140609, 为 0 时取到当天|结束日期, |FilledUp| logical|补齐类型, True补齐,False不补齐 |FQ| char 数组|复权类型, 'NA': 不复权;'FWard': 向前复权;'BWard': 向后复权 - 输出结构: 多变量,其中每个变量的意义如下: |变量名|类型|说明| | - | :- | :- | |Time|N*1 double型数组|bar的时间以Matlab日期数字形式存储| |Open|N*1 double型数组 |bar的开盘价| |High|N*1 double型数组 |bar的最高价| |Low| N*1 double型数组 |bar的最低价| |Close| N*1 double型数组|bar的收盘价| |volume| N*1 double型数组|bar的成交量| |turnover |N*1 double型数组|bar的成交金额| |openinterest| N*1 double型数组 |bar的持仓量| - 例子: 获取000004从20170101到20170331日线Bar数据,用8个不同的变量返回其结果 [Time, Open, High, Low, Close, Volume, TurnOver, OpenInterest] = traderGetKData('SZSE', '000004', 'day', 1, 20170101, 20170331, false, 'FWard'); <span id="traderGetLatestQuotationV2"></span> ### ▲ traderGetLatestQuotationV2 - 获取标的最新报价### ---------- - 函数说明:(在[策略结构](#structure)中使用)获取多组标的资产的最新报价情况(只适用于tick刷新) - 语法: ` traderGetLatestQuotationV2(TargetListIdx);` - 输入参数: |字段名 |类型| 说明| | - | :- |:-| |TargetListIdx|列表或者cell,整数|标的资产索引号| - 输出结构: |字段名 |类型| 说明| | - | :- |:-| |Market|char|标的资产所属交易所代码 |Code|char|标的资产的证券代码 |Time|double|最新报价的时间戳,datenums形式 |CurrentPrice|double|当前价 |CurrentVolume|double|当前成交量 - 例子: 在三个标的中,获取第一个和第三个标的的最新的报价情况 LatestQuotation = traderGetLatestQuotationV2([1,3]); <span id="traderGetMainContract"></span> ### traderGetMainContract - 获取主力合约的物理合约代码### ---------- - 函数说明:根据交易日历返回主力合约的物理合约 - 语法: `traderGetMainContract(Market, Code, BeginDate, EndDate);` - 输入参数: |字段名 |类型| 说明| | - | :- |:-| |Market| char 数组|市场类型 |Code| char 数组|品种代码, |BeginDate| 整形|开始日期 |EndDate| 整形|结束日期 - 输出结构: N*2 cell: |cell|类型|说明| | - | :- | :- | |Code|N*1 char数组|物理主力合约代码| |Date|N*1 double数组 |具体交易日历| - 例子: 获取沪深300主连合约在20180101至20180201的物理主力合约 data = traderGetMainContract('cffex', 'if0000', 20180101, 20180201); 返回: data = 23×2 cell array 'IF1801' [20180102] 'IF1801' [20180103] 'IF1801' [20180104] 'IF1801' [20180105] 'IF1801' [20180108] 'IF1801' [20180109] 'IF1801' [20180110] 'IF1801' [20180111] 'IF1801' [20180112] 'IF1801' [20180115] 'IF1801' [20180116] 'IF1801' [20180117] 'IF1803' [20180118] 'IF1803' [20180119] 'IF1803' [20180122] 'IF1803' [20180123] 'IF1803' [20180124] 'IF1803' [20180125] 'IF1803' [20180126] 'IF1803' [20180129] 'IF1803' [20180130] 'IF1803' [20180131] 'IF1803' [20180201] <span id="traderGetMarketSet"></span> ### (旧)traderGetMarketSet - 获取市场有关数据 ### ---------- - 函数说明:根据表名,字段名,开始日期和结束日期,获取数据库中与整体市场有关的日期序列数据 - 语法: `traderGetMarketSet(CatName,ItemName,BeginDate,EndDate)` - 输入参数: |字段名 |类型| 说明| | - | :- |:-| |CatName| char|表名,具体情况数据介绍 |ItemName|char|字段名,请看数据介绍 |BeginDate| 整型, 如 20140608 |开始日期 |EndDate|整型, 如 20140609, 为 0 时取到当天|结束日期 - 输出结构: struct结构体,每个cell的长度与数据库中日期有关,其中每个字段的意义如下: |字段名|类型|说明| | - | :- | :- | |Date|cell|时间以Matlab日期数字形式存储| |对应查询的字段名|cell|根据数据库的内容返回 - 例子: 获取从20180401到20180501日,在表MKT_EQUD_STATS中的{'StatsTypeClass','MarketValue','NegMarketValue','TurnoverVol','TurnoverValue'}字段,分别对应为{统计角度,市值,流通市值,成交量,成交金额},代表整个市场的状况 data=traderGetMarketSet('MKT_EQUD_STATS',{'StatsTypeClass','MarketValue','NegMarketValue','TurnoverVol','TurnoverValue'},20180401,20180501) 返回: data = 90×1 struct array with fields: TradeDate StatsTypeClass MarketValue NegMarketValue TurnoverVol TurnoverValue <span id="traderGetRegFactor"></span> ### ▲ traderGetRegFactor - 获取注册的BP因子### ---------- - 函数说明:(在[策略结构](#structure)中使用)根据已注册的BP因子获取BP因子数据(数据滑窗) - 语法: `traderGetRegFactor(Idx, length); ` - 输入参数: |字段名 |类型| 说明| | - | :- |:-| |idx| float矩阵|注册BP因子返回的矩阵变量 |length| 数值类型|例120, 表示返回从当前开始往前的120个数据序列 - 输出结构: (M*N)*length的矩阵,最新的数据在最后一列,其中每行的含义如下: M为标的数量 N为因子数量 |位置|类型| 说明| | - | :- |:-| |第一个标的第一个因子| float|返回的因子数值 |第一个标的第二个因子| float|返回的因子数值 |第二个标的第一个因子| float|返回的因子数值 |第二个标的第二个因子| float|返回的因子数值 - 例子: if binit % 注册PE和MA10两个因子 factor1=traderRegFactor('PE','MA10'); else % 获取注册后的因子数据,并取长度为2天的因子数据 factordata=traderGetRegFactor(factor1, 2) <span id="traderGetRegKData"></span> ### ▲ traderGetRegKData - 获取注册的K线数据### ---------- - 函数说明:(在[策略结构](#structure)中使用)根据已注册的数据序列获取K线数据(数据滑窗) - 语法: `traderGetRegKData(KIdx, length, fillup); ` - 输入参数: |字段名 |类型| 说明| | - | :- |:-| |Kidx| double矩阵|注册数据返回的矩阵变量,记录注册频率信息 |length| 数值类型|例120, 表示返回从当前开始往前的120个数据序列 |fillup| boolen|true:补齐;false:不补齐 - 输出结构: (8 x N)x length的矩阵,N为标的数,当存在多标的时,每个标的展示以行的方式扩展矩阵,最新的数据在最后一列,其中每行的含义如下: |字段|类型|说明| | - | :- | :- | |Time|1*length double型数组|bar的时间以Matlab datenum日期数字形式存储| |Open|1*length doublet型数组 |bar的开盘价| |High|1*length double型数组 |bar的最高价| |Low| 1*length double型数组 |bar的最低价| |Close| 1*length double型数组|bar的收盘价| |volume| 1*length double型数组|bar的成交量| |turnover |1*length double型数组|bar的成交金额| |openinterest| 1*length double型数组 |bar的持仓量(股票为0)| - 例子: if bInit % 判定是否策略开启启动 % 行情注册,1day级别的K线 idexD=traderRegKData('day',1); else % 构建数据滑窗,获取当前时刻过去5天不补齐的数据情况 data=traderGetRegKData(idexD,5,false) 其中data在策略回测中返回的情况是: 最右的一列为当前时刻的bar信息 data = 1.0e+08 * NaN NaN NaN NaN 0.0074 NaN NaN NaN NaN 0.0000 NaN NaN NaN NaN 0.0000 NaN NaN NaN NaN 0.0000 NaN NaN NaN NaN 0.0000 NaN NaN NaN NaN 0.0025 NaN NaN NaN NaN 5.1417 NaN NaN NaN NaN 0 <span id="traderGetRegTimeLine"></span> ### ▲ traderGetRegTimeLine - 获取策略的刷新时间轴### ---------- - 函数说明:(在[策略结构](#structure)中使用)获取策略运行的时间节点(刷新的时间轴) - 语法: ` traderGetRegTimeLine();` - 输入参数: 无 - 输出结构: |字段名 |类型| 说明| | - | :- |:-| |TL|double|整个策略刷新时间的时间轴,datenums格式 - 例子: if bInit % 判定是否策略开启启动 % 行情注册,15分钟的K线和5分钟的K线 idexD=traderRegKData('min',15); else % 注册之后,可以获取整个策略刷新的时间轴 TL=traderGetRegTimeLine() 返回: TL = 1.0e+05 * Columns 1 through 19 7.37067.37067.37067.37067.37067.37067.37067.37067.37067.37067.37067.37067.37067.37067.37067.37067.37067.37067.3706 Columns 20 through 38 7.37067.37067.37067.37067.37067.37067.37067.37067.37067.37067.37067.37067.37067.37067.37067.37067.37067.37067.3706 Columns 39 through 52 7.37067.37067.37067.37067.37067.37067.37067.37067.37067.37067.37067.37067.37067.3706 <span id="traderGetTargetInfo"></span> ### traderGetTargetInfo - 获取标的信息### ---------- - 函数说明:查询标的基本信息。 - 语法: `traderGetTargetInfo(Market, Code)` - 输入参数: |字段名 |类型 |说明| |:-|:-|:-| |Market |char |市场代码| |Code |char |交易品种代码| - 输出参数: struct结构体,其中每个字段的意义如下: |字段名 |类型 |说明| |:-|:-|:-| |Market |char |市场| |Code |char |标的代码| |Name |char |标的名称| |Type |double |标的类型 1 股票, 2 期货, 3 期权 |Multiple |double| 合约乘数| |MinMove |double| 最小变动单位| |TradingFeeOpen |double |开仓手续费率| |TradingFeeClose| double| 平仓手续费率| |TradingFeeCloseToday |double |当日平仓手续费| |LongMargin |double |多方保证金率| |ShortMargin |double |空方保证金率| |LastTradingDate |double |最后交易日| |以下为期权专用| |TargetMarket |char| 对标标的市场| |TargetCode |char |对标标的代码| |OptionType |char |期权类型(暂未提供)| |CallOrPut |double |认购认沽| |ListDate |double |首个交易日| |EndDate |double |最后交易日| |ExerciseDate |double| 期权行权日| |DeliveryDate |double |行权交割日| |CMUnit |double |合约单位| |ExercisePrice |double |期权行权价| |MarginUnit |double |单位保证金| 示例: 获取橡胶主力连续合约的信息 Data=traderGetTargetInfo('SHFE', 'ru0000') 返回 Data = struct with fields: Market: 'shfe' Code: 'ru0000' Name: '天胶1809' Type: 2 Multiple: 10 MinMove: 5 TradingFeeOpen: 5.4050e-05 TradingFeeClose: 5.4050e-05 TradingFeeCloseToday: 5.4050e-05 LongMargin: 0.1900 ShortMargin: 0.1900 TargetMarket: '' TargetCode: '' OptionType: '' CallOrPut: '' ListDate: 20170918 LastTradingDate: 20180917 EndDate: 4.3432e-311 ExerciseDate: 4.3437e-311 DeliveryDate: 1.5915e-314 CMUnit: 2.9644e-323 ExercisePrice: 0 MarginUnit: 1.5535e-315 <span id="traderGetTargetInfoV2"></span> ### ▲ traderGetTargetInfoV2 - 获取标的基本信息 ### ---------- - 函数说明:(在[策略结构](#structure)中使用)获取标的基本信息。 - 语法: `traderGetTargetInfoV2(TargetIdxA)` - 输入参数: |字段名 |类型 |说明| |:-|:-|:-| |TargetIdxA |列表,cell或者整数 |标的索引号序列| - 输出参数: struct结构体,每个字段的意义如下: |字段名 |类型 |说明| |:-|:-|:-| |Market |char |市场| |Code |char |合约代码| |Name |char |标的名称| |Type |double |标的类型 1 股票, 2 期货, 3 期权 |Multiple |double| 合约乘数| |MinMove |double| 最小变动单位| |TradingFeeOpen |double |开仓手续费率| |TradingFeeClose| double| 平仓手续费率| |TradingFeeCloseToday |double |当日平仓手续费| |LongMargin |double |多方保证金率| |ShortMargin |double |空方保证金率| |LastTradingDate |double |最后交易日| |以下为期权专用| |TargetMarket |char| 对标标的市场| |TargetCode |char |对标标的代码| |OptionType |char |期权类型(暂未提供)| |CallOrPut |double |认购认沽| |ListDate |double |首个交易日| |EndDate |double |最后交易日| |ExerciseDate |double| 期权行权日| |DeliveryDate |double |行权交割日| |CMUnit |double |合约单位| |ExercisePrice |double |期权行权价| |MarginUnit |double |单位保证金| - 例子: 在策略中获得索引号为1的标的资产的基本信息 Data=traderGetTargetInfoV2(1) 返回: Data = struct with fields: Market: 'shfe' Code: 'rb0000' Name: '螺钢1810' Type: 2 Multiple: 10 MinMove: 1 TradingFeeOpen: 2.6000e-05 TradingFeeClose: 2.6000e-05 TradingFeeCloseToday: 2.6000e-05 LongMargin: 0.1600 ShortMargin: 0.1600 TargetMarket: '' TargetCode: '' OptionType: '' CallOrPut: '' ListDate: 20171017 LastTradingDate: 20181015 EndDate: 2.3693e-308 ExerciseDate: 1.4182e-317 DeliveryDate: 9.8813e-324 CMUnit: 2.9644e-323 ExercisePrice: 6.3660e-314 MarginUnit: 1.5535e-315 <span id="traderGetTargetList"></span> ### ▲ traderGetTargetList - 获取策略标的列表### ---------- - 函数说明:(在[策略结构](#structure)中使用)获取标的资产列表。 - 语法: `traderGetTargetList()` - 输出参数: struct结构体,每个字段的意义如下: |字段|类型 |说明| |:-|:-|:-| |Market |char |市场| |Code |char |标的代码| - 例子: 获得索引号为1的标的资产的基本信息 Data=traderGetTargetList() 返回: Data = struct with fields: Market: 'SHFE' Code: 'RB0000' <span id="traderGetTickData"></span> ### traderGetTickData - 获取历史tick数据### ---------- - 函数说明:根据标的资产,日期查询当天的所有Tick数据(可以查询当天tick数据) - 语法: `traderGetTickData(Market, Code, Date, FQ);` - 输入参数: |字段名 |类型| 说明| | - | :- |:-| |Market| char 数组|市场类型 |Code| char 数组|品种代码, |Date| 整形|查询日期 |FQ| char 数组|复权类型, 'NA': 不复权;'FWard': 向前复权;'BWard': 向后复权 - 输出结构: 多变量,其中每个变量的意义如下: |变量|类型|说明| | :- | :- | :- | |Time|N*1 double型数组|时间列表以Matlab datanum形式存储| |Price|N*1 double型数组 |tick的成交价| |volume|N*1 double型数组 |当天的累计成交量| |volumetick| N*1 double型数组 | tick成交量| |turnover| N*1 double型数组| tick的成交金额,| |openinterest| N*1 double型数组|tick的持仓量| |bidprice |N*5 double型数组|tick的前五档委托买价(买一到买五)| |bidvolume| N*5 double型数组 |tick的前五档委托买量(买一到买五)| |askprice| N*5 double型数组 |tick的前五档委托卖价(卖一到卖五)| |askvolume| N*5 double型数组 |tick的委托卖量(卖一到卖五)| - 例子: 获取沪深300主连合约在20150601当天整天的Tick数据情况,以10个变量返回其结果 [Time, Price, Volume, VolumeTick, TurnOver, OpenInterest, BidPrice, BidVolume, AskPrice, AskVolume] = traderGetTickData('CFFEX', 'IF0000', 20150601, 'NA'); <span id="traderGetTradingDays"></span> ### traderGetTradingDays - 获取交易日历### ---------- - 函数说明:获取指定日期内,所有的交易日,如果endday为0,则返回从开始时间一直到最近一个交易日中间所有的交易日期。 - 语法: `traderGetTradingDays(BeginDay, EndDay)` - 输入参数: |字段名 |类型 |说明| |:-|:-|:-| |BeginDay |整形 |开始交易日期| |EndDay |整形 |结束交易日期| - 输出参数: ||类型|说明| |:-|:-|:-| |Days |一维矩阵|交易日期序列| - 例子: 获取20180101至20180201的交易日历 traderGetTradingDays(20180101,20180201) 返回: ans = Columns 1 through 16 20180102 20180103 20180104 20180105 20180108 20180109 20180110 20180111 20180112 20180115 20180116 20180117 20180118 20180119 20180122 20180123 Columns 17 through 23 20180124 20180125 20180126 20180129 20180130 20180131 20180201 <span id="traderGetTradingTime"></span> ### traderGetTradingTime - 获取交易时间### ---------- - 函数说明:根据具体标的的频率周期获取的交易时间。 - 语法: `traderGetTradingTime(TargetList,freq,BeginDay,EndDay)` - 输入参数: |字段名 |类型| 说明| |:-|:-|:-| |TargetList|结构体|标的资产,包含Market和Code两个字段| |freq|char|返回的时间精细级别'tick','sec','min','day'| |BeginDay|整型|开始日期| |EndDay |整型| 结束日期| - 输出参数: |字段名 |类型 |说明| |:-|:-|:-| |Time |一维矩阵 |交易时间,datenum格式,有多个标的时,会取各自时间的并集| |DayPos |一维矩阵 |该时间在所属日期bar序列数,有多个标的时,会取各自的并集再排序| - 例子: 获取3个期货品种在20180507至20180508,以1分钟划分的交易时间点 TargetList(1).Market = 'SHFE'; TargetList(1).Code = 'RB0000'; % 螺纹钢主力连续 TargetList(2).Market = 'SHFE'; TargetList(2).Code = 'AG0000'; % 白银主力 TargetList(3).Market = 'SHFE'; TargetList(3).Code = 'AL0000'; % 铝主力 [Time, DayPos] = traderGetTradingTime (TargetList, 'min', 20180507, 20180508); 返回 Time = 1.0e+05 * 7.3718 7.3718 7.3718 7.3718 . . DayPos = 1 2 3 4 . . ## 基本面信息数据 ## ---------- 基本面信息数据,请使用新版的API,具体可见数据字典介绍 ## 策略入口 ## <span id="traderRunBacktestV2"></span> ### traderRunBacktestV2 - 回测入口### ---------- - 函数说明:(回测函数入口)实现策略的回测。 - 语法: `traderRunBacktestV2(StrategyName,@TradeFun,varFunParameter,AccountList,TargetList,KFrequency,KFreNum,BeginDate,EndDate,FQ)` - 输入参数: |字段名 |类型 |说明 |:-|:-|:-| |StrategyName |char |自定义回测策略的名称 |TradeFun |函数对象 |主策略函数名 |varFunParameter |cell |策略函数中用到的参数 |AccountList |cell |账户名称,回测模式只允许单账号 |TargetList |结构体 |策略标的列表 Market : 市场类型,char;Code: 交易品种代码,char |KFreNum |整数|频率数值 |KFrequency |char |频率周期 |BeginDate |整型 |开始日期 |EndDate |整型 |结束日期 |FQ |char |复权类型, 'NA'为不复权, 'FWard'向前复权, 'BWard' 向后复权 - 输出: 策略回测完成后返回策略ID,可以用于调取策略回测绩效 |字段 |类型 |说明 |:-|:-|:-| |orderID |str |策略ID - 例子: 回测名为“matlab example test”的策略从20180102到20180103的绩效。 traderRunBacktestV2('matlab_example_test',@matlab_example_test, {stoploss,m,n},AccountList,TargetList,'min',15,20180102,20180103,'FWard'); - 注意: 1.回测的账户只能使用FutureBackReplay或者StockBackReplay,均可以交易所有标的 2.回测不允许使用多账户交易 3.参数不一定都需要在执行脚本中定义,在主策略函数里定义也是可以的 <span id="traderRunRealTradeV2"></span> ### traderRunRealTradeV2 - 实时模式入口### ---------- - 函数说明: 实现策略的实盘交易和模拟交易,只支持单一策略。 - 语法: `traderRunRealTradeV2(StrategyName, @TradeFun, varFunParameter, AccountList, TargetList, KFrequency, KFreNum, BeginDate, FQ)` - 输入参数: |字段名 |类型 |说明 |:-|:-|:-| |StrategyName |char |自定义回测策略的名称 |TradeFun |函数对象 |主策略函数名 |varFunParameter |cell |策略函数中用到的参数 |AccountList |cell |账户名称,回测模式只允许单账号 |TargetList |结构体 |策略标的列表 Market : 市场类型,char; Code: 交易品种代码,char |KFreNum |整数|频率数值 |KFrequency |char |频率周期 |BeginDate |整型 |开始日期 |FQ |char |复权类型, 'NA'为不复权, 'FWard'向前复权, 'BWard' 向后复权 - 输出: 无 - 例子: 从20180502起,在指定的标的下,实现策略的模拟交易和实盘交易 traderRunRealTradeV2('matlab_example_test',@matlab_example_test, {stoploss,m,n},AccountList,TargetList,'min',15,20180502,'FWard'); - 注意: 1.实盘交易和模拟交易都是使用traderRunRealTradeV2,通过账户名来区分,配置账户在AT客户端上设置 2.BeginDate的作用于设定数据开始位置,构建的数据滑窗时间轴不能早于BeginDate,否则将返回NaN或者“” 3.实时模式下的手续费以及滑点等不能设置,实盘根据经纪商设定,模拟交易根据系统默认设置 4.如果在实时交易时间里启动策略,BeginDate不能填写当天,否则会出错 ## 数据处理 ## <span id="traderRegFactor"></span> ### ▲ traderRegFactor - BP因子注册### ---------- - 函数说明:(在[策略结构](#structure)中使用)注册策略要使用的BP因子(目前仅限于股票) - 语法: `traderRegFactor(FactorName1,FactorName2,……)` - 输入参数: |字段名 |类型 |说明 |:-|:-|:-| |FactorName |char |因子名称,具体见数据介绍 - 输出参数: |字段|类型 |说明 |:-|:-|:-| |Idx |double矩阵 |每一行代表一个标的,列为系统用于构建数据滑窗的数据 - 例子: 使用PE和MA10两个因子,获取所有标的在当前时刻往前5根K线的数据 if bInit % 判定是否策略开启启动 % BP因子注册,使用PE和MA10两个因子 factor1=traderRegFactor('PE','MA10'); else % 获取注册后的因子数据 factordata=traderGetRegFactor(factor1, 1) - 注意: 1.一般`traderRegFactor`返回的变量都需要使用在主策略函数里定义为全局变量,不然没办法在后续的函数运行中被调用 2.支持同时注册多个因子 3.因子的数值是数据库里是日数值,默认交易日结束才更新,所以时间在交易时间,只能拿到前一天的因子数值 <span id="traderRegKData"></span> ### ▲ traderRegKData - 行情数据注册### ---------- - 函数说明:(在[策略结构](#structure)中使用)注册策略要使用的行情数据频率 - 语法: `traderRegKData(KFrequency, KFreNum)` - 输入参数: |字段名 |类型 |说明 |:-|:-|:-| |KFrequency |char |频率周期,支持‘tick’,‘min’,‘day' |KFreNum |整数 |频率数值 - 输出参数: |字段|类型 |说明 |:-|:-|:-| |Idx |double矩阵 |每一行代表一个标的,列为系统用于构建数据滑窗的数据 - 例子: 获取所有标的在当前时刻往前5根K线的数据(15min频率) if bInit % 判定是否策略开启启动 % 行情注册,15分钟的K线和5分钟的K线 idexD=traderRegKData('min',15); else % 获取所有标的在当前时刻往前5根K线的数据(15min频率) data=traderGetRegKData(idexD, 5, false); 返回: idexD = 2 1 0 注意: 1.一般`traderRegKData`返回的变量都需要使用在主策略函数里定义为全局变量,不然没办法在后续的函数运行中被调用 2.当存在多个标的,然后`traderGetRegKData`只想拿某个标的时,通过筛选行就可以实现,例如`traderGetRegKData(idexD(1,:), 5, false)`就只拿到第一个标的的数据 <span id="traderSetBacktest"></span> ### traderSetBacktest - 设定回测细节### ---------- - 函数说明:(回测入口前使用)设置回测初始信息。 - 语法: `traderSetBacktest(InitialCash,Costfee,Rate,SlidePrice,PriceLoc,DealType,LimitType)` - 输入参数: |字段名 |类型 |说明 |:-|:-|:-| |InitialCash |double |初始资本 |Costfee |double |手续费率(所有品种统一设置) |Rate |double |无风险利率 |SlidePrice |double |滑点倍数 |PriceLoc |char |市价单成交位置 :0-当前bar收盘价; 1-下一个bar开盘价; 2-下一个bar第二个tick; n-下一个bar第n个tick; 默认为1 |DealType |char |市价单成交类型: 0-成交价; 1-对方最优价; 2-己方最优价 默认为0 |LimitType |char |限价单成交方式: 0-直接成交; 1-下一个bar内没有该价格时,撤单处理; 默认为0 - 输出: 无 - 例子 在回测时设置初始资本1000000元、手续费率0.0025、无风险利率0.02、滑价0、默认1下一个bar的开盘价、默认0成交价、默认0直接成交 traderSetBacktest(1000000,0.0025,0.02,0,1,0,0) <span id="traderSetMarketOrderHoldingType"></span> ### ▲ traderSetMarketOrderHoldingType - 设定市价单状态### ---------- - 函数说明: (在[策略结构](#structure)中使用)设置市价单保持状态,只适用于回测 - 语法: `traderSetMarketOrderHoldingType(MarketOrderHolding)` - 输入参数: |字段名 |类型 |说明 |:-|:-|:-| |MarketOrderHolding |logical |当一下根bar成交量为0时,true,则在成交量等于0时撤单,false则为保持状态 - 输出: 无 - 例子 traderSetMarketOrderHoldingType(true); ## 账户信息获取 ## <span id="traderGetAccountInfoV2"></span> ### ▲ traderGetAccountInfoV2 - 获取账户资金情况### ---------- - 函数说明: (在[策略结构](#structure)中使用)通过账户句柄索引序列号获得账户当前资金情况 - 语法: `traderGetAccountInfoV2(HandleIdx)` - 输入参数 |字段名|类型|说明| |:-|:-|:-| |HandleIdx|列表,cell或者整数|账户句柄索引序列号| - 输出参数: 返回多个变量,每个变量的意义如下: |字段|类型 |说明 |:-|:-|:-| |ValidCash |double |账户当前可用资金 |HandListCap |double |账户当前总动态权益 |OrderFrozen |double |下单冻结资金总额 |MarginFrozen |double |占用保证金资金总额 |PositionProfit |double |持仓盈亏 - 示例: 获得索引号为1的标的资产的账户资金信息 [ValidCash, HandListCap,OrderFrozen, MarginFrozen,PositionProfit] = traderGetAccountInfoV2(1) 返回: ValidCash = 1000000 HandListCap = 1000000 OrderFrozen = 0 MarginFrozen = 0 PositionProfit = 0 <span id="traderGetAccountPositionDirV2"></span> ### ▲ traderGetAccountPositionDirV2 - 根据头寸方向获取持仓信息### ---------- - 函数说明:(在[策略结构](#structure)中使用)获得指定账户,指定标的资产的当前多头或者空头的仓位信息。 - 语法: `traderGetAccountPositionDirV2(HandleIdx,TargetIdx,LongShort)` - 输入参数: |字段名 |类型 |说明 |:-|:-|:-| |HandleIdx |列表,cell或者整数 |账户句柄索引序列号 |TargetIdx |列表,cell或者整数 |交易标的索引序列号 |LongShort |char |'Long'表示多头 'Short'表示空头 - 输出参数: 返回3个变量,每个变量的意义如下: |字段|类型 |说明 |:-|:-|:-| |Position |double |当前多头或者空头持仓 |Frozen |double |当前多头或者空头冻结持仓 |AvgPrice |double |当前多头或者空头平均价格 - 例子: 获得第一个账户,索引号为1的标的资产的多头持仓 [Position, Frozen, AvgPrice] = traderGetAccountPositionDirV2(1, 1, 'Long') 返回: Position = 0 Frozen = 0 AvgPrice = 0 <span id="traderGetAccountPositionV2"></span> ### ▲ traderGetAccountPositionV2 - 获取仓位信息### ---------- - 函数说明:(在[策略结构](#structure)中使用)获得标的资产在指定账户里仓位信息。 - 语法: `traderGetAccountPositionV2(HandleIdx,TargetIdx)` - 输入参数 |字段名 |类型 |说明 |:-|:-|:-| |HandleIdx |列表,cell或者整数 |账户句柄索引序列号 |TargetIdx |列表,cell或者整数 |交易标的索引序列号 - 输出参数: 3个变量,每个变量的代表意义如下: |字段|类型 |说明 |:-|:-|:-| |Position |double|当前多头或者空头持仓 |Frozen |double|当前多头或者空头冻结持仓 |AvgPrice |double |当前多头或者空头平均价格 - 例子: 获得第一个账户,索引号为1的标的资产的持仓 [Position, Frozen, AvgPrice] = traderGetAccountPositionV2(1, 1) 返回: Position = 0 Frozen = 0 AvgPrice = 0 ## 开平仓操作 ## <span id="traderBuyToCoverV2"></span> ### ▲ traderBuyToCoverV2 - 买入平仓### ---------- - 函数说明:(在策略结构中)空单的平仓下单,即买入平仓下单。 - 语法: `traderBuyToCoverV2(HandleIdx,TargetIdx,Contracts,Price,PriceType,OrderTag)` - 输入参数: |字段名 |类型 |说明 |:-|:-|:-| |HandleIdx |整数|账户句柄索引序列号 |TargetIdx |整数|交易标的索引序列号 |Contracts |必须为大于零的整数 |下单数量 |Price |double |价格,市价单价格为0 |PriceType |char |下单价格类型 'market': 市价 'limit': 限价 |OrderTag |char |订单标记,用户可以自定义 - 输出参数: |字段名 |类型 |说明 |:-|:-|:-| |orderID |整数 |委托记录号,跟随策略启动进行编号 - 功能描述: 若计划买平5手, 1.无持仓,此次买平无效,最后无持仓 2.原有2手多单,此次买平无效,维持买平前的一切状态,最后持仓是:2手多单 3.若有7手空单,计划买平5手后,账号最后持仓为:max(7-5,0)=2,即要么还有7-5=2手空单,要么无持仓 ---------- - 例子: 使用第一个账户,索引号为1的标的资产的持仓,以市价买入平仓,数量为1,并把这个订单标记为‘buy’,返回的订单ID用SellOrderID记录 SellOrderID=traderBuyToCoverV2(1, 1, 1, 0, 'market', 'buy'); - 注意: 1.PriceType指定为‘market’的话,price使用0 2.OrderID用于止盈止损的订单跟踪,从0开始编号,每次策略重启后会重新编号 <span id="traderBuyV2"></span> ### ▲ traderBuyV2 - 买入开仓(考虑持仓)### ---------- - 函数说明:(在策略结构中)买入开仓下单,若初始有空头持仓,则先平仓,再买入。 - 语法: `traderBuyV2(HandleIdx,TargetIdx,Contracts,Price,PriceType,OrderTag)` - 输入参数: |字段名 |类型 |说明 |:-|:-|:-| |HandleIdx |整数|账户句柄索引序列号 |TargetIdx |整数|交易标的索引序列号 |Contracts |必须为大于零的整数 |下单数量 |Price |double |价格,市价单价格为0 |PriceType |char |下单价格类型 'market': 市价 'limit': 限价 |OrderTag |char |订单标记,用户可以自定义 - 输出参数: |字段|类型 |说明 |:-|:-|:-| |orderID |整数 |委托记录号,跟随策略启动进行编号 - 功能描述: 若计划买开5手, 1.无持仓,直接买开5手多单,最后持仓是:5手多单 2.原有3手空单,则市价平3手空单,再买开5手多单,最后持仓是:5手多单 3.原有2手多单,再买开5手多单,最后持仓是:2+5=7手多单 ---------- - 例子: 获得第一个账户,索引号为1的标的资产的持仓,以市价买入开仓,数量为1,并把这个订单标记为‘buy’,返回的订单ID用OrderID记录 orderID = traderBuyV2(1, 1, 1, 0, 'market', 'buy'); - 注意: 1.PriceType指定为‘market’的话,price必须使用0 2.OrderID用于止盈止损的订单跟踪,从1开始编号,每次策略重启后会重新编号 3.委托订单成交的位置会在下一根K线(回测中根据设置),回报会在下一次策略刷新时获取 <span id="traderCancelOrderV2"></span> ### ▲ traderCancelOrderV2 - 撤销未成交单### ---------- - 函数说明:(在策略结构中)撤销未成交的限价单 - 语法: `traderCancelOrderV2(HandleIdx, OrderID);` - 输入参数: |字段名 |类型| 说明| | - | :- |:-| |HandleIdx| 整数|账户索引,顺序根据策略入口时指定的AccountList |OrderID| 整数|委托订单系统生成的OrderID - 输出结构: 无 - 例子: 撤销BuyOrderID限价单 traderCancelOrderV2(1,BuyOrderID); <span id="traderCloseAllV2"></span> ### ▲ traderCloseAllV2 - 全平### ---------- - 函数说明: (在策略结构中)全平指定账户所有持仓(不包含冻结部分)。 - 语法: `traderCloseAllV2(HandleIdx)` - 输入参数: |字段|类型 |说明 |:-|:-|:-| |HandleIdx |整数|账户句柄索引序列号 - 输入参数: 无 - 例子: 获得索引号为1的标的资产的持仓 [Position, Frozen, AvgPrice] = traderGetAccountPositionV2(1, 1); <span id="traderDirectBuyV2"></span> ### ▲ traderDirectBuyV2 - 买入下单(不考虑持仓)### ---------- - 函数说明:(在策略结构中)买入下单,初始持仓无影响。 - 语法: `traderDirectBuyV2(HandleIdx, TargetIdx, Contracts, Price, PriceType,OrderTag)` - 输入参数: |字段名 |类型 |说明 |:-|:-|:-| |HandleIdx |整数|账户句柄索引序列号 |TargetIdx |整数|交易标的索引序列号 |Contracts |必须为大于零的整数 |下单数量 |Price |double |价格,市价单价格为0 |PriceType |char |下单价格类型 'market': 市价 'limit': 限价 |OrderTag |char |订单标记,用户可以自定义 - 输出参数: |字段|类型 |说明 |:-|:-|:-| |orderID |整数 |委托记录号,跟随策略启动进行编号 - 功能描述: 若计划买开5手: 1.无持仓,直接买开5手,最后持仓为:5手多单 若账号已有空单: 2.如果空单数量大,例如空单7手,则最后仓位为:7-5=2手空单 3.如果买开数量大,例如空单3手,则最后仓位为:5-3=2手多单 4.已有3手买开,再买开5手,最后持仓是3+5=8手多单 ---------- - 例子: 获得第一个账户,索引号为1的标的资产的持仓,以市价买入开仓(不考虑原来持仓),数量为1,并把这个订单标记为‘buy’,返回的订单ID用OrderID记录 orderID = traderDirectBuyV2(1, 1, 1, 0, 'market', 'buy'); <span id="traderDirectSellV2"></span> ### ▲ traderDirectSellV2 - 卖出开仓(不考虑持仓) ### ---------- - 函数说明:(在策略结构中)卖出下单,初始持仓无影响。 - 语法: `traderDirectSellV2(HandleIdx, TargetIdx, Contracts, Price, PriceType, OrderTag)` - 输入参数: |字段名 |类型 |说明 |:-|:-|:-| |HandleIdx |整数|账户句柄索引序列号 |TargetIdx |整数|交易标的索引序列号 |Contracts |必须为大于零的整数 |下单数量 |Price |double |价格,市价单价格为0 |PriceType |char |下单价格类型 'market': 市价 'limit': 限价 |OrderTag |char |订单标记,用户可以自定义 - 输出参数: |字段|类型 |说明 |:-|:-|:-| |orderID |int |委托记录号,跟随策略启动进行编号 功能描述: 若计划卖开5手, 1.账号无持仓,直接卖开5手空单 若账号已有多单, 2.如果卖开数量大,例如空单3手,则先平3手多单,再卖开5-3=2手空单.最后持仓是:2手空单 3.如果多单数量大,例如空单8手,则最后仓位为:8-5=3手多单[即多单被平了5手 4.若账号已有2手空单,再卖开5手,最后持仓的数量是:2+5=7手空单 ---------- - 例子: 获得第一个账户,索引号为1的标的资产的持仓,以市价卖出开仓,数量为1,并把这个订单标记为‘sell’,返回的订单ID用OrderID记录 orderID = traderDirectSellV2(1, 1, 1, 0, 'market', 'sell'); <span id="traderOrderFilledPriceV2"></span> ### ▲ traderOrderFilledPriceV2 - 获取成交单价格### ---------- - 函数说明:(在策略结构中)判断限价单是否已经成交 - 语法: `traderOrderFilledPriceV2(HandleIdx, OrderID);` - 输入参数: |字段名 |类型| 说明| | - | :- |:-| |HandleIdx| 整数|账户索引,顺序根据策略入口时指定的AccountList |OrderID| 整数|委托订单系统生成的OrderID - 输出结构: |字段名 |类型| 说明| | - | :- |:-| |Price|double|限价单是否成交,若0,则未成交;若成交,则返回值为成交价,部分成交则返回部分成交的均价 - 例子: 判断BuyOrderID这个限价单是否已经成交 Price=traderOrderFilledPriceV2(1,BuyOrderID); <span id="traderPositionToV2"></span> ### ▲ traderPositionToV2 - 调仓到指定仓位### ---------- - 函数说明:指定账户,指定标的资产调仓到指定仓位 - 语法: `traderPositionToV2(HandleIdx,TargetIdx,Position,Price,PriceType,OrderTag)` - 输入参数: |字段名 |类型 |说明 |:-|:-|:-| |HandleIdx |整数|账户句柄索引序列号 |TargetIdx |整数|交易标的索引序列号 |Position |double |目标仓位数量,正负代表多空, 数值代表仓位数量 |Price |double |价格,市价单价格为0 |PriceType |char |下单价格类型 'market': 市价 'limit': 限价 |OrderTag |char |订单标记,用户可以自定义 - 输出参数: |字段|类型 |说明 |:-|:-|:-| |orderID |整数 |委托记录号,跟随策略启动进行编号 功能描述: 1.计划调整为指定仓位:5,(多单或者空单) 账号无持仓:则相应开多或者开空5手 2.初始持仓为3手多单: 计划调整为5手空单,平3手多单,开5手空单,最后持仓:5手空单 计划调整为5手多单,最后持仓:5手多单 3.初始持仓为2手空单: 计划调整为5手多单,则平2手空单,再开5手多单,最后持仓:5手多单 计划调整为5手空单,最后持仓:5手空单 ---------- - 例子: - 获得第一个账户,索引号为1的标的资产的持仓,以市价调仓到数量为5,并把这个订单标记为‘target’,返回的订单ID用OrderID记录 orderID = traderPositionToV2(1, 1, 5, 0, 'market', 'target'); <span id="traderSellShortV2"></span> ### ▲ traderSellShortV2 - 卖出开仓(考虑持仓) ### ---------- - 函数说明:(在策略结构中)卖出开仓下单,若初始有多头持仓,则先平仓,再卖出。 - 语法: `traderSellShortV2(HandleIdx,TargetIdx,Contracts,Price,PriceType,OrderTag)` - 输入参数: |字段名 |类型 |说明 |:-|:-|:-| |HandleIdx |整数|账户句柄索引序列号 |TargetIdx |整数|交易标的索引序列号 |Contracts |必须为大于零的整数 |下单数量 |Price |double |价格,市价单价格为0 |PriceType |char |下单价格类型 'market': 市价 'limit': 限价 |OrderTag |char |订单标记,用户可以自定义 - 输出参数: |字段|类型 |说明 |:-|:-|:-| |orderID |整数 |委托记录号,跟随策略启动进行编号 功能描述: 若计划卖开5手, 1.账号无持仓,直接卖开5手空单,最后持仓:5手空单 2.有3手多单,先市价平3手多单,在卖开5手空单,最后持仓:5手空单 3.有2手空单,再卖开5手空单,最后持仓:2+5=7手空单 ---------- - 例子: 获得第一个账户,索引号为1的标的资产的持仓,以市价卖出开仓,数量为1,并把这个订单标记为‘sell’,返回的订单ID用OrderID记录 orderID = traderSellShortV2(1, 1, 1, 0, 'market', 'sell'); <span id="traderSellV2"></span> ### ▲ traderSellV2 - 卖出平仓### ---------- - 函数说明:(在策略结构中)多单的平仓下单,即卖出平仓下单。 - 语法: `traderSellV2(HandleIdx,TargetIdx,Contracts,Price,PriceType,OrderTag)\\` - 输入参数: |字段名 |类型 |说明 |:-|:-|:-| |HandleIdx |整数|账户句柄索引序列号 |TargetIdx |整数|交易标的索引序列号 |Contracts |必须为大于零的整数 |下单数量 |Price |double |价格,市价单价格为0 |PriceType |char |下单价格类型 'market': 市价 'limit': 限价 |OrderTag |char |订单标记,用户可以自定义 - 输出参数: |字段名 |类型 |说明 |:-|:-|:-| |orderID |整数 |委托记录号,跟随策略启动进行编号 - 功能描述: 若计划卖平5手, 1.无持仓,此次卖平无效,最后无持仓 2.原有2手空单,此次卖平无效,维持卖平前的一切状态,最后持仓是:2手空单 3.若有7手多单,计划卖平5手后,账号最后持仓为:max(7-5,0)=2,即要么还有7-5=2手多单,要么无持仓 ---------- - 例子: 获得第一个账户,索引号为1的标的资产的持仓,以市价卖出平仓,数量为1,并把这个订单标记为‘sell’,返回的订单ID用SellOrderID记录 SellOrderID=traderSellV2(1, 1, 1, 0, 'market', 'sell'); - 注意: 1.PriceType指定为‘market’的话,price使用0 2.OrderID用于止盈止损的订单跟踪,从0开始编号,每次策略重启后会重新编号 ## 止盈止损操作 ## <span id="traderCancelStopOrderV2"></span> ### ▲ traderCancelStopOrderV2 - 撤销止盈止损单### ---------- - 函数说明:(在策略结构中)根据止盈止损单生成的OrderID撤销未触发的止盈止损单 - 语法: ` traderCancelStopOrderV2(HandleIdx, OrderID);` - 输入参数: |字段名 |类型| 说明| | - | :- |:-| |HandleIdx| 整数|账户索引,顺序根据策略入口时指定的AccountList |OrderID| 整数|需撤销的止盈止损单的订单号 - 输出结构: 无 - 例子: 获取账户的当前持仓信息。若没有持仓则下单,下单数量1手,价格为0,市价单,标记这个单为'buy1';若有持仓则撤销现有的止损单。 [Position,Frozen,AveragePrice]=traderGetAccountPositionV2(1,1); if Position==0 BuyOrderID=traderBuyV2(1,1,1,0,'market','buy1'); OrderID=traderStopLossByOrderV2(1,BuyOrderID,3,'point','market','stop1'); else traderCancelStopOrderV2(1,OrderID); <span id="traderStopLossByOrderV2"></span> ### ▲ traderStopLossByOrderV2 - 根据订单设置止损### ---------- - 函数说明: (在策略结构中)针对指定订单以固定的点位或者比例止损(以tick数据进行匹配,仅在匹配成功时成交) - 语法: `traderStopLossByOrderV2(HandleIdx, TargetOrderID, StopGap, StopType, OrderCtg, OrderTag)` - 输入参数: |字段名 |类型 |说明 |:-|:-|:-| |HandleIdx |整数 |账户句柄索引 |TargetOrderID |整数 |止损指令针对的订单(委托时生成的OrderID) |StopGap |double |止损阈值, 当stopType为'Point'时,其数值代表价格变动的点数, 当stopType为'Percent'时,其数值代表价格变动百分比,如3表示3% |StopType |char |止损类型 'Point': 按价格点数止损,在订单成交价格的基础上变动指定点数则触发止损条件 'Percent':按照价格变化的百分比率止损,在订单成交价格的基础上变动指定百分比则触发止损条件 |OrderCtg |char |下单价格类型: 'market': 市价成交 |OrderTag |char |订单标记 - 输出参数: |字段名|类型 |说明 |:-|:-|:-| |StopOrderID |整数 |订单号 - 例子: 买入下单,根据买入的订单设置止损单。以点数作为止损标准,亏损6个指数点将以市价止损. orderID=traderBuyV2(1,1,1,0,'market','buy'); StopOrderID=traderStopLossByOrderV2(1, orderID, 6, 'point', 'market', 'stop1'); - 注意: 1.使用止盈止损时设置的Point或者Percent,计算触发价格会根据该品种的最小变动单位四舍五入取整 2.Point指的是价格点数,并非最小变动单位 <span id="traderStopProfitByOrderV2"></span> ### ▲ traderStopProfitByOrderV2 - 根据订单设置止盈 ### ---------- - 函数说明: (在策略结构中)针对指定订单以固定的点位或者比例止盈(以tick数据进行匹配,仅在匹配成功时成交) - 语法: `traderStopProfitByOrderV2(HandleIdx,TargetOrderID,StopGap,StopType,OrderCtg,OrderTag)` - 输入参数: |字段名 |类型 |说明 |:-|:-|:-| |HandleIdx |整数 |账户句柄索引 |TargetOrderID |整数 |止损指令针对的订单(委托时生成的OrderID) |StopGap |double |止盈阈值, 当stopType为'Point'时,其数值代表价格变动的点数, 当stopType为'Percent'时,其数值代表价格变动百分比,如3表示3% |StopType |char |止盈类型 'Point': 按价格点数止损,在订单成交价格的基础上变动指定点数则触发止盈条件 'Percent':按照价格变化的百分比率止盈,在订单成交价格的基础上变动指定百分比则触发止盈条件 |OrderCtg |char |下单价格类型: 'market': 市价成交 |OrderTag |char |订单标记 - 输出参数: |字段|类型 |说明 |:-|:-|:-| |StopOrderID |整数 |订单号 - 例子: 买入下单,根据买入的订单设置止损单。以点数作为止盈标准,获利6个指数点将以市价止盈。 orderID=traderBuyV2(1,1,1,0,'market','buy'); StopOrderID=traderStopProfitByOrderV2(1, orderID, 6, 'point', 'market', 'stop1'); - 注意: 1.使用止盈止损时设置的Point或者Percent,计算触发价格会根据该品种的最小变动单位四舍五入取整 2.Point指的是价格点数,并非最小变动单位 <span id="traderStopTrailingByOrderV2"></span> ### ▲ traderStopTrailingByOrderV2 - 追踪止盈### ---------- - 函数说明: (在策略结构中)针对指定订单跟踪止盈(以tick数据进行匹配,仅在匹配成功时成交) - 语法: `traderStopTrailingByOrderV2(HandleIdx, TargetOrderID, StopGap, StopType, TrailingGap, TrailingType, OrderCtg, OrderTag)` - 输入参数: |字段名 |类型 |说明 |:-|:-|:-| |HandleIdx |整数 |账户句柄索引 |TargetOrderID |整数 |止损指令针对的订单(委托时生成的OrderID) |StopGap |double |止盈阈值, 当stopType为'Point'时,其数值代表价格变动的点数, 当stopType为'Percent'时,其数值代表价格变动百分比,如3表示3% |StopType |char |止盈类型 'Point': 按价格点数止损,在订单成交价格的基础上变动指定点数则触发止盈条件 'Percent':按照价格变化的百分比率止盈,在订单成交价格的基础上变动指定百分比则触发止盈条件 |TrailingGap |double |跟踪止盈触发的回撤条件 当TrailingType为'Point'时,其数值代表价格变动的点数, 当TrailingType为'Percent'时,其数值代表价格变动百分比,如3表示3%。若价格先触及stopGap,又触及此条件,则进行对应的止盈下单 |TrailingType |char |跟踪止盈类型 Point': 按价格点数止盈,从触发止盈条件时刻开始,回撤达到指定点数则进行止盈操作 'Percent':按照价格变化的百分比率止盈,从触发止盈条件时刻开始,回撤达到指定百分比则进行止盈操作 |OrderCtg |char |下单价格类型: 'market': 市价成交 |OrderTag |char |订单标记 - 输出参数: |字段|类型 |说明 |:-|:-|:-| |ClientOrderID |int |订单号 - 例子: 买入下单,当价格亏损 1 %时止损,当价格上涨20%之后,回撤2%将触发追踪止盈。 orderID=traderBuyV2(1,1,1,0,'market','buy'); StopOrderID=traderStopLossByOrderV2(1, orderID, 1, 'Percent', 'market', 'stoplossB'); TrailingStopOrderID=traderStopTrailingByOrderV2(1, orderID, 20, 'Percent', 2, 'Percent', 'market', 'trailingB'); - 注意: 1.使用止盈止损时设置的Point或者Percent,计算触发价格会根据该品种的最小变动单位四舍五入取整 2.Point指的是价格点数,并非最小变动单位 ## 日志输出 ## <span id="traderPutLog"></span> ### ▲ traderPutLog - 打印日志### ---------- - 函数说明: (在策略结构中)构造 log 信息发送至 AT,不能在注册阶段使用 - 语法: `traderPutLog(Log)` - 输入参数: |字段名 |类型 |说明 |:-|:-|:-| |Log |char |需要在AT上面输出的文本信息 - 输出参数: 无 - 例子: 在策略中输出'Welcome To AT' traderPutLog('Welcome To AT') # 高阶应用 ------ AT提供以下几个高阶应用给用户,让用户在写策略的时候可以有更多的自主性,便利性以及极大使用计算机性能,主要包括以下几个方面: 1.策略使用用户自建的函数(以行情数据或者因子数据为基础) 2.使用并行运算模式 3.策略使用用户准备的外部数据(纯数据,不涉及运算) 4.参数检查模式 5.清除Matlab缓存文件 6.通过Matlab工具箱获取策略回测后的绩效报告 以上个应用场景会配以特定的API使用,并且会增加代码的理解难度,以及可能会导致策略的计算顺序改变,某些特定的场景甚至会导致用户无法在策略代码中断点调试(如并行运算) ## 应用一:策略使用用户自建的函数 ### 案例 ------ **以行情数据或者因子数据为基础再构建函数** 使用自建函数主要是为了在策略运行中,会使用行情数据或者因子数据做一些较为复杂的计算,如果在策略运行过程中运算,会导致策略运行速度变慢,而且代码显得臃肿,比较难快速把握到策略的思路,因此使用这个功能,可以实现以上几个问题。主要的步骤如下: 1.在注册阶段,注册行情数据,BP因子数据(如有需要) 2.在注册阶段,使用`traderRegUserIndi`注册,以及参数传递 3.在主策略函数之后,定义自建函数,以`(cellPar,bpPFCell)`作为参数 4.在策略运行阶段,使用`traderGetRegUserIndi`获取函数运行的结果 具体实施过程请看例子: 主策略函数 ``` function testATRfunctionV2(bInit,bDayBegin,cellPar)% %% 函数说明 % 上面的三个参数是一种固定结构。 % bInit,在策略逻辑运行前为1,当bInit为0时,交易启动。 % bDayBegin判断是否为一天的开始。 %% 外部和全局参数声明 % 这是一个固定结构. % 日数据是分钟数据的合成.如在日中获取日数据,仅是已出现分钟数据的合成,不包含之后的数据。 global g_idxKOneMin; % 注册1分钟数据的index,交易刷新频率 global g_idxKFiveMin; % 注册5分钟数据的index,信号计算频率 global g_idxSignal; % 注册自建函数的index global TLen; nbar = cellPar{1}; range = cellPar{2}; Freq = cellPar{3}; initial = cellPar{4}; if bInit %% 初始化回测帐户 % 数据只有先注册才能使用 % 基本数据注册 % traderRegKData('day',Freq).Freq为bar的周期。数据的更新频率依据外部运行命令。分钟获取,将'day'变为'min'。 % 自定义函数注册 % traderRegUserIndi(@Fun,{para1,para2,...})。 % Fun为自定义函数,其固定结构参考后面代码,大括号内为函数输入参数。 g_idxKOneMin = traderRegKData('min',1);%交易频率 g_idxKFiveMin = traderRegKData('min',Freq);%信号频率 g_idxSignal = traderRegUserIndi(@getSignal,{g_idxKFiveMin,nbar,range}); else %% 交易逻辑 % 交易启动、先平后开 targetList = traderGetTargetList(); % 获取标的信息。 TLen = length(targetList);%标的个数 Signal = traderGetRegUserIndi(g_idxSignal,1) end end ``` 自定义函数 ``` function Signal=getSignal(cellPar,bpPFCell) %% 函数说明 % 当在调用该函数如 getSignal(a1,a2,a3,a4,a5,...).所有的参数都会被赋值给cellPar,即cellPar={a1,a2,a3,a4,a5,...} % bpPFCell为一个时间序列,标记特定的刷新时刻 %% 参数声明 idxK =cellPar{1}; nbar = cellPar{2}; range = cellPar{3}; %% %% 信号计算 [targetNum,~]=size(idxK); Signal=nan(1,targetNum); %前面的targetNum个数据用于储存信号,后面的用于储存range for i=1:targetNum % 在策略运行的过程中,使用注册的行情数据,获取nbar+2个数据 mindata=traderGetRegKData(idxK(i,:),nbar+2,false,bpPFCell); mindata(:,any(isnan(mindata),1))=[]; minopen=mindata(2,:)'; minhigh=mindata(3,:)'; minlow=mindata(4,:)'; minclose=mindata(5,:)'; [~,KLen]=size(mindata); if KLen<nbar+2 continue end value1 = minhigh(end-nbar:end-1)-minlow(end-nbar:end-1);% 当日最高价减去当日最低价 value2 = abs(minhigh(end-nbar:end-1)-minclose(end-nbar-1:end-2));% 当日最高价减去前日收盘价的绝对值 value3 = abs(minlow(end-nbar:end-1)-minclose(end-nbar-1:end-2));% 当日最低价减去前日收盘价的绝对值 TR=max([value1,value2,value3],[],2); ATRvalue=mean(TR(end-nbar+1:end)); longsignal=minclose(end)>(minopen(end)+ATRvalue*range); shortsignal=minclose(end)<(minopen(end)-ATRvalue*range); if longsignal Signal(i)=1; end if shortsignal Signal(i)=-1; end end end ``` 执行脚本 ``` clear all; clc; targetList(1).Market = 'SHFE'; targetList(1).Code = 'CU0000'; targetList(2).Market = 'SHFE'; targetList(2).Code = 'AL0000'; % 设定外部参数,可以传进主策略函数中 initial=10000000; nbar=10; range=0.1; Freq=5; %信号频率 AccountList(1) = {'StockBackReplay'}; % 设定回测入口 traderRunBacktestV2('testATRV2',@testATRfunctionV2,{nbar,range,Freq,initial},AccountList,targetList,'min',1,20180401,20180410,'FWard'); ``` - 解析 1.在自定义函数getSignal中,返回的是一个与标的数有关的结果,通过在自定义函数中使用t`raderGetRegKData(idxK(i,:),nbar+2,false,bpPFCell)`,可以获取每次刷新点处Nbar+2个K线的数据,从而计算Signal 2.`traderRegUserIndi(@getSignal,{g_idxKFiveMin,nbar,range})`中,将`{g_idxKFiveMin,nbar,range}`四个参数传进自定义函数getSignal中 3.自定义函数`function Signal=getSignal(cellPar,bpPFCell)`使用`(cellPar,bpPFCell)`作为参数传递使用 4.在回测准备数据的过程中,getSignal的数据会和K线数据一样提前准备,不需要等待到逻辑计算时才计算,会大幅减少运算时间 5.在实时交易中,当有新行情推送过来时,会先计算自定义函数的数值,然后在执行主策略函数 ### ▲ traderRegUserIndi - 用户自建函数注册### ------ - 函数说明: (在[策略结构](#structure)中的注册阶段)注册用户自建的外部函数。 - 语法: `Idx=traderRegUserIndi(F,cellPar)` - 输入参数: |字段名 |类型 |说明 |:-:|:-:|:-:| |F |函数对象 |因子计算函数 |cellPar |cell|F函数入参,传递参数到自建函数中 - 输出参数: | |类型 |说明 |:-:|:-:|:-:| |Idx |double矩阵|返回因子序列的索引值,系统使用 - 示例: 在注册阶段中使用 ``` if bInit %% 初始化回测帐户 % 数据只有先注册才能使用 % 基本数据注册 % traderRegKData('day',Freq).Freq为bar的周期。 % 自定义函数注册 % traderRegUserIndi(@Fun,{para1,para2,...})。 % Fun为自定义函数,其固定结构参考后面代码,大括号内为函数输入参数。 g_idxKOneMin = traderRegKData('min',1);%交易频率 g_idxKFiveMin = traderRegKData('min',Freq);%信号频率 g_idxSignal = traderRegUserIndi(@getSignal,{g_idxKFiveMin,nbar,range}); ``` ### ▲ traderGetRegUserIndi - 获取自建函数注册后的结果### ------ - 函数说明:(在[策略结构](#structure)中)根据已注册的用户自建函数序列获取数据索引序列 - 语法: `traderGetRegUserIndi(Idx,len)` - 输入参数: |字段名 |类型 |说明 |:-:|:-:|:-:| |Idx |double矩阵 |注册数据时返回的索引序列矩阵 |Len |整数 |获取自建函数返回值序列在当前时刻往前取Len个数据 - 输出参数: |字段|类型 |说明 |:-:|:-:|:-:| |Idx |Any |自定义输出值 - 示例: 在策略函数中 ``` if bInit %% 初始化回测帐户 % 数据只有先注册才能使用 % 基本数据注册 % traderRegKData('day',Freq).Freq为bar的周期。 % 自定义函数注册 % traderRegUserIndi(@Fun,{para1,para2,...})。 % Fun为自定义函数,其固定结构参考后面代码,大括号内为函数输入参数。 g_idxKOneMin = traderRegKData('min',1);%交易频率 g_idxKFiveMin = traderRegKData('min',Freq);%信号频率 g_idxSignal = traderRegUserIndi(@getSignal,{g_idxKFiveMin,nbar,range}); else %% 交易逻辑 % 交易启动、先平后开 targetList = traderGetTargetList(); % 获取标的信息。 TLen = length(targetList);%标的个数 Signal = traderGetRegUserIndi(g_idxSignal,1) end ``` - 注意 1.因子的序列和K线的序列在时间上是一致的 ## 应用二:并行运算 ### 原理介绍 ------ 在工具箱获取数据的过程中,我们充分利用MATLAB并行运算的特性,设计了并行模式,通过分解数据任务,使用多个线程同时进行,大幅提升策略运行效率,使用的方式在注册阶段将traderSetParalMode设为true即可(默认为false)。 <font color=red>**注意:使用并行运算的话,会导致断点调试无法进行,因为任务被分解,无法显示断点的情况,所以当策略程序错误时,报错的信息与实际错误的位置不一定会一致**</font> ### ▲ traderSetParalMode - 并行模式设定### ------ - 函数说明: (在[策略结构](#structure)中的注册阶段)选择是否开启并行模式 - 语法: `traderSetParalMode(mode)` - 输入参数: |字段名 |类型 |说明 |:-:|:-:|:-:| |mode |logical|true代表并行开启,false代表运行关闭(默认为false) - 输出参数: 无 - 示例: 在注册阶段中使用 ``` if bInit %% 初始化回测帐户 % 数据只有先注册才能使用 % 基本数据注册 % traderRegKData('day',Freq).Freq为bar的周期。 % 自定义函数注册 % traderRegUserIndi(@Fun,{para1,para2,...})。 % Fun为自定义函数,其固定结构参考后面代码,大括号内为函数输入参数。 % 使用并行模式 traderSetParalMode(true); g_idxKOneMin = traderRegKData('min',1);%交易频率 g_idxKFiveMin = traderRegKData('min',Freq);%信号频率 g_idxSignal = traderRegUserIndi(@getSignal,{g_idxKFiveMin,nbar,range}); ``` ## 应用三:策略使用用户准备的外部数据 ### 案例 ------ 在策略结构中,我们允许用户添加一些自己的数据到策略结构中,一般而言在回测中使用比较多,在实时交易时,由于行情推送时间是属于未来的数据,一般难以与用户自己的数据结合,因为用户添加的数据往往是静态的,但从逻辑上是可以支持的。主要步骤如下: 1.在注册阶段,通过`traderRegUserData`告诉系统外部的数据的时间,以及时间节点上的数据 2.在策略运行阶段,通过`traderGetRegUserData`获取当前刷新时间点的外部数据 具体实施过程请看例子: 主策略函数 ``` function matlab_example_test(bInit,bDayBegin,cellPar)% % 三个参数的形式固定 global idexD; global userD; % 插入外部数据 % 插入两个时间点 T(1) = datenum(2018, 1, 2, 10, 00, 00); T(2) = datenum(2018, 1, 3, 10, 10, 10); % 出入两个时间点上的数值 D(1) = 2.6; D(2) = 3.8; if bInit % 判定是否策略开启启动 % 行情注册,15分钟的K线和5分钟的K线 idexD=traderRegKData('min',15); % 注册外部数据 userD=traderRegUserData(T, D); else % 获取所有标的在当前时刻往前5根K线的数据(15min频率) data=traderGetRegKData(idexD, 5, false); datestr(data(1,end)) userdata=traderGetRegUserData(userD,3) end end ``` 执行脚本 ``` clear all; clc; % 设定需要传进策略的参数 stoploss =0.9; % 设定止损比例 m=5; % 设定双均线中的第一根均线周期 n=10; % 设定双均线中的第二个均线周期 % 设定回测账户 AccountList(1) = {'FutureBackReplay'}; % 设定 TargetList(1).Market = 'SHFE'; TargetList(1).Code = 'RB0000'; % 螺纹钢主力连续 % 设定初始资金和费率,滑点等 traderSetBacktest(1000000, 0.000026,0.02,0); % 策略名为‘matlab_example_test’,每次刷新会调用matlab_example_test % 将{stoploss,m,n}参数传进策略 % 使用FutureBackReplay这个回测账户 % 以TargetList这结构体里的内容作为订阅标的 % 按照15分钟的频率运行回测,每15分钟会刷新一次策略 % 回测时间从20180102开始到20180104结束 % 价格使用前复权价格 traderRunBacktestV2('matlab_example_test',@matlab_example_test, {stoploss,m,n},AccountList,TargetList,'min',15,20180102,20180104,'FWard'); ``` 返回 ``` ans = '02-Jan-2018 09:15:00' userdata = 0 ans = '02-Jan-2018 09:30:00' userdata = 0 0 ans = '02-Jan-2018 09:45:00' userdata = 0 0 0 …… ans = '02-Jan-2018 10:15:00' userdata = 0 0 2.6000 …… ans = '03-Jan-2018 10:15:00' userdata = 2.6000 2.6000 3.8000 ``` 解析 1.添加的两个数据时间点分别在20180102:100000和20180103:101010,回测的时间段在20180102到20180104,因此在20180102的10点之前,用户自添加的数据没有数据,系统会处理为0 ### ▲ traderRegUserData - 用户外部数据注册### ------ - 函数说明: (在[策略结构](#structure)中的注册阶段)注册用户自建的外部数据。 - 语法: `Idx=traderRegUserData(TimeLine,DataArray)` - 输入参数: |字段名 |类型 |说明 |:-:|:-:|:-:| |TimeLine|cell,或者矩阵 |导入数据的时间轴, 长度与数据序列保持一致 |DataArray |cell,或者矩阵|导入的数据序列, 长度与时间轴保持一致 - 输出参数: |字段|类型 |说明 |:-:|:-:|:-:| |Idx |double矩阵|返回因子序列的索引值,系统使用 - 示例: 在注册阶段中使用 ``` % 插入外部数据 % 插入两个时间点 T(1) = datenum(2018, 1, 2, 10, 00, 00); T(2) = datenum(2018, 1, 3, 10, 10, 10); % 出入两个时间点上的数值 D(1) = 2.6; D(2) = 3.8; if bInit % 判定是否策略开启启动 % 行情注册,15分钟的K线和5分钟的K线 idexD=traderRegKData('min',15); % 注册外部数据 userD=traderRegUserData(T, D); ``` ### ▲ traderGetRegUserData - 获取用户注册的外部数据### ------ - 函数说明:(在[策略结构](#structure)中)根据已注册的用户的外部序列获取数据索引序列 - 语法: `traderGetRegUserData(Idx,len)` - 输入参数: |字段名 |类型 |说明 |:-:|:-:|:-:| |Idx |double矩阵 |注册数据时返回的索引序列矩阵 |Len |整数 |获取外部数据序列在当前时刻往前取Len个数据 - 输出参数: | |类型 |说明 |:-:|:-:|:-:| |Idx |Any |在traderRegUserData中定义的在当前时间点的数据 - 示例: 在策略函数中 ``` function matlab_example_test(bInit,bDayBegin,cellPar)% % 三个参数的形式固定 global idexD; global userD; % 插入外部数据 % 插入两个时间点 T(1) = datenum(2018, 1, 2, 10, 00, 00); T(2) = datenum(2018, 1, 3, 10, 10, 10); % 出入两个时间点上的数值 D(1) = 2.6; D(2) = 3.8; if bInit % 判定是否策略开启启动 % 行情注册,15分钟的K线和5分钟的K线 idexD=traderRegKData('min',15); % 注册外部数据 userD=traderRegUserData(T, D); else % 获取所有标的在当前时刻往前5根K线的数据(15min频率) data=traderGetRegKData(idexD, 5, false); datestr(data(1,end)) % 获取当前时刻往前3个时间点的外部数据序列 userdata=traderGetRegUserData(userD,3) end end ``` - 注意: 1.外部数据的序列和K线的序列在时间上是一致的 2.若当前刷新的时间点不在外部数据的时间序列上,则返回0 ## 应用四:使用参数检查 ------ ### 原理说明 在AT工具箱中,提供一种方便入门用户对策略代码错误定位的模式,即参数检查。参数检查会在用户调用API时,输入的参数类型与API本身要求的类型不一致,将会及时报错,用户可以在Matlab的Command Window中获取错误信息而定位到具体出错的API中,但同时,参数检查会增加系统运行的时间,导致回测速度下降,在以tick频率刷新的策略中,影响特别明显。 当参数检查不开启时,API函数将会在被调用时报错,该错误信息基本都是在内部函数中,一般初学用户难以迅速定位到错误的API中,但可以体验到AT回测的“真正速度”。 目前参数检查功能只适用于以下4个API函数: ``` 1.traderDailyCloseTime 2.traderPutLog 3.traderGetCurrentTickV2 4.traderGetRegFactor ``` ### ▲ traderSetParamCheck - 参数检查设定### - 函数说明: (在[策略结构](#structure)中的注册阶段)选择开启或关闭参数检查功能。 - 语法: `traderSetParamCheck(mode)` - 输入参数: |字段名|类型|说明 |:-|:-|:-| |mode|logical|true代表参数检查开启,false代表参数检查关闭(默认为false) - 输出参数: 无 - 示例: 在注册阶段中使用 ``` if bInit % 开启参数检查模式 traderSetParamCheck(true); ``` ## 应用五:清除Maltab缓存 ### 原理说明 ------ 在AT中,依赖着非常强大的数据高速并发读取功能,可以为用户提供高速回测服务,所有的快速回测都基于AT本身随着用户使用,会形成数据缓存,在后面的回测过程中,直接读取缓存而不是向服务器请求数据,减少了网络传输的负担,大幅提升了回测的速度。然而,在用户使用的过程中,可能以为网络问题,存在数据丢失,导致缓存数据可能会出现错误,此时用户需要清除缓存,让AT重新向服务器请求数据。 AT中的缓存有多层级,这里清除的只是Matlab的缓存 **注意:当清除Matlab缓存后,AT需要重新向服务器请求数据,会增加回测的时间** ### traderClearCache - 清除Matlab缓存### ------ - 函数说明: 清除Matlab缓存数据。 - 语法: `traderClearCache()` - 输入参数: 无 - 输出参数: 无 - 示例: 当需要清除Matlab缓存时,在Command Window中输入 ``` `traderClearCache()` ``` ## 应用六:Matlab工具箱获取回测完的策略业绩报告 ### 原理说明 ------ 每个回测完成的策略,AT提供完整的业绩分析报告,每个业绩分析报告会保存在内存中,依赖于策略ID,用户可以通过Matlab工具箱提供的专门API获取整个报告的每一个字段。 策略ID的获取有两种方式,用户可以根据具体的使用场景在不同地方使用 **回测语句完成后返回策略ID** ``` clear all; clc; % 设定回测账户, AccountList(1) = {'FutureBackReplay'}; % 设定标的资产,以沪深300指数的成分股作为标的 TargetList=traderGetCodeList('HS300') % 按照1day的频率运行回测 StrategyID = traderRunBacktestV2('matlab_example_test',@matlab_example_test, {},AccountList,TargetList,'day',1,20180123,20180125,'FWard'); ``` 代码解析: 1. 通过回测入口函数 `traderRunBacktestV2` 运行回测后返回策略ID 2. 只有回测完成才会返回策略ID;回测中断,回测发生错误都不会返回策略ID **回测后获取AT里的策略列表** ``` traderGetStrategyID() ``` 代码解析: 1.`traderGetStrategyID` 获取的策略ID是当前AT客户端中,策略回测页面存在,并且可以提取绩效报告的策略ID 2.当AT客户端中策略回测中策略的Tab被关闭,或者AT重启后,策略ID失效 3.通过此方式不必依赖策略回测入口函数 `traderRunBacktestV2` 获取策略ID 4.只有回测成功,回测结束,绩效计算完成的策略才会返回策略ID ### traderGetStrategyID - 获取回测完策略的ID ------ - 函数说明: 获取AT上当前回测完的策略的ID - 语法: `traderGetStrategyID()` - 输入参数: 无 - 输出参数: struct结构体 |字段名|类型|说明 |:-|:-|:-| |StrategyName|char|策略名称| |StrategyID|char|策略ID| 解析 1.获取回测完的策略ID,只支持在命令行的方式下获取,不支持在策略运行(回测,实时交易)中获取 ### traderGetPerformance - 获取策略的绩效报告 ------ - 函数说明: 根据策略ID获取策略的绩效报告 - 语法: `traderGetPerformance(StrategyID)` - 输入参数: |字段名|类型|说明 |:-|:-|:-| |StrategyID|char|策略ID| - 输出参数: struct结构体 |字段名|类型|说明 |:-|:-|:-| |StrategtyName|char|策略名 |CumReturn|double|累计收益率 |AnnuReturn|double|年化收益率(几何) |MaxDrawBackRate|double |最大回测率 |InitCash|double |初始资金 |TotalProperty|double |总资产 |BeginDate|datenums| 回测开始日期 |EndDate|datenums |回测结束日期 |CumReturnBM|double |基准累计收益率 |Alpha|double |策略的Alpha| |Beta|double |策略的Beta |SharpeRatio|double| 夏普比率 |InfoRatio|double |信息比率 |TurnoverRate|double |换手率 |NetProfit|double |净利润(元) |GrossProfit|double |毛利(元) |GrossLoss|double |毛损(元) |ProfitFactor|double |盈利因子 |LongNetProfit|double |多头净利(元) |ShortNetProfit|double |空头净利(元) |AverReturn|double| 年化收益率(算术) |MaxDrawBack|double |最大回撤(元) |CommissionPaid|double| 已付手续费(元) |SlidePaid|double |已付滑价 |TargetNums|double| 标的数量 |CalmarRatio|double |Calmar比率 |SortinoRatio|double| Sortino比率 |NetProfit2MaxPoLoss|double| 净利润 / 最大潜在亏损 |Commission2NP|double |手续费 / 净利润 |TradingDays|double |交易天数 |AverHoldingTime|double |平均持仓时间(天) |MaxDrawBackPeriod|char |最大回测期 |MaxLossDuration|double |最大不盈利天数 |MaxConProfitDays|double| 最大连续盈利天数 |MaxConLossDays|double |最大连续亏损天数 |MaxConProfit|double |最大连续盈利(元) |MaxConLoss|double |最大连续亏损(元) |TotalTrade |double |交易总数量(笔) |NoneCloseTrade| double |未平仓交易数量(笔) |ProfitTrade |double |盈利交易数(笔) |LossTrade |double| 亏损交易数(笔) |Odds |double |胜率 |AverProfit| double |平均盈利(元) |AverLoss |double |平均亏损(元) |PLRatio |double |平均盈利 / 平均亏损 |TurnOverDay| double |资金周转周期(天) |NetValueArr| 1 * 2 cell |净值曲线 |————|————|————| |NetValueArr{1}|1*n struct|策略净值:n为数据点的数量 |Name|n个char| 曲线名称 |NValue|n个double| 净值曲线数值 |Date|n个datenums |日期 |————|————|————| |NetValueArr{2} |1*n struct |基准净值:n为数据点的数量 |Name |n个char |基准名称 |NValue |n个double| 基准曲线数值 |Date |n 个 datenums| 日期 |————|————|————| |TradeListFuture |1*m struct |期货交易列表:m为配对后交易记录数量 |OrderID |m个double |开仓的交易订单号 |Market |m个char |市场 |Code |m个char| 代码 |ShortName |m个char |品种 |LSType |m个char |多空类型 |Volume |m个double| 数量 |OpenTime |m个datenums| 开仓时间 |CloseTime |m个datenums |平仓时间 |OpenPrice |m个double| 开仓价格 |Close |m个double| 平仓价格 |————|————|————| |TradeListStock| 1*m struct |期货交易列表:m为配对后交易记录数量 |OrderID |m个double |开仓的交易订单号 |Market| m个char| 市场 |Code |m 个char| 代码 |ShortName |m个char|品种 |LSType| m个char |开仓多空类型 |Volume| m个double| 数量 |OpenTime |m个datenums |开仓时间 |CloseTime |m个datenums| 平仓时间 |OpenPrice |m个double |开仓价格 |Close |m个double |平仓价格 |————|————|————| |MonthInfoArr |1*p struct |月度分析:p为回测期间所涵盖的月份 |Month| p个char |月份标记 |NetProfit |p个double| 净利润 |NetProfitReturn| p个double |净利率 |GrossProfit |p个double| 毛利 |GrossLoss |p个double |毛损 |TradeNums |p个double |交易次数 |Odds |p个double |胜率 |————|————|————| |MonthPLArr |1*p struct |月度盈亏分析:p为回测期间所涵盖的月份 |PL |p个double|月度 |Date|p个datenums| 日期 |————|————|————| |LongEquArr|1*n struct|多头权益:n为数据点(交易日) |LEquity |n个double |多头权益 |Date| n个datenums |日期 |————|————|————| |ShortEquArr| 1*n struct |空头权益:n为数据点(交易日) |SEquity| n个double |空头权益 |Date |n个datenums| 日期 |————|————|————| |EquityArr |1*n struct |权益:n为数据点(交易日) |Equity |n个double| 权益 |Date |n个datenums| 日期 |————|————|————| |PotentialLossArr| 1*n struct |潜在亏损:n为数据点(交易日) |PLoss |n个double |潜在亏损 |Date| n个datenums |日期 解析 1.获取策略回测的绩效,只支持单一策略ID查询 2.如果通过 `traderRunBacktestV2` 获取策略ID,然后马上获取策略绩效,在策略的回测结果没有计算完毕之前,查询结果无效 # 常用数据枚举 # ------------ ## FilledUp数据补齐枚举 ## |是否补齐 |释义 |注释 |:-:|:-:| |True |补齐 |按照输入时间补齐所有合约这段时间内数据,补齐的数据成交量为0,价格为上根bar收盘价 |False |不补齐 |只计算有交易的时间,未交易的时间在回测时将不产生下单 ## FQ复权枚举 ## |复权类型| 复权方向 |:-:|:-:| |NA |不复权 |FWard |向前复权 |BWard |向后复权 ## Kfrequency K线类型枚举 ## |K线的时间级别 |K线类型 |K线频率 |:-:|:-:| |min |分钟线 |1分钟自由合成各频率 |day |日线 |单日合成各频率 |tick |Tick数据 |默认为1 ## 期货品种代码表 ## |品种代码 |品种名称 |交易所 |:-:|:-:| |A |豆一 |大连商品交易所 |B |豆二 |大连商品交易所 |BB |胶合板 |大连商品交易所 |C |玉米 |大连商品交易所 |CS |玉米淀粉 |大连商品交易所 |FB |纤维板 |大连商品交易所 |I |铁矿石 |大连商品交易所 |J |焦炭 |大连商品交易所 |JD |鸡蛋 |大连商品交易所 |JM |焦煤 |大连商品交易所 |L |LLDPE |大连商品交易所 |M |豆粕 |大连商品交易所 |P |棕榈油 |大连商品交易所 |PP |聚丙烯 |大连商品交易所 |S |大豆 |大连商品交易所 |V |聚氯乙烯 |大连商品交易所 |Y |豆油 |大连商品交易所 |AG |白银 |上海期货交易所 |AL |铝 |上海期货交易所 |AU |黄金 |上海期货交易所 |BU |石油沥青 |上海期货交易所 |CU |铜 |上海期货交易所 |FU |燃料油 |上海期货交易所 |HC |热轧卷板 |上海期货交易所 |NI |镍 |上海期货交易所 |PB |铅 |上海期货交易所 |RB |螺纹钢 |上海期货交易所 |RU |天然橡胶 |上海期货交易所 |SN |锡 |上海期货交易所 |WR |线材 |上海期货交易所 |ZN |锌 |上海期货交易所 |CF |棉花 |郑州商品交易所 |ER |早籼稻 |郑州商品交易所 |FG |玻璃 |郑州商品交易所 |GN |绿豆 |郑州商品交易所 |JR |粳稻谷 |郑州商品交易所 |LR |晚籼稻 |郑州商品交易所 |MA |甲醇 |郑州商品交易所 |ME |甲醇 |郑州商品交易所 |OI |菜籽油 |郑州商品交易所 |PM |普通小麦 |郑州商品交易所 |RI |早籼稻 |郑州商品交易所 |RM |菜籽粕 |郑州商品交易所 |RO |菜籽油 |郑州商品交易所 |RS |油菜籽 |郑州商品交易所 |SF |硅铁 |郑州商品交易所 |SM |锰硅 |郑州商品交易所 |SR |白糖 |郑州商品交易所 |TA |PTA |郑州商品交易所 |ZC |动力煤 |郑州商品交易所 |WH |强麦 |郑州商品交易所 |CY |棉纱 |郑州商品交易所 |AP |苹果 |郑州商品交易所 |IC |中证500指数股指期货 |中国金融期货交易所 |IF |沪深300指数股指期货 |中国金融期货交易所 |IH |上证50指数股指期货 |中国金融期货交易所 |T |10年期国债期货 |中国金融期货交易所 |TF |5年期国债期货 |中国金融期货交易所 |SC |原油 |上海国际能源中心 ## 期货主力合约信息 ## AT已将每个期货品种的主力合约做成统一连续的标准合约,默认当日持仓量最大的合约为该品种的主力合约,标记为`CODE0000`,例如当日沪深300指数股指期货主力合约为`IF1603`,则可直接调用`IF0000`,次主力合约为`IF1604`,则可直接调用为`IF0001`。 |合约 |释义 |备注 |:-:|:-:|:-:| |Code0000 |主力合约 || |Code0001 |次主力合约 || |IF0000 |中金所沪深300指数股指期货主力合约 || |IF0001 |中金所沪深300指数股指期货次主力合约 || |CU0000 |上期所铜主力合约 || |CU0001 |上期所铜次主力合约 || |M0000 |大商所豆粕主力合约 || |M0001 |大商所豆粕次主力合约 || |CF000 |郑商所棉花主力合约 |郑商所合约号码为三位| |CF001 |郑商所棉花次主力合约 |郑商所合约号码为三位|
contact@digquant.com.cn

联系

邮箱

0755-8695-2080

联系

电话

关注

微信

关注

QQ

回到

顶部