大智慧股票公式之循環(huán)語(yǔ)句_第1頁(yè)
大智慧股票公式之循環(huán)語(yǔ)句_第2頁(yè)
大智慧股票公式之循環(huán)語(yǔ)句_第3頁(yè)
大智慧股票公式之循環(huán)語(yǔ)句_第4頁(yè)
大智慧股票公式之循環(huán)語(yǔ)句_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、大智慧股票公式之循環(huán)語(yǔ)句1. 為什么要循環(huán)循環(huán)是計(jì)算機(jī)程序中一個(gè)最重要的概念, 它使計(jì)算機(jī)能夠按照用戶的意志重復(fù)執(zhí)行某個(gè) 任務(wù),我們前面所提到的公式系統(tǒng)中存在的隱含循環(huán)也是一種沿時(shí)間變化的循環(huán)。 其實(shí)我們 的函數(shù)中也大量包含了循環(huán)的概念,比如SUM MA等等。我們來看看循環(huán)的概念。如果我們計(jì)算從 1 加到 100,寫成公式:1+2+3+4+5+100;這個(gè)公式很長(zhǎng),而且寫起來容易出錯(cuò),如果我們是計(jì)算從1 加到 1 0000怎么辦 ?這就需要用到循環(huán),我們讓計(jì)算機(jī)循環(huán)計(jì)算, 總共循環(huán)10000次,其中第N次循環(huán)加N即可解決這 個(gè)問題:FOR I=1 TO 10000 DOSU := SU+I;等

2、一會(huì)兒我們?cè)賮斫忉屗?我們看到, 有了循環(huán)以后, 許多繁雜的事情都可以輕松解決 了。由于以前沒有循環(huán), 我們必須在函數(shù)內(nèi)部來實(shí)現(xiàn)一些循環(huán),現(xiàn)在有了它,我們可以省去 好多函數(shù)。例如,SUM表示計(jì)算N天數(shù)值的總和,寫成公式C + REF(C,1) + REF(C,2) + + REF(C,N -1);由于書寫困難而且不靈活,我們引入SUM函數(shù)來計(jì)算。但是如果我們使用循環(huán):SU := 0;FOR I=0 TO N-1 DOSU := SU+REF(C,I);FOR循環(huán)表示,循環(huán)執(zhí)行 SU := SU+REF(C,I)這條語(yǔ)句,第一次循環(huán)變量 I等于0,每 次循環(huán) I 遞增 1,直到大于 N-1 時(shí)

3、循環(huán)結(jié)束。也就是說, REF(C,I) 在每次循環(huán)中表示今天、 昨天、前天訊-1天前的收盤價(jià),將它們累加到 SU變量中,完成了累加的功能。我們需要注意的是, 此時(shí)的循環(huán)與公式中的隱含循環(huán)是不一樣的, 隱含循環(huán)不需要書寫 而且是不可避免的, 而循環(huán)需要用循環(huán)語(yǔ)句寫出來。 循環(huán)語(yǔ)句所描述的循環(huán), 是針對(duì)某一根 K線執(zhí)行的,整個(gè)循環(huán)過程中其計(jì)算位置是不變的。因此,在整個(gè)隱含循環(huán)中,每進(jìn)行一次 隱含循環(huán), 就要執(zhí)行一輪循環(huán)語(yǔ)句。 因此,大量使用循環(huán)語(yǔ)句,尤其是嵌套循環(huán)語(yǔ)句將大大降低運(yùn)算速度。我們可以來看看,如果某股票有3000根K線,我們?cè)诠街邪粋€(gè)100次的循環(huán), 則循環(huán)將執(zhí)行 3000*100

4、=30 萬次,如果還存在循環(huán)嵌套, 也就是循環(huán)套循環(huán), 如 果內(nèi)外均是 100 次的循環(huán), 則循環(huán)次數(shù)為 3000*100*100=3000 萬次,其執(zhí)行速度將非常緩慢。 分析家系統(tǒng)限制總的循環(huán)次數(shù)要小于 1 億次,否則不能得到計(jì)算結(jié)果。循環(huán)分為 WHILE和FOR循環(huán)兩種。2. WHILE 循環(huán)WHILE循環(huán)語(yǔ)法: WHILE 條件DO 語(yǔ)句它表示, 如果條件成立則循環(huán)執(zhí)行語(yǔ)句, 直到條件不成立為止。 例如我們計(jì)算最近多少 天完成 100%換手:HR := VOL;ND := 0;WHILE HRND := ND+1;HR := HR + REF(VOL,ND);ENDND就是結(jié)果。HR表示

5、最近成交量累加,設(shè)初始值為當(dāng)日成交量,然后循環(huán)直到它大于 流通盤為止。循環(huán)體中,ND每次循環(huán)加1,HR每次循環(huán)加上 ND天前的成交量,也就是說最近ND天的成交量累加。在循環(huán)中必須注意的是, 循環(huán)條件在循環(huán)過程中一定要發(fā)生變化, 并且會(huì)變成條件不成 立,否則會(huì)形成死循環(huán),也就是說循環(huán)條件永遠(yuǎn)成立,計(jì)算機(jī)不斷地進(jìn)行循環(huán)計(jì)算。在上例中,HR每次遞增,當(dāng)它增大到流通盤以上時(shí),條件變成不成立,從而終止循環(huán)。 另外一個(gè)我們沒有注意到的問題是,如果今天是上市第一天,而且換手率沒有達(dá)到100,則這個(gè)循環(huán)會(huì)出現(xiàn)問題,因?yàn)椴徽揘D怎樣增大,REF(VOL,ND總是返回沒有數(shù)值,也就是說HR的不到遞增,也就永遠(yuǎn)無法

6、破壞循環(huán)條件而終止循環(huán),它也是一個(gè)死循環(huán)。因此我們需 要改成:HR := VOL;ND := 1;WHILE HRHR := HR + REF(VOL,ND);ND := ND+1;END增加一個(gè)ND從這些例子中我們看到,自己使用循環(huán)來實(shí)現(xiàn)算法,其功能是強(qiáng)大的,但是需要十分小心,避免死循環(huán)的發(fā)生。 因此,我們能夠使用函數(shù)來實(shí)現(xiàn)的功能,還是盡量使用函數(shù)來實(shí)現(xiàn),避免不必要的復(fù)雜性。3. FOR循環(huán)我們大多數(shù)的循環(huán)是指定循環(huán)次數(shù)的循環(huán),而且我們證券計(jì)算也大量使用向前引用若干天的數(shù)據(jù),因此FOR循環(huán)將更加實(shí)用。FOR 變量=初值TO 終值DO 語(yǔ)句它表示使用變量來控制執(zhí)行循環(huán)語(yǔ)句,首先給變量賦初值,然

7、后判斷變量是否小于或等于終值,若滿足條件則執(zhí)行語(yǔ)句,然后將變量加1,循環(huán)判斷變量是否小于等于終值并循環(huán)執(zhí)行,直到條件不滿足為止。例如FOR 1=1 TO N DO 表示循環(huán)N次,循環(huán)變量從1到N,類似的FOR 1=0 TO N- 1 DO 也表示循環(huán)N次,但是循環(huán)變量從 0到N-1。循環(huán)變量還可以從大循環(huán)到小,可以使用FOR 變量=初值DOWNTO 終值DO 語(yǔ)句此時(shí)變量將從大到小變化,直到小于終值為止。我們?cè)谑褂弥行枰⒁膺f增還是遞減變化,否則將形成死循環(huán)。使用FOR循環(huán)的一個(gè)最大的好處在于其循環(huán)次數(shù)可以控制,不像WHILE循環(huán)可能存在潛在的死循環(huán)。還以 WHILE循環(huán)中的換手100%為例:

8、HR := 0;FOR I=0 TO BARPOS-1 DO BEGINIF HRHR := HR+REF(VOL,I);IF HR>=CAPITALND := I+1;ENDEND我們用FOR循環(huán)來控制總的循環(huán)次數(shù)不超過數(shù)據(jù)總數(shù),從而避免了死循環(huán)的發(fā)生。在循環(huán)中, 如果換手未超過流通盤, 則繼續(xù)累加, 當(dāng)換手剛達(dá)到流通盤時(shí), 將循環(huán)次數(shù)賦給結(jié)果 ND。4. 循環(huán)的終止我們看到,循環(huán)過程中必須要有一個(gè)終止循環(huán)的方法,WHILE語(yǔ)句中使用條件不滿足來終止循環(huán),F(xiàn)OR循環(huán)中使用變量遞增遞減來終止循環(huán),是否還有其它的需要呢?我們看上面的例子, 該循環(huán)有一個(gè)問題, 就是無論是否計(jì)算出結(jié)果, 循環(huán)

9、都將繼續(xù)下去, 直到計(jì)算到上市第一天,這將大大降低效率。我們通過主動(dòng)終止循環(huán)來解決這個(gè)問題:HR := 0;FOR I=0 TO BARPOS-1 DO BEGINHR := HR+REF(VOL,I);IF HR>=CAPITAL BEGINND := I+1;BREAK;ENDEND執(zhí)行BREAK語(yǔ)句將終止循環(huán),無論循環(huán)中值條件是否達(dá)到。 在本例中,當(dāng)計(jì)算到結(jié)果,就 停止循環(huán)。一般說來, BREAK語(yǔ)句總是與IF語(yǔ)句配合使用。使用 BREAK語(yǔ)句可以使公式看 起來更加簡(jiǎn)單。BREAK可以用來終止WHILE循環(huán)和FOR循環(huán)。5. 循環(huán)的嵌套我們可以在循環(huán)中再套入循環(huán), 這就叫做循環(huán)嵌套

10、。 例如我們想要找到最近 100 天中收 盤價(jià)相同的天數(shù):ND := 0;FOR I=0 TO 99 DO BEGINFOR J=I+1 TO 99 DO BEGINIF REF(CLOSE,I)=REF(CLOSE,J) THENND := ND+1;ENDEND我們分成內(nèi)外兩個(gè)循環(huán),外層循環(huán)使用 I 作為循環(huán)變量,它從 0到 99循環(huán),得到之前 每一天的收盤價(jià) REF(CLOSE,I),而內(nèi)層循環(huán)使用 J作為循環(huán)變量,它1+1到99循環(huán),表示 從第I+1天前開始查找等于第 I天數(shù)值的K線,若找到(條件REF(CLOSE,I)=REF(CLOSE,J) 滿足),則將ND加1。使用循環(huán)嵌套,

11、我們可以做許多過去無法做的事情了。 但是使用嵌套一定要注意, 不要 是循環(huán)次數(shù)太大,否則運(yùn)行速度會(huì)很慢。6. 循環(huán)舉例例 1. 計(jì)算 N 日均線SU := 0;FOR I=0 TO N-1 DOSU := SU+REF(CLOSE,I);SU / MIN(N,BARPOS);該例子中有兩個(gè)技巧, 其一, 沒有可以去避免向前循環(huán)超過上市日的問題, 因?yàn)榘l(fā)生這 樣情況時(shí)SU的數(shù)值不會(huì)增加,也就是說SU等于上市到現(xiàn)在的總和;其二,如果當(dāng)前位置小于N,則SU的數(shù)值表示上市到現(xiàn)在的總和而不是N日總和,所以平均價(jià)格應(yīng)該為 SU/BARPOS因此我們使用了 SU / MIN(N,BARPOS);例 2. 計(jì)

12、算前十大股東占總股本的比例SU:=0;FOR I=1 TO 10 DOSU := SU + PROFFIN(5002+(I-1)*6,0);比例 : SU/PROFFIN(1001,0)*100;在本循環(huán)中使用了一個(gè)技巧,我們發(fā)現(xiàn)第一、第二、第三股東持股量的代碼是 5002,5008,5014,它們之間間隔6,所以我們可以使用5002+(1-1)*6 來表示這些代碼分支1. 為什么要分支所謂分支, 就是如果滿足某個(gè)條件就執(zhí)行某些指令, 否則就指令另外一些指令。 有了分 支,計(jì)算機(jī)就有了智能, 知道根據(jù)具體情況作出不同的動(dòng)作, 這是計(jì)算機(jī)最重要的功能之一。2. 以前我們是怎樣實(shí)現(xiàn)分支的過去, 我

13、們也在函數(shù)中隱含地使用了一些分支概念, 在函數(shù)中直接將分支包含進(jìn)去。 例 如繪圖函數(shù)DRAWTEXT(Cond,Price,Text),表示如果 Cond條件滿足就輸出文字。再例如, IF(Cond,V1,V2)表示如果Cond條件成立就返回 V1,否則就返回 V2。但是這種包含在函數(shù)中間的條件也有許多缺陷, 那就是它只能控制一條語(yǔ)句, 而且只在 有限的幾個(gè)函數(shù)中包含條件, 這極大地限制了分支的應(yīng)用。 例如, 我們就無法描述如果條件 成立,V1就等于 CLOSE否則 V2就等于CLOSE3. 分支的描述方法我們使用 IF 條件 THEN 語(yǔ)句 來描述如果條件成立就執(zhí)行語(yǔ)句這樣一個(gè)邏輯,例 如I

14、F CLOSE>OPEN THENP := P+1;它表示如果收盤價(jià)大于開盤價(jià),P的數(shù)值就增加1,否則P值維持不變,也就是說統(tǒng)計(jì)歷史陽(yáng)線的數(shù)量。需要注意, IF 語(yǔ)句和 IF 函數(shù)使用同樣的關(guān)鍵字,區(qū)分它們的辦法是在 IF 語(yǔ)句之后必 然存在THEN語(yǔ)句,而IF函數(shù)則沒有。因此我們不能在IF語(yǔ)句條件部分包含IF函數(shù),例如:IF IF(CLOSE>OPEN, OPEN, CLOSE)>10 THENP := P+1;該語(yǔ)句將混淆兩個(gè) IF 的作用,可以使用以下方法來解決:C1 := IF(CLOSE>OPEN, OPEN, CLOSE)>10;IF C1 THENP

15、 := P+1;如果我們想要在條件滿足的情況下多做幾件事情怎么辦?在此我們引入BEGIN- END這樣一個(gè)語(yǔ)句來形成組合語(yǔ)句,也就是說將它們中間所包含的語(yǔ)句看作一個(gè)整體,一起執(zhí)行。 組合語(yǔ)句被認(rèn)為是一個(gè)整體,在接下來的分支、循環(huán)等操作中均需要用到。例如:IF CLOSE>OPEN THEN BEGINP := P+1;Q := MA(CLOSE,10);END它表示如果條件成立,將執(zhí)行對(duì)P和Q的賦值語(yǔ)句,否則這兩條語(yǔ)句均不執(zhí)行。BEGIN- END語(yǔ)句可以嵌套,END與之前面最接近的還沒有配對(duì)的BEGIN進(jìn)行配對(duì)。例如:IF CLOSE>OPEN THEN BEGIN (1)P :

16、= P+1;IF CLOSE>10 THEN BEGIN (2)P := P+1;Q := MA(CLOSE,10);END (3)END (4)其中, 2-3 是配對(duì)的, 1-4 是配對(duì)的。分支語(yǔ)句還有以下形式:IF-THEN-ELSE, 它表示如果條件滿足就執(zhí)行某件事, 否則就執(zhí)行另外一件事。例如:IF CLOSE>OPEN THENP := P+1;ELSEQ := Q+1;這段公式表示,如果今天收陽(yáng)線,則將P的數(shù)值增加1,否則將Q的數(shù)值增加1,需要注意的是,ELSE必須與IF配對(duì),而且中間只能有一條語(yǔ)句或用BEGIN-END包圍起來的組合語(yǔ)句。IFTHEN-ELSE可以嵌套

17、,ELSE與之前最接近的未配對(duì)的IF語(yǔ)句進(jìn)行配對(duì),例如:IF CLOSE>OPEN THEN (1)P := P+1;ELSE IF CLOSEQ := Q+1;ELSE (3)R := R+1;其中第 行的ELSE與第 行的IF配對(duì),因?yàn)樗懊嬷挥幸粋€(gè)IF;第 行的ELSE與 第(2) 行的 IF 配對(duì)而不與第 (1) 行的 IF 配對(duì),因?yàn)榈?(2) 行的 IF 未配對(duì),而且距離第 (3) 行 最近。在使用多層分支嵌套時(shí),要時(shí)刻注意這個(gè)配對(duì)原則。4. 分支舉例例 1 :計(jì)算上市以來上漲天數(shù)和下跌天數(shù)的比率:VARIABLE: UP=0, DN=0;IF CLOSE>REF(CLOSE,1) THENUP := UP+1;ELSE IF CLOSEDN := DN+1;RATIO: IF(DN=0,0,UP/

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論