2017年10月5日 星期四

疑惑:MultiCharts11 的 plot


程式交易小學堂─期貨投機事業的王道
把交易機的 MultiCharts 升級上 11後發現,T+1盤的監視畫面,所有 plot 的數據都不會動?難道,ReCalacLastbarAfter 在 MC_11 卻給廢了?不可能吧...

於是,我做了點實驗,分別寫了個訊號與指標,都在盤後(沒有 tick event) 靠 ReCalacLastbarAfter 強迫程式重 Run 來顯示 CurrentTime_s,看看這個指令是否還有作用?



接著開一張 1 tick 圖,把這個指標、訊號都放上去... 很明顯的,我可以看到訊號的 CurrentTime_s 可以每秒都被更新。而指標上 plot 出來的 CurrentTime_s 卻在完成後就不再更新... 但是!在指標中,所下的 FileAppend 卻可以每秒一次的去做檔案寫入的動作,這表示不論在訊號或是指標,ReCalacLastbarAfter 都是有作用的。


為什麼 plot 卻不會刷新呢?雖然就功能來說,都是可以繼續執行的,但 plot 不會更新總讓人不舒服啊~


2017年10月3日 星期二

Touchance 的報價服務,併筆或不是併筆?


程式交易小學堂─期貨投機事業的王道
大約兩三年前,我開始使用 Touchance 的報價服務,當時我聽說 Touchance 報價快是因為"併筆"關係。這也是有好一段歷史故事了,可以參考故事傳送門。另外我記得應該有一篇 立偉兄 解釋的 Touchance 報價的併筆原理解釋,暫時找不到。

因為,我個人有在觀察每天收到的 tick 數量,有一個現象一直加深我認定 Touchance 報價就是併筆的現象:從艾揚報價所收到的 tick 數量相對 Kway 的少很多,但是把當日所有 tick 的成交量做加總,卻又沒有多少差異,這個現象每天都在發生,更讓我認定 Touchance 的報價服務就併筆的。

在因緣際會下,討論到這個併筆的事情,艾揚給的回應卻是:「他們沒有做併筆的動作,只是會因為 client 端當時的條件,選擇是否丟掉 tick 不送進 MC。」然而,這個說法讓我大起疑惑,如果是把 tick 丟掉,那每天我都遺漏幾乎兩三萬個 tick,這些 tick 成交量的加總,卻能相當接近日成交量是怎麼回事?這不科學啊 XD


今天,我總算得到相當合理的解釋了:「Touchance 的 tick 成交量資訊,並不是把從交易所收來的資料就直接轉送,而是利用像是 q_TotalVolume 這個資訊去算出要給 送進 MC 的 tick 成交量」。你可以理解成,每個從 Touchance 送進 MC 的 tick 的成交量是 q_TotalVolume - q_TotalVolume[1] 這樣的概念。因此這就造成,不管我接收的報價漏了多少 tick ,當日成交量的加總都會非常接近日成交量。我的疑惑也就得到了解釋。

所以,Touchance 的報價服務,是併筆嗎?不是!但會因為 client 端接收的當時狀況而被選擇性的拋棄 tick (會漏),而有被送進來的 tick 所帶的成交量資訊,基本上可以說是... 假假的。優點呢?快、穩定。

2017年9月29日 星期五

函數:_fancyDailyEquity


程式交易小學堂─期貨投機事業的王道
在開發交易管理系統的早期,我注意到給策略做評價的 KPI 計算出來的分數會出現負數,而負數的出現自然是被評估的那個策略實在太爛的關係。然而所謂的策略績效表現太爛,通常不是策略訊號本身就衰到爆,卻往往是交易成本(稅、費、滑價)把訊號本身的價差獲利吃乾抹淨所致。也就是我常在講座、課程中提到的:我們手上策略賺不了錢的絕大部分原因,是被賭場抽頭給抽死的。

近期,好友(就是凌波微步大)與我討論到把賠到不行的策略對做這件事(他也有發文講這事)。真的要做的話,我們第一件要做的事情就是先把策略績效中的交易成本因素剔除。

由於我們還打算跟超級爛策略對做(你叫多單,我就下空單),所以最好把策略績效修改成,每做一筆交易就算平出也能拿到獎金,如果在這種條件下,還能做到賠錢,那真無疑是地獄倒楣鬼:一空就漲、一多就跌。因此,我先寫個函數來把原始策略績效改成剔除交易成本還附送獎金,產生負面評估的原始材料。


函數名稱: _fancyDaulyEquity(A, B)。參數A:抓取幾天前的 fancyEquity。參數B:每口交易成本設定。其他就自行看 code 研究吧。
input: DaysAgo(Numeric), costPerContract(Numeric);
var: tradeAmount(0), totalCost(0), totalContracts(0), fancyEquity(0);
array: DailyfancyEquity[](0);




tradeAmount= i_CurrentContracts;

if tradeAmount<>tradeAmount[1] then
  totalContracts= totalContracts + pos(tradeAmount-tradeAmount[1]);

totalCost= totalContracts * costPerContract;
fancyEquity= i_OpenEquity + 2*totalCost;


once array_setmaxindex( DailyfancyEquity, 1 );

if sessionlastbar then begin
  array_setmaxindex( DailyfancyEquity, array_getmaxindex(DailyfancyEquity)+1 ); 
  _arrayShift( DailyfancyEquity );
  DailyfancyEquity[1]= fancyEquity;
end;  



if totalContracts>0 then begin
  
  if DaysAgo=0 or sessionlastbar then
    _fancyDailyEquity= fancyEquity
  else
    _fancyDailyEquity= DailyfancyEquity[DaysAgo];

end;    




我們用個指標畫圖來比較一下 _fancyDailyEquity 與 i_openEquity 的差別。
第一筆交易進場1口,空 8268 收 8269,價差 -200,交易成本每口設 600,所以 i_openEquity = -800,而 _fancyDailyEquity 則是價差 -200,不計交易成本,還送獎金 600,所以 +400。後續以此類推。


經過幾筆交易後... 應該很容易體會到為什麼這個函數會被取名成 fancy 了 ^_^


這只是用來辨識地獄倒楣鬼的起步,用來看出有"對做"價值策略的原始材料,後面還要做不少工作,才能納進交易管理系統。

2017年8月29日 星期二

智能版當沖策略專用清倉訊號


程式交易小學堂─期貨投機事業的王道
在跟好友的討論中產生出來的當沖策略用的臨收盤前出場的"訊號"。不過,這篇文章的題目加上了智能版,總是要比過去分享過的東西多聰明一點點才行嘛 XD

因應交易多商品的需求,每一種商品的收盤時間都很可能不一樣。至少,想讓這個臨收盤出場能隨著個別商品的 QM 設定而自動配合。

用 SessionLastBar 這個內建函數來協助判斷目前的 K 棒是否是交易時段的最後一根,再用這最後一根 K棒的結束時間作為基準,接著以 q_time 來計算距離這商品的收盤時間還有幾分鐘?當這個距離時間小於等於指定的時間長度(參數):平倉。
[IntrabarOrderGeneration=True]


input: minutesBeforeEndTime(5);

var: intrabarpersist isEndBar(false);
var: intrabarpersist now(0), intrabarpersist endTime(0);


isEndBar= sessionlastbar;


if isEndBar then begin
  if marketposition>0 then  sell this bar close;
  if marketposition<0 then  buytocover this bar close;
end;  


if isEndBar and LastBarOnChart then begin
  
  endTime= HoursFromDateTime( el_timetodatetime(time) )*60 + MinutesFromDateTime( el_timetodatetime(time) );
  now= q_Time;//currentTime;
  now= HoursFromDateTime( el_timetodatetime(now) )*60 + MinutesFromDateTime( el_timetodatetime(now) );

  if endTime - now <= minutesBeforeEndTime then begin
    if marketposition>0 then  sell next bar market;
    if marketposition<0 then  buytocover next bar market;
  end;
  
end;




需要注意的是,因為這裡計算離收盤時間還有幾分鐘用的是 q_time,如果在這段收盤前幾分鐘就清倉的時間內,都沒有 tick 進來的話,有可能 q_time 沒有更新而導致... 留倉!

過去,我曾經分享過給台指用的收盤前清倉的訊號,採用了 currentTime,用的是電腦時間,因為交易的標的擴展到多商品的時候,幾乎標的的交易所時間都跟我們的電腦時間是不同時區,不能用 currentTime 去做。如果能自動取得該商品的交易所時區,也許就能用本地的電腦時間去做更好的控制了。

暫時,這是一個姑且用之的自適應版本。


2017年8月17日 星期四

外接下單機的結算日清倉實作


程式交易小學堂─期貨投機事業的王道
我在台指上的交易,讓交易策略每到結算日就收盤清倉的作法,已經維持數年。
僅用 if _checkDay then setexitonclose; 一句來達到訊號的回測。但是,這樣的寫法是不能直接用在日常實戰的。我自己不用內建下單機,不知道她會怎麼動作?而外接下單的方式,則因為單純這樣的策略內指令不會在結算日的收盤前有任何圖表訊號出現,所以也就不會輸出部位變化給外接下單機知道。因此,實際上是根本沒有任何的平倉動作,讓交易所把我的部位給結算掉,而得到真實清倉的效果。

但是,因為外接下單機沒有接收到任何的部位變化訊息,它也就不會有任何動作,從而在結算日收盤後變成錯誤的帳上留倉部位,這會導致後續的交易錯誤。因此,我必須在結算日這天的收盤後,採用手動或自動的方式,讓外接下單機上的帳上留倉部位(下單大師稱為"實際倉位")給歸零。

這裡提供一個方式,讓外接下單機可以知道我要在結算日這天清倉:把輸出給它的資訊,強迫改成... 0。

在你要輸出到外接下單機的訊號或是指標中做這樣的寫法:


var: IntrabarPersist MP(0);

{MP 是要輸出給外接下單機的部位數值,因為我要他在結算日的收盤後做變動,但當時會沒有 tick 進來,所以要宣告成宣告成 IntrabarPersist ,好讓我變更這個變數的數值後得以保留,不會被回復。}


if CheckDay and ( currentTime<0845 or currentTime>1340 ) then
  MP= 0
else
  MP= i_marketposition * i_currentcontracts;

{這一段是判斷 K棒是否屬於結算日,並且如果電腦時間在 08:45 前 或 13:40 後的話,把 MP 設為 0,其他時候則 MP 就是本來你要輸出的訊號部位。這裡需要想像一下,CheckDay 的結算日判斷,是以 K 棒的日期作為判斷的依據,所以當今天是結算日的話,是從開盤第一根K棒就開始回報為 True,所以要限制它必須電腦時間在 13:30(結算合約的最後交易時間)之後才可以變成 0。而當結算日收盤後一直到隔天的早上開盤前,因為沒有新的 tick 進來,不會有新的 K棒日期出現,所以就圖表來看這一段時間,函數 CheckDay 回傳值都會是 True,加上電腦時間在 08:45 之前也算(以防你的 MultiCharts 與下單機都一直開著沒有關掉),就讓結算日的 13:41~ 隔天的 08:45 前,把 MP 指定成 0 的條件都成立}


RecalcLastBarAfter(1);

{這個指令是為了在沒有 tick 的時候,強迫這個訊號或指標的 code 都每秒 run 一次,透過這個指令,才能在 13:41 開始,把 MP 從原本的部位數值變成 0,輸出出去給下單機接收到,也因為這個變化是在沒有 tick 進來的狀況下,不可能會有換 bar,讓一般的變數值更新,所以才需要把 MP 宣告為 IntrabarPersist}


透過這樣在負責輸出部位數值給外接下單機的訊號或是指標,就能夠在 13:41 的時候讓下單機知道部位應該要變成零,而去執行下單的動作,雖然當時的委託送出其實是會失敗的(非該商品的交易時間),真實部位一樣進入結算,但下單機內的帳上留倉部位卻會歸零。我也就不需要另外手動去調整下單機內的帳上部位了。

K棒是否屬於結算日的判斷函數(CheckDay)請見:http://www.yctseng.net/2012/03/blog-post_13.html

2017年5月13日 星期六

帳戶管理人的必備工具


程式交易小學堂─期貨投機事業的王道
在 Blog 每日公佈個人交易帳戶的權益變化好些年了,我也承認在那個帳戶中其實有不少交易並不是程式交易下單的。因此,有些時候看到我的帳戶績效衝得比較快也不見得是程式的功勞。事實上,人為主觀下單更多時候給我的帳戶績效帶來的是負面影響,但我還是難逃想要自己下場交易的誘惑。

然而,在我管理的受託帳戶就完全是程式交易的下單,主因是我無力同時照看多個帳戶。好險,這個因素讓我得以在受託帳戶上實現完整的程式交易實單記錄。

即使知道使用「智能交易顧問 SmartCTA」,在真實交易經驗上確實有效,但它卻無法提供回測,可...大家都是回測控啊!我一直說 SmartCTA 有效,但它到底是怎樣的有效呢?空口白話總是很難體會。因為我有真實的記錄資料,就來做個比較給大家參考。


以下這三個帳戶,分別記錄不同開始時間,不同的資金規模,但都使用相同的訊號組合來源(可每日查看)。

2017年4月25日 星期二

策略管理機制的驗證:Random equity


程式交易小學堂─期貨投機事業的王道
前文說過,KPI 只是整個管理系統的起點,因為所有的管理動作,都必須有"衡量",而且是一致化、量化的衡量,不是隨個人喜好的衡量。

然而,我們會想出各種可能的 KPI,也可能因而衍生出各種不同的管理動作流程。這時,另一個問題就出現了:哪一個有效?又誰比誰更有效?有效又是表現在哪些面相?在每天的真實交易績效表現上,這是我們時刻要面對的,絕不能僅僅只是認定它有效就帶過。

熱門文章