大智慧股票公式_第1頁
大智慧股票公式_第2頁
大智慧股票公式_第3頁
大智慧股票公式_第4頁
大智慧股票公式_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

2、我們看到,有了循環(huán)以后,許多繁雜的事情都可以輕松解決 了。由于以前沒有循環(huán),我們必須在函數內部來實現一些循環(huán),現在有了它,我們可以省去 好多函數。例如,SUM表示計算N天數值的總和,寫成公式C + REF(C,1) + REF(C,2)+ + REF(C,N-1);由于書寫困難而且不靈活,我們引入SUM函數來計算。但是如果我們使用循環(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)這條語句,第一次循環(huán)變量I等于0,每 次循環(huán)I遞增1,直到大于N-1時循環(huán)結束。也就是說,REF(C,I)在每次循環(huán)

3、中表示今天、 昨天、前天N-1天前的收盤價,將它們累加到SU變量中,完成了累加的功能。我們需要注意的是,此時的循環(huán)與公式中的隱含循環(huán)是不一樣的,隱含循環(huán)不需要書寫 而且是不可避免的,而循環(huán)需要用循環(huán)語句寫出來。循環(huán)語句所描述的循環(huán),是針對某一根 K線執(zhí)行的,整個循環(huán)過程中其計算位置是不變的。因此,在整個隱含循環(huán)中,每進行一次 隱含循環(huán),就要執(zhí)行一輪循環(huán)語句。因此,大量使用循環(huán)語句,尤其是嵌套循環(huán)語句將大大 降低運算速度。我們可以來看看,如果某股票有3000根K線,我們在公式中包含一個100 次的循環(huán),則循環(huán)將執(zhí)行3000*100=30萬次,如果還存在循環(huán)嵌套,也就是循環(huán)套循環(huán),如 果內外均是1

4、00次的循環(huán),則循環(huán)次數為3000*100*100=3000萬次,其執(zhí)行速度將非常緩慢。 分析家系統(tǒng)限制總的循環(huán)次數要小于1億次,否則不能得到計算結果。循環(huán)分為WHILE和FOR循環(huán)兩種。WHILE 循環(huán)WHILE循環(huán)語法:WHILE 條件DO 語句它表示,如果條件成立則循環(huán)執(zhí)行語句,直到條件不成立為止。例如我們計算最近多少 天完成100%換手:HR := VOL;ND := 0;WHILE HRND := ND+1;HR := HR + REF(VOL,ND);ENDND就是結果。HR表示最近成交量累加,設初始值為當日成交量,然后循環(huán)直到它大于 流通盤為止。循環(huán)體中,ND每次循環(huán)加1,HR每

5、次循環(huán)加上ND天前的成交量,也就是說最 近ND天的成交量累加。在循環(huán)中必須注意的是,循環(huán)條件在循環(huán)過程中一定要發(fā)生變化,并且會變成條件不成 立,否則會形成死循環(huán),也就是說循環(huán)條件永遠成立,計算機不斷地進行循環(huán)計算。在上例中,HR每次遞增,當它增大到流通盤以上時,條件變成不成立,從而終止循環(huán)。 另外一個我們沒有注意到的問題是,如果今天是上市第一天,而且換手率沒有達到100,則 這個循環(huán)會出現問題,因為不論ND怎樣增大,REF(VOL,ND)總是返回沒有數值,也就是說 HR的不到遞增,也就永遠無法破壞循環(huán)條件而終止循環(huán),它也是一個死循環(huán)。因此我們需 要改成:HR := VOL;ND := 1;WH

6、ILE HRHR := HR + REF(VOL,ND);ND := ND+1;END增加一個ND從這些例子中我們看到,自己使用循環(huán)來實現算法,其功能是強大的,但是需要十分小 心,避免死循環(huán)的發(fā)生。因此,我們能夠使用函數來實現的功能,還是盡量使用函數來實現, 避免不必要的復雜性。FOR循環(huán)我們大多數的循環(huán)是指定循環(huán)次數的循環(huán),而且我們證券計算也大量使用向前引用若干 天的數據,因此FOR循環(huán)將更加實用。FOR 變量=初值TO 終值DO 語句它表示使用變量來控制執(zhí)行循環(huán)語句,首先給變量賦初值,然后判斷變量是否小于或等 于終值,若滿足條件則執(zhí)行語句,然后將變量加1,循環(huán)判斷變量是否小于等于終值并循環(huán)

7、 執(zhí)行,直到條件不滿足為止。例如FOR I=1 TO N DO表示循環(huán)N次,循環(huán)變量從1到N,類似的FOR I=0 TO N-1 DO也表示循環(huán)N次,但是循環(huán)變量從0到N-1。循環(huán)變量還可以從大循環(huán)到小,可以使用FOR 變量=初值DOWNTO 終值DO 語句此時變量將從大到小變化,直到小于終值為止。我們在使用中需要注意遞增還是遞減變化,否則將形成死循環(huán)。使用FOR循環(huán)的一個最大的好處在于其循環(huán)次數可以控制,不像WHILE循環(huán)可能存在潛 在的死循環(huán)。還以WHILE循環(huán)中的換手100%為例:HR := 0;FOR I=0 TO BARPOS-1 DO BEGINIF HRHR := HR+REF(

8、VOL,I);IF HR=CAPITALND := I+1;ENDEND我們用FOR循環(huán)來控制總的循環(huán)次數不超過數據總數,從而避免了死循環(huán)的發(fā)生。在循 環(huán)中,如果換手未超過流通盤,則繼續(xù)累加,當換手剛達到流通盤時,將循環(huán)次數賦給結果 ND。循環(huán)的終止我們看到,循環(huán)過程中必須要有一個終止循環(huán)的方法,WHILE語句中使用條件不滿足來 終止循環(huán),FOR循環(huán)中使用變量遞增遞減來終止循環(huán),是否還有其它的需要呢?我們看上面的例子,該循環(huán)有一個問題,就是無論是否計算出結果,循環(huán)都將繼續(xù)下去, 直到計算到上市第一天,這將大大降低效率。我們通過主動終止循環(huán)來解決這個問題:HR := 0;FOR I=0 TO B

9、ARPOS-1 DO BEGINHR := HR+REF(VOL,I);IF HR=CAPITAL BEGINND := I+1;BREAK;ENDEND執(zhí)行BREAK語句將終止循環(huán),無論循環(huán)中值條件是否達到。在本例中,當計算到結果,就 停止循環(huán)。一般說來,BREAK語句總是與IF語句配合使用。使用BREAK語句可以使公式看 起來更加簡單。BREAK可以用來終止WHILE循環(huán)和FOR循環(huán)。循環(huán)的嵌套我們可以在循環(huán)中再套入循環(huán),這就叫做循環(huán)嵌套。例如我們想要找到最近100天中收 盤價相同的天數:ND := 0;FOR I=0 TO 99 DO BEGINFOR J=I+1 TO 99 DO BE

10、GINIF REF(CLOSE,I)=REF(CLOSE,J) THENND := ND+1;ENDEND我們分成內外兩個循環(huán),外層循環(huán)使用I作為循環(huán)變量,它從0到99循環(huán),得到之前 每一天的收盤價REF(CLOSE,I),而內層循環(huán)使用J作為循環(huán)變量,它I+1到99循環(huán),表示 從第I+1天前開始查找等于第I天數值的K線,若找到(條件REF(CLOSE,I)=REF(CLOSE,J) 滿足),則將ND加1。使用循環(huán)嵌套,我們可以做許多過去無法做的事情了。但是使用嵌套一定要注意,不要 是循環(huán)次數太大,否則運行速度會很慢。循環(huán)舉例例1.計算N日均線SU := 0;FOR I=0 TO N-1 DO

11、SU := SU+REF(CLOSE,I);SU / MIN(N,BARPOS);該例子中有兩個技巧,其一,沒有可以去避免向前循環(huán)超過上市日的問題,因為發(fā)生這 樣情況時SU的數值不會增加,也就是說SU等于上市到現在的總和;其二,如果當前位置小 于N,則SU的數值表示上市到現在的總和而不是N日總和,所以平均價格應該為SU/BARPOS, 因此我們使用了 SU / MIN(N,BARPOS);例2.計算前十大股東占總股本的比例SU:=0;FOR I=1 TO 10 DOSU := SU + PROFFIN(5002+(I-1)*6,0);比例:SU/PROFFIN(1001,0)*100;在本循環(huán)

12、中使用了一個技巧,我們發(fā)現第一、第二、第三股東持股量的代碼是 5002,5008,5014,它們之間間隔6,所以我們可以使用5002+(I-1)*6來表示這些代碼分支為什么要分支所謂分支,就是如果滿足某個條件就執(zhí)行某些指令,否則就指令另外一些指令。有了分 支,計算機就有了智能,知道根據具體情況作出不同的動作,這是計算機最重要的功能之一。以前我們是怎樣實現分支的過去,我們也在函數中隱含地使用了一些分支概念,在函數中直接將分支包含進去。例 如繪圖函數DRAWTEXT(Cond,Price,Text),表示如果Cond條件滿足就輸出文字。再例如, IF(Cond,V1,V2)表示如果Cond條件成立

13、就返回V1,否則就返回V2。但是這種包含在函數中間的條件也有許多缺陷,那就是它只能控制一條語句,而且只在 有限的幾個函數中包含條件,這極大地限制了分支的應用。例如,我們就無法描述如果條件 成立,V1就等于CLOSE,否則V2就等于CLOSE0分支的描述方法我們使用IF 條件THEN 語句來描述如果條件成立就執(zhí)行語句這樣一個邏輯,例 如IF CLOSEOPEN THENP := P+1;它表示如果收盤價大于開盤價,P的數值就增加1,否則P值維持不變,也就是說統(tǒng)計 歷史陽線的數量。需要注意,IF語句和IF函數使用同樣的關鍵字,區(qū)分它們的辦法是在IF語句之后必 然存在THEN語句,而IF函數則沒有。

14、因此我們不能在IF語句條件部分包含IF函數,例如:IF IF(CLOSEOPEN, OPEN, CLOSE)10 THENP := P+1;該語句將混淆兩個IF的作用,可以使用以下方法來解決:C1 := IF(CLOSEOPEN, OPEN, CLOSE)10;IF C1 THENP := P+1;如果我們想要在條件滿足的情況下多做幾件事情怎么辦?在此我們引入BEGIN-END這 樣一個語句來形成組合語句,也就是說將它們中間所包含的語句看作一個整體,一起執(zhí)行。 組合語句被認為是一個整體,在接下來的分支、循環(huán)等操作中均需要用到。例如:IF CLOSEOPEN THEN BEGINP := P+1

15、;Q := MA(CLOSE,10);END它表示如果條件成立,將執(zhí)行對P和Q的賦值語句,否則這兩條語句均不執(zhí)行。BEGIN-END語句可以嵌套,END與之前面最接近的還沒有配對的BEGIN進行配對。例如:IF CLOSEOPEN THEN BEGIN (1)P := P+1;IF CLOSE10 THEN BEGIN (2)P := P+1;Q := MA(CLOSE,10);END (3)END (4)其中,2-3是配對的,1-4是配對的。分支語句還有以下形式:IF-THEN-ELSE,它表示如果條件滿足就執(zhí)行某件事,否則就 執(zhí)行另外一件事。例如:IF CLOSEOPEN THENP :=

16、 P+1;ELSEQ := Q+1;這段公式表示,如果今天收陽線,則將P的數值增加1,否則將Q的數值增加1,需要 注意的是,ELSE必須與IF配對,而且中間只能有一條語句或用BEGIN-END包圍起來的組 合語句。IF-THEN-ELSE可以嵌套,ELSE與之前最接近的未配對的IF語句進行配對,例如:IF CLOSEOPEN THEN (1)P := P+1;ELSE IF CLOSEQ := Q+1;ELSE (3)R := R+1;其中第(2)行的ELSE與第行的IF配對,因為她前面只有一個IF;第行的ELSE與 第(2)行的IF配對而不與第(1)行的IF配對,因為第(2)行的IF未配對,而且距離第(3)行 最近。在使用多層分支嵌套時,要時刻注意這個配對原則。分支舉例例1:計算上市以來上漲天數和下跌天數的比率:VARIABLE: UP=0, DN=0;IF CLOSEREF(CLOSE,1) THENUP := UP+1;ELSE IF CLOSEDN := DN+1;RATIO: IF(DN=0,0,U

溫馨提示

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

評論

0/150

提交評論