《策略编程语言用户编程手册.docx》由会员分享,可在线阅读,更多相关《策略编程语言用户编程手册.docx(76页珍藏版)》请在三一办公上搜索。
1、DragonSoft Information Technology Co. Ltd.图标DTS2.0 策略编程语言 用户编程手册Author : DTS研发部门 Version2.08DTS2.0 Version: 2.0.8策略编程语言 Last Updated: 2011/09/19用户编程手册Revision HistoryDateVersionDescriptionAuthorApprover2008/11/192.00Initial version.Aaron.Peng2011/3/162.0.1增加3.3.3.3.5 内部修正命令3.5.2.2 注册要收听的价格3.5.2.5 查找
2、价格更新3.5.4.2 _OnEventOrderResponse回 调Jack.shiPeter.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、调更新3.5.5.1 DTSMessageRecordAccess类型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.g
4、ongJack.shi2011/9/152.0.7增加2.3.1.2 sys_find的说明更新3.7的matlab图只显示半个6.1增加ETFIOPV说明,修改V说明更新6.3DTSNewOrderAccess field 一览更新6.4DTSCancelOrderAccess field 一览xiang.shuJack.shi2011/9/192.0.8增加PriceCondition的说明Jack.shi目录REVISION HISTORYII1.DTS策略编程语言简介11.1DTS策略编程平台及其原理11.2策略在系统平台上的生命周期和运行过程21.2.1策略生命周期21.2.2系统通
5、讯和Event31.2.2.1事件定义31.2.2.2输入输出事件31.2.2.3Buffer flag31.2.2.4事件回调31.2.3策略参数和参数变化回调41.2.4运行策略42.DTS SCRIPT编程基础72.1DTS Script基本语法格式72.1.1语言字符要求72.1.2程序注释72.1.3关键字82.1.4特殊字符的表示112.2变量及变量的作用域112.2.1全局变量及其作用域112.2.2局部变量(local)及其作用域122.2.3同名的全局变量和局部变量的作用原则122.3类型122.3.1变量内部的类型122.3.1.1nil类型和逻辑判断122.3.1.2st
6、ring类型及针对string的操作122.3.1.3数值类型及内建的数值计算函数142.3.1.4table类型152.3.2支持的各类型间的自动转换152.3.3显式转换类型152.3.4类型转换时的注意事项162.3.5sys_format函数162.4函数182.4.1函数定义182.4.2函数调用192.4.3对函数的限制192.4.4pcall 函数调用192.5运算符202.5.1逻辑运算符202.5.2算术运算符202.5.3字符串连接运算202.5.4赋值运算符202.5.5比较运算符212.5.6元运算符212.5.7运算符优先级212.6程序控制流程212.6.1顺序结构
7、212.6.2If条件语句212.6.3do 块222.6.4while循环语句222.6.5repeat循环语句222.6.6一般for循环语句222.6.7用于遍历表的for循环语句(generic for)232.6.8return和break语句232.7基本容器table242.7.1table的基本概念242.7.2创建和初始化一个table242.7.3table下标的使用242.7.4table的“.”运算符252.7.5顺序存储元素和按key索引元素252.7.6table的insert操作252.7.7table的长度252.7.8table的遍历262.7.8.1全遍历(
8、pairs)262.7.8.2自然数序遍历(ipairs)262.7.9table的sort算法(仅对自然数序table有效)262.8参考Lua的基本语法272.8.1参考部分Lua的语法和Lua的参考资料272.8.2与Lua的重要不同273.DTS API273.1DTS API简介273.2事件处理273.2.1详细的事件定义和事件属性设置273.2.2事件注册(Client)283.2.3事件回调详解293.2.4策略参数事件及其回调293.2.5事件内容设置和发送事件303.2.6事件存盘和读取保存事件(DynamicData)303.3DTS API 变量类型313.3.1用户定
9、义的事件类型313.3.2策略参数类型(DTSParameter)323.3.3DTS系统类型323.3.3.1用于和一般Script逻辑交换信息的内部类型323.3.3.2时间类型323.3.3.2.1DTSDate323.3.3.2.2DTSTime323.3.3.2.3DTSMicroTime333.3.3.3用于下单和撤单的类型333.3.3.3.1DTSNewOrderAccess333.3.3.3.2DTSCancelOrderAccess333.3.3.3.3DTSBasket容器333.3.3.3.4发送Order(下单、撤单)命令343.3.3.3.5内部修正命令353.3.
10、3.3.6批量撤单接口393.3.4其他系统类型393.4存取数据库信息(StaticData)393.4.1从数据库取数据(_GetCommonData)403.4.2更新数据(_UpdateCommonData)403.5固化系统回调事件413.5.1Timer413.5.1.1启动/停止一个Timer413.5.1.2_OnEventTimer回调413.5.2收听市场价格413.5.2.1DTSPrice类型413.5.2.2注册要收听的Price413.5.2.3_OnEventPrice回调423.5.2.4停止收听价格423.5.2.5查找价格423.5.3收听市场逐笔行情价格4
11、33.5.3.1DTSQueuePrice类型433.5.3.2注册要收听的Price463.5.3.3_OnEventQueuePrice回调463.5.3.4停止收听分笔行情价格463.5.3.5查找分笔行情价格473.5.4监视仓位变化473.5.4.1DTSPosition类型473.5.4.2注册要监听的Position473.5.4.3_OnEventPosition回调483.5.4.4停止收听Position483.5.5监听下单回复483.5.5.1DTSExecution类型483.5.5.2_OnEventOrderResponse回调493.5.6监听成交信息503.5
12、.6.1DTSMessageRecordAccess类型503.5.6.2选择需要监听的成交信息503.5.6.3_OnEventExecution回调503.6系统工具函数513.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.7MATLAB支持523.7.1启动MATLAB engine523.7.2判断MAT
13、LAB engine是否启动523.7.3设置MATLAB变量533.7.4获取MATLAB变量533.8一个完整的例子534.完整的语法规则555.LUAEDITOR555.1DTS Lua Editor简介555.2LuaEditor功能介绍575.2.1增加一个新策略575.2.2语法检查595.2.3提交595.2.4发布605.2.5策略管理615.3LuaEditor使用技巧625.3.1LuaEditor对DTSScript语法关键字和符号能自己编辑颜色625.3.2语法错误的提示626.附录636.1DTSPrice field一览636.2DTSQueuePrice fiel
14、d一览656.3DTSNewOrderAccess field 一览656.4DTSCancelOrderAccess field 一览676.5参考资料68Confidential上海龙软信息技术有限公司, 2006-2011vi1. DTS策略编程语言简介DTS系统策略编程语言是针对DTS程式化套利系统编写套利策略的策略编程语言, 提供灵活的,具有一般性的编程语言接口, 可以为DTS系统编写高效的策略服务程序。DTS策略编程语言综合了Lua和基于C+的DTS系统API接口, 最终将脚本翻译成C+服务器程序编译执行, 具有灵活高效的特点。DTS策略编程语言由基本DTSScript和DTS系统
15、API 两部分组成, DTSScript提供了基本用户编程逻辑的编写接口, DTSAPI提供了Server编程框架和用户策略逻辑对DTS后台系统数据的访问和使用接口。本手册讨论这种语言的基本组成,语法特点和具体使用方法, 同时介绍DTS客户端系统附带的LuaEditor的基本功能和使用技巧。1.1 DTS策略编程平台及其原理DTS策略编程平台主要由 DTSClient 下带的 DTS Script Editor(Lua Editor)为客户端, 配合Strategy Control Server (SCS)为服务器端组成。用户编写的策略通过Client端 自带的Event打包解包库(Event
16、Communicator),打包成事件(Event)发送给SCS, 由SCS内的Script Translator(L2C)翻译成C+源代码后由GNU编译成策略服务器程序(SS)。启动时, 由客户端发送启动Event给SCS控制启动SS, 并告知客户端SS端口及ip地址, 由客户端直接Socket链接SS获取策略服务; 停止时, 也由客户端发送停止Event给SCS控制结束SS服务。由于SS是直接编译运行的, 所以拥有效率高的特点; 同时每个客户有自己的策略服务器, 故每个服务器程序负载不会很重, 所以又有稳定,快速的优点。1.2 策略在系统平台上的生命周期和运行过程1.2.1 策略生命周期要
17、完整地编写一个能用的策略服务器, 需要以下几个步骤:1. 在Script Editor中编写完整的策略脚本。2. 语法检查通过。3. 提交SVN(通过SCS)成功。4. 发布成功(编译成功)。当策略被发布成功后, 用户可以在自己的策略管理界面上看到相应的策略;用户可以选择加载需要的策略版本,并且运行此策略;策略一旦运行, 就开始提供既定的服务直到用户停止此策略。策略的生命周期:1.2.2 系统通讯和EventDTS系统内部各个组成部件间的通讯都是建立在事件(Event)处理上的,SCS,Client及SS之间信息的互换都是通过Event来完成的。所有的Event都是统一格式存放的, 由包含在C
18、lient和Server端程序中的EventCommunicatorLib进行编码/解码。我们可以把Event看作是可以自定义字段的Message。1.2.2.1 事件定义所有用户事件都是可以在脚本中定义的。以下例程定义了一个最简单的事件,_DefineEventObject TestEvent _AS _Output_DefFld(TestField,_String ,12);_End这个Event被定义为包含一个名叫“TestField”的字段, 字段类型为String类型, 长度为12。事件定义和处理被做为一种DTSAPI的特性将在第3章 节中详细介绍。1.2.2.2 输入输出事件做为策
19、略编程语言, DTSScript写好的脚本最终会被编译成策略服务器程序(SS);相对SS来说是输入的Event被认为是输入事件, 例如Client向SS传送的参数可以被认为是一个In事件;相反的, SS发送出去的事件被认为是Out事件, 如上面的例程就是定义了一个Out事件, 填写完整这个TestEvent后, SS可以创建一个Out事件的实例并且通过API将这个实例发送给所有监听这个事件的客户端(可能是DTSClient端或者另外一个SS)。1.2.2.3 Buffer flag由于系统中所有的通讯都被认为是事件处理, 也就是说所有的Server,Client和Server之间都是基于一方发
20、送Out事件,一方接收事件并触发回调来达到交换信息的目的, 这样,为了可以使不同时间连接上来的客户端可以收到完整的Event流, Event被设计成带有一个Buffer标志, Buffer Flag一共有3种值, 0代表没有Buffer, 即后来连接上来的Client不会接收到连接上来之前Server已经发送过的Event;1代表list类型的Buffer, 即后来连接上来的Client能够收到符合条件的自Server启动以来发送过的所有这种类型的Event, 并且是按事件顺序排列的;2代表map类型的Event, 即后来连接上来的Client能够收到所有以某个字段为Key的Server已经发
21、送过的Event, 重复Key的Event只保留最新的一个。有了这2种buffer, 像诸如HDS(Historical Data Sever)这种需要保留历史数据的服务器也可以用策略来描述了。1.2.2.4 事件回调对于接收别的Server或Client发送的事件一方的Server或Client, 只需要知道接收的是来自哪里的什么Event就可以了:_RegisterEventObject(PortfolioID=P2007091319484800001, StrageyID=2007091319484800001,EventID=TbtPEvent,condition=IssueCode#
22、issueCode1,issueCode2,issueCode3)使用_RegisterEventObject命令可以注册与什么策略服务器连接, 并取得什么Event。当连接建立后, 每当那个策略服务器向外发送既定的Event, 接收方就会收到一条Event的回调:_OnEventDefined(TbtPEvent evt) -用户逻辑_End 收到Event回调后, 接收方就通过_OnEventDefined接口回调函数执行既定的用户逻辑。1.2.3 策略参数和参数变化回调在DTS2.0系统中, 所有的系统间交互都是通过Event完成的, 所以策略服务器的输入参数实际上也是一种特殊的Even
23、t。输入参数Event做为一种特殊Event,被设计为是同时拥有Input和OutPut属性的Event,做为Input Event(客户端向SS发送参数值),其Buffer Flag为0, SS只需要最新的参数;而做为Output Event (SS返回给客户端的Ack),其Buffer Flag为2, Key是一个永远为1的值,这样可以保留最新一个Ack也能被Client收到,防止Client重启后参数不同步的情况。所有定义的参数都会在策略服务器中对应一个同名同类型的全局变量,脚本中可以直接使用这些参数, 同时当参数值变化时, Client端发送来的参数变化也会被同步到这些全局变量中。可以
24、通过_DefineStrategyParameters关键字定义一组策略Server的参数,并通过_OnEventParameterChanged(DTSParameter parameter) 回调来处理从客户端发送过来的参数变化:_DefineStrategyParameters_String issueCode1_String issueCode2_String issueCode3_Number factor1_Number factor2_Number factor3_Number constant_String periodType_String periodCount_End_O
25、nEventParameterChanged(DTSParameter parameter) -用户处理逻辑_End1.2.4 运行策略当策略被发布好以后, DTSClient中的策略管理页面也就有了相应的策略列表:在需要启动此策略的模型中添加此策略:启动策略:停止策略:2. DTS Script编程基础2.1 DTS Script基本语法格式2.1.1 语言字符要求DTS Script中的名字(变量名,函数名,Table的字段名等标识符)可以由任意字母,数字和下划线组成,但是不能以数字开头, 由于DTS API(将在第3章详细介绍)关键字以”_”开头,所以应尽量避免使用”_”做为名称的起始符
26、号, 以避免和系统关键字相互冲突。DTS Script 是严格区分大小写的, 比如Text和text是不同的变量名, 可以用来代表不同的2个变量。DTS Script中的字符串可以是以一对单引号()引起或者一对双引号(”)引起的一串字符,内容里可以支持任意字符, 包括中文, 系统传输和翻译中不会改变字符的编码方式, 但是为了终端显示和避免编码解码方式不同带来的麻烦, 建议统一使用utf-8编码方式(注意不要使用带signal的UTF-8编码, 头标记会被认为是非法字符)。对于_开头的函数, 一般认为是系统保留的函数名, 建议尽量避免使用。对于“DTS”开头的词, 一般认为是系统API数据类型,
27、 请不要使用其命名一般变量和函数等。名字,函数调用和关键字,算符等之间以空白分隔, 空白可以是任意的空白,不限数量和种类,包括 空格( ),TAB(t),分割符(f)和分行/回车(rn,r,n)。DTS Script各个段(声明,结构,语句等)间可以以分号(;)分隔,也可以以上述的空白分隔。但是有一种情况必须用分号分隔:local a - 1b = “b” - 2_String str = b -3由于DTS API允许定义带类型限定(如上例第3行, 限定str为_String类型)的变量, 而某些自定义类型名也可能使用名字(Identifier),所以对上例中1,2行中的a和b中的a,Scr
28、ipt翻译器不能确定其是b的类型限定名还是一个变量定义,所以这种情况下, a b间必须加一个分号分隔2个语句:local a ; - 1b = “b” - 2_String str = b -3DTS Script支持各种数字表述方式,包括整数,负数(-),小数(带小数点.), 16进制数(0x)和科学计数法表示的数值:3 3.0 3.1416 314.16e-2 0.31416E1 0xff 0x562.1.2 程序注释DTS Script采用Lua的程序注释形式, 分为行注释和块注释2种:DTS Script使用- 来表示行注释, 例如:a = alon123 - Assign alon1
29、23to aDTS Script 采用 - 对来表示块注释, 例如:- DTS Script CommentCopyRight DragonSoft2.1.3 关键字DTS Script 关键字分为一般关键字,运算符和系统API关键字3部分。关键字不能当作名字(标识符)使用。拥有系统给定的含义。DTS Script 一般关键字有:关键字含义关键字含义关键字含义关键字含义and逻辑与break跳出循环do块开始else非条件end块结束false布尔假forFor循环function函数声明inTable inlocal本地声明nil空not逻辑否repeatRepeatreturn返回then
30、Thentrue真whileWhileelseifelse ifif条件语句or逻辑或untilRepeat注意:1. nil 表示DTS Script的空, 与NULL意义相近但不是NULL。2. elseif 为连写的else if, 和其他语言不同, 不能写成分开的else if。DTS Script 运算符和关键符号:关键符号含义关键符号含义关键符号含义HUGE_VAL最大数+加号-减号*乘号/除号%取余乘方=赋值=等于=不等于=大于等于大于小于(小括号左)小括号右方括号左方括号右大括号左大括号右;分号,逗号.点号.字符串连接不定参DTS API 关键字:1. DTS 开头的标识符:D
31、TS 开头的标识符表示DTS系统内部类型, 不能做为名字(标识符)使用,例如:DTSBasket basket = _CreateBasket()其中DTSBasket表示basket 是一个DTSBasket类型的变量,与一般类型(不带类型定义的变量)不同,每种DTS系统内部类型的实例都拥有自己特有的方法和构造方式, 这部分请参见第3章和第6章。2. sys_ 开头的函数名:sys_ 开头的函数都是系统内建函数, 也就是系统内部提供的已经写好的函数, 有自己的用法和功能。如:sys_format(“%f”, 3.14)输出一个STRING型的”3.14”;这部分函数会在以后的各节中一一列举其
32、形式和功能。3. API 接口关键字类型关键字:关键字对应类型关键字对应类型关键字对应类型_Booleanbool_Intint_DecimalBDecimal_BigIntegerBBigInteger_StringBString_Doubledouble事件字段类型:关键字对应类型关键字对应类型_Booleanint_Numberdouble_StringBString_Metachar*事件类型关键字:关键字事件类型关键字事件类型_Input对SS来说为输入事件_Output对SS来说为输出事件事件时间Key类型:关键字含义关键字含义关键字含义_EventYearType按年_Event
33、MonthType按月_EventWeekType按周_EventDayType按日_EventMinuteType按分_EventOtherType其他文件索引类型关键字:关键字含义关键字含义关键字含义_DataYearType按年_DataMonthType按月_DataWeekType按周_DataDayType按日_DataOtherType其他数据库操作辨识符:关键字含义关键字含义关键字含义_Insert插入_Modify修改_Delete删除DTS API 中的其他关键字:_DefineEventObject定义一个事件。_AS定义事件类型(in、out)。_End回调段结束符。_
34、DefKeyField定义事件主键。_DefFld定义事件字段。_SetBufferedFlag定义事件Buffer Flag。_GetBufferedFlag得到事件Buffer Flag。_SetDataType设置事件数据类型。_GetDataType得到事件数据类型。_SetDataInterval设置事件数据发送间隔。_GetDataInterval得到事件数据发送间隔。_SetTimeKey设置事件时间键。_GetTimeKey得到事件事件键。_SetFld设置事件字段值。_GetFld得到事件字段值。_CreateEventObject创建一个事件实例。_CreateDynami
35、cData创建一个动态数据。_Get得到文件类型。_SaveData保存至文件。_Clear清空数据。_GetDynamicData得到保存的动态数据,和OnDynamicData为同步回调。_OnDynamicData得到动态数据的回调。_GetCommonData获取静态数据,和OnCommonData为同步回调。_OnCommonData得到静态数据的回调。_UpdateCommonData更新、插入、删除静态数据。_DefineStrategyParameters定义策略服务器参数。_OnEventParameterChanged策略服务器参数变化回调。_RegisterEventOb
36、ject注册事件。_OnEventDefined事件回调。_EventName事件回调名字标识。_EventID事件ID标识。_OnEventTimer定时器回调。_EndTime定时器终止事件标识。_Interval定时器时间间隔标识。_TimerName定时器名字标识。_OnEventPrice价格回调。_PriceName价格函数名字标识。_IssueCode证券号码标识。_MarketCode市场标识。_OnEventPosition仓位变化回调。_OnEventExecution成交回调。_OnEventOrderResponse下单回复回调。_RegisterExecution注册
37、监听成交。_SendToClients发送事件给客户端(监听者)。_Stop停止策略服务。_RegisterPrice注册监听价格。_StopPrice停止监听单个价格。_StopAllPrice停止监听所有价格。_RegisterPosition注册监听仓位变化。_StopPosition停止监听仓位变化。_StartTimer启动定时器。_StartTime定时开始时间标识。_MaxNumber定时器最大跳数标识。_StopTimer停止定时器。_createPortfolioOrders得到模型下所有Order的Basket。_SendOrders发送Order(下单、撤单等)。_Can
38、celOrders撤单(已废止,现在使用_SendOrders撤单)。_GetPortfolioID取得模型ID。_GetStrategyVersion取得策略版本号。_GetStrategyID取得策略号。_GetPortfolio取得模型数据。_GetDealerID取得用户ID。_GetPortfolioContent取得模型信息。_Get取得动态数据文件存放的根目录。_GetHostname取得主机名。_GetServicePort取得服务端口。_GetProcessID取得服务进程号。_GetWorkstationNo取得服务器号。_GetStartTime取得服务开始事件。_Cre
39、ateBasket创建一个篮子(basket)。_CreateBasketCancelBasket 创建一个篮子撤单的篮子(basket)。_CreateNewOrder创建一个空的NewOrder,(下单用)。_CreateCancelOrder创建一个空的CancelOrder,(撤单用)。_CreateManualNewAccept创建一个ManualNewAccept,(无参数时表示创建一个空容器,有参数时表示创建一个用于补委托的内部修正命令)。_CreateManualNewReject创建一个ManualNewAccept,(撤消委托用)_CreateManualExecution
40、创建一个ManualExecution,(无参数时表示创建一个空容器,有参数时表示创建一个用于补成交的内部修正命令)。_CreateCancelExecution创建一个ManualExecution,(撤消成交用)。_CreateGlobalUniqueKey生成一个全局唯一序列号。_CreateAESEncrypt对字符串进行加密。_CreateAESDecrypt对字符串进行解密。_DestroyBasket销毁一个Basket。_WriteAplLog写入APL log。_WriteErrorLog写入Error log。_GetNowTime取得当前系统时间(精确到秒)。_GetNo
41、wMicroTime取得当前系统时间(精确到微秒)。_GetNowDate取得当前系统日期。_onSubmitStatusChange可以下单状态回调。_GetShmOrderDetail根据内部委托号取得对应下单状态。_GetFirstShmMessage根据内部委托号取得对应下单的第一条交易流水信息。_GetLastError取得最近一次错误的详细描述。API关键字代表的函数和回调的用法和作用将在第3章做详细介绍。注意:因为最终将会被翻译成C+编译执行,所以所有C+的关键字都是DTS Script的隐式关键字,不可以被做为名字(标识符)使用, 如 int, long, string, do
42、uble, default, continue, switch等等。2.1.4 特殊字符的表示DTS Script中String下的一些控制字符和被用作标识符而不能使用的字符的表达, 和其他语言一样,使用做为转义符,例如: 表示 。” 表示 “ 。 表示 。n r rn表示回车, t 表示TAB等。2.2 变量及变量的作用域变量分为全局变量和局部变量,有不同的作用域和定义方式。2.2.1 全局变量及其作用域在任何地方定义一个一般变量,这个一般变量都会被认为是一个全局变量,例如:a = 1if a = 1 then b = 2else b = 1end这里a 和 b都是全局变量,即使出了if块,b仍然有效。如果在end后将b记入log,log中将记入2这个值。2.2.2 局部变量(local)及其作用域由 local 关键字声明的变量为局部变量,局部变量只在其有效作用区间中有效,出了作用域, local 变量将被析构(销毁),不能再使用。例如:a = 1if a=1 then local b = 2else