Q語言(動態程式語言)

Q語言(動態程式語言)

本詞條是多義詞,共2個義項
更多義項 ▼ 收起列表 ▲

Q是一個數據語言,目前被限定為一個數據定義語言(DDL)。Q採用JSON/XML模式,其配備了一個專用的用於定義數據的類型系統,和一個稱為“信息契約”的理論,用於程式和數據交換語言之間的互操作。Q語言是專為量化投資和程式化交易開發的動態程式語言,兼具C++語言的靈活性和EasyLanguage語言的易用性,支持證券、期貨、上海黃金交易所、渤海商品交易所所有指。標的歷史數據、實時行情、程式化交易;支持恒生、金仕達、頂點、金證、易盛、CTP、國外FIX等幾乎所有的交易接口;同時還支持C++,C#、JAVA、MATLAB、R等多種語言的調用。

基本介紹

  • 中文名:Q語言
  • 外文名:QLanguage
  • 屬於:計算機編程
  • 語言:動態程式語言
  • 領域:為量化投資和程式化交易開發
一、Q語言特點,二、代碼結構,1. 變數聲明,2. 常規變數,3. 特殊變數,4. 作用域,

一、Q語言特點

  1. 面向對象,可以自定義類;
  2. 區分大小寫;
  3. 以一行代表一條完整的語句;
  4. 以Tab縮進實現結構化控制,使得程式可讀性更強;
  5. 是弱數據類型的程式語言,能夠實現變數、參數類型的智慧型化處理。

二、代碼結構

一個完整的Q語言策略程式由兩個可選擇使用模組三個必需模組構成:
1.兩個可選擇使用的模組
  • “引用”模組:在此模組可以聲明想要引用的外部函式或類。
  • “外部參數”模組:在此模組中可定義全局性的靜態變數,一般把策略的參數定義在此模組中。
2.三個必需的模組
  • Init()模組:僅在策略準備時運行一次。在該模組中,用戶可定義全局變數,並對其進行賦初值。
  • Start()模組:由實時行情或後驗數據流驅動循環調用,引擎每接受到一個新的數據就運行一次。策略編寫者的策略思想主要在該模組中實現。每次執行完成後,在Start()模組中定義的局部變數會被釋放,但在Init()模組中定義的全局變數以及在“外部參數”模組中定義的參數會保留,進入下一次Start()循環。
  • UnInit()模組:為程式全部執行完成結束後調用,為系統默認調用,一般地用戶不需要在此模組中編寫代碼。
在Q語言中,變數可分為一般程式語言通用的“常規變數”和程式化交易專用的“特殊變數”,以下就是兩類變數以及其定義和使用方法做簡要介紹。

1. 變數聲明

在使用變數之前,需要對變數進行聲明和賦予初值。Q語言是一種弱類型的程式語言,變數類型不需要特別進行聲明,變數聲明和賦予初值可同步進行,變數類型由所賦予的初值的數據類型決定。變數名稱可採用大寫字母(A-Z)、小寫字母(a-z)、下劃線(_)以及數字(0-9)等,但首字母不能為數字。變數名稱的長度基本沒有限制。
示例:變數聲明和變數類型的確定
語句
釋義
i=5
將i聲明為整數(int)型變數,並賦予初值5。
Price=[0.1]
將Price聲明為長度為1的雙精度型的動態列表變數,並賦予初值0.1。
Price=[0.1]*10
將Price聲明為長度為10的雙精度型的動態列表變數,並把數值中每個元素的初值設為0.1。
SecuCode=”600519”
將SecuCode聲明為字元串型變數,並賦予初值”600519”。
SellFlag = {"600519": 0}
將SellFlag聲明為包含一個鍵(字元串型)及對應值(整數型)的字典型變數

2. 常規變數

(1) 基本類型
Q語言支持long int(長、短整型)、double(雙精度浮點型)、string(字元串)、bool(布爾型)及DateTime(日期類型)等5種基本的數據類型,如下所示:
類型名稱
注釋
值域
範例
long int
長、短整型
±5.0 e−323~±1.79 e308
0,1,10…
double
雙精度浮點數
3.1415926789
string
字元串
‘abcdefg’ “a str”
bool
布爾型
為True或False
True, False
DateTime
日期時間類型
2012/1/1 23:01:01
  • DateTime的使用
DateTime類型為系統定義的一種類型,可通過構造函式DateTime定義,包括下表所列出的一些屬性和方法。
DateTime的屬性

屬性
含義

屬性
含義
1
Date
8
Month
月份數
2
Day
月份天數
9
Now
現在時間
3
DayOfWeek
周幾
10
Second
秒數
4
DayOfYear
一年的第幾天
11
Ticks
百納秒數
5
Hour
小時
12
TimeOfDay
一天的時間
6
Millisecond
毫秒
13
Today
今天的日期
7
Minute
分鐘
14
Year
年份
DateTime的方法

方法
含義

方法
含義
1
AddDays
增加天數
10
CompareTo
和指定日期比較
2
AddHours
增加小時數
11
DaysInMonth
當月天數
3
AddMilliseconds
增加毫秒數
12
Equals
指示是否等於指定日期值
4
AddMinutes
增加分鐘數
13
IsDaylightSavingTime
指示是否在當前時區的夏時制範圍內
5
AddMonths
增加月份數
14
IsLeapYear
是否是閏年
6
AddSeconds
增加秒數
15
Parse
從字元串中得到日期
7
AddTicks
增加Tick數
16
Subtract
減去
8
AddYears
增加年數
17
ToString
轉化為字元串
9
Compare
比較兩個日期
(2) 列表類型
相關聯的一些同類型的數據可以以列表的形式來組織。在Q語言中,用戶可以定義各種列表結構,包括:整型、雙精度型、字元(串)型以及布爾邏輯型等基本類型;也可以是Q語言定義的結構變數類型;還可以是用戶自定義的數據類型。
Q語言簡化了列表定義的方式,採用簡潔的直接賦值的方式進行定義及初值的設定,形式如下所示:
定義方式1
Listname = [init_value]*Length
定義方式2
Listname = [init_value1, init_value2, …, init_valueN]
其中,Listname表示列表名稱,init_valueN為賦予每個列表元素的初值,Length為列表的長度(即列表包含元素的個數)。列表元素的類型由其初值的類型確定,“*Length”為可選;如果不設定,表示列表的長度為1。
更多示例如下所示:
語句
釋義
Price = [0.0]
定義長度為1的列表變數Price,並給元素賦予初值0.0。
PriceH = [0.0]*10
定義長度為10的列表變數PriceH,並給每個元素賦予初值0.0。
PriceC = [1.0, 1.1, 1.15]
定義長度為3 的列表變數PriceC,並給元素分別賦予初值1.0、1.1、和1.15。
CharArray = [‘A’,’B’]
定義長度為2 的字元列表變數CharArray,並給元素分別賦予初值’A’和’B’。
StrArray = [“no”,”yes”]
定義長度為2 的字元串列表變數StrArray,並給元素分別賦予初值”no”和”yes”。
LogArray = [True,False]
定義長度為2 的邏輯型列表變數LogArray,並給元素分別賦予初值True和False。
  • 列表操作
  • 取值操作
列表的取值操作通過“[]”符號完成,如下表所示:
操作類型
釋義
Listname[0]
取出列表的第1個(索引為0的)值
Listname[1:4]
取出列表從第2個到第5個之間的所有值
Listname[-1]
取出列表的倒數第1個值
Listname[-3:]
取出列表從倒數第3個到倒數第1個的所有值
Listname[3:]
取出列表從第4個到最後一個的所有值
Listname[:3]
取出列表從第1個到第4個的所有值
Listname[:]
取出列表的所有值
  1. 編輯操作
對列表變數的編輯操作主要包括添加(append)、插入(insert)、移除(remove)、排序(sort)、反轉(reverse)、彈出(pop)、清空(clear),如下表所示:
操作類型
釋義
Listname. append(value)
在列表列表的末尾處加入值value
Listname. insert(i, value)
在列表列表索引為i的地方插入值value
Listname. remove(value)
移除列表列表中第一個值為value的元素
Listname.sort()
對列表中元素的元素進行排序
Listname.reverse()
對列表中元素的元素進行反轉
Listname.pop(i)
彈出列表中索引為i的元素並返回
Listname.clear()
清空列表中的所有元素
  1. 其他操作
適用於列表的其他操作如下表所示:
操作類型
釋義
Listname.index(value)
查找列表中第一個值為value的元素並返回其索引
Listname.count(value)
返回列表中出現value的次數
(3) 字典類型
Q語言中,字典(Dictionary)是由鍵(Key)和值(Value)一一對應所形成的基本單元的集合。
同樣地,Q語言簡化了字典定義的方式,採用更加簡潔的直接賦值的方式進行定義及初值的設定。形式如下:
<定義字典變數>
dictname = {key1:value1, key2:value2, … , keyN:valueN}
其中,dictname為構造的字典的名稱,keyN為鍵N的名稱,為字元串,valueN為鍵N對應的值;鍵keyN和值valueN均可為任意的數據類型,其值分別由定義時給定的值的類型確定。在定義好字典類後,我們可以通過訪問字典的鍵獲得該鍵對應的值。
字典的操作實例:
語句
釋義
ExternPara = {"LSRto": 0.02, "SSRto": 0.02}
定義ExternPara字典
ExternPara["LSRto"] = 0.05
改變字典指定鍵的值

3. 特殊變數

根據程式化交易的特點,在開發策略代碼時,可以直接調用系統內置的特殊變數來簡化編碼,提高開發效率。
(1) 系統變數
  • 持倉相關變數:
變數名稱
釋義
Pos.LongPosition
多頭持倉手數。如果目前有3手多頭持倉,則Pos.LongPosition = 3
Pos.ShortPosition
空頭持倉手數。如果目前有2手空頭持倉,則Pos.ShortPosition = 2
Pos.MarketPosition
持倉狀態。可取三種值,1,-1,0。如果多頭持倉>空頭持倉,該值為1;若多頭持倉<空頭持倉,該值為-1;若多頭持倉=空頭持倉,該值為0
Pos.LastEntryBar
上一次開倉所在Bar的全局索引。如果上一次開倉所在的Bar的索引值為168,則Pos.LastEntryBar = 168
Pos.LastExitBar
上一次平倉所在Bar的全局索引。如果上一次平倉所在的Bar的索引值為56,則Pos.LastExitBar = 56
Pos.LastEntryPrice
上一次開倉的價格。如果上一次開倉時trade.T_Buy()函式中輸入的價格是Price,則Pos.LastEntryPrice = Price
Pos.LongAvgEntryPrice
多頭持倉均價。如果有3手多頭持倉,開倉價格分別為2300、2450、2400,則多頭持倉均價為(2300+2450+2400)/3 = 2383.33
Pos.ShortAvgEntryPrice
空頭持倉均價。如果有3手空頭持倉,開倉價格分別為2300、2450、2400,則空頭持倉均價為(2300+2450+2400)/3 = 2383.33
  • Bar相關變數:
變數名稱
釋義
Bar.Count
當前Bar的全局索引。按照從左到右的順序,全局第一根Bar的索引值為1,第二根Bar的索引值為2,以此類推。
例如,從左向右數,當前Bar為第230根Bar,則Bar.Count = 230
以下兩種寫法是一致的:
BarCount=Bar.Count
BarCount=quotation.Q_BarCount(strSecuCode,BarCountMode.GLOBAL,StrategyInfo.DefaultTimeFrame)
Bar.CountIntra
當前Bar在當前交易日的索引。按照從左到右的順序,當前Bar所在交易日的第一根Bar的索引值為1,第二根Bar的索引值為2,以此類推。
Bar.CountDay
當前的日Bar的索引。按照從左到右的順序,第一根日Bar的索引值為1,第二根Bar的索引值為2,以此類推。
Bar.Time
當前Bar的時間。
例如,當前Bar的時間為14:35,則Bar.Time = 1435
以下兩種寫法是一致的:
Time = Bar.Time
Time=quotation.Q_BarTime(strSecuCode,StrategyInfo.DefaultTimeFrame)
Bar.Date
當前Bar的日期。
例如,當前Bar的日期為2013年8月28日,則Bar.Date = 20130828
以下兩種寫法是一致的:
Date = Bar.Date
Date=quotation.Q_Date_Bar(strSecuCode,StrategyInfo.DefaultTimeFrame)
  • 系統相關變數:
變數名稱
釋義
Sys.Time
獲取系統時間。
例如,系統時間為20:23,則Sys.Time = 2023
Sys.Date
獲取系統日期。
例如,系統日期為2013年8月1日,則Sys.Date = 20130801
  • 資金相關變數:
變數名稱
釋義
Cap.Init
初始資金
Cap.Margin
可用保證金
  • 品種相關變數:
變數名稱
釋義
Contract.Code
契約代碼
Contract.MarginRatio
契約保證金比例
Contract.PriceTick
契約最小變動價格
Contract.TradingUnit
契約交易單位
(2) 行情變數
變數名稱
釋義
Open
獲取Bar open數據序列信息
High
獲取Bar high數據序列信息
Low
獲取Bar low數據序列信息
Close
獲取Bar close數據序列信息
Vol
獲取Bar volumn數據序列信息
OpenInt
獲取Bar openint數據序列信息
OpenD
獲取DayBar open數據序列信息
HighD
獲取DayBar high數據序列信息
LowD
獲取DayBar low數據序列信息
CloseD
獲取DayBar close數據序列信息
VolD
獲取DayBar volumn數據序列信息
OpenIntD
獲取DayBar openint數據序列信息
BarList
獲取Bar數據序列信息。序號0為最新Bar。返回值為一個BarInfo類型的變數,參見BarInfo。
以下兩種寫法是一致的:
List =Bar.List
List = quotation.Q_Barlist (strSecuCode,StrategyInfo.DefaultTimeFrame)
(3) 外部參數
在“外部參數”模組中可定義全局性的靜態變數,一般在整個代碼中僅僅對其調用,不再進行修改,所以策略的參數可以很便利的使用“外部參數”進行定義。
示例如下:
Line 1:
Ex:

Line 2:
ExTime = 1455
Line 3:
StartTime = 905
Line 4:
EndTime = 1305
Line 5:
ATRLength=7
Line 6:
M=15
Line 7:
N=0.15
Line 8:
TrailStop=7
Line 9:
EndEx
(4) 其他變數
  • 枚舉類型
Q語言提供了一些在策略開發中常用的枚舉類型,各種類型的名稱、取值、含義及使用範例如下表所示:
類型名稱

注釋
使用範例
SecuType
(表示證券類型)
NULL
默認空類型
用SecuType.STOCK表示證券類型為股票;用SecuType.BOND_FUTURE表示證券類型為債券期貨
COMMON
所有類型
STOCK
股票
FUTURE
期貨
BOND
債券
OPTIONS
期權
GOLD
貴金屬
COMMODITY
商品
FOREIGN_EXCHANGE
外匯
INDEX_FUTURE
指數期貨
COMMODITY_FUTURE
商品期貨
BOND_FUTURE
債券期貨
TimeFrame
(表示K線類型)
TICK
Tick 數據
用TimeFrame.TICK表示K線數據為Tick數據;用TimeFrame.DAY表示K線數據為日數據
MIN_1
1 分鐘 Bar
MIN_5
5 分鐘 Bar
MIN_10
10 分鐘 Bar
MIN_15
15 分鐘 Bar
MIN_30
30 分鐘 Bar
MIN_60
60 分鐘 Bar
DAY
一日 Bar
WEEK
一周 Bar
MONTH
一月 Bar
SEANSON
一季度 Bar
YEAR
一年 Bar
BarCountMode
(表示Bar計數模式類型)
INTRADAY
日內 Bar 計數
BarCountMode.INTRADAY
BarCountMode.GLOBAL
GLOBAL
全局 Bar 計數
StrategyType
(表示策略類型)
INDICATOR
指標
StrategyType.INDICATOR
StrategyType.TRADINGSYSTEM
TRADINGSYSTEM
交易系統
OffsetFlag
(表示開平標誌)
OPEN
開倉
OffsetFlag.OPEN,
OffsetFlag.CLOSE
CLOSE
平倉
FORCECLOSE
強平
CLOSETODAY
平今
TradeDirection
(表示買賣方向)
BUY

TradeDirection.BUY
TradeDirection.SELL
SELL

OrderType
(表示委託類型)
MARKETORDER
市價
OrderType.MARKETORDER
OrderType.LIMITORDER
  • 結構類型
結構型的數據變數將一組相關的信息變數組織為一個單一的變數實體,其中各個信息變數的數據類型既可以是基本的數據類型,也可以是自定義的數據類型。Q語言定義了兩類結構變數類型BarInfo和TickInfo,分別記錄行情數據Tick數據信息和Bar數據信息,如表3和表4所示。其中,Tick數據信息是行情的最精確單位,是交易時間的最小顆粒;我國期貨市場目前是500 毫秒推送一個Tick,股票市場是5~6 秒推送一個Tick。在一定時間段內的Tick 序列就構成了一根K 線,在Q語言中單根K線就稱為一個Bar。
和枚舉類型一樣,除系統自帶的結構變數類型之外,目前Q語言還不開放開發者自定義的結構類型變數。用戶可以採用字典、類的方法實現結構變數的定義。
TickInfo結構類型屬性介紹:
屬性名稱
屬性類型
屬性注釋
SecuType
SecuType
標的類型
SecuCode
string
標的代碼
SecuName
string
標的名稱
TradingDate
DateTime
交易日期
TradingTime
DateTime
交易時間
LatestPrice
double
最新價
TurnoverVolume
double
成交量 / 手數
TurnoverValue
double
成交金額
TurnoverWeight
double
成交重量
PriceChangeRatio
double
價格漲跌幅
PriceChanged
double
價格漲跌值
UpperLimitPrice
double
漲停價格
LowerLimitPrice
double
跌停價格
PreClosePrice
double
前收盤價
PreSettlementPrice
double
前結算價
PreOpenInterest
double
前持倉量
SettlementPrice
double
結算價
OpenInterest
double
持倉量
SuspendTag
bool
停牌標誌
BarTimeFrame
TimeFrame
Bar 時間窗
OpenPrice
double
Bar 開盤價
HighPrice
double
Bar 最高價
LowPrice
double
Bar 最低價
ClosePrice
double
Bar 收盤價
AveragePrice
double
均價
PriceUpDown
int
漲跌:1 漲 -1 跌 0 平
BidPrice1
double
買一價
BidPrice2
double
買二價
BidPrice3
double
買三價
BidPrice4
double
買四價
BidPrice5
double
買五價
AskPrice1
double
賣一價
AskPrice2
double
賣二價
AskPrice3
double
賣三價
AskPrice4
double
賣四價
AskPrice5
double
賣五價
BidVolume1
double
買一量
BidVolume2
double
買二量
BidVolume3
double
買三量
BidVolume4
double
買四量
BidVolume5
double
買五量
AskVolume1
double
賣一量
AskVolume2
double
賣二量
AskVolume3
double
賣三量
AskVolume4
double
賣四量
AskVolume5
double
賣五量
BarInfo結構類型屬性介紹:
屬性名稱
屬性類型
屬性注釋
SecuType
SecuType
標的類型
SecuCode
string
標的代碼
SecuName
string
標的名稱
TradingDate
DateTime
交易日期
TradingTime
DateTime
交易時間
LatestPrice
double
最新價
TurnoverVolume
double
成交量/手數
TurnoverValue
double
成交金額
TurnoverWeight
double
成交重量
PriceChangeRatio
double
價格漲跌幅
PriceChanged
double
價格漲跌值
UpperLimitPrice
double
漲停價格
LowerLimitPrice
double
跌停價格
PreClosePrice
double
前收盤價
PreSettlementPrice
double
前結算價
PreOpenInterest
double
前持倉量
SettlementPrice
double
結算價
OpenInterest
double
持倉量
SuspendTag
bool
停牌標誌
BarTimeFrame
TimeFrame
Bar 時間窗
OpenPrice
double
Bar 開盤價
HighPrice
double
Bar 最高價
LowPrice
double
Bar 最低價
ClosePrice
double
Bar 收盤價

4. 作用域

Q語言按照模組結構來組織程式,一個完整的模組包括函式、類、控制結構等,模組之間可以是並列關係,也可以是包含關係。
變數的作用域是指變數在各模組中的使用範圍。按照作用域的範圍,Q語言中變數可分為全局變數(global)和局部變數(local)。在量邦天語中
  • 全局變數的聲明在“Init()”中完成,在此模組中聲明的變數自動默認為全局變數;每輪“Start()”模組運行時它都存在並一直保留至程式結束,期間可以對其進行操作。
  • 在“Start()”模組內部聲明的變數都是局部變數,作用域僅限於當輪運行的“Start()”模組;在當輪“Start()”模組運行過程中,局部變數必須先聲明之後才可調用。
如下例所示:
示例:變數的作用域
Line 1:
def Init():
Line 2:
Volume=100.0
Line 3:
BuyFlag=True
Line 4:
CumValue=0.0
Line 5:
return "初始化成功"
Line 6:
def Start(strSecuCode):
Line 7:
addval = 5.12
Line 8:
if BuyFlag==True :
Line 9:
temp = 0.1 * Volume
Line 10:
CumValue = CumValue + addval + temp
Line 11:
return
Line 12:
def UnInit():
Line 13:
return
第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()模組,結束化模組。

  

相關詞條

熱門詞條

聯絡我們