流程控制之迴圈


在撰寫腳本的時候,有的時候,同樣的一件事,我們希望電腦幫我們執行好幾次,這時候,我們就需要迴圈的語法。

以下,我們就來介紹不同的語法在迴圈上的應用。


for迴圈




input:Length(10); setinputname(1,"N期內");
input:mNewHighTimes(3); setinputname(2,"M次以上新高");


variable: la(Length-1); //日數與參數調整
variable: QHigh(0); Qhigh=high[la]; //含當根K棒 最左邊第一筆資料起算
variable: outputdays(0);  outputdays=0; //每跟K要歸0
variable: i(0); //迴圈用數

for i = 1 to la begin 
     if ( high[la-i]  > QHigh ) then
      begin
        outputdays+=1;  
       QHigh = high[la-i];
     end;
end;

if  high > QHigh and  outputdays >= mNewHighTimes then ret=1;


 迴圈 while

while的流程安排方式
在迴圈的使用上除了使用for之外另一種用法是使用whilewhile的語法如下:
While(判斷式) begin..end
寫法如下例:
While (Value1 > 1) Begin  //While後面的陳述式為True持續執行Statement
 Value1 = Value1 -1;
End;


這邊要注意的是,while括號中的判斷式如果成立時,電腦會執行下方begin..end中間的敘述式,然後再回頭執行一次while括號中的判斷式,一直到這個判斷式不成立的時候,才會往下再執行end下面的敘述式。



我們用下面這個腳本做例子,我們想要尋找反彈已經超過整個跌幅0.618的股票,我們認為發生這種情況,極可能不是反彈而是回升。
要寫這樣的腳本,我們得先找出波段的最高點及最低點,而且要確定波段最高點出現在波段最低點的左邊。
由於我們不知道高點在那一根K棒,低點在那一根K
所以我們用 While來處理
請看以下的寫法:
while(high[n]<highest(high,30))
begin
n=n+1;
end;
我們用high[n]<highest(high,30)來作判斷式,當電腦讀到這個敘述式時,電腦會去判斷第n+1K棒的高點有沒有小於三十根K棒的最高點,如果符合這個條件,電腦會去執行Begin..end裡的敘述式,也就是n=n+1,這樣電腦就會回頭再去執行while裡的敘述式,一直到while裡的敘述式不再成立,也就是high[n]=highest(high,30)時,電腦才會跳出這個迴圈,再往下執行,這樣就可以找到過去三十根K棒中的最高點,同理也可以找到過去三十根K棒中的最低點,
把這兩點相減就是這陣子下跌時的最大跌幅,把這跌幅乘上0.618再加上最低價,就是反彈的最高目標,當股價超過這個目標,我們就認定這不是反彈而是回升,就請電腦通知我們。


var:n(0);
var:m1(0);
var:TP(0);
while(high[n]<highest(high,30))
begin
n=n+1;
end;
while(low[m]>lowest(low,30))
begin
m1=m1+1;
end;

if n>m
then
begin
value1=high[n]-low[m1];

TP=low[m]+value1*0.618;

if m1<>0 and close>tp
then ret=1;
end;

這個例子很清楚的表現出Whilefor的差別,在我們知道這個迴圈要執行多少次時我們使用for,但如果我們不知道迴圈要執行多少次時,我們就可以使用while了,這就是用for跟用while的最大差別。

再舉一個例子,市場老手常說,底部量是頭部量的十分之一,我們可以透過while找到過去300天最大量的那一天成交量是多少,寫法如下:
Var:n(0);
Whie(volume(n)<highest(volume,300))
Begin
N=n+1
End;
這麼寫電腦最後記住的n就是成交量最大那根barn
然後我們再寫
If  volume*10<=volume[n]
Then ret=1;
這敘述式的意思是現在的成交量就算乘上10都小於最大量,也就是現在的成交量已經小於頭部量的十分之一。

透過這樣的腳本我們就可以找到目前成交量是頭部量十分之一的股票了


 Repeat ……until


Repeat..until是另一個迴圈的用法,它會跑多少次就看until括號內的敘述式何時為true,以下是它的語法





Repeat Until同用
用法為
Repeat
表述式;
Until (
傳回True/False的表達式);
  1. Repeat                        //Value1超過50之前,不斷重複累加1  
  2. Value1 = Value1 + 1;   
  3. Until ( Value1 > 50);  
這種迴圈跟for不一樣的地方在於for要跑幾次是很確定的,這個則視看條件式何時由false轉成true
這種寫法跟while有點像,差別在於while是後面的條件式如果是true時就一直執行到變false才停,這個則是如果是false時就一直執行到變成true才停。