Q语言

更新时间:2024-06-23 00:26

Q是一个数据语言,被限定为一个数据定义语言(DDL)。Q采用JSON/XML模式,其配备了一个专用的用于定义数据的类型系统,和一个称为“信息合约”的理论,用于程序和数据交换语言之间的互操作。Q语言是专为量化投资和程序化交易开发的动态编程语言,兼具C++语言的灵活性和EasyLanguage语言的易用性,支持证券、期货、上海黄金交易所渤海商品交易所所有指。标的历史数据、实时行情、程序化交易;支持恒生、金仕达、顶点、金证、易盛、CTP、国外FIX等几乎所有的交易接口;同时还支持C++,C#、JAVA、MATLAB、R等多种语言的调用。

特点介绍

代码结构

一个完整的Q语言策略程序由两个可选择使用模块三个必需模块构成:

1.两个可选择使用的模块

2.三个必需的模块

在Q语言中,变量可分为一般编程语言通用的“常规变量”和程序化交易专用的“特殊变量”,以下就是两类变量以及其定义和使用方法做简要介绍。

1. 变量声明

在使用变量之前,需要对变量进行声明和赋予初值。Q语言是一种弱类型的程序语言,变量类型不需要特别进行声明,变量声明和赋予初值可同步进行,变量类型由所赋予的初值的数据类型决定。变量名称可采用大写字母(A-Z)、小写字母(a-z)、下划线(_)以及数字(0-9)等,但首字母不能为数字。变量名称的长度基本没有限制。

示例:变量声明和变量类型的确定

2. 常规变量

(1) 基本类型

Q语言支持long int(长、短整型)、double(双精度浮点型)、string(字符串)、bool(布尔型)及DateTime(日期类型)等5种基本的数据类型,如下所示:

DateTime类型为系统定义的一种类型,可通过构造函数DateTime定义,包括下表所列出的一些属性和方法。

(2) 列表类型

相关联的一些同类型的数据可以以列表的形式来组织。在Q语言中,用户可以定义各种列表结构,包括:整型、双精度型、字符(串)型以及布尔逻辑型等基本类型;也可以是Q语言定义的结构变量类型;还可以是用户自定义的数据类型。

Q语言简化了列表定义的方式,采用简洁的直接赋值的方式进行定义及初值的设定,形式如下所示:

其中,Listname表示列表名称,init_valueN为赋予每个列表元素的初值,Length为列表的长度(即列表包含元素的个数)。列表元素的类型由其初值的类型确定,“*Length”为可选;如果不设定,表示列表的长度为1。

更多示例如下所示:

列表的取值操作通过“[]”符号完成,如下表所示:

对列表变量的编辑操作主要包括添加(append)、插入(insert)、移除(remove)、排序(sort)、反转(reverse)、弹出(pop)、清空(clear),如下表所示:

适用于列表的其他操作如下表所示:

(3) 字典类型

Q语言中,字典(Dictionary)是由键(Key)和值(Value)一一对应所形成的基本单元的集合。

同样地,Q语言简化了字典定义的方式,采用更加简洁的直接赋值的方式进行定义及初值的设定。形式如下:

其中,dictname为构造的字典的名称,keyN为键N的名称,为字符串,valueN为键N对应的值;键keyN和值valueN均可为任意的数据类型,其值分别由定义时给定的值的类型确定。在定义好字典类后,我们可以通过访问字典的键获得该键对应的值。

字典的操作实例:

3. 特殊变量

根据程序化交易的特点,在开发策略代码时,可以直接调用系统内置的特殊变量来简化编码,提高开发效率。

(1) 系统变量

(2) 行情变量

(3) 外部参数

在“外部参数”模块中可定义全局性的静态变量,一般在整个代码中仅仅对其调用,不再进行修改,所以策略的参数可以很便利的使用“外部参数”进行定义。

示例如下:

(4) 其他变量

Q语言提供了一些在策略开发中常用的枚举类型,各种类型的名称、取值、含义及使用范例如下表所示:

结构型的数据变量将一组相关的信息变量组织为一个单一的变量实体,其中各个信息变量的数据类型既可以是基本的数据类型,也可以是自定义的数据类型。Q语言定义了两类结构变量类型BarInfo和TickInfo,分别记录行情数据Tick数据信息和Bar数据信息,如表3和表4所示。其中,Tick数据信息是行情的最精确单位,是交易时间的最小颗粒;我国期货市场是500 毫秒推送一个Tick,股票市场是5~6 秒推送一个Tick。在一定时间段内的Tick 序列就构成了一根K 线,在Q语言中单根K线就称为一个Bar。

和枚举类型一样,除系统自带的结构变量类型之外,Q语言还不开放开发者自定义的结构类型变量。用户可以采用字典、类的方法实现结构变量的定义。

TickInfo结构类型属性介绍:

BarInfo结构类型属性介绍:

4. 作用域

Q语言按照模块结构来组织程序,一个完整的模块包括函数、类、控制结构等,模块之间可以是并列关系,也可以是包含关系。

变量的作用域是指变量在各模块中的使用范围。按照作用域的范围,Q语言中变量可分为全局变量(global)和局部变量(local)。在量邦天语中

如下例所示:

第1~13行构成了一个比较完整的Q语言程序。

第1~5行定义了程序的Init()模块,初始化模块。

第2~4行声明了三个全局变量:Volume(double型)、BuyFlag(Bool逻辑型)和CumValue(double型)。

第6~11行定义了程序的Start()模块,循环主体模块。

第7行定义了一个局部变量:addval (double型),该局部变量的作用域仅局限于当轮运行的“Start()”模块中。

第9行也定义了一个局部变量temp,特别注意:即使一个局部变量是在“Start()”模块的子模块内被定义的,它的作用域仍然是整个当轮运行的“Start()”模块,所以temp可以在if语句之外(语句10)中被调用(即便它是在if语句内被定义的)。

第12~13行定义了程序的UnInit()模块,结束化模块。

免责声明
隐私政策
用户协议
目录 22
0{{catalogNumber[index]}}. {{item.title}}
{{item.title}}