顯示具有 Multicharts程式相關 標籤的文章。 顯示所有文章
顯示具有 Multicharts程式相關 標籤的文章。 顯示所有文章

2016年6月23日 星期四

Multicharts 「訊號」以及「指標」運作方式的不同

碰到了問題,就會想很久,有時甚至想破頭,才發覺原來卡在早就知道的東西上.... 


Multicharts的運作方式,在「訊號」及「指標」上,有很大的不同:

1) 訊號的運作方式,是K棒結束之後才會把訊號內容運算一次,所以一根K棒只會在結束時運算一次。

2) 指標的運作方式,是用tick為單位,每一個tick進來時,都會運算一次。


所以,當我們在「訊號」的程式寫作上,碰到了很多「晚一根出訊號」、或IOG模式、非即時的問題,其實都出在訊號及指標的運作基礎不同。也就因為如此,許多網上的前輩都使用「指標」來運作策略內容來達到「每一個tick運算」的目的,而非使用「訊號」。訊號只是用來做歷史回測而已...  営然,訊號也可以使用IOG模式來做tick的運算,不過實在是麻煩很多,不如直接在指標內做運算來的方便。

所以,不管是跟下單大師的萬用API連結(阿政大的方法),或是使用文字檔輸出,把這些程式碼放在指標中,是比放在訊號中來的即時,也來的可靠..

譬如,在五分鐘的週期中,若文字檔內有輸出close的價位 (下單大師會用到這個close的價位來判定是否系統當掉):

1) 使用訊號模式,每五分鐘才會更新一次,也就是只有五分鐘倍數的時間價位。
2) 使用指標模式,每一個tick都會更新一次,也就是即時的價位。

但指標上也有幾個要注意的地方:
1) 這種方式只能使用外接下單機來做下單,券商版的功能被砍掉了,殘念~~
2) 指標上的倉位,直接用i_marketposition * i_currentcontracts 來判定,又即時又方便,又不會被指標內的IOG模式給干擾。

說實在,MC還是有許多眉眉角角,對初學者來說是很惱人的...

[轉貼] 台指結算日判斷_延後結算也OK (from 阿政)

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

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

原理是這樣的,我依然先檢查當天的日期是否是第三個週三,方式是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


效果如下圖:

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

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

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

轉貼From: 阿政的投機生活,  http://www.yctseng.net/2012/03/blog-post_13.html