這個函數的功能是,確認今天是不是結算日,我也寫過類似的功能
若是結算日為假日會自動把次日當成結算日,就不需要去看有沒有放假這件事
但它只能看 "今天"是不是結算日,無法推算今天離結算日有多少天
所以我兩個結算日的函數都有寫過,可以看情況來使用。
感謝客服一號的提醒。
我之前也寫了計算距離下一結算日還有多少天的函數,但是後來覺得實用性不太好。
對於未來日子,因 K bar 尚未出現,所以只能用日期去算下一結算日。
但實用上真正需要的,不是距離下一結算日 “還有幾天”,而是距離下一結算日 “還有幾個交易日”。
也就是中間的週末跟國定假日要扣掉才行。否則策略認為還有好幾天才結算,結果放個連續假日後馬上就結算了。
所以如果不特別處理中間假日,對距離未來結算還有幾個交易日的一般算法也只能是個估計值。也就是大概還很遠或大概已經很近了。
既然是估計,我就直接用距離上個結算日有幾個交易日來估計了。離上次結算日很近就表示離下次結算日很遠。拿平均的結算間隔交易日數來算算。
這樣就可以直接把上面那個算法裡的 LastSettleDay 拿來用了,最大引用 K 棒數就還是只有兩根,且至少上次結算日是根據實際交易 K 棒而非日期。
反正都是估計,還是拿已經發生的 K 棒來估計容易一點,速度上也獲得好處。
分享一個 generic 的版本, 有跑國外期貨的可以用的到 (一樣是判斷當天是不是結算日)
1. 可選擇當月幾號結算(settleDayOfMonth != 0) 或當月第幾個星期幾 (settleDayOfMonth = 0)兩種格式
2. 可設定每個月結算(settleMonths = [0]) 或某些月份結算 (e.g. settleMonths = [3, 6, 9, 12])
3. 結算日回傳1, 非結算日回傳0, lastSettle 回傳最近一個結算日
4. 此 function 需每日執行一次
// $isSettlementDay(lastSettle, settleMonths, settleDayOfMonth, settleWeek, settleDayOfWeek); // return 0: not settlement day // return 1: settlement day // return lastSettle: return last settlement date input: lastSettle(numericRef); input: settleMonths[settleMonthsSize](numericArrayRef); input: settleDayOfMonth(numericSimple); input: settleWeek(numericSimple); input: settleDayOfWeek(numericSimple); var: x(0); var: _dom(0); var: _month(0); var: _d1om(0); var: _d1ow(0); _dom = dayOfMonth(date); _month = month(date); _d1om = date - dayOfMonth(date) + 1; _d1ow = dayOfWeek(_d1om); $isSettlementDay = 0; // check settlement day on this month if (_month <> month(lastSettle)) then begin // escape if not in months if (settleMonths[0] <> 0) then begin for x = 0 to settleMonthsSize + 1 begin if (x = settleMonthsSize + 1) then #return; if (_month = settleMonths[x]) then break; end; end; // check by day of month if (settleDayOfMonth > 0) then begin if (settleDayOfMonth >= _dom) then begin $isSettlementDay = 1; end; // check by day of week end else if (_d1ow <= settleDayOfWeek) then begin if (_dom > ((settleWeek - 1) * 7) + (settleDayOfWeek - _d1ow)) then begin $isSettlementDay = 1; end; end else begin if (_dom > (settleWeek * 7) - (_d1ow - settleDayOfWeek)) then begin $isSettlementDay = 1; end; end; end; if ($isSettlementDay <> 0) then begin lastSettle = date; end;
isntrue 您好~
請問若我想~ 計算出每月倒數第二交易日結算 ~應該要怎麼填參數呢 ??
謝謝!
這個 generic 版本的結算判斷是不是有錯誤?
如下修改,螢光處應為 <= ,而非 >=,>=會造成每月1號視為結算日
// check by day of month if (settleDayOfMonth > 0) then begin if (settleDayOfMonth <= _dom) then begin $isSettlementDay = 1; end; // check by day of week
end else if
2023 年 1 月遇到農曆過年, 結算日不在第三個週三, 改到開紅盤(1/30)日結算, 之前用的結算函數無法適用, 剛好 google 到這篇, 感覺樓主的程式還不錯, 就看開紅盤日能否順利完成結算功能! 因為現在有夜盤, 年前夜盤最後收在1/18 0500, 而1/18剛好是第三個週三, 若不加條件, 就會結算在1/18 0500. 我測試了一下, 若加上結算日的最後 k 棒的時間, 就不會在 1/18 0500 結算! 我的語法是 if _Today_Is_Settle_Day and time = 1333 then setExitonClose; 我是用 4 分鐘 k 線, 結算日最後 k 棒的時間是 1333!
給大家參考!