1. 程式人生 > >[一個簡單的程式交易框架] 1 基本構思(待完善)

[一個簡單的程式交易框架] 1 基本構思(待完善)

One Trader

一個簡單的策略交易框架

1. 架構

1.1. 層次劃分:

graph BT subgraph 交易策略層 海龜策略/馬丁策略 end 交易介面/資料介面 -.-> 海龜策略/馬丁策略 subgraph 統一介面層 交易介面/資料介面 end subgraph 介面實現層 CTP/Esunny等介面 -.-> 交易介面/資料介面 end

1.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. 介面設計概述

市場資料模組主要提供以下只大功能:

功能 說明
登入登出 遠端市場資料伺服器的登入與登出操作
引數設定 設定模組所需要的引數,如伺服器地址
資料訂閱 根據品種訂閱市場資料伺服器的資料
資料鉤子 對於伺服器推送的實時資料採用資料鉤子的方式處理
資料獲取 提供靈活的資料獲取方式,如通過倒序索引,時間等
資料整合 對於資料來源(如歷史如數等)進行整合,可通過當前統一介面獲取
模組狀態 提供當前模組的工作狀態資訊
sequenceDiagram participant 其它模組 participant 市場資料模組 participant 服務端 市場資料模組->>服務端:登入 服務端->>市場資料模組:登入成功 opt 訂閱資料 市場資料模組->>服務端:訂閱請求 服務端->>市場資料模組:訂閱成功 服務端->>市場資料模組:市場資料 end opt 取消訂閱 市場資料模組->>服務端:取消訂閱 服務端->>市場資料模組:取消成功 服務端-x市場資料模組:市場資料 end 其它模組->>市場資料模組:新增資料鉤子 其它模組->>市場資料模組:新增查詢介面 其它模組->>市場資料模組:查詢 graph TB 服務端-->資料接收器 subgraph 市場資料模組 資料接收器--推送-->資料佇列((資料佇列)) 資料接收器-.通知.->資料分發器 資料分發器--獲取-->資料佇列 資料分發器--推送-->資料鉤子A 資料分發器--推送-->資料鉤子B 資料分發器--推送-->... 資料分發器--推送-->資料鉤子N subgraph 資料處理器 資料鉤子A 資料鉤子B ... 資料鉤子N end end

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

  1. 為什麼不把資金資訊,倉位資訊,訂單資訊以模組方式單獨出來,而是要放在交易介面中?

    因為設計是要支援多個交易介面多策略同時工作的,一個賬戶對應一個交易介面,
    同時可以存在多個交易模組,每個交易介面都有單獨的資金資訊,倉位資訊以及訂單資訊
    單獨出來的話還要區分不同的賬戶

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

  • 完善此文