策略程序的通常架構、一個策略框架html
在發明者量化教程 2.6 期貨 章節 咱們已經初步使用了CTP商品期貨經常使用的程序架構(輪詢式)算法
function MainLoop(){ // 處理具體工做的函數 // deal Main task } function main() { var status = null; while(true){ status = exchange.IO("status"); // 調用API 肯定鏈接狀態 if(status === true){ // 判斷狀態 LogStatus("已鏈接!"); MainLoop(); // 鏈接上 交易所服務器後,執行主要工做函數。 }else{ // 若是沒有鏈接上 即 exchange.IO("status") 函數返回 false LogStatus("未鏈接狀態!"); // 在狀態欄顯示 未鏈接狀態。 } Sleep(1000); // 須要有輪詢間隔, 以避免訪問過於頻繁。 } } 複製代碼
那麼數字貨幣策略的通常架構是什麼樣的呢? 一樣是輪詢方式的,其實比商品期貨的更加簡單:數組
//other functions function f1(){ //... } //... function loop(){ // do somethings f1(); //... //API... } function main(){ //初始化 //... while(true){ loop(); Sleep(1000); } } 複製代碼
那有同窗問: 架構是輪詢的,有沒有併發執行機制呢?bash
發明者量化平臺已經封裝了部分 API 用以支持 併發機制,詳見發明者量化 - API文檔服務器
代碼架構: (我自己也是菜鳥,架構是學習Z大的,若有錯誤 歡迎指出)markdown
// 其它函數 function buy(){ Log("buy"); } //任務生成器構造函數 function MakeTasksController(){ var TasksController = {}; TasksController.tasks = []; // 任務數組 TasksController.initTask = function(cmd){ // 初始化要執行的任務參數、設置 var task = { //各類任務 數據 cmd : 0, // 命令: 0:waiting , 1: buy state: 0, // 狀態: 0:uncomplete 1: complete //... }; task.cmd = cmd; //task.XX 初始化 TasksController.tasks.push(task); // 存入 任務數組 }; TasksController.DealWithTasks = function(){ // 處理 tasks 數組內 儲存的task _.each(TasksController.tasks, function(task){ // 迭代 執行所有任務 // 處理任務task ,保存每一個任務的狀態數據,直到任務完成。在處理任務的具體代碼中 不作死循環處理。 // 即每一個任務不獨佔時間。下次輪詢 讀取task 數據繼續任務。從而實現模擬多任務模式。 // ... if(task.cmd === 1){ buy(); task.state = 1; // 任務執行完成就調用 賦值語句 給task.state 標記賦值 } }); }; TasksController.CheckTask = function(){ var process = 0; _.each(TasksController.tasks, function(task){ if(task.state === 1){ // 任務已經完成,彈出完成的任務。 Log("task.cmd:", task.cmd, "已完成!"); }else{ process++; } }); if(process === 0){ TasksController.tasks = []; // 清空 任務數組 } }; return TasksController; } function main(){ var tasksController = MakeTasksController(); var count = 0; while(true){ //觸發新建任務,例子。 if(count === 100){ tasksController.initTask(1); // 初始化任務, buy 任務 即 1 //... 初始其它任務。 } //... tasksController.DealWithTasks(); // 處理任務 tasksController.CheckTask(); // 檢查任務處理 count++; Sleep(200); // 任務不少的時候 能夠適當減少 Sleep 的參數值 } } 複製代碼
一個完整的交易系統都要包含哪些模塊呢? 一、 收益統計模塊。 二、 UI界面、數據反饋、狀態顯示。 三、 交互模塊。 四、 圖表模塊。 五、 策略邏輯(具體交易算法) 六、 交易模塊。 七、 數據處理模塊。架構
一個簡單的策略框架:簡單的策略框架(能夠自行修改擴展)併發
這個策略框架基本上就是 以前的學習內容。各個方面代碼組合起來的,仔細閱讀代碼,你會發現很熟悉。直接能夠運行,不過沒有寫任何 觸發*做的代碼,能夠自行擴展。下一章,咱們會動手擴展這個策略框架,讓策略真正的跑起來。框架
閱讀原文ide