判斷結算日

  •   1K 
  • 最後發表   股海小子  2020 九月 03
股海小子 發文於   2020/06/04

小幫手您好,

想於警示當中跑資料,寫入判斷當日是否結算日(第三個星期三),我希望在屬於該月第三個星期三的時候,就在v83這個欄位標記1,預設為0。

我寫的判斷方式,並非直接去讀取日期,然後判斷是否為[第三周]&[星期三],因為觀察任何一年的月曆可以發現,每月第三個星期三並不一定是在第三周。例如2020年的5月份,該月的第三個星期三是2020/05/20,但這應該是五月的第四周了。

所以我是希望寫一個流程來判斷,當天是否是當月第三個星期三。寫法邏輯如下:

1. 判斷當天是否星期三,如果是,則往前檢查20天(往前抓20天,因為第三個星期三的位置最晚在21號,不可能位於更後面。),目的是判斷裡面有幾個星期三。

2. 判斷前面抓出來的20個日子,是否屬於同一個月份。

3. 如果同一個月份,那麼判斷這些日子裏面,有幾個星期三。

程式如下

variable:v1(0),v83(0),m(0),i(0);

 

v1 = DaysToExpirationTF;

 

//Value92 = DateValue(currentdate, "WM");  //這是月份內的第幾周

value93 = DateValue(date, "DW");  //星期幾

Value94 = DateValue(date, "M");   //月份值

if value93=3 and DayOfMonth(date)=21 then v83=1

else 

  if value93=3 and DayOfMonth(date)<22 then 

    m=0;

    for i=1 to 20

    begin

      value95=dateadd(date,"D",-i);  //開始往前取日期數字值

      if datevalue(value95,"M")=value94 and datevalue(value95,"DW")=3 then //判斷在同一個月內且星期三

      m+=1;

    end;

  if value93=3 and m=2 then v83=1

  else v83=0;

;

 

 

Print(file("儲存路徑C:\....."),  

 SymbolName,   //印出今天日期

 date,

 numtostr(v1[1], 0), ",",

 numtostr(v83[1], 0), ",");

 

看了結果,還差一點點。標記的日期,變成了都是每個月的第三個星期四,不知道我是哪裡寫錯了。

請問該怎麼改呢? 謝謝。

排序方式: 標準 | 最新
股海小子 發文於   2020/06/05

哈囉小幫手,山不轉路轉,我用另一個方法,結果發現一樣是跑出星期四。

我的方法是,第三個星期三,一定出現在每月的15~21日之間。

所以,程式碼如下

value93 = DateValue(date, "DW");  //星期幾

condition1=DayOfMonth(date)>14 and DayOfMonth(date)<22; 

if value93=3 and condition1 then v83=1

else v83=0;

結果,仍是選出每月的第三個星期四,應該不是我程式碼有問題了。

我猜,貴公司的Datevalue函數的說明,可能有點問題,網頁如下http://xshelp.xq.com.tw/XSHelp/?HelpName=DateValue&group=DATEFUNC

請確認函數說明,星期日~星期六,對應0~6。

如果函數沒問題,那麼是否我程式有問題呢?

唉呀咿阿 發文於   2020/06/05

我是直接看日曆,把每月的結算日期手動輸入變成條件~有點麻煩就是了

  • 按讚來自於
  • Sinotrade006
XQ小幫手 發文於   2020/06/09

Hi 股本小子

看完您的問題後,小幫手有一個最大的疑問想請教

為什麼您要print v83的[1] 呢,這個是print 出前一天的結果

因此5/21那一天,他就會取[1],也就是5/20的值。

再請您替小幫手解惑,謝謝您。

  • 按讚來自於
  • Sinotrade006
股海小子 發文於   2020/06/09

Hi~ 小幫手,謝謝回覆。

之所以要印前一天,因為這些資料是要丟進去做機器學習,所以我其實是把每一天的資料做特徵,把後面一天的資料做標記。

不過,我稍微想了一下,似乎問題就是在這裡.....

ㅤㅤ 發文於   2020/09/02

直接自訂新增一個『結算日檢查函數:CheckDay』,資料形態設定:True, False,一勞永逸。

以後在指標、警示腳本中寫公式,只要遇到檢查當日是否是結算日,就可以寫:

If CheckDay = True Then..........

  • 按讚來自於
  • Sinotrade006
股海小子 發文於   2020/09/03

很棒的功能,謝謝XQ。我看完程式碼,想再確認一點: 這個函數,主要功能是檢查每個月的第三個星期三,對吧?! 並不是真的抓取期交所的"結算日紀錄"吧? 我的意思是,有時候遇到剛好星期三是假日/或颱風假之類的,或者二月份的農曆年狀況,這個函數仍會出錯吧?! 出錯無所謂,我只是想確認函數可以做到甚麼事情。謝謝。

ㅤㅤ 發文於   2020/09/03

嗨!您好我是 RUI,沒錯唷,單純檢查「每個月第三個星期三」,並未抓期交所結算資料。

這個自訂的結算檢查函數,是我直接從 MultiCharts 官方論壇移植來 XQ 的,目前測試是都沒問題👌🏻

除非真的遇到您上開所述,假日、颱風等臨時變因。

發表回覆
Close