流程控制之if..then

流程控制
一個腳本的完成,有幾個步驟。
1.       我們透過參數及變數的宣告,準備好要加以運算的數據。
2.       我們透過運算因子,完成各種數值間的運算。
接下來,我們必須為這些運算的結果安排其先後順序,以及建構與輸出語法間的的因果關係,這些工作,我們都是透過流程控制的語法來完成,前面我們有用到的IF ……..THEN就是一個典型的流程控制語法。
接下來的章節,我們就一一來介紹這些控制流程的語法,完成這部份的學習,XS的基本語法,就大致完備了。

一,  IF..Then

if then的流程控制
在腳本中我們最常運用到的流程控制,應該就是如果…………那就……….,也就是if ……..then
例如我們要電腦在股價創今天高點時通知我們
我們會寫成if close=q_dailyhigh then ret=1;
但在撰寫腳本時,並不是每個想法都只是單純的if……..then ,有時候我們在符合某個條件時,想要電腦幫我們處理的,不只有一行敘述,有時候符合條件時我們希望電腦幫我們執行某動作,在不符合條件時執行另一個動作,因此,本節我們來學習if…….then這個我們最常用的流程控制語法,到底有那幾種不同的寫法,用來處理不同的情境。

1.最簡單的模式


這一種是我們最常用也最簡單的寫法
例如我們要電腦在股票出現K棒三連陽時通知我們,我們只要寫以下的兩行腳本 :
if trueall(close>close[1],3)
then ret=1;
這樣的敘述很單純,就是如果IF後面的那個敘述式為真,那就執行then後面的那一個敘述式。

二,單條件單敘述

但有的時候,我們在寫腳本的時候,除了希望在某敘述式為真時,請電腦幫我們執行某敘述,有時候我們也希望當該敘述式false時,可以為我們執行另一個敘述,這時候的寫法很簡單,就是在then之後的那個敘述式的下方,用else起頭,寫下另一個敘述式就可以了。
例如我們在計算真實波動區間時,我們需要找真實的高點及真實的低點,所謂真實的高點是
1.    如果昨天收盤比今天的高點高,那麼昨天的收盤價就是今天的真實高點
2.    如果昨天收盤不比今天的高點高,那麼今天的最高價就是今天的真實高點
在寫成腳本時,我們就可以用if……then …….else的語法來處理如下方的敘述式

if Close[1] > High then TrueHigh = Close[1]
else TrueHigh = High;
       
三,單條件多敘述

有的時候,當符合if後面的敘述式時,我們希望電腦幫我們執行的,不只一行的敘述式時,電腦要怎麼知道有那敘述是在前面條件符合時批次都要執行的呢?我們在DJ Script的語法中,使用begin …….end;的方式,來標示所有要執行的敘述式。
例如若要找出前N日漲幅超過X%且今天跳空開高超過Y%的股票
我們可以寫一個腳本如下:

//宣告參數:利用input宣告輸入的參數。
input:N(3);//N
input:X(10);//n日漲幅%
input:_Y(4);//缺口大小%

if open>high[1] then //跳空開高
//begin來呈現if 之後要執行的不只一件的事情
begin
value1=(1-close[1]/close[N])*100;//計算前N天的漲幅
value2=(open-high[1])/close*100;//計算跳空缺口的大小
end;
//最後用end來宣告if之後要執行程式的結束

if value1>=X and value2>=_Y
then ret=1;

四,多條件單敘述

我們最常用的語法是如果…….……否則就……………,但有的時候,我們必須設下不止一層的過濾器,也就是在上面的語法的否則就……”,不是一個指示下一個直接運算的敘述式,而是另一個if….then的判斷式敘述。
例如我們如果想找開盤就漲停或開盤跳空上漲後,不到九點十五就漲停的股票,我們可以運用以下的腳本
if open=q_DailyUplimit
then ret=1
else
if  open>close[1]*1.025 and close=q_DailyUplimit and time<091500
then ret=1;
這樣的架構就是為觸發設定兩個不同的條件,當符合條件A時就觸發,但如果沒有符合條件A,如果符合條件B也可以觸發。

開盤就漲停


開盤跳空大漲,09:15之前就漲停


五,多條件多敘述之簡單模式

這樣的流程控制算是if ….then裡最複雜的,用白話文說就是如果……那就開始一連串的動作,反之如果不符合上述條件,就開始進到第二個如果…..那就開始另一連串的動作
以上述的例子的引申為例,我們也可以把上面的例子改寫成以下的腳本:

這腳本的意思是當一開盤就漲停時,我們幫它加一個條件:如果過去十根K棒漲幅都沒有超過2.5%就觸發,至於對於那一些開盤沒有馬上漲停,但開高後在9:15之前就漲停的股票,如果過去十天漲幅不到兩成,就觸發警示。
這樣的流程基本上就可以同時COVER各種觸發的條件。

六 ,多條件多敘述之複雜模式

這樣的流程控制結構就更複雜,它是用兩個條件式來把流程引導向三種不同的運算,我們最常用它來安排不同的觸發警示條件。
我們可以把上述的腳本再更進一步加上後面的另一種觸發警示的條件如下:

這腳本的意思是說有三種情況請電腦觸發警示
1.    開盤就漲停且過去十天沒有一天漲超過2.5%
2.    開盤沒有漲停,但開高超過2.5%9:15之前就漲停,而且過去十天合計漲幅小於兩成。
3.    開盤沒有漲停,9:15之前也沒有漲停,但現在漲停了而且過去十天合計漲幅小於一成。
從上述的例子,我們就可以了解,這樣的流程控制,可以讓使用者像剝洋葱一樣,把一個結果(漲停)安排出不同情境下的不同觸發但書。

這當中有件事要請各位特別留意,那就是在語法上,要千萬記得
If……..
Then …….
else………..;

如果有else,前面then 之後的敘述式結束時,不要打逗號,要等到else後面的敘述式結束後才打逗號。