台指期的結算日在每月的第三個禮拜三,到這日波段單便要出場。因此,我們需要在語法中判斷出結算日。
每月的第三個禮拜三由15號至21 號都有可能。上圖是2020年月曆。如果當月的 1 號是禮拜三,第三個禮拜三會是15 號,例如今年的一月。如果當月的 1 號是禮拜四,第三個禮拜三會是21 號,例如今年的十月。
vars: Settlement(false);
If Date <> Date [1] then Settlement = false;
If DayOfMonth(Date)>=15 and DayOfMonth(Date)<=21 and DayOfWeek(Date)=3 then Settlement = True;
If marketposition <> 0 and Settlement
= true then setexitonclose;
在語法中,先定義出一個變數Settlement,初始值為false,如符合條件Settlement 會 = True 。如果結算日當天有部位,則收盤時出場。
這好像很簡單喔! 可是,現實中會出現延後結算,如果第三個禮拜三當天遇上了假期,像遇上了颱風,便會出現延後結算的問題。關於這個問題,解決方法是寫一個能判斷延後結算的函數。寫法可以參考曾永政老師的版本,以下符上連結
http://www.yctseng.net/2012/03/blog-post_13.html
在Powerlanguage Editor 裡新增一個函數CheckDay,函數回傳類型為True/False,儲存類型為時序。
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;
有了這個函數後,結算日出場便可寫成:
If marketposition <> 0 and CheckDay
= true then setexitonclose;