Q是一個數據語言,目前被限定為一個數據定義語言(DDL)。Q採用JSON/XML模式,其配備了一個專用的用於定義數據的類型系統,和一個稱為“信息契約”的理論,用於程式和數據交換語言之間的互操作。Q語言是專為量化投資和程式化交易開發的動態程式語言,兼具C++語言的靈活性和EasyLanguage語言的易用性,支持證券、期貨、上海黃金交易所、渤海商品交易所所有指。標的歷史數據、實時行情、程式化交易;支持恒生、金仕達、頂點、金證、易盛、CTP、國外FIX等幾乎所有的交易接口;同時還支持C++,C#、JAVA、MATLAB、R等多種語言的調用。
基本介紹
- 中文名:Q語言
- 外文名:QLanguage
- 屬於:計算機編程
- 語言:動態程式語言
- 領域:為量化投資和程式化交易開發
一、Q語言特點
- 面向對象,可以自定義類;
- 區分大小寫;
- 以一行代表一條完整的語句;
- 以Tab縮進實現結構化控制,使得程式可讀性更強;
- 是弱數據類型的程式語言,能夠實現變數、參數類型的智慧型化處理。
二、代碼結構
- “引用”模組:在此模組可以聲明想要引用的外部函式或類。
- “外部參數”模組:在此模組中可定義全局性的靜態變數,一般把策略的參數定義在此模組中。
- Init()模組:僅在策略準備時運行一次。在該模組中,用戶可定義全局變數,並對其進行賦初值。
- Start()模組:由實時行情或後驗數據流驅動循環調用,引擎每接受到一個新的數據就運行一次。策略編寫者的策略思想主要在該模組中實現。每次執行完成後,在Start()模組中定義的局部變數會被釋放,但在Init()模組中定義的全局變數以及在“外部參數”模組中定義的參數會保留,進入下一次Start()循環。
- UnInit()模組:為程式全部執行完成結束後調用,為系統默認調用,一般地用戶不需要在此模組中編寫代碼。
1. 變數聲明
語句 | 釋義 |
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. 常規變數
類型名稱 | 注釋 | 值域 | 範例 |
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的屬性 | |||||
屬性 | 含義 | 屬性 | 含義 | ||
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 | 比較兩個日期 |
定義方式1 | Listname = [init_value]*Length |
定義方式2 | Listname = [init_value1, init_value2, …, init_valueN] |
語句 | 釋義 |
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[:] | 取出列表的所有值 |
- 編輯操作
操作類型 | 釋義 | |
Listname. append(value) | 在列表列表的末尾處加入值value | |
Listname. insert(i, value) | 在列表列表索引為i的地方插入值value | |
Listname. remove(value) | 移除列表列表中第一個值為value的元素 | |
Listname.sort() | 對列表中元素的元素進行排序 | |
Listname.reverse() | 對列表中元素的元素進行反轉 | |
Listname.pop(i) | 彈出列表中索引為i的元素並返回 | |
Listname.clear() | 清空列表中的所有元素 |
- 其他操作
操作類型 | 釋義 |
Listname.index(value) | 查找列表中第一個值為value的元素並返回其索引 |
Listname.count(value) | 返回列表中出現value的次數 |
<定義字典變數> | dictname = {key1:value1, key2:value2, … , keyN:valueN} |
語句 | 釋義 |
ExternPara = {"LSRto": 0.02, "SSRto": 0.02} | 定義ExternPara字典 |
ExternPara["LSRto"] = 0.05 | 改變字典指定鍵的值 |
3. 特殊變數
- 持倉相關變數:
變數名稱 | 釋義 |
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 | 契約交易單位 |
變數名稱 | 釋義 |
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) |
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 |
- 枚舉類型
類型名稱 | 值 | 注釋 | 使用範例 |
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 |
- 結構類型
屬性名稱 | 屬性類型 | 屬性注釋 |
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 | 賣五量 |
屬性名稱 | 屬性類型 | 屬性注釋 |
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. 作用域
- 全局變數的聲明在“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 |