策略程序的通常架构、一个策略框架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