[一個簡單的程式交易框架] 1 基本構思(待完善)
阿新 • • 發佈:2019-01-09
One Trader
一個簡單的策略交易框架
1. 架構
1.1. 層次劃分:
graph BT subgraph 交易策略層 海龜策略/馬丁策略 end 交易介面/資料介面 -.-> 海龜策略/馬丁策略 subgraph 統一介面層 交易介面/資料介面 end subgraph 介面實現層 CTP/Esunny等介面 -.-> 交易介面/資料介面 end1.2. 模組劃分:
graph LR 市場資訊((市場資訊)) 策略模組 --> 市場資料 策略模組 --> 市場資訊 策略模組 --> 分析模組 策略模組 --> 交易介面 市場資料 --> 市場資訊 交易介面 --> 市場資訊 分析模組 --> 市場資料 subgraph 平臺實現介面,如CTP, Esunny等 市場資訊 --> 市場資料 市場資訊 --> 交易介面 end模組 | 說明 |
---|---|
市場資料 | 管理並獲取序列化的實時和歷史行情並更新市場資訊 |
市場資訊 | 儲存市場交易品種的基本屬性及最新詢價(Tick)等 |
交易介面 | 執行交易,獲取資金資訊,倉位資訊,訂單資訊 |
分析模組 | 方便對資料進行分析,如指標分析等,用於指導交易 |
策略模組 | 綜合決策模組,呼叫其它模組完成自動化交易 |
1.2.1. 市場資料
介面檔案: MarketData.h
1.2.1.1. Tick與K線資料定義:
/** @brief Tick結構定義 */
struct Tick
{
uint64_t time; /*< 最近更新時間 */
uint32_t time_ms; /*< 以毫秒為單位的最近更新時間 */
double bid; /*< 當前買入價 */
double ask; /*< 當前賣出價 */
double last; /*< 最近交易價格 */
uint32_t bid_volume; /*< 當前買價量 */
uint32_t ask_volume; /*< 當前賣價量 */
uint64_t volume; /*< 最近交易量 */
double openinterest; /*< 持倉量 */
};
/** @brief 行情Bar定義 */
struct Bar
{
uint64_t time; /*< 時間截 */
double open; /*< 開盤價 */
double close; /*< 收盤價 */
double high; /*< 最高價 */
double low; /*< 最低價 */
uint64_t volume; /*< 成交量 */
double openinterest; /*< 持倉量 */
};
Tick:
時間戳 | 毫秒 | 買價 | 賣價 | 最近成交價 | bid量 | ask量 | 成交量 | 持倉量 |
---|---|---|---|---|---|---|---|---|
time | time_ms | bid | ask | last | bid_volume | ask_volume | volume | openinterest |
Bar:
時間戳 | 開盤價 | 收盤價 | 最高價 | 最低價 | 成交量 | 持倉量 |
---|---|---|---|---|---|---|
time | open | close | high | low | volume | interest |
Tick中需要ask與bid主要是考慮到回測需要(撮合成交一般取bid, ask, last的中間價格),目前只定義了一檔價格。
1.2.1.2. 介面設計概述
市場資料模組主要提供以下只大功能:
功能 | 說明 |
---|---|
登入登出 | 遠端市場資料伺服器的登入與登出操作 |
引數設定 | 設定模組所需要的引數,如伺服器地址 |
資料訂閱 | 根據品種訂閱市場資料伺服器的資料 |
資料鉤子 | 對於伺服器推送的實時資料採用資料鉤子的方式處理 |
資料獲取 | 提供靈活的資料獲取方式,如通過倒序索引,時間等 |
資料整合 | 對於資料來源(如歷史如數等)進行整合,可通過當前統一介面獲取 |
模組狀態 | 提供當前模組的工作狀態資訊 |
1.2.2. 市場資訊
- TODO
1.2.3. 交易介面
- TODO
1.2.4. 分析模組
1.2.4.1. 分析模組概述
- 指標分析(主要對價格等交易資料進行統計分析,如使用常規指標ATR,RSI等)
- 資料分析(各種能指導交易的資料分析,如基本面資料,基差,等等)
1.2.4.2. 分析模組介面
- TODO
1.2.5. 策略模組
策略模組啟動流程:
graph LR 接入依賴的模組 --> 策略初始化 策略初始化 --> 策略執行 策略執行 --> 策略反初始化 策略反初始化 --> 策略退出1.2.6. FAQ
- 為什麼不把資金資訊,倉位資訊,訂單資訊以模組方式單獨出來,而是要放在交易介面中? 因為設計是要支援多個交易介面多策略同時工作的,一個賬戶對應一個交易介面,
同時可以存在多個交易模組,每個交易介面都有單獨的資金資訊,倉位資訊以及訂單資訊
單獨出來的話還要區分不同的賬戶
2. 框架開發
2.1. 程式碼風格
- 類, 類公有成員,全域性變數,函式 使用匈牙利命名法
- 類私有與保護成員使用m_開頭 並使用小寫加下劃線模式
- 函式區域性變數使用小寫加下劃線方式
- 註釋風格使用javadoc風格
2.2. 介面原則
避免因為增加介面而造成版本不相容
- 介面的實現不使用變數,只使用函式
- 屬性使用GetPropertyString, GetPropertyInteger, GetPropertyDouble的方式進行擴充套件
2.3. 平臺接入
3. 策略開發
- TODO
4. 配置
- 配置檔案格式為json, 使用json schema 校驗 簡單示例:
{
"Modules": [
{
"name": "itap",
"enable": true,
"path": "itap.dll"
}
],
"Framework": {
"name":"OneTrader",
"marketdata": {
"name":"itap_marketdata",
"module":"itap",
"login":false,
"params":{
"server":"61.163.243.173",
"port": 8383,
"user": "no",
"passwd": "onetrader"
}
},
"marketinfo": {
"name": "itap_marketinfo",
"module": "itap"
},
"trader": {
"name": "itap",
"module": "itap",
"auth": true,
"login": true,
"params": {
"server":"61.163.243.173",
"port": 8383,
}
}
},
"OneTrader":{
"loglevel": 0
}
}
5. TODO
- 完善此文