台指期與相關商品的結算日是每個月的第三個星期三,至於以前的結算時間在早上,近年改在尾盤這個就不管了,因為我要做的是抓出結算日這天。
雖然結算日的規則滿清楚的,就是第三個週三,但是台灣很喜歡搞彈性放假,還有颱風、年假什麼的,三不五時也會讓結算日不是在第三個週三。不過,至少有規則可循:原結算日當日因故無法結算時,次交易日為結算。利用這個特性,我們就可以做出比較"自動"一點的結算日判斷了。
原理是這樣的,我依然先檢查當天的日期是否是第三個週三,方式是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
效果如下圖:
當然,這樣的方式可以沿用到未來,不需要以後每年先去查看當年的行事曆把可能發生例外的結算日逐條列入了。
如果您有仔細研究一下這個函數的程式碼,應該可以發現這其實不是"絕對"不會有問題的,在這樣的程式碼運作下,結算日被因故延後而依然可以被判斷出來的能力"範圍"只有多出一週而已,如果你需要讓這個能力更加擴大到一週之後,那就多動動腦吧^^