2012年3月13日 星期二

函數(CheckDay):台指結算日判斷 - 延後結算也OK

台指期與相關商品的結算日是每個月的第三個星期三,至於以前的結算時間在早上,近年改在尾盤這個就不管了,因為我要做的是抓出結算日這天。

雖然結算日的規則滿清楚的,就是第三個週三,但是台灣很喜歡搞彈性放假,還有颱風、年假什麼的,三不五時也會讓結算日不是在第三個週三。不過,至少有規則可循:原結算日當日因故無法結算時,次交易日為結算。利用這個特性,我們就可以做出比較"自動"一點的結算日判斷了。



原理是這樣的,我依然先檢查當天的日期是否是第三個週三,方式是15號到21號的週三就是第三個週三為結算日,如果每個月的某一天有符合這條件,就用一個變數做 mark 去記錄這個月有按普通規則結算了。而當日子來到第三個週四以後卻還沒有發生過按普通規則結算的話(用 mark 做判斷),那麼就把這個日子當做是今天結算!至於其中的變數 mark 怎麼控制我就不多描述了,請自建一個函數名稱為 CheckDay,記得要選好類型為(True/False),程式碼如後。




MultiCharts版:
var:mark(0);

if D>D[1] then CheckDay=false;

if Month(D)<>Month(D)[1] then mark=0;

if (DayOfMonth(D)>=15 and DayOfMonth(D)<=21 and DayOfWeek(D)=3) then begin

  CheckDay=True;
  mark=1;
  end
     
else 
  if mark=0 and
     (
       (DayOfMonth(D)>=16 and DayOfMonth(D)<=22 and DayOfWeek(D)=4) or
       (DayOfMonth(D)>=17 and DayOfMonth(D)<=23 and DayOfWeek(D)=5) or
       (DayOfMonth(D)>=18 and DayOfMonth(D)<=24 and DayOfWeek(D)=6) or
       (DayOfMonth(D)>=20 and DayOfMonth(D)<=26 and DayOfWeek(D)=1) or
       (DayOfMonth(D)>=21 and DayOfMonth(D)<=27 and DayOfWeek(D)=2) or
       (DayOfMonth(D)>=22)
      ) then begin

    CheckDay=True;
    mark=1;

  end;



HTS(STS)版:
var:mark(0);

if D>D[1] then CheckDay=false; end if

Value1=Month(D);
if Value1<>Value1[1] then mark=0; end if

if (DayOfMonth(D)>=15 and DayOfMonth(D)<=21 and DayOfWeek(D)=3) then

  CheckDay=True;
  mark=1;
     
elseif mark=0 and
     (
       (DayOfMonth(D)>=16 and DayOfMonth(D)<=22 and DayOfWeek(D)=4) or
       (DayOfMonth(D)>=17 and DayOfMonth(D)<=23 and DayOfWeek(D)=5) or
       (DayOfMonth(D)>=18 and DayOfMonth(D)<=24 and DayOfWeek(D)=6) or
       (DayOfMonth(D)>=20 and DayOfMonth(D)<=26 and DayOfWeek(D)=1) or
       (DayOfMonth(D)>=21 and DayOfMonth(D)<=27 and DayOfWeek(D)=2) or
       (DayOfMonth(D)>=22)
      ) then 

    CheckDay=True;
    mark=1;

end if


效果如下圖:
1

結論:2007年的 2月就因為年假的關係,本來按照普通規則應該在 02/21 結算,而被延到新春第一個交易日 02/26 結算。這樣的程式寫法就可以判斷出 02/21 本來應該結算的日子,因為沒有交易資料所以不存在,等到 02/26 這天的交易資料一出現就當做這是本來該結算但是被延後的第一個交易日

當然,這樣的方式可以沿用到未來,不需要以後每年先去查看當年的行事曆把可能發生例外的結算日逐條列入了。

如果您有仔細研究一下這個函數的程式碼,應該可以發現這其實不是"絕對"不會有問題的,在這樣的程式碼運作下,結算日被因故延後而依然可以被判斷出來的能力"範圍"只有多出一週而已,如果你需要讓這個能力更加擴大到一週之後,那就多動動腦吧^^