前言:
2014年時,曾以Java為基礎開發了股市自動交易系統 - JavaATS,後來不了了之。
最近以先前的架構為基礎重新開發,系統改以Python語言為基礎,以PostgreSQL和MQTT通訊協定為核心,重新設計成開發式架構。
因為系統無法達成自動交易的目標,因此命名為金融自動排程系統。
這篇會描述系統架構。
系統架構:
系統延續JavaATS的排程器核心,以Python重新實做。
因為科技的進步,原先Configure Manager使用的XML現在直接改用ini + PostgreSQL,原本定義在XML內的Task,都改定義到SQL中。
原先各元件之間,透過一個Socket Server交換資訊,同樣因為科技的進步,現在直接透過MQTT就能達成,Socket Server交換資訊時的資料格式問題,現在透過json能夠方便的進行資料交換。
TimerServer:
這是整個系統的核心,它以Crontab語法為基礎,在SQL中定義多個Task,TimerServer會以while loop方式每15秒撈取一次SQL內的Task List,並比對當下時間和Task Crontab時間,符合就執行。
執行時,透過Python的os.system(),以及定義在SQL內的Task欄位,能夠指定直譯器以及程式參數,例如:
python3 Downloader.py
ts-node-script stock_invest_downloader.ts
python3 dir_scanner.py /tmp/data/
延續JavaATS的TimerServer,Crontab的語法基本上能做到特定日期時間執行、週期執行、每星期特定天執行。
多機跨網路系統:
TimerServer啟動時包括一個config.ini檔案,裡面定義了SQL的帳號、密碼、DB,一個稱為MY_RUNNER_NAME的名稱定義。
而在資料庫的Task List中,每個Task都包含一個runner的欄位,同樣的,TimerServer在檢查Task List時,會比對Task的runner和自己的MY_RUNNER_NAME是否一致,或者runner是否為空,如果為空或者一致,則進一步比對時間是否符合,符合則執行。
上述的runner設計,讓TimerServer變成了多機跨網路的系統,可在多台PC甚至樹莓派上執行,每台電腦都透過SQL撈取Task List,比對後判斷是否是相對應的機器和相對應的時間,符合就會執行,達到多機器跨網路運作。
圖形化管理元件:
Python支援Qt,在Blog以前的文章中寫過多次Qt文章,這裡緬懷良葛格,以前開發Qt程式時,良葛格是少數中文的Qt教學,而且不同於書籍和官方教材,他的文章內容精準,看得出是學過寫過得人,才寫得出的教學文章,可惜他竟然走了。
透過PySide2,能夠方便的新增、修改、刪除Task List的Task。
模組化元件:
只有TimerServer定時執行顯然不夠,要能建構出金融自動系統,至少還需要歷史資料、證券公司API行情程式、證券公司API下單程式。
以歷史資料而言,現在能夠過Yahoo Finance API的Python Package,直接撈取歷史資料,後續透過Python PostreSQL Package就能將資料寫入SQL中。
加密貨幣?
加密貨幣交易所也是有提供API的,NodeJS?
前面提到,TimerServer可透過指定直譯器執行,不一定是Python,當然也可以是NodeJS,如前面範例提到的,ts-node-script就蠻方便的。
證券API串接:
我使用的證券提供c#的API,原則上是PC的下單應用程式將Component拆出來,透過c#呼叫的,因此,Windows是必要的。
目前我開了一個Windows VM,用Visual Studio 2015的c#開發2隻程式,一隻為即時價格註冊和擷取程式,一隻為下單程式,證券公司的API中,即時價格擷取是一個API,下單是一個API。
因為以前的經驗,為了縮短開發時間,方便未來證券公司API程式改版。
我是以證券公司提供的範例程式直接修改,將視窗Dialog隱藏,增加右下角System Notify,然後加上config.ini、MQTT的相關程式碼。
作用,
即時價格擷取:
能透過config.ini、SQL撈取要註冊取得即時價格的Symbol,當取得即時價格後,透過MQTT發送。
即時下單程式:
透過MQTT取得下單指令,進行下單,並透過MQTT、LineBot回報委託情況。
上述2隻程式開發後,連同API一起放在一個Windows VM,並排程開機、關機。
資料分析與技術分析:
嗯~這是個大哉問,如果有答案就不會寫這篇了~啊~不是。
這個以TimerServer為基礎的系統,能夠方便的加上各種分析模塊,我們以典型的技術分析當作例子:
寫一隻Python程式,內容是
每日從SQL中撈取歷史資料,透過Python的TALib計算均線(Simple MA),然後根據是否Cross,從MQTT或SQL上發出或寫入觸發信號。
當然,也可以是透過觸發信號直接透過MQTT發出下單指令。
來點更複雜的吧。
OK......
結論:
透過新版的金融自動(排程)系統,能夠透過開發各個模塊疊加,形成一個多功能跨網路的金融系統,因為以模塊化設計,各種功能都能實做,小到下載歷史資料,大到結合AI測試都能開展,而且透過SQL和MQTT,能夠讓各模塊交互作用。
TimerServer排程器是系統核心中的核心,所有的元件執行都透過TimerServer,透過runner欄位,能讓TimerServer做到多主機跨網路的能力。