TB交易開拓者公式平臺(tái)的語(yǔ)言編碼原則 TBQuant版 2021年3月20日 14:38 瀏覽量:360 ?收藏 語(yǔ)言元素 交易開拓者公式平臺(tái)的語(yǔ)言是TradeBlazer Language,簡(jiǎn)稱“TB語(yǔ)言”。 它是一種高級(jí)語(yǔ)言,語(yǔ)法簡(jiǎn)潔易懂,介于C++與Pascal之間,其語(yǔ)言元素包括保留字、函數(shù)、表達(dá)式和語(yǔ)句。 保留字:TB公式中保留字有自己獨(dú)特的意義或用途,主要是指一些功能關(guān)鍵字、系統(tǒng)函數(shù)以及數(shù)據(jù)類型等,例如:Params,Vars , For…… 函數(shù):函數(shù)實(shí)現(xiàn)一定的功能,分為系統(tǒng)函數(shù)和用戶函數(shù),例如:sqr,abs…… 表達(dá)式:由變量和操作符組成的運(yùn)算式,例如:x=a+b; 語(yǔ)句:賦值語(yǔ)句,分支語(yǔ)句,控制語(yǔ)句等等,例如:if…else語(yǔ)句 命名規(guī)則 1. 公式名稱規(guī)則 不區(qū)分大小寫; 不能超過(guò)64個(gè)英文字符; 公式之間不得重名; 公式名稱不能出現(xiàn)字母、數(shù)字、下劃線以外的其他字符,且不能以數(shù)字開頭; 不能使用C++關(guān)鍵字; 公式名稱不能和系統(tǒng)保留字,系統(tǒng)函數(shù)等重名。 2. 變量,參數(shù)規(guī)則 不區(qū)分大小寫; 不能超過(guò)64個(gè)英文字符; 每一個(gè)公式內(nèi)部不能重復(fù)命名; 名稱不能出現(xiàn)字母、數(shù)字、下劃線以外的其他字符,且不能以數(shù)字開頭; 名稱不能和系統(tǒng)保留字,系統(tǒng)函數(shù)等重名; 不能使用C++關(guān)鍵字; 不能使用已定義的用戶函數(shù)名。 公式正文規(guī)則 公式中不區(qū)分字符的大小寫,例如Ab與ab等效; 公式語(yǔ)句以“;”結(jié)束; 公式中代碼正文不允許出現(xiàn)中文字符,使用英文雙引號(hào) “” 引用起來(lái)的字符串除外; 公式正文字符因含義不同,以不同的顏色區(qū)分: 黑色 --- 用戶自己聲明的變量名或者參數(shù)名; 紅色 --- 數(shù)字; 藍(lán)色 --- 系統(tǒng)函數(shù); 暗紅色--- 已有的用戶函數(shù); 紫紅色--- 運(yùn)算符號(hào); 果綠色--- 字符串(可以為中文字符); 翠綠色--- 注釋語(yǔ)句(注釋符號(hào)后可為中文字符)。 注釋方式 對(duì)單行語(yǔ)句進(jìn)行注釋,可以在句首使用“//”將該行文字注釋,也可直接在公式語(yǔ)句之后使用 “// ”對(duì)語(yǔ)句的意思或者想要標(biāo)記的內(nèi)容注釋; 對(duì)多行語(yǔ)句進(jìn)行注釋,則可使用“/* ...*/”將整段文字進(jìn)行注釋; 也可以使用快捷鍵Ctrl + B進(jìn)行塊注釋; 使用快捷鍵Ctrl+U對(duì)選中行取消行注釋,Ctrl+L對(duì)選中行添加行注釋; 注釋語(yǔ)句不參與公式主體的計(jì)算,允許出現(xiàn)中文字符。 保留字 TB公式中保留字主要指功能關(guān)鍵字、系統(tǒng)函數(shù)以及數(shù)據(jù)類型等。命名公式簡(jiǎn)稱以及參數(shù)、變量時(shí),要避免使用保留字。 下面分類列舉出系統(tǒng)主要的保留字。 運(yùn)算符 類型保留字 算術(shù)運(yùn)算符+ - * / % ^ 關(guān)系運(yùn)算符> >= < <= == != <> 邏輯運(yùn)算符AND/&& OR/|| NOT/! 功能關(guān)鍵字 保留字說(shuō)明 Params用該關(guān)鍵字宣告參數(shù)定義的起始,參數(shù)必須填寫默認(rèn)值。 Vars用該關(guān)鍵字宣告變量定義的起始(可以賦初值), 變量不填寫初值時(shí),系統(tǒng)將自動(dòng)為其填充初值。 If條件語(yǔ)句。 Else條件語(yǔ)句。 Begin用該關(guān)鍵字宣告程序主體的起始。 End用該關(guān)鍵字宣告程序主體的結(jié)束。 For循環(huán)語(yǔ)句。 To循環(huán)語(yǔ)句。 DownTo循環(huán)語(yǔ)句。 While循環(huán)語(yǔ)句。 Break循環(huán)語(yǔ)句。 Continue循環(huán)語(yǔ)句。 True真。 False假。 Return返回函數(shù)結(jié)果 數(shù)據(jù)源 保留字說(shuō)明 Data0-Data99**支持多個(gè)數(shù)據(jù)源(具體數(shù)目及支持效率與本地電腦配置相關(guān))。 Data數(shù)據(jù)源數(shù)組(格式為:Data[i],i為整數(shù),用法同上)。 函數(shù):數(shù)據(jù)輸出和交易指令 保留字說(shuō)明 PlotBool輸出布爾型值。 PlotNumeric輸出數(shù)值型值。 PlotString輸出字符串值。 UnPlot取消指定位置的輸出。 PlotDic在當(dāng)前Bar的輸出信息中添加基礎(chǔ)數(shù)據(jù)信息。 Alert報(bào)警輸出。 Buy多頭建倉(cāng)操作。 Sell多頭平倉(cāng)操作。 SellShort空頭建倉(cāng)操作。 BuyToCover空頭平倉(cāng)操作。 ...其他系統(tǒng)函數(shù)。 標(biāo)點(diǎn)符號(hào) TB公式的語(yǔ)句支持使用標(biāo)點(diǎn)符號(hào),例如,";"標(biāo)注一個(gè)語(yǔ)句結(jié)束;()創(chuàng)建規(guī)則的優(yōu)先權(quán)等等。標(biāo)點(diǎn)符號(hào)也是系統(tǒng)保留字,下表中列出了TB公式中所用到的標(biāo)點(diǎn)符號(hào)及其含義: 符號(hào)名稱說(shuō)明 ;分號(hào)語(yǔ)句結(jié)束的標(biāo)志。 ,逗號(hào)當(dāng)函數(shù)帶有多個(gè)參數(shù)時(shí),用于分隔多個(gè)參數(shù)。 ()小括號(hào)括號(hào)之內(nèi)的表達(dá)式有計(jì)算的優(yōu)先權(quán)。 ""雙引號(hào)字符串常量。 []中括號(hào)回溯數(shù)據(jù),引用以前的數(shù)據(jù),或者數(shù)組中的元素。 {}大括號(hào)控制語(yǔ)句的起始。 .點(diǎn)擴(kuò)展數(shù)據(jù)源的數(shù)據(jù)調(diào)用。 操作符 操作符是象征具體操作運(yùn)算行為的符號(hào),根據(jù)其作用的不同,分為三類: 數(shù)學(xué)操作符 操作符說(shuō)明 +加 -減 *乘 /除 %求模 ()括號(hào) 這些數(shù)學(xué)操作符按其特定的優(yōu)先級(jí)來(lái)進(jìn)行計(jì)算,“* ”(乘法)最先,其次是“/”(除法)和“%”(求模),“+”(加法)和“-”(減法)最后,如果有多個(gè)乘法/除法(或者是加法/減法),那么計(jì)算順序是從左至右。 例:High+2* Range/2; 它首先計(jì)算的是Range(此處Range是指High-Low)與2的積,接著計(jì)算與2的商(除法),最后求2*Range/2與最高價(jià)(High)的和。 例: (High+Low)/2; 先計(jì)算()中High與Low的和,然后將計(jì)算得到的和值除以2,找到一個(gè)Bar的中間位置 關(guān)系操作符 操作符說(shuō)明 <小于 >大于 <=小于等于 >=大于等于 <>或!=不等于 ==等于 應(yīng)用關(guān)系操作符,可以對(duì)兩個(gè)數(shù)值或字符串表達(dá)式進(jìn)行比較。 如果兩個(gè)操作數(shù)都是數(shù)值型,則按其大小比較 如果兩個(gè)操作數(shù)都是字符型,則按字符的ASCII碼值從左到右一一比較 漢字字符大于西文字符 關(guān)系操作符的優(yōu)先級(jí)相同 例:Close>High[1]; 判斷當(dāng)前Bar收盤價(jià)是否比前一個(gè)Bar最高價(jià)高 例:"abcd" < "zyxw"; 字符串的比較運(yùn)算中,按照順序依次比較的每個(gè)字符的ASCII碼值,直至計(jì)算出結(jié)果即可。 在這個(gè)例子中,首先比較“a”和“z”,字母"a"的ASCII值是小于"z",所以該表達(dá)式的值為True。 邏輯操作符 TB語(yǔ)言支持三類邏輯操作符:與AND(&&),或OR(||),非NOT(!)。 AND邏輯操作符運(yùn)算規(guī)則: 表達(dá)式1表達(dá)式2表達(dá)式1 AND 表達(dá)式2 TrueTrueTrue TrueFalseFalse FalseTrueFalse FalseFalseFalse 簡(jiǎn)單記憶法則:AND運(yùn)算只有兩個(gè)條件都為True時(shí),結(jié)果才為True。 OR邏輯操作符運(yùn)算規(guī)則: 表達(dá)式1表達(dá)式2表達(dá)式1 OR 表達(dá)式2 TrueTrueTrue TrueFalseTrue FalseTrueTrue FalseFalseFalse 簡(jiǎn)單記憶法則:OR運(yùn)算只要有一個(gè)條件為True,結(jié)果即為True。 NOT邏輯操作符運(yùn)算規(guī)則: 表達(dá)式1NOT表達(dá)式1 TrueFalse FalseTrue 例:Low < Low[1] AND Close > High[1]; 當(dāng)前Bar的最低價(jià)小于前一個(gè)Bar的最低價(jià),并且當(dāng)前Bar的收盤價(jià)高于前一個(gè)Bar的最高價(jià)時(shí),這個(gè)表達(dá)式的計(jì)算結(jié)果才為Ture。 例:High > 10 OR Vol > 5000; 當(dāng)前Bar的最高價(jià)大于10,或者成交量大于5000,表達(dá)式的值都為True。 邏輯操作符的優(yōu)先級(jí)低于數(shù)學(xué)操作符和關(guān)系操作符。邏輯操作符也遵循括號(hào)優(yōu)先的原則,如果沒(méi)有括號(hào),那么其運(yùn)算順序是從左至右。因此邏輯表達(dá)式中不同條件的前后順序,可能會(huì)產(chǎn)生不同的運(yùn)算邏輯,執(zhí)行的效率也會(huì)有所不同。 以Con1 AND Con2為例,系統(tǒng)從左到右進(jìn)行邏輯判斷,當(dāng)Con1為True時(shí),需要繼續(xù)判斷Con2是否為True,只有當(dāng)Con1,Con2都為True時(shí),整個(gè)表達(dá)式才為True。但是只要當(dāng)Con1為False時(shí),就不再需要判斷Con2的值,而是直接返回False。 因此,以下兩個(gè)表達(dá)式在執(zhí)行效率方面是有差異的: 5 < 4 AND Close > Open; Close > Open AND 5 < 4; 第一條語(yǔ)句的執(zhí)行速度大部分情況下都比第二條要快。 對(duì)于Con1 OR Con2表達(dá)式,情況也比較類似,當(dāng)Con1為False時(shí),需要繼續(xù)判斷Con2是否為False,只有當(dāng)Con1,Con2都為False時(shí),整個(gè)表達(dá)式才為False。但是只要當(dāng)Con1為True時(shí),就不再需要判斷Con2的值,而是直接返回True。 以下兩條語(yǔ)句的執(zhí)行效率也是不一樣的: 5 > 4 OR Close > Open; Close > Open OR 5 > 4; 因此,邏輯表達(dá)式的組合應(yīng)該盡可能的把容易判別整個(gè)表達(dá)式邏輯的條件放在前面,以減少整個(gè)表達(dá)式的計(jì)算時(shí)間。 表達(dá)式 表達(dá)式的組成 TB表達(dá)式由常量、變量、操作符、函數(shù)和圓括號(hào)按一定的規(guī)則組成,通過(guò)運(yùn)算能得到結(jié)果,運(yùn)算結(jié)果的類型由數(shù)據(jù)和操作符共同決定。 表達(dá)式的書寫規(guī)則 乘號(hào)不能省略。 括號(hào)必須成對(duì)出現(xiàn),均使用圓括號(hào),可以嵌套,但必須配對(duì)。 表達(dá)式從左到右在同一基準(zhǔn)上書寫,無(wú)高低、大小之分。 例:sqr((3* x+y)-z)/(x*y)^4 不同數(shù)據(jù)類型的轉(zhuǎn)換 操作數(shù)的數(shù)據(jù)類型應(yīng)該符合要求,不同的數(shù)據(jù)應(yīng)該轉(zhuǎn)換成同一類型。 例:Commentary("Close = "+Text(Close)); Commentary函數(shù)只能顯示字符串類型的注釋信息,因此,使用Text()函數(shù)將Close的數(shù)值轉(zhuǎn)換成字符再顯示 優(yōu)先級(jí) 同一表達(dá)式中,不同運(yùn)算符的優(yōu)先級(jí)是: 算術(shù)運(yùn)算符 > 字符運(yùn)算符 > 關(guān)系運(yùn)算符 > 邏輯運(yùn)算符 【注意】對(duì)于存在多種運(yùn)算符的表達(dá)式,可增加圓括號(hào)改變優(yōu)先級(jí)或使表達(dá)式更清晰。 例:MarketPosition == 1 And BarsSinceEntry >= 1 先進(jìn)行關(guān)系運(yùn)算MarketPosition是否等于1,BarsSinceEntry是否大于等于1;然后再根據(jù)邏輯運(yùn)算符AND計(jì)算兩個(gè)表達(dá)式的的結(jié)果(此條件的含義為是否持有多倉(cāng)且不是開倉(cāng)bar) 例:Low <= MyEntryPrice - StopLossSet* MinPoint 先計(jì)算StopLossSet* MinPoint,然后計(jì)算MyEntryPrice - StopLossSet* MinPoint,最后比較Low是否小于MyEntryPrice - StopLossSet*MinPoint(此條件的含義為判斷止損條件是否滿足) 賦值語(yǔ)句 一個(gè)語(yǔ)句代表一個(gè)完全的指示或描述,語(yǔ)句中包含有保留字、操作符、符號(hào)。并且語(yǔ)句總是以";"作為語(yǔ)句結(jié)束的標(biāo)志。 賦值語(yǔ)句用于給公式變量指定一個(gè)具體的值的語(yǔ)句,賦值語(yǔ)句使用賦值操作符(=)進(jìn)行處理。 以下為賦值語(yǔ)句的一些例子: Vars Bool b; Events OnBar(ArrayRef<Integer> indexs) { B = true; ... } Vars Numeric Value1; Events OnBar(ArrayRef<Integer> indexs) { Value1 = (Close + Open)/2; ... } Vars String str; Events OnBar(ArrayRef<Integer> indexs) { str ="It Is A Test!"; ... } 變量在賦值的時(shí)候忽略其擴(kuò)展數(shù)據(jù)類型,只考慮其基本數(shù)據(jù)類型,即Series,NumericRef,Numeric之間可以相互賦值。此時(shí)序列數(shù)據(jù)類型只是對(duì)當(dāng)前Bar的值進(jìn)行操作。 以下的寫法是錯(cuò)誤的: Vars Series<Numeric> Value2; Events OnBar(ArrayRef<Integer> indexs) { Value2[1] = (Close + Open)/2; } 控制語(yǔ)句 計(jì)算機(jī)語(yǔ)言一般都有有三個(gè)基本的控制語(yǔ)句,順序、選擇和循環(huán)。 順序類型直接以代碼的順序決定。選擇類型和循環(huán)類型則需要有關(guān)鍵字來(lái)進(jìn)行操作。 1. 選擇類型 選擇類型的關(guān)鍵字有if和else。 1.1 一個(gè)分支 If(邏輯條件) { 執(zhí)行語(yǔ)句組; } 注意:如果執(zhí)行語(yǔ)句組只有一條語(yǔ)句時(shí),{}可以省略。 舉例: Vars Numeric a; Numeric b; Events OnBar(ArrayRef<Integer> indexs) { if(a>0 and a<=1) b=1; } 1.2 兩個(gè)互斥分支 If(邏輯條件) { 執(zhí)行語(yǔ)句組A; } Else { 執(zhí)行語(yǔ)句組B; } 舉例: Vars Numeric a; Numeric b; Events OnBar(ArrayRef<Integer> indexs) { if(a>0 and a<=1) b=1; Else b=2; } 1.3 多個(gè)互斥分支 If(邏輯條件1) { 執(zhí)行語(yǔ)句組A; } Else if(邏輯條件2) { 執(zhí)行語(yǔ)句組B; } Else if(邏輯條件3) { 執(zhí)行語(yǔ)句組C; } ... Else { } 舉例: Vars Numeric a; Numeric b; Events OnBar(ArrayRef<Integer> indexs) { if(a>0 and a<=1) b=1; else if(a>1 and a<=2) b=2; else if(a>2 and a<=3) b=3; Else b=4; } 1.4 條件語(yǔ)句的嵌套 If(邏輯條件1) { If(邏輯條件2) { 執(zhí)行語(yǔ)句組; } } 舉例: Vars Numeric a; Numeric b; Events OnBar(ArrayRef<Integer> indexs) { if(a>0) { if(a<1) b=1; } } 2. 循環(huán)類型 循環(huán)類型的關(guān)鍵字有while和for。配合的還有to downto break continue。 2.1 while類型 While(邏輯條件) { 執(zhí)行語(yǔ)句組; } 舉例: Vars Numeric a; Numeric b; Events OnBar(ArrayRef<Integer> indexs) { While(b<3) { b=b+1; } } 2.2 for 增序類型 for i=min to max { 執(zhí)行語(yǔ)句組; } 舉例: Vars Integer i; Numeric b; Events OnBar(ArrayRef<Integer> indexs) { for i=0 to 3 { b=b+1; } } 2.3 for 降序類型 for i=max downto min { 執(zhí)行語(yǔ)句組; } 舉例: Vars Integer i; Numeric b; Events OnBar(ArrayRef<Integer> indexs) { for i=3 DownTo 0 { b=b+1; } } 2.4 break Break是觸發(fā)語(yǔ)句所在的最內(nèi)層循環(huán)的終止。 舉例: Vars Integer i; Numeric b; Events OnBar(ArrayRef<Integer> indexs) { for i=3 DownTo 0 { b=b+1; if(b>=2) break; } } 注釋:當(dāng)b>=2時(shí),這個(gè)循環(huán)就提前終止了。 2.5 continue Continue是跳過(guò)語(yǔ)句所在循環(huán)剩下的執(zhí)行語(yǔ)句,進(jìn)入下一輪的執(zhí)行。 舉例: Vars Integer i; Numeric b; Events OnBar(ArrayRef<Integer> indexs) { for i=3 DownTo 0 { if(b>=2) Continue; b=b+1; } } 注釋:當(dāng)b>=2時(shí),b=b+1始終得不到執(zhí)行,所以b最終=2。 2.6 循環(huán)的嵌套 For i=min to max { For j=min to max { 執(zhí)行語(yǔ)句組; } } 舉例: Vars Integer i; Integer j; Array<Array<Numeric>> a; Events OnBar(ArrayRef<Integer> indexs) { for i=3 DownTo 0 { for j=0 to 3 { a[i][j]=i+j; } } } RANGE對(duì)代碼段的控制 Range[i:j] { 代碼段codes1; } 如果使用range[i:j]把代碼段codes1括起來(lái),則代表這一段代碼只在數(shù)據(jù)源datai到dataj的數(shù)據(jù)源運(yùn)行。I要小于j,比如range[1:2],則代表代碼段codes1只在數(shù)據(jù)源data1和data2上運(yùn)行。 具體例子如下: Range[0:1] { AvgValue1 = AverageFC(Close,FastLength); AvgValue2 = AverageFC(Close,SlowLength); PlotNumeric("MA1",AvgValue1); PlotNumeric("MA2",AvgValue2); } 上面代碼會(huì)在Data[0]和Data[1]上都運(yùn)行,分別畫出Data[0]和Data[1]的雙均線。 注意:Range[i:j]內(nèi)的代碼運(yùn)行說(shuō)明如下: 沒(méi)有指定數(shù)據(jù)源的代碼,依次在Data [i]到Data [j]的bar上運(yùn)行。 有指定數(shù)據(jù)源的代碼,則在指定的數(shù)據(jù)源的bar上運(yùn)行。 同一個(gè)公式內(nèi),可有多個(gè)并列的Range代碼塊,Range內(nèi)不支持Range嵌套。 Range[m:n]中,數(shù)據(jù)源起始位置m及結(jié)束位置n可以指定,也可以為變量和參數(shù)聲明,類型為簡(jiǎn)單變量。 如果想要得到數(shù)據(jù)源的編號(hào),則可以這樣使用 Range[i=0:1] { Commentary(“i=”+text(i)); } |
|