2015年7月31日 星期五

收盤前平倉_當沖專用(訊號)


程式交易小學堂─期貨投機事業的王道
最近又看到人家在問,想要在收盤時平倉。在 MultiCharts 上,實際上是做不到收盤"時"平倉的,因為當真的收盤的時間一到,不管你的下單機有多快,委託單送出得到的回報必然只有一個:拒絕委託,非交易時間。

而在 MultiCharts 用來作為每天的收盤清倉的指令:SetExitOnClose,實際上是個僅供"回測"的指令,這個指令是無法用在盤中驅動買賣動作的。只要花點時間去觀察就知道,盤中報價持續跳著,即使你在訊號程式碼中下了 SetExitOnClose,但到了 13:45(TXF為例),它就是不會產生平倉訊號,我們得把圖表關掉重開,才會看到平倉訊號出現。

那麼,實際上我要在臨收盤前把部位清掉的話,該怎麼做呢?得獨立做一個訊號,專門來幹這件事,它必須開啟 IntrabarOrderGeneration 模式,只下平倉命令,沒有進場命令,訊號程式碼如下:
[IntrabarOrderGeneration = True]

input:exitTime( 134457 );
Var:cleanTime(0), toClean(false);

cleanTime= iff( _Checkday, exitTime-1500, exitTime );
toClean= Q_Time_s>=cleanTime and Time_s>=cleanTime;

if toClean then begin
 if marketposition>0 then  Sell next bar market;
 if marketposition<0 then  Buytocover next bar market;
end;

訊號的參數是到秒格式的指定時間,時間一到要做平倉出場動作,以上 code 預設值是 13:44:57 。通常來說以國內的下單機速度,3 秒鐘應該足夠用來委託的送達了,如果你擔心這樣的時間太緊迫或有個人喜好的話,自行調整參數去控制出場的指定時間。另外,因為結算日當天會提早 15分鐘收盤,所以我把執行出場時間在結算日當天自動減去 1500。


在你做好了這個專門用來給當沖程式的指定時間到就強迫清倉出場的訊號後,需要把這個訊號跟你的當沖程式放在同一個圖表上,並作設定如下圖:

2015年7月18日 星期六

函數:讀取文字檔_利用ELCollections.dll


程式交易小學堂─期貨投機事業的王道
在 MultiCharts 中要把一些所需的資訊輸出出去,存成文字檔(.txt)的形式,內建於 MultiCharts 的 fileappend 與 print 指令都能順利辦到。另外,國內有凌波大分享的 outputfile.dll 與 下單大師的 omSignTXT.dll 可供使用,更能提供比內建指令更好的穩定性,避免檔案讀取權限被鎖住的問題。

但是從外部文字檔讀取資訊進來給 MultiCharts 使用,就沒有內建的指令可以使用了,在凱衛官方網站上,有網友 bodrigs 分享自製工具,我有使用一段時日,但是如果欲讀取文字檔不存在的話,會導致整個 MultiCharts 整個 crash 掉,算是使用該資源的一項風險。其後,又有網友 swwang1999 分享相同功能的資源,說是即使讀取文字檔失敗,也不會造成 MultiCharts 當掉。不過,幾經實驗,我依然不得要領。

經過一番 Google 後發現,原來安裝了 ADE 就會得到的 ELCollections.dll ,也可以用來讀取文字檔(資訊來源)。經過測試後,這個功能就算讀取文字檔失敗也不會造成 MultiCharts 當掉,只會出現個錯誤訊息,並且讓引用這功能的指標或訊號 OFF 掉而已,不會影響其他的圖表運作,相對安全。

由於要讀取文字檔內容,需要經過 ADE 套件中的三個函數依序協做,我乾脆把這幾個需要用到的函數內容複製出來做一些修改,合併成一個好方便使用,函數(_readFile,數值型)程式碼如下:
[LegacyColorValue = TRUE];

external method: "C:\AutoTrading\ELCollections_x64.dll", double, "ListN_New";
external method: "C:\AutoTrading\ELCollections_x64.dll", int, "ListN_ReadFile", double, LPSTR;
external method: "C:\AutoTrading\ELCollections_x64.dll", double, "ListN_Get", double, int;
external: "C:\AutoTrading\ELCollections_x64.dll", int, "_OnDestroyHandler", IEasyLanguageObject;

#Events
    OnDestroy = _OnDestroyHandler;
#End;



Inputs:FileName(string),Index(Numeric);
Vars:ID(ListN_New);


ListN_ReadFile(ID, FileName);

_readFile = ListN_Get(ID, Index);


要使用這個函數的時候需要兩個參數,_readFile(A, B)。A:文字檔的名稱,需包含路徑、B:讀取文字檔中的第幾行。使用範例如下,我用一個指標做這件事情,請自行參考。


因為這個 _readFile 函數需要使用到 ELCollections.dll,而 ADE 有分 x64、x32 的版本不同,我自己使用 x64 的,如果你不想為了這個功能就去做整個 ADE 的安裝工程的話,我把 ELCollections.dll 複製出來,跟函數 _readFile 的 pla 檔及 sef 檔(8.5x64),一同打包在一起提供下載。下載點:download from GoogleDrive

解壓縮開後,需要把 ELCollections_x64.dll 放到 C:\AutoTrading\ 之下,因為函數 readFile 的程式碼已經指向了這個路徑。或者你得修改程式碼內容(參照上方程式碼中藍色字)去對應好,看你把 ELCollections_x64.dll 放在哪邊去了。

注意:本函數的調用,被讀取的文字檔內容中,必須全部內容都是數字,不可含有字母、空格或是其他符號,可分多行,一如上圖中的 123.txt 那樣。另外,被讀取的文字檔,不可以用 FileAppend 去寫,會發生權限打架而導致失敗。

2015年7月10日 星期五

分散交易是為了什麼?


程式交易小學堂─期貨投機事業的王道
今年的台指也許是跳空方向的關係,也也許是走勢的來回,總之讓有掛在台指期上的策略大多數表現不佳,因為這項商品本身的走勢,似乎對一般大家使用的順勢交易策略,並不友善。

分散到不同的商品,為的應該是更多的機會可供選擇,因為只交易一種商品就只有一種機會,不管這個商品是不是 TXF,至少不同的策略掛在相同商品上只會有同一種 GAP。


等待交易的商品清單,在任意時間區段中,總是會有比較好做與比較難做的,而所謂的比較好做或難做,其實不是商品本身的走勢乾淨與否,其實是直接跟掛在其上的策略一併表現的。我相信今年的台指,還是有人的策略績效表現得很好。所以,什麼叫做好做或不好做?

畢竟,透過不管什麼面相去評估商品走勢本身是否好做,都是在預期商品會讓某個策略有比較好的績效表現。如果在投入資金之前的商品 ranking 得到 IF300 是該優先交易的商品,但策略掛在其上之後,卻是表現不佳,那是策略的錯嗎?又或者是給商品做 ranking 的指標的錯?

因此,直接去對商品做 ranking 似乎就怪怪的了。難道,我們不該直接對圖表(某商品掛上某策略)的績效做 ranking 嗎?

不過,直接對圖表績效做 ranking 的話,就得有個前提必須成立:圖表的績效不會是隨機表現。而這個假設是正確的嗎?

2015年6月10日 星期三

函數 _ChartSleepDetect:圖表睡著的通報


程式交易小學堂─期貨投機事業的王道
每每在課程中講到程式交易的一般障礙自動自我救援的時候,我說出 MultiCharts 其實時不時還是會有圖表報價"睡著"的意外發生時,同學幾乎都是一副不可思議的表情。是的,圖表會睡著!是睡著,不是死掉,不是當掉,也不是斷線...

一般來說,如果報價中斷或是網路斷線,在 MultiCharts 上所有圖表的報價就不會跳了。但是,在我多年的使用經驗上,實際上多次發生好幾個圖接收同一個商品報價,卻只有其中某一個圖的報價不會跳,而其他圖表的報價依然在跳動,這證明了網路沒斷、報價有進來,僅僅只有那個不跳報價的圖表昏過去了(難道是賠太多嗎 XD)。這狀況其實很嚴重啊!因為不是報價中斷,不會觸發 Multicharts 本身的自動重連或是自動回補機制,只有那個圖表遺世獨立而已...

在我的自動救援機制中,自有其應對之道。但我還想進一步知道到底是哪一個圖表睡著呢?

2015年5月16日 星期六

函數 _bankerRound:四捨六入五成雙


程式交易小學堂─期貨投機事業的王道
MultiCharts 內建函數的 Round 是大家所熟知的四捨五入去到小數點以下幾位。但是,Round 這個幾乎所有程式語言都有的內建函數,卻不見得在每個語言中都是四捨五入喔。至於,什麼是"四捨六入五成雙"?可以查一下 banker's rounding。這裡有些不同 round 方式的介紹:http://goo.gl/gTpp9b

2015年4月21日 星期二

函數:xAverage for Array, 一維陣列用的EMA


程式交易小學堂─期貨投機事業的王道
個人在平均值,尤其是均線上的計算使用,對 EMA(即 xAverage)的偏好大於 MA(即 Average)。在 MultiCharts 內建函數中對於一維陣列的平均計算有 Average_a 或是 AverageArray 可用,但找不到以 EMA 方式對一維陣列按序號遞增做 EMA 計算的函數...

2015年3月8日 星期日

系統錯誤通報 by SMS


程式交易小學堂─期貨投機事業的王道
這篇文章有前篇,搜自網路上人家分享的發送 mail 功能後,可自行點閱。因為我的手機接收的 mail 通知實在太多,弄到我連收到 mail 都有點麻痺,於是修改了系統錯誤通報的途徑,從 mail 改為發送手機簡訊(SMS)。這個功能,依然採用 AutoIt 去做,並且採用台灣簡訊的服務,如果你沒有打算購買台灣簡訊的服務,可直接放棄。

熱門文章