公式編寫第四課
公式編寫規則
我們要給電腦下的命令集合就是公式。話說沒有規矩不成方圓,萬事萬物都是一樣。那么這些公式的編寫規則又是怎么樣的呢?這一節課我們就解決這個問題。
一、我們先來了解一下語言規范。
我們來看看上面的這些。逐一的說一下。
1、 關鍵字。這些關鍵字在語句編寫過程中經常起到承上啟下的作用。注意兩點:一是不能用全角狀態輸入,全角字符和半角字符在電腦里算是兩家人(在所有的編寫公式的字母都是半角,切記!)。二是字母沒有大小寫之分。
2、 常數。包括:浮點數(簡單理解一下吧,就是帶小數的數值,如:12.345),整數(同前面就是沒小數的數值)和字符串(字符串是一個可以另外定義各種屬性的命令的名稱)。
3、 分隔符。
雙引號(“”) 是用來表示引號里面放的是字符串。
單引號(‘’) 是表示里面放的是字符,是直接輸出所看到的內容。
小括號(()) 是用來控制運算的優先級別的。
中括號([]) 里面放的是數值。
大括號({}) 是語句嵌套專用的。
注 釋(/**/) 注釋的語句不參與運算,只是為了方便閱讀各語句的內容。
4、 標識符。由字母和數字組成。也可以用漢字,字母不分大小寫。
5、 運算符。數值運算同四則運算一樣,先乘除,后加減。下面是幾種邏輯運算符的表示方法。
a==b 為判斷a是否等于b,等于的話輸出值為1,不等于輸出值為0;
a!=b 為判斷a是否不等于b,不等于的話輸出值為1,等于輸出值為0;
a>b 為判斷A是否大于b,大于的話輸出值為1,不大于輸出值為0;
a<b 為判斷A是否小于b,小于的話輸出值為1,大于輸出值為0;
a>=b 為判斷A是否大于或者等于b,大于或者等于的話輸出值為1,否則為0;
a<=b 為判斷a是否小于或者等于b,小于或者等于的話輸出值為1,否則為0;
a and b 表示a條件和b條件兩者都為真(也就是1),兩個條件都符合才行;
a or b 表示a條件和b條件只要有一個條件為真就可以了;
上面的這些運算符的順序注意按照上圖從上到下的順序哦。還有幾個特殊的邏輯運算符,一起介紹一下。
isnull(a) 判斷是否為空,表示如果a沒有數據則返回值1,否則返回0;
not(a) 這個簡單,表示非a,即a為0時返回1,a為1時返回0。
6、語句。語句是公式編寫的骨架。
賦值 a=b 把b的值賦給a
條件 if a==b; then c=d; 表示如果a=b 那么就c=d
循環語句 while a=b c=d;也就是當a=b的時候c=d
函數調用 func(a,b) “func”的意思是函數名
二、賦值語句
其一般形式為:
a=b; 含義為將b的值付給a。
幾個運算符的意義
“=” 賦值
“:=”賦值
“:” 賦值并輸出數值或字符串
“:>” 賦值并輸出圖形
注意:“=”和“:=”兩個運算符的意義、用法完全相同。這樣做主要是為了更好地兼容市場上目前的各種帶有公式編輯功能的分析軟件。
三、條件語句
其一般形式為:
IF(邏輯表達式) 語句1;
ELSE 語句2;
上述結構表示: 如果邏輯表達式的值為非0(TURE)即真, 則執行語句1, 執行完語句1從語句2后開始繼續向下執行;如果表達式的值為0(FALSE)即假, 則跳過語句1而執行語句2。
注意以下幾點:
1、條件執行語句中"ELSE 語句2;"部分是選擇項, 可以缺省, 此時條件語句變成:
IF(邏輯表達式) 語句1;
表示若邏輯表達式的值為非0則執行語句1,否則跳過語句1繼續執行。
2、如果語句1或語句2有多于一條語句要執行時, 必須使用"{"和"}" 把這些語句包括在其中, 此時條件語句形式為:
IF(邏輯表達式) { 語句體1; }
ELSE { 語句體2; }
這里語句體指多個語句,每個語句都必須以“;”結尾。
3. 條件語句可以嵌套,這種情況經常碰到,但條件嵌套語句容易出錯,其原因主要是不知道哪個IF對應哪個ELSE。
例如:
IF(x>20 OR x<-10)
IF(y<=100 AND y>x)
A="yes";
ELSE
B="no";
對于上述情況, 規定: ELSE語句與最近的一個IF語句匹配, 上例
中的ELSE與IF(y<=100 AND y>x)相匹配。為了使ELSE與IF(x>20 OR x<-10)相匹配, 必須用花括號。如下所示:
IF(x>20 OR x<-10)
{ IF(y<=100 AND y>x)
A="yes"; }
ELSE B="no";
4. 可用階梯式IF-ELSE-IF結構。
階梯式結構的一般形式為:
IF(邏輯表達式1) 語句1;
ELSE IF(邏輯表達式2) 語句2;
ELSE IF(邏輯表達式3) 語句3;
四、循環語句
while循環的一般形式為:
while(條件) 語句;
while循環表示當條件為真時, 便執行語句。直到條件為假才結束循環。并繼續執行循環程序外的后續語句。
注意:
1、可以有多層循環嵌套。
2、語句可以是語句體, 此時必須用"{"和"}"括起來。
五、break語句
break語句通常用在循環語句中。當break語句用while循環語句中時,可使程序終止循環而執行循環后面的語句, 通常break語句總是與if語句聯在一起。即滿足條件時便跳出循環。
注意:
1、break語句對if-else的條件語句不起作用。
2、在多層循環中, 一個break語句只向外跳一層。
continue 語句
continue語句的作用是跳過循環本中剩余的語句而強行執行下一次循環。
continue語句只用在while循環體中, 常與if條件語句一起使用, 用來加速循環。
六、函數調用
調用函數的基本方式為:函數名(參數,參數,…)
其返回值為函數里面的return語句規定的返回值。若無return語句,則返回被調用函數里,以函數名命名的變量的值。若無以函數名命名的變量,則返回最后一個輸出的值。若無輸出的值,則返回最后一個被調用的語句的值。
例如:調用KDJ指標。KDJ函數的名稱為kdj,其參數和內容如下:
函數內容為:
RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;
K:SMA(RSV,M1,1);
D:SMA(K,M2,1);
J:3*K-2*D
則當您在其它函數里輸入a=KDJ(8,6,6)的時候,相當于計算N1=8,M1=6,M2=6時的J值,并把這個值賦給a。
注意:
1、當傳遞的參數數目不等于被調用函數設置的參數數目時。
a、沒有傳遞參數。則采用原來設置的默認參數計算。
b、傳遞參數少于被調用函數設置的參數數目。則將參數傳過去,依次改變前面同樣數目參數的值,后面其它的參數采用原來設置的默認參數計算。
c、傳遞參數大于被調用函數設置的參數數目。則將參數傳過去,依次改變被調用函數的參數值,多余的參數不起作用。
2、函數名稱不區分大小寫。
3、新建的函數,其函數名可能與其它以存在的函數里面的內部變量重名。這樣在調用那個函數時,那個內部變量將變成對這個新建函數的函數調用,從而產生錯誤。所以,在新建函數起名時要注意。
七、關于“空”的問題
所謂“空”即指沒有數據。在某些情況下,一些數據項可能取不到數據,這時返回值為“空”。例如,yearrep(&jlr,4),其含義為取該公司3年前年報的凈利潤。如果某家公司上市時間較短,而無三年前的年報數據,則其值為“空”。
1、“空”與任何數據作計算時,相應計算被取消。
例如:7×NULL(即“空”)得到的結果為7。
2、“空”與任何數據比較大小時,“空”較小。
例如:-7>NULL(即“空”)得到的結果為1(即條件滿足)。
這樣的結果可能與我們原來希望得到的數值不符,如果想避免這種情況可以用ISNULL函數來判斷某個數據是否為“空”,。