有時候我就是手癢 .. 會想搞些程式,看能不能蹦出一些好的idea,順便幫股友解一些問題

下圗是股友的問題

figure-1

就我的理解,先以加權指數做為範例向大家解釋這位股友的問題,就是他想找出一個特定期間的最低價,且在這個期間K棒價格碰觸最低價的次數,白話文來說就是測試支撐的次數,就傳統交易來說,測試支撐的次數越多,而價格都能在一定範圍內守住的話,這個支撐得可參考性越大!

為了方便做教學解釋,我先把這個特定期間抓遠一點,我劃了一條米色的支撐線,這條線的指數位置約是9485,就這張圗來看是能看做一個W底上攻的型態,在左腳的地方有第一次的測試,右腳又有第二次的測試,其中這兩次的測試中都有好幾根K棒,如果用人工細算的話確實會有點麻煩 ... 以下開始解釋原先程式為何無法達成此需求的問題

figure-2

input:x1(20,"讀取資料筆數");

settotalbar(x1);

value1=lowestbar(close,x1);

condition1=close<lowestbar(close,x1);

value2=countif(condition1,20);

ret=1;

//上圗黃字是版友給的程式碼

之前我好像有寫過一支抓特定期間高低點的程式給他,但我有點忘了實際內容了 ... 我寫過的程式太多了,加上三不五時就在想一些鬼idea搞程式,所以當版友問我之前的程式時通常我都不太會有印象XDD

這支程式是無法達到這位股友的需求的,因為這支程式原本的撰寫方法是透過lowestbar這個函數在抓過去特定期間的低點,這邊有一個邏輯!假設我們現在有一組數列是「1,5,3,7,2,11,0,-5,9,-10」,有十個值,如果我們透過lowestbar去抓這段數列的最低值(抓出來的值是-10),我們在lowestbar輸入的“期數”是10,因為有10期的數字,要抓這組數字,就要10期,10這個參數,講到這裡各位必須確實明白,不然會無法理解後面的說明。而程式在執行時是有順序的,也就是假設6/1~6/10好了,程式如果在6/1號執行就會往前推10期抓數值,而在6/1號執行的話就無法完整抓到6/1~6/10的數值,所以要當程式在6/10執行時才會完整抓到6/1~6/10期間的最低值,所以說當lowestbar可以正確的抓到正確的數值時,當下的日期一定是6/10,此時程式執行程序已經來到6/10了,只有當時間來到6/10時lowestbar才能完整的讀取到「1,5,3,7,2,11,0,-5,9,-10」這十個數值,若時間只是在6/1執行的話,程式只知道1這個數值,當時間在6/5執行時程式只會知道「1,5,3,7,2」,所以假設程式在6/5執行的話會根本抓不到-10這個數值,無法抓取到完整的數值,程式還看不到後面的數值,-10這個值是必須等程式完整執行且時間已經來到6/10時才知道。

股友的程式問題就在於9485這個值必須是當程式完整執行到6/10時才會出現的值,而程式到了6/10時已經無法再回去計算過去K棒的狀況了,所以說股友寫得這個程式為什麼會出問題就在於,他在6/5程式執行時的最低價並不一定是9485,9485是程式完整執行程式後跑出來的。

股友的需求,關於這支程式要寫,其實有點複雜 ... 但程式撰寫的大概方向我能給各位

就是你要先宣告一個A變數來紀載當下的最低值,再宣告一個B變數來紀載現在測試這個低點的次數,而當新的低點出現時,A變數就要刷新,A變數刷新時勢必要刷新B變數為0重新計算,因為原本B變數紀載的前一個A變數測試低點的次數。


如果理解上述解釋了的話,就會知道其實有一點複雜的程度在,還有一個問題是如果要測試有效低點,常理來說並不能抓特定期間的最低點!有時候會假跌破,如下圗,這時候有些人會取紅色的線做為有效支撐(當然也有人會有其他看法)

figure-3

如果單純以創新低這個條件來更新A變數的話,會與實務脫鉤。支撐或壓力應給一個適度空間去伸縮,例如K棒低點的上下5%都算是同一個有效的支撐點。