2014年8月3日

股市自動交易系統(半完成品) - JavaATS程式架構 - DataManager

這篇來描述另一個簡單的部份,Data Manager,取得歷史資料的元件,
在JavaATS架構圖如下:
這裡的Data Manager,主要就是從SQL Server裡面把資料撈出來,
目前的Data Manager只有實做撈Candle(K線資料),
每筆資料包含:

  • ID (代號)
  • Name (名稱)
  • Date (日期時間)
  • Open (開盤價)
  • Close (收盤價)
  • High (最高價)
  • Low (最低價)
  • Volume (成交價)

Data Manager程式碼結構:
Data Manager結構非常簡單,只有1個建構子+2個method,如下:

  • 建構子:載入JDBC驅動程式,設定SQL Server的資訊(IP、Port、DB Name、Account、Password)
  • getCandle:取出特定市場、代號的歷史資料(所有時間,從最早到最新)
  • setCandle:傳入SQL Code,直接寫入或更新資料到SQL Server

Candle與CANDLES變數:
這裡唯一需要解釋的是,Candle和CANDLES這2個變數,和它的命名原因。

  • Candle:就是K線資料,但它代表1個時間的K線資料
  • CANDLES:表示一整串Candle,它的原型是個Candle的陣列

大小寫命名原因:
這和之後會提到的StockAPI有關連,
為了讓StockAPI便於使用和區別,
我在StockAPI內,統一使用「大寫+底線」的method名稱,
例如:
取得歷史資料的API叫GET_HISTORY
取得Quote的API叫GET_QUOTE

一整串的Candle因為很常被StockAPI使用,因此它的命名變為大寫。

2014年8月2日

股市自動交易系統(半完成品) - JavaATS程式架構 - Config Manager

這篇要來描述Config Manager的部份,在JavaATS的架構圖如下藍色框框部份:
ConfigManager是屬於比較單純的部份,
它主要功能就是XML的Parser,負責將XML資訊讀出成變數。

ConfigManager功能與呼叫方式:
JavaATS會在一開始時透過ConfigManager載入所有變數,
之後JavaATS所有變數的取得,都是透過ConfigManager。

例如:
xml設定檔檔名為:configs.xml

則在JavaATS一開始時,會呼叫:
CONFIG = new ConfigManager(configs.xml);

之後所有設定都會讀入CONFIG當中。

例如要取得MySQL設定的IP,如下:
String ip = CONFIG.getMySQLIP();

ConfigManager程式結構:
Java的XML Parser有2套,是:

  • DOM XML Parser
  • SAX XML Parser
DOM的優點是程式碼比較容易結構化,缺點是操作比較麻煩,
SAX的優點是,操作單純,但程式碼比較不好結構化。

在寫這部份時,正好就學習SAX XML Parser使用方式,
因此,JavaATS的XML Parser,原則上都是用SAX XML Parser。

SAX XML Parser:
這裡不得不稍微提下Java SAX XML Parser的使用方式,
Java SAX XML Parser程式碼結構大致如下:
File f = new File(configs.xml);
DefaultHandler XMLHandler = new DefaultHandler() {}

SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser saxParser = spf.newSAXParser();
saxParser.parse(f, XMLHandler);
原則上,SAXParser的設計是:

  1. 先建立並初始化SAXParserFactory物件
  2. 從SAXParserFactory取出Parser
  3. 設定Parser的XML檔案和Handler

上述的程式碼結構,就是先建立出XML的File和Parser Handler,
然後按設計,建立並設定到Parser內,就會開始Parse XML了。

Handler的實做包括:
public void startElement(String uri, String localName,String qName, Attributes attributes)
public void endElement(String uri, String localName, String qName)
public void characters(char[] ch, int start, int length)

SAX Parser會從頭一行一行讀XML,
當讀到StartElement時,就會跳入startElement()的Handler function,
要開始讀內容時,就會跳入characters()的Handler function,
當讀到EndElement時,就會跳入endElement()。

例如:
<Config>
HelloWorld
</Config>
當讀到<Config>時,就會跳入startElement(),
在startElement()內,就會取得Config這個標籤名稱是開頭。

當讀到Hello World時,就會跳入characters(),
在characters()內,就可以取得Hello World。

當讀到</Config>時,就會跳入endElement(),
在endElement()內,就會取得Config這個標籤名稱是結尾。

ConfigManager程式碼結構:
ConfigManager程式碼依循SAX設計,
在Handler內,將Config XML的載入透過startElement()、characters()、endElement()分開。

原則上,每個項目的參數,都會包括:

  • 變數Element:用在startElement()時,標記目前要讀取的變數,在endElement()時,標記變數已讀取完畢
  • 變數本身:用在characters()時,實際讀出並紀錄變數

例如:
MySQL的IP資訊

SQLElement:紀錄是否要讀取SQL資訊
MySQLIP:紀錄MySQL的IP

在startElement()時,當標籤是SQL,就將SQLElement設為true,
在characters()時,檢查到SQLElement == true,就讀取標籤內容,並設定到MySQLIP。

程式碼大致如下:
public void startElement()
{
  if(qName.equals("SQLElement"))
    SQLElement = true;
}
public void characters()
{
  if(SQLElement == true)
    MySQLIP = new String(ch, start, length);
}

public void endElement()
{
  if(qName.equals("SQLElement"))
    SQLElement = false;
}

2014年7月26日

股市自動交易系統(半完成品) - JavaATS程式架構 - Timer Server

這篇開始,會分幾篇來解釋目前JavaATS的程式架構,
讓有興趣修改、增加功能的網友能比較容易看懂程式。

這篇就直接切入最核心的部份,Timer Server和它相對應的Script Task List。

一開始再貼一次JavaATS程式架構圖:
這篇的重點會放在藍色字標注的區塊。

程式流程:
說得再多,比不過一張流程圖清楚,直接看流程圖:


第1張流程圖是JavaATS建構子的執行流程,
過程簡單,就是建立1個Timer定時觸發,觸發呼叫特定Method。

第2張流程圖才是關鍵所在,
當Timer觸發後,會呼叫MyTimerServerEvent這個Method,
接著它會從ScriptTasks這個List中,陸續取出所有Task來檢查和執行。

檢查時,會先判斷是否有IntervalTime(Interval模式),
如果有,就進入Interval模式。
如果沒有,就進入crontab的時間字串模式。

Interval模式:
1. 先取得上次執行的時間
2. 如果沒執行過,直接執行
3. 如果上次執行時間 + 間隔時間 >= 現在時間,表示到時或超時了,直接執行

crontab時間字串模式:
1. 先取得上次執行時間
2. 上次執行時間和現在時間同分鐘,表示執行過了
3. 週末是否設定不執行,現在是否是週末
4. 檢查現在時間是否符合crontab時間字串,符合就執行

crontab時間字串設計:
在crontab時間字串模式的設計,我一開始想了很久,
到底Linux的crontab是怎麼檢查執行的,
後來想到,Linux的crontab如果超過時間了,它是不會執行的,
我因此瞭解到它的時間檢查是反過來的。

它的核心設計是用現在時間來比較crontab時間字串是否符合。
給個簡單的例子:
假設:設定10:03分要執行 (假設時間字串為10:03)

電腦會每分鐘檢查一次現在時間,
10:00分時,時間字串為 10:00,10:00和10:03字串不符,不執行
10:01分時,時間字串為 10:01,10:01和10:03字串不符,不執行
10:02分時,時間字串為 10:02,10:02和10:03字串不符,不執行
10:03分時,時間字串為 10:03,10:03和10:03字串相符,執行

因此,它只需要每次檢查時,將現在時間轉成時間字串,
然後比較現在時間的字串是否符合Task時間的字串,
就能判斷是否執行。

當然,這裡面的字串比對比較複雜,
用傳統的indexOf或strstr或substring,那會比較到發瘋,
因此這裡是用Regular Expression,
它直接可以確定字串格式,並且把格式中所有項目的資訊一次取得,
然後各個項目比較即可。

還是以上面的10:03為例:
現在時間:Regular Expression類似(10):(02)
Task時間:Regular Expression類似(10):(03)

即可直接取得
Now[0] = 10
Now[1] = 02

TaskTime[0] = 10
TaskTime[1] = 03

接著只要Now[0]和TaskTime[0]比較,Now[1]和TaskTime[1]比較,
全部Pass,就是字串符合,這個例子中,Now[1]和TaskTime[1]不一樣,所以不執行。

延伸思考:
如果有在使用Google的Google日曆,注意到Google日曆的時間設定,
你會發現它彈性非常大,它一樣可以設定單次時間行程、週期時間行程,
但神奇的是,它定義好週期時間行程後,
還可以將週期時間行程的某幾個時間行程刪除或變更,
這樣的設計,我其實覺得滿高明的,我還沒有想通它的設計原理。

時間精確度問題:
crontab時間字串的設計有個致命傷,
因為它必須用現在時間來比較Task時間字串
因此它每次的現在時間,都必須有個緩衝空間。

假設crontab時間字串的精準度設定為
意思是,電腦必須每秒取得一次現在時間,
並且要在1秒內完成所有Task的時間字串比對,
只要電腦處理超時1秒鐘,
就會造成這秒的所有Task全部沒有執行。

文字不好表達,來個例子:

假設:
Task 1 10:00:02    定義10點00分02秒執行         執行時間0.2秒
Task 2 10:00:02    定義10點00分02秒執行         執行時間2秒
Task 3 10:00:03    定義10點00分03秒執行

以這樣有3個Task為例,
在10:00:02時,
Task 1會先執行,接著Task 2會執行。

Task 2執行完後,時間應該已經是10:00:04,
Task 3就會永遠略過不執行。

這就是為什麼crontab的時間精確度只能到的原因,
因為大部分Shell程式,很少執行時間會超過1分鐘,
crontab的說明中有稍微提到一點點,
它有提到,crontab的執行時間不能過長,否則就是建議放到背景執行。

回到JavaATS,
目前設計,我並沒有設計multi-threading,
我的假設是,Task的bsh Script執行時間,應該是不會長的太誇張,
正常網路下,一般操作的Delay,應該是不會離譜到超過1分鐘以上。

2014年7月22日

股市自動交易系統(半完成品) - JavaATS設計與使用

這篇開始,會分幾篇將JavaATS進行解說,第一篇先描述設計的使用方式。

JavaATS設計:
JavaATS的核心是一個Schedule Server,可以設定多個(理論上無限多)Task,
每個Task可以各自定時,時間到時會自動被呼叫執行。
Task就是1個1個的BeanShell Script,每次時間到,都會被呼叫執行1次。
上述的JavaATS描述,其執行示意如下圖:
整個JavaATS的設定,包括:
1. JavaATS啟動時是否執行Init Script?
2. 有哪些Task需要執行?這些Task的執行時間?執行的BeanShell檔案是?
3. MySQL Server資訊設定
4. IM的帳號、密碼、傳訊對象設定
5. NDDEAgent資訊設定

這些資訊全部都紀錄在1個XML設定檔中,並在JavaATS啟動時載入。

JavaATS使用:
JavaATS啟動:
java -jar JavaATSServer.jar [config.xml]

執行畫面如下:

程式啟動後,便會載入Config的XML檔案,從XML檔案裡面取得相關設定,
之後便會根據設定的資料開始定期執行.bsh程式。

以上述畫面中,我測試的設定,JavaATS會執行2個Script,
1個是Init.bsh,另1個是DollarCostAveraging.bsh。

Init.bsh會在系統啟動後執行,
DollarCostAveraging.bsh會每分鐘執行。

Config設定檔如果沒有填,預設會讀取目前目錄下的config.xml。

Config檔案:
Config檔案是一個標準的XML檔案,只要符合XML規格,
可以用文字檔編輯,檔案格式必須是UTF-8。

XML格式畢竟不是給人看的,因此,我另外寫了一個專門設定的UI程式,叫JavaATSGUI。

在視窗(Windows/Linux皆可)下執行:
java -jar JavaATSGUI.jar

執行畫面如下:


可以透過Load將某個Config XML載入,修改後按Save儲存。
也可以直接填寫資訊後,按Save儲存成某個Config XML檔案。

以我測試中的config.xml為例,載入後截圖如下:

檔案下載:
https://www.openfoundry.org/of/projects/2518/download

目前版本MSN的相關設定和功能都還在,
在整個整理完畢上傳後,
會開始修改這個部份,將MSN功能移除,加上Pushbullet支援。

2014年7月20日

股市自動交易系統(半完成品) - NDDEAgent

開發背景:
在台灣的程式交易中,DDE可以說是無人不知無人不曉,
這鬼東西在我一開始接觸程式交易時,
對大家講的DDE...TS...資料源,根本一頭霧水,
一查資料,乖乖不得了,這鬼東西的書竟然是1994年,
要特別到圖書館借舊書才找得到,電腦書店根本沒有這東西。

用DDE+linux為關鍵字Google,想當然,什麼鬼都沒有,
有一樣疑問的人當然有,有人有發問,但答案就是......No answer.....
因此最終放棄在Linux上呼叫或連結DDE,改在Windows上開發個Agent來做。

一開始,我期望統一用Java來開發,畢竟同語言開發有一致性,好維護,
我當時比較熟的也只有Java,但不幸的,Java的DDE只有JDDE,而且似乎要收費,
因此轉而用跟Java比較相近的c#和NDDE開發。

最早,DDE Agent的開發是一回事,證券軟體的操作是另一回事,
為了自動操作證券軟體,最早我用AutoIt另外寫了一個Stock Server
AutoIt的Stock Server專門用來操作Windows軟體,
DDE Agent則專門透過DDE取得和廣播DDE資訊,
這樣的設計實在太複雜,2個TCP Server各自運作,卻還互相關聯,
因此我將證券軟體啟動的AutoIt程式加入到DDE Agent,
成為了目前版本的NDDE Agent v1.5Beta。

一些網友會問(包括最開始的我),
DDE除了用Excel之外,怎麼接收?
DDE有辦法轉成其他Protocol嗎?
除了TS外,有沒有什麼程式可以同時設定、接收多個資料源?
NDDE Agent就是答案。

NDDE Agent功能與需求:

  1. 要能夠接收DDE訊息
  2. 要能透過TCP廣播DDE訊息
  3. 要能被控制,需要能下指令給NDDE Agent
  4. 要能將DDE註冊到證券軟體
  5. 要能啟動證券軟體(寶來點金靈)
  6. 能否提供個Web介面供呼叫?


NDDE Agent與Java ATS Server架構:

NDDE Agent基本設計:
為了能達到若干需求,NDDE Agent包括下面3個Server:
NDDE Agent的Server基本設計是Telnet Server。

所謂的常駐型Server,意思是Client端連上後,就會保持連線狀態,
直到下指令斷線離開,或者任一方斷線為止。

所謂的問答式Server,意思是這個Server是和Web Server一樣,
用一問一答方式設計,每次連上後詢問,得到答案後,會自動斷線。

在NDDE Agent中,目前裡面包裹了3個TCP Server,作用如下:
Data Server:
負責廣播所有DDE訊息。
Client連上後,所有DDE訊息都會透過它收到,它沒有指令控制,
Client連上後只能被動的接收訊息,要離開,由Client自行斷線即可。

Admin Server:
負責下指令給NDDE Agent。
Client連上後,會保持登入狀態,直到Client下exit指令離開,
Client可以透過它下DDE註冊指令,
Client也可以透過它下啟動點金靈指令,
Client也可以透過它下開啟元大寶來的B2CAPI指令。

Http Admin Server:
負責下指令、詢問NDDE Agent。
這個Server是應朋友需要加上的,透過它可以用Http URL的方式下指令給NDDE Agent,
因為它模擬Http Server,因此每次詢問或下指令後,都會回應並斷線,
它可以提供DDE訊息,但只能透過詢問方式取得,沒有即時性。

NDDE Agent特色:
1. DDE轉Socket程式
2. 支援多DDE註冊
3. Data Server用non-blocking方式開發,理論上在多Client同時接收時,能盡量降低延遲時間

NDDE Agent各部份設計:


NDDE Agent整個程式只有1個.cs檔案,算是整個Java ATS裡面數一數二醜又難看的程式,
好消息是,程式算單純,而且一段一段,分得還算清楚。

程式碼說明:
Admin Server、Http Admin Server各自是一個獨立的Thread,
Admin Server和Http Admin Server都是以TcpListener實做。

Data Server就是NDDE Agent的主程式。

NDde和EWinner的B2CAPI,它們都是設計成Event Handle的形式,
因此裡面像是objEwinner_OnDataResponse、DDEOnAdvise,
就是它們各自的Event Handler function。

DDE Connect Table和DDE Item Table,為了紀錄所有註冊的DDE連線,
因此設計2個Hash Table,各自儲存所有的DDE Connect和所有的DDE Item,
新增、刪除都會紀錄在這2個Hash Table內,然後才下function去註冊和刪除DDE。

AutoIt程式操作,AutoIt本身大概可以寫上一整篇,
先前為了寫AutoIt版的Stock Server,可以說是遇到很多麻煩,
這裡只是為了啟動點金靈,用的不多,就不細說了,
程式裡面有用到的只有2個片段,用au3為關鍵字查詢,就能看到那段內容。
這2段程式功能大意是:
登入:輸入帳號密碼、按確定、等公告、按確定
登出:關閉點金靈程式、按確定

程式啟動說明:
程式啟動後,畫面如下:

它會顯示NDDEAgent的版本號碼和Admin Server、Http Admin Server、Data Server的Port。

Admin Server指令說明:
確定NDDE Agent啟動後,此時用telnet連Admin Server,如下:

此時輸入help指令,按下Enter,如下:

會看到所有指令的一覽、說明、範例。

Http Admin Server指令說明:
和Admin Server類似,但改為瀏覽器輸入,所有指令的格式都如下:
http://[Server IP]:58892/command?[指令]

例如我這邊的環境:
NDDEAgent的IP是192.168.1.12
我要呼叫help指令,瀏覽器輸入如下:
http://192.168.1.12:58892/command?help

截圖如下:

Data Server說明:
程式啟動後,telnet到58888 Port,畫面如下:

當有DDE訊息進入後,就會直接收到,例如:


DDE語法說明:
在NDDE Agent中,針對DDE註冊,需要下指令,語法如下:
add conn DDEService|DDETopic
add item DDEService|DDETopic!DDEItem
add item DDEService|DDETopic!DDEItem
add item DDEService|DDETopic!DDEItem

以點金靈要註冊「中鋼」(2002)的成交價格、開盤價格、最高價格為例,如下:
add conn EWinner|RQ
add item EWinner|RQ!2002.Price
add item EWinner|RQ!2002.Open
add item EWinner|RQ!2002.High

截圖:


要刪除,直接刪除Connect,我記得程式會自動把item統統刪掉。
remove conn EWinner|RQ

程式需求:
執行時,程式需要下面幾個.dll檔案:

  1. 元大寶來的B2CAPI dll檔
  2. AutoIt dll檔
  3. Ndde dll檔和1個xml檔案
  4. 程式使用前,要確定AutoIt的dll有正確註冊
  5. 目前點金靈自動登入的分公司選擇無效,需手動勾選「記憶帳號」,並成功登入,讓點金靈記住分公司資訊後,才能使用NDDEAgent做自動登入的功能


使用平台是選WinXP,理論上應該適用大部分Windows系統,
選WinXP的原因是,它的使用空間最小、系統資源吃得最少。

為何不用Win2K?Win98?
之前一直是Win2K,但Win2K現在證券軟體支援很差了,只能換到WinXP。
Win98,嗯......VirtualBox的支援都很差了,不用說證券軟體了。

程式下載:
講這麼多,程式在哪?程式碼在哪?
http://www.openfoundry.org/of/projects/1818

股市自動交易系統(半完成品) - 設計發想與架構

隨著台股上9000點,加上最近比較沒這麼忙,
又想起了一直想做的程式交易。

在先前,為了做程式交易,我陸續自行開發了許多程式交易的程式和元件,
但最終因為一個人人力有限無力負擔,加上回測部份一直沒有完成,
操作演算法一直沒有頭緒,因此就讓它自然荒廢了,
我想,網路力量大,把它Open Source出來,也許會有比較多人想一起來寫,
這篇,會先介紹這個未完成系統的架構與設計發想。

程式交易架構:
程式交易系統千千萬萬,但不外乎下面這幾個元件:


設計發想:
在開始設計時,我有幾個需求:

  1. 希望在Linux上進行程式交易
  2. 希望能夠有彈性,方便開發和修改交易演算法
  3. 全自動操作,免人為操作
  4. 最好有類似證券軟體的GUI可以回測


因為上述條件,我開始進行設計。

設計:
即時資料源:
在台灣,台灣的證券公司普遍提供Microsoft DDE做為即時資料源,
我不得不說,DDE這東西已經快變成骨灰了,Microsoft自己都不太維護這東西了,
證券公司是該改改了吧,
人家國外直接有IB提供完整的API,可以抓歷史資料、即時資料、下單,
靠DDE是要打混摸魚到什麼時候?
離題了.......

因為DDE是Microsoft的東西,Linux一定不支援,
加上要做到全自動,自動啟動證券軟體的開啟、登入是必要的,
因此針對Windows的DDE,我做了下面的設計:

這個設計簡單說,就是在Windows上寫個Agent,
Linux端透過Agent取得資料源的資料,
Linux端也透過Agent控制證券軟體的操作。

歷史資料:
歷史資料主要就是Parse證交所網頁的每日資料和歷史資料,
當然也可以從證券軟體中把歷史資料匯出到Excel後取出。

歷史資料的儲存,設計上是儲存到mysql,
但理論上,因為它沒有用特殊語法,因此它應該可以支援各式SQL Server。
設計如下:

下單:
在元大寶來有提供B2CAPI,可以透過寶來點金靈進行下單,
但和取得即時資料有相同的問題,它只支援Windows,不支援Linux,
因此設計上和取得即時資料相同,都要透過Windows的Agent進行操作。
設計如下:

交易演算法:
這裡的交易演算法,是我的稱呼,它其實就是俗稱的「下單機」、「自動交易程式」...等。
設計上就是JavaATS Server(ATS為Automated Trade System的簡稱)。

它的設計發想包含2部份:

  1. 它是Time Trigger的系統
  2. 演算法容易開發、維護


Time Trigger設計:
在設計時,它的定位不是高頻交易系統,也不是當沖系統
它的設計比較趨近於短線操作(精確度:分鐘),或中長線操作(精確度:天以上),
因此它並不是根據成交觸發的Event Trigger設計
它的設計是以Time Trigger的方式,定時觸發執行。

它有2種Time Trigger觸發執行,
一種是以秒為單位的定時觸發,
另一種的執行週期最短執行為每分鐘,最長可以是數天甚至數週。

為了提供彈性的定時執行計畫,我以Linux的crontab設計為發想,設計了下面這樣的語法:
*_*_*#* *:*/1

[年]_[月]_[日]#[週] [時]:[分]

語法和crontab類似,
可定義「某年」、「某月」、「某日」、「某周」、「某時」、「某分」。

和crontab一樣,它可以定義週期執行,例如:
*_*_*#* *:*/1

*/1     表示每分鐘執行

和crontab一樣,它可以定義多個特定時間點,例如:
*_*_*#* *:1,5,10,15,20,25

1,5,10,15,20,25     表示每小時的1分、5分、10分、15分、20分、25分執行

和crontab一樣,它可以用「*」定義是否mask該時間設定,例如:
2014_7_*#* 13:0

2014年7月,每天的13:00執行

這樣的設計理論上可以提供極大的彈性,規劃出任何時間的週期執行。

這個設計的缺陷是,它不支援以秒為單位的短時間觸發,
因此,我另外設計了Interval Timer Trigger,可以設定固定間隔幾秒觸發執行。

演算法設計:
在我一開始找程式交易相關資料時,注意到下面幾個是大部分人的開發系統:

  • Excel
  • HTS

Excel:
Excel因為有大量Cell和方便的圖表產生器,
最重要的是,它有方便的VBA可以開發,
因此是很多人入門的首選。

HTS:
HTS實際上裡面提供了Power Language的程式開發功能,
可以簡單的開發出交易程式,搭配HTS內提供的圖表,可以方便的回測。

再經過一段時間的摸索後,我得出一個重要結論,
演算法不好開發,等於無法使用。

想想看,我希望有個MA(移動平均)資料,卻要寫出2頁程式碼,
這應該沒人受得了,
但偏偏傳統的通用語言C/C++、Java、Python、Perl、PHP...等,
都不是針對自動交易設計,一定是難用又難受,
光想到寫個簡單的邏輯演算法,卻要Compile再Compile,
如果是C/C++,甚至還要處理new、free、delete的問題,嗯.....很痛苦.......

但矛盾的是,大部分的程式資源,又都集中在C/C++、Java...等通用語言上,
像Power Language這類語言,沒有提供的功能,你就是無法使用,
試想看看,一個開放的競技場,不限定使用的武器,
但你用Power Language,表示你只能用長矛、用盾牌、用護甲。
槍呢?對不起,沒有提供
劍呢?對不起,沒有提供

我認為在先天上就輸了,你用它可以贏過沒有裝備的人,
但對於有能力自製武器的人而言,你先天就輸了,因為你缺乏武器........

為此,當時我找了一些Open Source的Script,
加上Java ATS一開始是用Java設計,
因此後來選定了BeanShell做為開發。

BeanShell本質上就是Java,理論上所有Java SDK都可以透過BeanShell呼叫執行,
BeanShell以Script方式執行,可以很方便的在修改後直接執行,
不用經過Compile,Java不用解釋了,它不用free/delete,
這能夠很大程度的降低開發門檻。

剩下的麻煩是呼叫方式,我希望簡單的呼叫個function,
就能夠達成,例如:
BUY(0050, 1);           //買0050,1張

因此,我當時決定寫個API,就叫做StockAPI,
提供些會用到的function,能夠方便的呼叫使用,
裡面實際上就包裹了實際操作的麻煩。

針對上述的2項設計,以及前面的幾項元件,其架構如下:
訊息通知:
訊息通知不外乎就是,
下單後通知自己,已經下單,
成交了通知自己,已經成交,
有危險時通知自己,快點逃命。

訊息通知方式,不外乎有數種IM軟體,包括:

  • MSN
  • Skype
  • GTalk
  • LINE
  • What's App
  • Yahoo Messager


實際上,有提供API的,大概只有

  • MSN
  • GTalk


Line和What's App都沒有免費提供API,Yahoo Messager我沒有使用,
Skype好像有,但之前很少用,現在被Microsoft併購後,SDK是否有提供不清楚。

因此在先前,我先開發了MSN的Client,後來寫了GTalk的Client。

SMS?
SMS要花錢,原則上直接排除。

回測:
很不幸的,回測部份我並沒有找到很好的回測設計方式,
這也是這個系統遲遲無法使用的主要原因之一。

我本來期望的是,能夠類似HTS一樣,下個Draw之類的就能畫出來,
但不幸的,每種資料的資料形式差異太大,
資料的X軸、Y軸標記形式太多,
並沒有一個固定的模式可以動態產生所有想要的圖形,
因此沒有設計出來。

另一方面,回測的作法目前我也沒有概念,
是用類似replay的方式餵資料,或者載入後直接顯示在圖形上,
還沒有想好設計方式,因此回測部份目前沒有任何設計。


2014年2月8日

網樂通開發 第2集 - 網樂通上嵌入式Linux

本篇前言:
這篇會先介紹網樂通上的嵌入式Linux,要玩它、修改它,要先知道它哪些可以改。

本篇開始:
所有嵌入式Linux系統都差不多,大致上包括:

  • BootLoader
  • Linux Kernel
  • rootfs
在網樂通上的嵌入式Linux包括如下:
  • BootLoader:u-boot
  • Linux Kernel:Debian Kernel for 網樂通、ArchLinux Kernel For 網樂通、sh4twbox 0.92 Kernel、網友提供2.6.32.59版Linux Kernel for 網樂通...等
  • rootfs:sh4twbox、Debian、ArchLinux
網樂通嵌入式Linux幾個部份的說明:

BootLoader:
網樂通的BootLoader是使用u-boot,這套BootLoader在嵌入式系統上經常被使用。
網樂通內建的RAM是256MB,但不知道為何,官方的u-boot只開放了128MB,
因此網友修改u-boot程式碼,讓網樂通u-boot能支援256MB。
關於刷u-boot,可以參考:

Linux Kernel:
Linux的驅動程式幾乎都相依在Linux Kernel上,
要讓網樂通支援其他硬體,像是usb webcam、usb wifi...等,
Linux Kernel都必須要自己重新編譯。
另外,針對Debian for 網樂通和ArchLinux for 網樂通,
因為本身有一些Kernel module的套件,所以會需要各自的Kernel,
否則一般而言,在網樂通中,Linux Kernel是可以另外編譯,另外支援。

rootfs:
一般所謂的網樂通刷機,指的都是更換rootfs。
所以rootfs實際上指的就是更換成sh4twbox、Debian、ArchLinux...等不同的Linux系統。

各部份在網樂通的位置:
在網樂通的刷機文件中會提到,網樂通需要至少2個分割區,
第1個分割區必須是FAT32,第2個分割區必須是ext2/ext3/ext4,分割區類似如下:








第1個分割區就是存放Linux Kernel的,內容如下:





第2個分割區就是rootfs,內容如下:

















從這裡可以注意到,除了BootLoader外,
Linux Kernel和rootfs都直接按不同分割區放置,很容易可以區分。

更換各部份:
更換Linux Kernel:
如果我們重新編譯Linux Kernel,要更換新的Linux Kernel,
只要將編譯出來的vmlinux.ub直接覆蓋sda1的vmlinux.ub,
重新開機後就會是載入我們新編譯出來的Linux Kernel。
類似如下:









更換rootfs:
要更換rootfs,最簡單的方式就是參考sh4twbox的教學
先將產生的rootfs壓縮打包好,接著按照正常刷機的步驟,
sh4twbox的教學的1.4第2步指定我們自己的rootfs壓縮檔,
它就會幫我們把rootfs解壓縮建立好。


網樂通開發 第1集 - 刷機版本的選擇

這篇開始,我會以網樂通和STLinux為基礎,寫一些自己開發的心得文章,
這篇是第1篇,主軸放在目前網樂通刷機版本的介紹,
因為這系列文章是以開發為主,不會描述刷機的過程,
文章會描述的是如何用網樂通和STLinux進行Cross-Compile,
目標是透過這系列文章,可以將網樂通開發成自己想要的功能主機。

本篇前言:
目前網樂通在網路上文章很多,但有點雜,
我過年前開始玩時,發現有好幾個不同版本的網樂通系統可以刷,
但並沒有太多文章描述這幾個版本有何不同,系統差異在哪。
因此,第1篇目標放在對幾個版本的描述,
在開發時,可以根據目標選擇合適的系統來刷。
這裡要先說的是,ArchLinux我不熟,所以針對ArchLinux的描述並不確實。

網樂通版本:
目前網樂通刷機的版本大致可以分為4種:

  • sh4twbox 0.62版
  • sh4twbox 0.92版
  • Debian wheezy版
  • ArchLinux版

sh4twbox 0.62版:
大本營:https://code.google.com/p/sh4twbox/

sh4twbox系列通常是網樂通第1次刷機的選擇,
事實上,0.92版刷機時用的USB隨身碟本身就是sh4twbox版本。

sh4twbox是以STLinux為基礎的Linux系統,
STLinux則是網樂通使用的SuperH系列處理器廠商維護的嵌入式Linux版本,
sh4twbox是以STLinux 2.3版為基礎修改而成,
目前STLinux2.3已經停止開發,因此sh4twbox也建議不要再使用sh4twbox 0.62版。

sh4twbox 0.92版:
大本營:https://code.google.com/p/sh4twbox/

sh4twbox 0.92版是以STLinux 2.4版為基礎的Linux系統,
是目前原廠正在維護的嵌入式Linux版本。

STLinux設計上就是嵌入式Linux,
相對於ArchLinux和Debian來說,它有幾個優點:

  1. 系統小使用資源少:最直接的就是開機時間比較短,系統運作比較順,反應比較快
  2. Cross Compiler環境:STLinux原廠提供了完整的Cross Compile環境供開發
但相對的它有幾個缺點:

  1. 現成的應用程式少
  2. 嵌入式系統和桌上型Linux環境差異較大

Debian wheezy版:

我個人熟悉的Linux其實是Debian/Ubuntu,但對於Debian在sh4處理器上的支援性,
我真的是覺得爛到爆了。

目前網樂通上,因為有Debian for 網樂通的善心人士協助,
網樂通上的Debian能跟上目前Debian的Stable版本Wheezy版,
從網站上可注意到,
他們現在正努力的讓Debian的下一個版本(目前是測試版)能支援網樂通。

相對於STLinux,Debian wheezy版有幾個優點:
  1. 現成的系統整合較好:像X-Window、幾套X-Window管理器都能順利運作
  2. 和PC版Debian開發環境相同:開發環境相同,開發上比較沒障礙
但它有幾個致命缺點:
  1. 系統大,使用資源多:最直接感受到的就是開機時間長,操作時反應慢
  2. 套件數量少:Debian for sh4的支援性差直接體現在套件數量上,它的套件數量相對於ARM版本就少很多,跟PC版Debian根本沒得比
ArchLinux版:

sh4twbox的作者覺得ArchLinux是網樂通比較好的選擇,因為ArchLinux套件數量多,
又是用PKGBUILD方式針對不同平台build,因此理論上要安裝套件,
只要透過ArchLinux的PKGBUILD就能建立出網樂通版的套件,
並安裝在網樂通上。

但可惜的是,ArchLinux我不會用,
對於PKGBUILD的使用方式以及套件的建立環境不會架設,
於是就.......

因為不懂ArchLinux就不多做評論了,這裡僅列出我刷機後使用時的感覺:
  • 開機速度比STLinux慢,但比Debian快
  • 系統的反應比Debian快

buildroot網樂通系統:
我自己在過年期間,有用buildroot建立過網樂通系統,並成功刷機執行。

buildroot可以簡單的建立出整個嵌入式系統,
DD-WRT、OpenWRT都是以buildroot為基礎修改的,
buildroot系統的優點是:
  • 系統小
  • 速度快
缺點是:
  • 幾乎沒有提供開發環境,只有執行環境
我自己使用的感覺是,buildroot系統比STLinux快,環境更小,
如果是buildroot有提供的功能,像是QT的Transmission。
直接使用buildroot說不定更好,系統資源更省。

我會在Cross Compile環境介紹後,介紹buildroot建立網樂通系統方式。

2014年2月5日

網樂通硬改,更換大容量或高速USB DOM(免焊接)

網樂通內的儲存空間主要是靠USB DOM,
要加大空間或者更換USB DOM網路上都能搜尋到文章,
文章原則上有3類:
  1. 直接用USB隨身碟插在屁屁
  2. 拆機後,把USB DOM的接腳另外焊上USB隨身碟
  3. 拆機後,原來的USB DOM焊接個USB接頭當隨身碟
我的問題:
內建的USB DOM真的有夠爛,
速度慢也就算了,刷一刷竟然被我刷掛了。

我的那個USB DOM死法真的是沒救,
它應該是USB DOM最前面儲存Partition的block壞軌了,
每次重新建立Partition,重開機Partition就消失了,
因此,它無法正常的刷Linux,
所以,我需要更換USB DOM。

因為這個原因,第3種教學文章直接沒用;

第1種作法不錯,但我的目標是Printer Server,
後面的USB需要接印表機,沒辦法用;

第2種作法不錯,但我技術差不想動電烙鐵,
怕下手後沒處理好,反而把元件燒了。

最終我找到了折衷的辦法,也就是我要發的這篇文章的作法。

我的作法:
網樂通上面的USB DOM,
接在板子上的4個pin腳其實就是杜邦端子的公頭,
網路上的教學是,
直接在端子和板子的焊接點上,焊接一個USB隨身碟,
但其實不用,只要自己剪條USB線,
在USB線做出4個杜邦端子的母頭,
就可以直接插入,完全不用電烙鐵焊接。

所需工具和零件:
  1. USB線一條(要有USB母座)(越短越好)
  2. 剝線鉗一把
  3. 杜邦端子接頭數個(至少5個以上,以防失敗)
  4. 4P杜邦端子座1個
  5. 豆子隨身碟1個(可選購4G、8G、16G、32G)
過程:

1. 首先準備一條有母頭的USB線,留下一小段,剪斷它並去皮,如下圖:


 2. 用剝線鉗接USB的4條電線都做好杜邦端子,這部份是最麻煩的,完成品如下圖:

3. 將網樂通上的USB DOM拆下後,最重要的,把它原本的杜邦端子座移除,如下圖:

 4. 將USB線上面的杜邦端子套上杜邦端子座,插上網樂通的端子頭,如下圖:
這裡注意到,一定會有疑問是,線怎麼排列,5V方向在哪?
USB線的順序是(由左而右):
黑 綠  

如下圖所示,
左邊是網樂通後面,右邊是網樂通前面,
電源接頭在左下角,網路接頭在左上角,
此時,USB線的紅色靠下。

5. 完成後,按網路教學用背後的USB隨身碟開機,刷Linux,應該就可以看到新的USB DOM。

網樂通開發文章計畫開始

利用過年期間,把網樂通的開發玩了玩,雖然還沒玩完,
但對於網樂通的STLinux開發有了一些心得,
我想後續應該可以針對網樂通sh4 STLinux的開發寫出大概4~5篇文章。

文章大概會從比較基本的網樂通目前網路上有的Linux Distribution介紹,
大概描述STLinux、ArchLinux、Debian在網樂通上我認為的區別。

接著會把主軸放在網樂通的STLinux如何開發。

如果我的Printer Server順利的話,
最後應該可以以Printer Server為例描述過程。