2017年7月8日 星期六

策略模組- A. 小台指動能策略(當沖)

再來就是策略模組了,這個模組須結合前面兩個模組,所以程式看起來會比較複雜。這個範例的基本精神就是『追高殺低』:當成交價超過開盤價40點,且每分鐘成交量超過1200口,買進小台期貨一口;當成交價低於開盤價40點,且每分鐘成交量超過1200口,賣出小台期貨一口,且於收盤前平倉。


先在此聲明,該策略不保證賺錢。應該也有人會問,上面的一些數字,如1200口等是怎麼來的?答案是用歷史資料回測來的。



上圖第14行起為下單模組,我把下單會用到的一些方法都寫在這個類別內。一般習慣是會把這個類別寫在另外一個檔,在這邊因為下載的便利性,就把它們都放在同一個檔,不過熟悉Java語言的人都知道,編譯過後會產不同的位元碼檔案。




上圖第127行起為這個範例的主要類別,main方法就是寫在這個類別內。我把一些參數設定,統一寫在第135~148行以方便管理,各位將來當然可以自己改參數,不過建議最好要用歷史資料回測。


2017年7月6日 星期四

即時報價模組- A. excel 報價

目前一般劵商會免費提供的報價有DDE RTD、及API報價,這三者經常會以excel為輸出,最後一個可能有些資格限制,因此從excel讀取報價是最常見的途徑。若是採用DDE報價,通常還要開著劵商的看盤軟體,在記憶體的用量上會比較吃緊,RTD報價則毋須開啟劵商的看盤軟體。


還是同樣的理由,Java無法直接讀取excel內的資料,在這邊我使用一個叫JDDE的套件,這個套件是提供excelJava間作DDE的溝通,其下載點:http://jdde.pretty-tools.com/examples.php





上圖第16行顯示我的資料來源是RTD。在這個範例程式中,我使用一個timer2秒去抓一次報價(這個設定是寫在第44~45行),若成交價低於某一個價位則印出訊息。因為這只是個範例程式,我不想讓程式變的太複雜難懂,一般實際的狀況是送出委託單,那就是插入之前介紹的下單模組


2017年7月5日 星期三

下單模組- B. 元大下單API

元大下單API是採用元件物件模型(Component Object Model),這是上世紀九零年代微軟所發展的一套規範,它制定了用戶端程式與及元件間溝通的介面,以達到相互操作(interoperability)所應共同遵循的一套標準。在使用該元件之前,必須先向作業系統註冊,元大下載的檔案裏有一個install_YTFutOrdAP.bat檔可用來執行此動作,但記得使用系統管理員身分執行。


同樣的原因,Java不能直接調用COM,在這邊我是使用JACOB(Java COM Bridge),其下載點: https://sourceforge.net/projects/jacob-project/






上圖第17行中『Yuanta.YuantaOrdCtrl.64』是元大下單元件在註冊表中的名稱。第20行用了一個DispatchProxy的類別,這個類別的作用是在兩個執行緒間傳送COM物件。這一行程式花了我大概一個月的時間,原因是JACOB這套件的API文件寫得不清楚,許多用法都要花時間去試,加上當初我對元件物件模型的運作原理不是很瞭解,因此不明白client端的介面指標無法直接指到物件的介面,必須透過proxy介面作傳送。如果有人不看我的程式碼,能在一個月內把程式寫出來,希望給我個電郵,咱們交個朋友吧。

36~40行是期貨委託的參數,總共15個參數須傳送,一個也不能少,就算是不必填的參數也要用空白傳送,算是蠻麻煩的。目前我也只想到把它寫成方法,以減少不必要的參數,但若要傳送多筆委託,這樣的寫法還是很不方便。


2017年7月1日 星期六

前言

程式交易是近年來相當熱門的交易模式,許多劵商大力的在推這個項目,主因是一方面可增加手續費,另一方面可收取平台使用的租金。以目前最流行的交易平台MultiCharts來說,一個月的租金大概也要一千元,除非你已經有一個很賺錢的策略在跑,要不然這也是一個負擔。

由於網際網路的發達,新一代的學子很多在學校都有學過Java語言,但能夠把它用在程式交易上的卻很少,原因是Java最大的特色在於它的跨平台性,也就是同一支程式無須作修改就可以在windowsiosandroid 等作業系統上運作。Java在作編譯時是把原始碼翻成位元碼(bytecode),而不像C等其他語言編譯成機械碼,因此只要作業系統上有安裝Java 虛擬機器(JVM),就可執行該位元碼。但程式交易如自動下單、讀取即時報價等功能都牽涉到作業系統底層的APIJava在這方面的操控能力就很差,必須借助JNI(Java Native Interface)及其衍生的套件(如後面會用到的JNAJACOB),而這些資料在一般Java的教科書上絕對找不到,網路上或許有,但必須先把它消化吸收。

或許有人會嫌Java不是編譯成機械語言,因此執行速度比較慢。我曾針對此論點加以測試:用台指期這種大成交量的商品,以市價委托下單,然後觀察下單和成交時間,基本上在『秒』這個數量級是沒有差別的,除非你的策略要求到『毫秒』等級。每一種程式語言都有它的強項和弱點,Java的強項是在網際網路的應用,要不然你用C語言來寫個網路程式看看。而我之所以開這個部落格,一來是Java在這方面的應用較少,另一方面是公開我辛勞的成果,讓有興趣的同好少走點冤枉路。

接下來簡介程式交易的模組,很多部落格在這方面已著墨很多,但為顧及文章完整性及部落格的連貫性,因此在這邊簡單提一下。

下單模組:以劵商所提供的API(Application Programming Interface)下單,我會分別介紹日盛及元大的下單API,並提供Java程式下載。這些程式碼只要你有帳號密碼,都是實際可運作的。

即時報價模組:這也是程式交易不可或缺的部份,目前一般劵商會免費提供的報價有DDE RTD、及API報價,前兩者通常會以excel為輸出,最後一個可能有些資格限制。既然從excel讀取報價是最常見的,因此我會介紹一個叫JDDE的套件。此外,我一直想從劵商的Ajax網頁抓取即時報價,但這方面一直還有些問題。

策略模組:前面兩個模組算是基礎,這個模組才是真正決定是否會賺錢的部份。但據很多程式交易者表示,真正賺錢的策略很難寫,而且這跟交易者的個性、心智狀態有絕對關係(因交易者可能隨時把程式停掉)。當然我也會演示一個範例,但『師父領進門,修行在各人』。