策略编程语言用户编程手册范本_第1页
策略编程语言用户编程手册范本_第2页
策略编程语言用户编程手册范本_第3页
策略编程语言用户编程手册范本_第4页
策略编程语言用户编程手册范本_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、图标DTS2.0 策略编程语言 用户编程手册Author : DTS 研发部门 Version2.08RevisionRevision HistoryHistoryDateDateVersionVersionDescriptionDescriptionAuthorAuthorApproverApprover2008/11/192.00Initial version.Aaron.Peng2011/3/162.0.1增加 3.3.3.3.5 部修正命令3.5.2.2 注册要收听的价格3.5.2.5 查找价格更新 3.5.4.2 _OnEventOrderResponse回 调Jack.shiPet

2、er.cao2011/4/22.0.2更新 3.5.3.3_OnEventPosition 回调Jack.shiPeter.cao2011/5/272.0.3更新 2.1.3 的 3.API 接口关键字2.3.1.1 nil 类型和逻辑判断,针对于指针变量作了说明增加 3.3.3.2.3 DTSMicroTime3.3.3.3.4 发送 Order(下单、撤单)命令,增加了单个 Order 下单的说明更新 3.3.3.3.5 部修正命令更新 3.5.2.5 查找价格更新 3.5.4.2 _OnEventOrderResponse 回调更新 3.5.5.1 DTSMessageRecordAcc

3、ess类型3.6 系统工具函数,增加 3.6.53.6.10 部分xuebin.liPeter.cao2011/6/202.0.4增加批量撤单接口 3.3.3.3.3,3.3.3.3.6Yousong.ZhangPeter.cao2011/6/302.0.5增加 matlab 的接口说明 3.7,增加简单加密的说明 3.6.9,3.6.10。Jack.shiPeter.cao2011/8/102.0.6增加市场逐笔行情信息 3.5.36.1 修改 ClosePriceInputFlag 的说明增加 DTSQUEUEPRICE FIELD 一览 6.2Lin.gongJack.shi2011/9

4、/152.0.7增加 2.3.1.2 sys_find 的说明更新 3.7 的 matlab 图只显示半个6.1 增加 ETFIOPV 说明,修改VWAPEVEPrice 说明更新 6.3 DTSNewOrderAccess field 一览更新 6.4 DTSCancelOrderAccess field 一览xiang.shuJack.shi2011/9/192.0.8增加 PriceCondition 的说明Jack.shi目录目录REVISIONREVISION HISTORYHISTORY.II II1.1.DTSDTS 策略编程语言简介策略编程语言简介.1 11.11.1DTSDT

5、S 策略编程平台及其原理策略编程平台及其原理.1 11.21.2策略在系统平台上的生命周期和运行过程策略在系统平台上的生命周期和运行过程 .2 21.2.1策略生命周期 .21.2.2系统通讯和 EVENT.31.2.2.1事件定义.31.2.2.2输入输出事件.31.2.2.3 Buffer flag .31.2.2.4事件回调.31.2.3策略参数和参数变化回调.41.2.4运行策略 .42.2.DTSDTS SCRIPTSCRIPT 编程基础编程基础.7 72.12.1DTSDTS S SCRIPTCRIPT基本语法格式基本语法格式.7 72.1.1语言字符要求 .72.1.2程序注释

6、.72.1.3关键字.82.1.4特殊字符的表示.112.22.2变量及变量的作用域变量及变量的作用域 .11112.2.1全局变量及其作用域.112.2.2局部变量(LOCAL)及其作用域.122.2.3同名的全局变量和局部变量的作用原则.122.32.3类型类型 .12122.3.1变量部的类型 .122.3.1.1 nil 类型和逻辑判断.122.3.1.2 string 类型及针对 string 的操作.122.3.1.3数值类型及建的数值计算函数.142.3.1.4 table 类型.152.3.2支持的各类型间的自动转换 .152.3.3显式转换类型 .152.3.4类型转换时的注

7、意事项.162.3.5SYS_FORMAT函数 .162.42.4函数函数 .18182.4.1函数定义 .182.4.2函数调用 .192.4.3对函数的限制 .192.4.4PCALL 函数调用.192.52.5运算符运算符 .20202.5.1逻辑运算符 .202.5.2算术运算符 .202.5.3字符串连接运算.202.5.4赋值运算符 .202.5.5比较运算符 .212.5.6元运算符 .212.5.7运算符优先级 .212.62.6程序控制流程程序控制流程.21212.6.1顺序结构 .212.6.2 IF条件语句.212.6.3DO 块 .222.6.4WHILE循环语句.22

8、2.6.5REPEAT循环语句 .222.6.6一般FOR循环语句 .222.6.7用于遍历表的FOR循环语句(GENERIC FOR) .232.6.8RETURN和BREAK语句 .232.72.7基本容器基本容器TABLETABLE.24242.7.1TABLE的基本概念.242.7.2创建和初始化一个TABLE.242.7.3TABLE下标的使用.242.7.4TABLE的“.”运算符.252.7.5顺序存储元素和按KEY索引元素.252.7.6TABLE的INSERT操作 .252.7.7TABLE的长度 .252.7.8TABLE的遍历 .262.7.8.1全遍历(pairs).2

9、62.7.8.2自然数序遍历(ipairs).262.7.9TABLE的SORT算法(仅对自然数序TABLE有效).262.82.8参考参考 L LUAUA的基本语法的基本语法.27272.8.1参考部分 LUA的语法和 LUA的参考资料 .272.8.2与 LUA的重要不同 .273.3.DTSDTS APIAPI .27273.13.1DTSDTS APIAPI 简介简介.27273.23.2事件处理事件处理.27273.2.1详细的事件定义和事件属性设置 .273.2.2事件注册(CLIENT) .283.2.3事件回调详解 .293.2.4策略参数事件及其回调.293.2.5事件容设置

10、和发送事件.303.2.6事件存盘和读取保存事件(DYNAMICDATA).303.33.3DTSDTS APIAPI 变量类型变量类型 .31313.3.1用户定义的事件类型.313.3.2策略参数类型(DTSPARAMETER).323.3.3 DTS 系统类型.323.3.3.1用于和一般 Script 逻辑交换信息的部类型.323.3.3.2时间类型.323.3.3.2.1 DTSDate.323.3.3.2.2 DTSTime.323.3.3.2.3 DTSMicroTime.333.3.3.3用于下单和撤单的类型.333.3.3.3.1 DTSNewOrderAccess.333.

11、3.3.3.2 DTSCancelOrderAccess.333.3.3.3.3 DTSBasket 容器 .333.3.3.3.4 发送 Order(下单、撤单)命令.343.3.3.3.5 部修正命令.353.3.3.3.6 批量撤单接口.393.3.4其他系统类型 .393.43.4存取数据库信息(存取数据库信息(S STATICTATICD DATAATA) .39393.4.1从数据库取数据(_GETCOMMONDATA).403.4.2更新数据(_UPDATECOMMONDATA).403.53.5固化系统回调事件固化系统回调事件.41413.5.1 TIMER.413.5.1.1

12、启动/停止一个 Timer.413.5.1.2 _OnEventTimer 回调 .413.5.2收听市场价格 .413.5.2.1 DTSPrice 类型.413.5.2.2注册要收听的 Price .413.5.2.3 _OnEventPrice 回调.423.5.2.4停止收听价格.423.5.2.5查找价格.423.5.3收听市场逐笔行情价格.433.5.3.1 DTSQueuePrice 类型.433.5.3.2注册要收听的 Price .463.5.3.3 _OnEventQueuePrice 回调.463.5.3.4停止收听分笔行情价格.463.5.3.5查找分笔行情价格 .47

13、3.5.4监视仓位变化 .473.5.4.1 DTSPosition 类型 .473.5.4.2注册要监听的 Position.473.5.4.3 _OnEventPosition 回调.483.5.4.4停止收听 Position.483.5.5监听下单回复 .483.5.5.1 DTSExecution 类型 .483.5.5.2 _OnEventOrderResponse 回调.493.5.6监听成交信息 .503.5.6.1 DTSMessageRecordAccess 类型.503.5.6.2选择需要监听的成交信息.503.5.6.3 _OnEventExecution 回调.503

14、.63.6系统工具函数系统工具函数.51513.6.1取得策略信息 .513.6.2取得运行信息 .513.6.3取得用户信息 .513.6.4取得环境信息 .513.6.5取得错误详细描述.513.6.6取得下单状态 .513.6.7取得第一条交易流水信息.513.6.8生成全局唯一序列号.513.6.9字符串加密 .513.6.10字符串解密.513.6.11停止服务.523.6.12写LOG的函数.523.73.7MATLABMATLAB 支持支持.52523.7.1启动 MATLAB ENGINE.523.7.2判断 MATLAB ENGINE是否启动 .523.7.3设置 MATLA

15、B 变量.533.7.4获取 MATLAB 变量.533.83.8一个完整的例子一个完整的例子.53534.4.完整的语法规则完整的语法规则 .55555.5.LUAEDITORLUAEDITOR .55555.15.1DTSDTS L LUAUA E EDITORDITOR简介简介 .55555.25.2L LUAUAE EDITORDITOR功能介绍功能介绍.57575.2.1增加一个新策略.575.2.2语法检查 .595.2.3提交.595.2.4发布.605.2.5策略管理 .615.35.3L LUAUAE EDITORDITOR使用技巧使用技巧.62625.3.1 LUAEDIT

16、OR对 DTSSCRIPT语法关键字和符号能自己编辑颜色 .625.3.2语法错误的提示.626.6.附录附录.63636.16.1DTSPDTSPRICERICE FIELDFIELD一览一览.63636.26.2DTSQDTSQUEUEUEUEP PRICERICE FIELDFIELD一览一览.65656.36.3DTSNDTSNEWEWO ORDERRDERA ACCESSCCESS FIELDFIELD 一览一览.65656.46.4DTSCDTSCANCELANCELO ORDERRDERA ACCESSCCESS FIELDFIELD 一览一览.67676.56.5参考资料参考资

17、料.68681.1. DTSDTS 策略编程语言简介策略编程语言简介DTS 系统策略编程语言是针对 DTS 程式化套利系统编写套利策略的策略编程语言, 提供灵活的,具有一般性的编程语言接口, 可以为 DTS 系统编写高效的策略服务程序。DTS 策略编程语言综合了 Lua 和基于 C+的 DTS 系统 API 接口, 最终将脚本翻译成 C+服务器程序编译执行, 具有灵活高效的特点。DTS 策略编程语言由基本 DTSScript 和 DTS 系统 API 两部分组成, DTSScript 提供了基本用户编程逻辑的编写接口, DTSAPI 提供了 Server 编程框架和用户策略逻辑对 DTS 后台

18、系统数据的访问和使用接口。本手册讨论这种语言的基本组成,语法特点和具体使用方法, 同时介绍 DTS 客户端系统附带的 LuaEditor 的基本功能和使用技巧。1.11.1 DTSDTS 策略编程平台及其原理策略编程平台及其原理DTS 策略编程平台主要由 DTSClient 下带的 DTS Script Editor(Lua Editor)为客户端, 配合 Strategy Control Server (SCS)为服务器端组成。用户编写的策略通过 Client 端 自带的 Event 打包解包库(EventCommunicator) ,打包成事件(Event)发送给 SCS, 由 SCS的

19、Script Translator(L2C)翻译成 C+源代码后由 GNU 编译成策略服务器程序(SS) 。启动时, 由客户端发送启动 Event 给 SCS 控制启动 SS, 并告知客户端 SS 端口及 ip 地址, 由客户端直接 SocketSS 获取策略服务; 停止时, 也由客户端发送停止 Event 给 SCS 控制结束 SS服务。由于 SS 是直接编译运行的, 所以拥有效率高的特点; 同时每个客户有自己的策略服务器, 故每个服务器程序负载不会很重, 所以又有稳定,快速的优点。1.21.2 策略在系统平台上的生命周期和运行过程策略在系统平台上的生命周期和运行过程1.2.1 策略生命周期

20、要完整地编写一个能用的策略服务器, 需要以下几个步骤:1. 在 Script Editor 中编写完整的策略脚本。2. 语法检查通过。3. 提交 SVN(通过 SCS)成功。4. 发布成功(编译成功) 。当策略被发布成功后, 用户可以在自己的策略管理界面上看到相应的策略;用户可以选择加载需要的策略版本,并且运行此策略;策略一旦运行, 就开始提供既定的服务直到用户停止此策略。策略的生命周期:1.2.2 系统通讯和 EventDTS 系统部各个组成部件间的通讯都是建立在事件(Event)处理上的,SCS,Client 及 SS之间信息的互换都是通过 Event 来完成的。所有的 Event 都是统

21、一格式存放的, 由包含在 Client 和 Server 端程序中的EventCommunicatorLib 进行编码/解码。我们可以把 Event 看作是可以自定义字段的Message。1.2.2.1 事件定义所有用户事件都是可以在脚本中定义的。以下例程定义了一个最简单的事件,_DefineEventObject_DefineEventObject TestEvent _AS_AS _Output_Output_DefFld_DefFld(TestField,_String ,12);_End_End这个 Event 被定义为包含一个名叫“TestField”的字段, 字段类型为 Strin

22、g 类型, 长度为12。事件定义和处理被做为一种 DTSAPI 的特性将在第 3 章 节中详细介绍。1.2.2.2 输入输出事件做为策略编程语言, DTSScript 写好的脚本最终会被编译成策略服务器程序(SS) ;相对 SS来说是输入的 Event 被认为是输入事件, 例如 Client 向 SS 传送的参数可以被认为是一个 In 事件;相反的, SS 发送出去的事件被认为是 Out 事件, 如上面的例程就是定义了一个 Out 事件, 填写完整这个 TestEvent 后, SS 可以创建一个 Out 事件的实例并且通过 API 将这个实例发送给所有监听这个事件的客户端(可能是 DTSCl

23、ient 端或者另外一个 SS) 。1.2.2.3 Buffer flag由于系统中所有的通讯都被认为是事件处理, 也就是说所有的 Server,Client 和 Server 之间都是基于一方发送 Out 事件,一方接收事件并触发回调来达到交换信息的目的, 这样,为了可以使不同时间连接上来的客户端可以收到完整的 Event 流, Event 被设计成带有一个 Buffer 标志, Buffer Flag 一共有 3 种值, 0 代表没有 Buffer, 即后来连接上来的 Client 不会接收到连接上来之前 Server 已经发送过的 Event;1 代表 list 类型的 Buffer,

24、即后来连接上来的 Client能够收到符合条件的自 Server 启动以来发送过的所有这种类型的 Event, 并且是按事件顺序排列的;2 代表 map 类型的 Event, 即后来连接上来的 Client 能够收到所有以某个字段为 Key的 Server 已经发送过的 Event, 重复 Key 的 Event 只保留最新的一个。有了这 2 种 buffer, 像诸如 HDS(Historical Data Sever)这种需要保留历史数据的服务器也可以用策略来描述了。1.2.2.4 事件回调对于接收别的 Server 或 Client 发送的事件一方的 Server 或 Client, 只

25、需要知道接收的是来自哪里的什么 Event 就可以了:_RegisterEventObject_RegisterEventObject(PortfolioID=P01, StrageyID=01,EventID=TbtPEvent,condition=IssueCode#issueCode1,issueCode2,issueCode3)使用_RegisterEventObject 命令可以注册与什么策略服务器连接, 并取得什么 Event。当连接建立后, 每当那个策略服务器向外发送既定的 Event, 接收方就会收到一条 Event的回调:_OnEventDefined_OnEventDefi

26、ned(TbtPEvent evt) -用户逻辑_End_End 收到 Event 回调后, 接收方就通过_OnEventDefined_OnEventDefined 接口回调函数执行既定的用户逻辑。1.2.3 策略参数和参数变化回调在 DTS2.0 系统中, 所有的系统间交互都是通过 Event 完成的, 所以策略服务器的输入参数实际上也是一种特殊的 Event。输入参数 Event 做为一种特殊 Event,被设计为是同时拥有 Input 和 OutPut 属性的Event,做为 Input Event(客户端向 SS 发送参数值) ,其 Buffer Flag 为 0, SS 只需要最新

27、的参数;而做为 Output Event (SS 返回给客户端的 Ack) ,其 Buffer Flag 为 2, Key 是一个永远为 1 的值,这样可以保留最新一个 Ack 也能被 Client 收到,防止 Client 重启后参数不同步的情况。所有定义的参数都会在策略服务器中对应一个同名同类型的全局变量,脚本中可以直接使用这些参数, 同时当参数值变化时, Client 端发送来的参数变化也会被同步到这些全局变量中。可以通过_DefineStrategyParameters_DefineStrategyParameters 关键字定义一组策略 Server 的参数,并通过_OnEventP

28、arameterChanged_OnEventParameterChanged(DTSParameter parameter) 回调来处理从客户端发送过来的参数变化:_DefineStrategyParameters_DefineStrategyParameters_String_String issueCode1_String_String issueCode2_String_String issueCode3_Number_Number factor1_Number_Number factor2_Number_Number factor3_Number_Number constant_St

29、ring_String periodType_String_String periodCount_End_End_OnEventParameterChanged_OnEventParameterChanged(DTSParameter parameter) -用户处理逻辑_End_End1.2.4 运行策略当策略被发布好以后, DTSClient 中的策略管理页面也就有了相应的策略列表:在需要启动此策略的模型中添加此策略:启动策略:停止策略:2.2. DTSDTS ScriptScript 编程基础编程基础2.12.1 DTSDTS ScriptScript 基本语法格式基本语法格式2.1.1

30、 语言字符要求DTS Script 中的名字(变量名,函数名,Table 的字段名等标识符)可以由任意字母,数字和下划线组成,但是不能以数字开头, 由于 DTS API(将在第 3 章详细介绍)关键字以”_”开头,所以应尽量避免使用”_”做为名称的起始符号, 以避免和系统关键字相互冲突。DTS Script 是严格区分大小写的, 比如 Text 和 text 是不同的变量名, 可以用来代表不同的 2个变量。DTS Script 中的字符串可以是以一对单引号( )引起或者一对双引号(” )引起的一串字符,容里可以支持任意字符, 包括中文, 系统传输和翻译中不会改变字符的编码方式, 但是为了终端显

31、示和避免编码解码方式不同带来的麻烦, 建议统一使用 utf-8 编码方式(注意不要使用带signal 的 UTF-8 编码, 头标记会被认为是非法字符) 。对于_开头的函数, 一般认为是系统保留的函数名, 建议尽量避免使用。对于“DTS”开头的词, 一般认为是系统 API 数据类型, 请不要使用其命名一般变量和函数等。名字,函数调用和关键字,算符等之间以空白分隔, 空白可以是任意的空白,不限数量和种类,包括 空格( ) ,TAB(t) ,分割符(f)和分行/回车(rn,r,n) 。DTS Script 各个段(声明,结构,语句等)间可以以分号(;)分隔,也可以以上述的空白分隔。但是有一种情况必

32、须用分号分隔:locallocal a - 1b = “b” - 2_String_String str = b -3由于 DTS API 允许定义带类型限定(如上例第 3 行, 限定 str 为_String 类型)的变量, 而某些自定义类型名也可能使用名字(Identifier) ,所以对上例中 1,2 行中的 a 和 b 中的 a,Script翻译器不能确定其是 b 的类型限定名还是一个变量定义,所以这种情况下, a b 间必须加一个分号分隔 2 个语句:locallocal a ; ; - 1b = “b” - 2_String_String str = b -3DTS Script

33、支持各种数字表述方式,包括整数,负数(-) ,小数(带小数点. ) , 16 进制数(0 x)和科学计数法表示的数值:3 3.0 3.1416 314.16e-2 0.31416E1 0 xff 0 x562.1.2 程序注释DTS Script 采用 Lua 的程序注释形式, 分为行注释和块注释 2 种:DTS Script 使用- 来表示行注释, 例如:a = alon123 - Assign alon123to aDTS Script 采用 - 对来表示块注释, 例如:- DTS Script CommentCopyRight DragonSoft2.1.3 关键字DTS Script

34、关键字分为一般关键字,运算符和系统 API 关键字 3 部分。关键字不能当作名字(标识符)使用。拥有系统给定的含义。DTS Script 一般关键字有:关键字含义关键字含义关键字含义关键字含义and逻辑与break跳出循环do块开始else非条件end块结束false布尔假forFor 循环function函数声明inTable inlocal本地声明nil空not逻辑否repeatRepeatreturn返回thenThentrue真whileWhileelseifelse ifif条件语句or逻辑或untilRepeat注意:1. nil 表示 DTS Script 的空, 与 NULL

35、意义相近但不是 NULL。2. elseif 为连写的 else if, 和其他语言不同, 不能写成分开的 else if。DTS Script 运算符和关键符号:关键符号含义关键符号含义关键符号含义HUGE_VAL最大数+加号-减号*乘号/除号%取余乘方=赋值=等于=不等于=大于等于大于, =和=其中值得注意的是=和=, 注意等于是 2 个=号,以示区别于赋值(=) , 而不等于是=,与其他语言也有些不同。2.5.6 元运算符元运算符只有 2 个:-(负号)和逻辑运算符 not。2.5.7 运算符优先级DTS Script 和大部分语言的运算符优先级都相同,最优先的是 table 中的点 .

36、 运算,就是取字段操作和 table 的(也是取字段操作) ,这 2 种将在 table 中介绍。剩下的真正的运算符优先级如下(从上至下优先级依次递减):-, not 优先于. 优先于*,/,% 优先于+,- 优先于,=,=,= 优先于and,or2.62.6 程序控制流程程序控制流程2.6.1 顺序结构DTS Script 的程序块中遵循顺序执行原则,即写在上面的语句比写在下面的语句先执行。2.6.2 If 条件语句条件语句:if if exp1 thenthenblock1elseifelseif exp2 thenthenblock2elseifelseif exp3 thenthenb

37、lock3.elseelseblock_elsendend含义为:如果满足 exp1(即表达式 exp1 为真或非 nil) ,则执行 block1 块中的语句;如果不满足 exp1 而满足 exp2,则执行 block2 中的语句,elseif 可以写多个, 如果全不满足, 则执行 block_els中的语句。2.6.3 do 块do 语句:dodoblockendend执行 block 中的语句,作用相当于 C 语言中的 。2.6.4 while 循环语句while 语句:whilewhile exp dodoblockendend只要 exp 满足,就执行 block 中的语句,直到 e

38、xp 不满足为止。2.6.5 repeat 循环语句repeat 语句:repeatrepeatblockuntiluntil exp执行 block 中的语句,直到 exp 满足为止。注意:这里不管 exp 满足还是不满足,一开始 block 中的语句都会被执行一遍。2.6.6 一般 for 循环语句for 语句:forfor ident = exp1,exp2 (,exp3)? dodoblockendend(,exp3)?表示 exp3 可有可无。先看一个有 exp3 的例子:forfor i=1+1, i=5, i-1 dodox = x+1endend表示创建一个 local 变量

39、i,赋值为 2(1+1) ,当 i5。这样,上例中如果 x 初值为 0,那么最终 x 将变成 3。这样,for 语句中,ident 为循环控制变量,exp1 是对 ident 赋的初值,exp2 是循环条件,exp3是步进值,也就是 ident 在一次循环后的增量。如果要使 ident 递减,只要把 exp3 设成负值就可以了。exp3 也可以不设:forfor i=1+1, i=5 dodox = x+1i = i+1endend如果这样,那么必须在循环体 block 中用语句显式地给循环控制变量 i 赋值,否则,循环将一直进行下去而成为死循环。从这里也可以看出,循环控制变量 i 的作用域是

40、 for 循环的循环体中。2.6.7 用于遍历表的 for 循环语句(generic for)DTS Script 支持的 Generic for 语句目前有 2 种:forfor ident_key, ident_value inin pairs(table) dodoblockendend和forfor ident_key, ident_value inin ipairs(table) dodoblockendend这 2 种 Generic for 语句分别对应表的全遍历和自然数下标遍历,将在后一节做详细介绍。2.6.8 return 和 break 语句returnreturn 用于函

41、数定义中,后跟一个变量或常量表示返回值,也可以不跟变量或常量,这时,函数使用默认返回值 nilnil 返回。目前不支持 returnreturn 用于 DTS API 的回调函数中,也不支持多返回值函数。breakbreak 用于一般循环体中,以中断最近的一层循环,例如:forfor i=1,i5,1 dodo a = 0whilewhile a 3 dodo if if a = -1 thenthen breakbreak endend a = a + a iendendendend这里如果满足 a triggerPrice thenthen locallocal DTSEvent oevt

42、 = _CreateEventObject_CreateEventObject(“ReportEvent”)oevt._SetFld_SetFld(“IssueCode”, issueCode)oevt._SetFld_SetFld(“MarketCode”, marketCode)local tdp = t.closeoevt._SetFld_SetFld(“TradePrice”, tdp)local qty = sys_format(“%d”, quantity)oevt._SetFld_SetFld(“TradeVolume”, qty)_SendToClients_SendToCli

43、ents(oevt)endendendend这里最后用_SendToClients_SendToClients 接口将事件发送给监听者(客户端) 。只要注册监听了这个事件的监听者都能收到本事件。3.2.6 事件存盘和读取保存事件(DynamicData)对于一个事件,还可以和一个动态数据绑定,由动态数据完成对这个事件的存盘,读取等操作,达到数据存储的目的。用_CreateDynamicData_CreateDynamicData(_String TSInstanceName,int fileType, _EventObject object)来建立一个动态数据的实例。这里第一个参数是保存的文件

44、名,第二个参数是文件类型,第 3 个是需要绑定的事件。要创建动态数据,首先要有一个需要绑定的事件的实例:locallocal DTSEvent tempevt = _CreateEventObject_CreateEventObject(“ReportEvent”)DTSDynamicData reportStore=_CreateDynamicData_CreateDynamicData(Rpt, _DataOtherType_DataOtherType, ReportEvent tempevt ) 相应的,动态数据也有 4 种索引类型:_DataYearType_DataYearType按

45、年索引_DataMonthType_DataMonthType按月索引_DataDayType_DataDayType按日索引_DataOtherType_DataOtherType其他(不索引)这里的索引是指文件存储格式中每行数据的 key,不需要和 EventType 对应。可以用_GetFileType_GetFileType( )接口函数查看文件类型。在创建了事件绑定的动态数据实例后,可以利用它读取或保存对应事件:_GetDynamicData_GetDynamicData(_String dataName,_String condition)_OnDynamicData_OnDyna

46、micData(_String dataName,_EventObject object)这组接口用来读取文件中保存的事件。这是一组同步回调,也就是说在_OnDynamicData_OnDynamicData 回调结束之前,_GetDynamicData_GetDynamicData 函数会被阻塞在那里,程序不会向下执行。在策略执行起来后,可能需要先 load 原先保存的数据,那么就可以使用这个接口了:reportStore. _GetDynamicData_GetDynamicData(report, condition=)_OnDynamicData_OnDynamicData(“repo

47、rt”, ReportEvent evt)local issue = evt._GetFld_GetFld(“IssueCode”)local mkt = evt._GetFld_GetFld(“MakretCode”)local tp = evt._GetFld_GetFld(“TradePrice”)local qty = evt._GetFld_GetFld(“TradeVolume”)local lg = sys_format(“%s.%st%st%sn”, issue, mkt, tp, qty)_WriteAplLog_WriteAplLog(lg)_End_End这样完成了一个将

48、数据读出写 log 的动作。实际上第一个参数”report”的作用是将这 2 个动作绑定,dataName 起到了回调注册的作用,要是这个参数写的不同,那么读取到的数据将不会通过不同 dataName 的_OnDynamicData_OnDynamicData 回调。同样,condition 参数规定了初步过滤条件,和_RegisterEventObject_RegisterEventObject 的 condition 条件一样。同样,可能希望在发送事件前先保存事件。可以使用_SaveData_SaveData(_String dataName,_EventObject object)接口。

49、我们来改写 onkline 函数,使它能保存数据:functionfunction onkline(t)if if t.close triggerPrice thenthen locallocal DTSEvent oevt = _CreateEventObject_CreateEventObject(“ReportEvent”)oevt._SetFld_SetFld(“IssueCode”, issueCode)oevt._SetFld_SetFld(“MarketCode”, marketCode)local tdp = t.closeoevt._SetFld_SetFld(“TradeP

50、rice”, tdp)local qty = sys_format(“%d”, quantity)oevt._SetFld_SetFld(“TradeVolume”, qty)reportStore._SaveData_SaveData(“report”, oevt)_SendToClients_SendToClients(oevt)endendendend当不需要保存的数据时,可以用 reportStore. _Clear_Clear(“report”)来删除文件。3.33.3 DTSDTS APIAPI 变量类型变量类型API 不同于 DTS Script 脚本基本语言部分,它是一个强类型

51、的体系,使用它提供的接口功能时,必须明确类型。正因为如此,弱类型的 DTS Script 脚本语言规定,使用 API 函数时,函数的参数部分只提供简单的变量或直接的常量参数形式,不支持表达式。API 的变量类型分为事件类型,基本类型,复杂结构类型 3 种。其中事件类型(DTSEvent)已经在上面介绍过了,基本类型可以和 Script 一般类型变量相互转换,而复杂结构类型要么是回调回来的数据结构,要么有专门的创建方法,下面主要就复杂结构类型进行详细的讨论。3.3.1 用户定义的事件类型上面介绍了事件,用户可以定义事件,事实上用户定义完事件后就是定义了一个以 EventID 命名的事件类型。所有

52、事件都是建立在基本事件类型 DTSEvent 基础上的,只是字段不同而已,所以定义和注册事件的时候需要说明事件类型,而使用事件的时候,基本上都是 DTSEvent 类型声明。3.3.2 策略参数类型(DTSParameter)策略参数是一个特殊的事件,有自己的固定类型:DTSParameter,实际上这也只是个 EventID而已,实际使用的时候还是要把它当作 DTSEvent 来使用。3.3.3 DTS 系统类型3.3.3.1 用于和一般 Script 逻辑交换信息的部类型DTS API 的强类型特征使得它很难在 DTS Script 中被使用,为此,API 定义了一组可以和Script 一

53、般类型互相交互的简单类型:_Boolean, _String, _Double, _Decimal, _Int, _BigInteger。其主要作用就是在对 API 复杂类型结构的字段设值。除了事件外,其他 API 复杂类型的字段赋值都有自己的赋值函数,赋值函数都对自己的参数规定了类型,不能使用 Script 一般类型。与一般类型交互过程在第 2 章已经详述,这里不再赘述。3.3.3.2 时间类型DTS 系统支持 2 种时间类型:3.3.3.2.1 DTSDate可以使用_GetNowDate_GetNowDate( )取得当前日期,返回值是个 DTSDate 类型。locallocal DT

54、SDate date = _GetNowDate_GetNowDate( )也可以直接用以”YYYYMMDD”或”YYMMDD”为格式的字符串得到特定的日期:locallocal DTSDate date = “20081127”DTSDate 类型支持很多方法,其中比较有用的是:locallocal year = date.year( ) -获取年,注意,这里的年是一个 4 位(YYYY)整数。locallocal month = date.month( ) -获取月,注意,这里的月是整数类型的数字。locallocal day = date.day( ) - 获取日期,注意,这里日期是当月

55、中的日,整数类型。locallocal strDate = date.asString(_String format) - 按照 format 格式返回表示日期的字符串。注意不接受 DTS Script 一般类型,必须先转成_String 类型输入 format。DTSDate 类型还有一些日期相关用法,这里暂且省略。3.3.3.2.2 DTSTime可以使用_GetNowTime_GetNowTime( )取得当前系统时间(精确到秒) ,返回值是个 DTSTime 类型。local DTSTime time = _GetNowTime( )也可以直接以”hhmm”或”hhmmss”或”YYM

56、MDDhhmmss”或”YYYYMMDDhhmmss”的格式的字符串直接得到指定时间:local DTSTime time = “091500” 同样,DTSTime 也有 year,month,day,hour,minute,second,asString 函数。locallocal year = time.year( ) -获取年,注意,这里的年是一个 4 位(YYYY)整数。locallocal month = time.month( ) -获取月,注意,这里的月是整数类型的数字。locallocal day = time.day( ) - 获取日期,注意,这里日期是当月中的日,整数类型

57、。locallocal hour = time.hour( ) - 获取小时,整数类型。locallocal minute = time.minute( ) - 获取分钟,整数类型。locallocal second = time.second( ) - 获取秒,整数类型。locallocal strTime = time.asString(_String format) - 按照 format 格式返回表示时间的字符串。注意不接受 DTS Script 一般类型,必须先转成_String 类型输入 format。3.3.3.2.3 DTSMicroTime可以使用_GetNowMicroTi

58、me_GetNowMicroTime ( )取得当前系统时间(精确到微妙) ,返回值是个DTSMicroTime 类型。local DTSMicroTime time = _GetNowMicroTime ( )也可以直接以”hhmmssqqq”或”hhmmss.qqq”或”hhmmss.qqqqqq”或”hh:mm:ss.qqq”或”hh:mm:ss.qqqqqq”的格式的字符串直接得到指定时间:local DTSMicroTime time = “091500000”同样,DTSMicroTime 也有year,month,day,hour,minute,second,msecond,us

59、econd,asString 函数。locallocal year = time.year( ) -获取年,注意,这里的年是一个 4 位(YYYY)整数。locallocal month = time.month( ) -获取月,注意,这里的月是整数类型的数字。locallocal day = time.day( ) - 获取日期,注意,这里日期是当月中的日,整数类型。locallocal hour = time.hour( ) - 获取小时,整数类型。locallocal minute = time.minute( ) - 获取分钟,整数类型。locallocal second = time

60、.second( ) - 获取秒,整数类型。locallocal msecond = time.msecond( ) - 获取毫秒,整数类型。locallocal usecond = time.usecond( ) - 获取微秒,整数类型。locallocal strTime = time.asString(_Int length) - 按照 length 所规定的长度返回表示时间的字符串。length 的值和字符串格式的对应关系如下:9 表示“hhmmssqqq” ,10 表示“hhmmss.qqq” ,13 表示”hhmmss.qqqqqq” ,15 表示”hh:mm:ss.qqqqqq”

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论