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