策略程序的一般架构、一个策略框架
策略的一般架构
在发明者量化教程 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);
- }
- }
那有同学问: 架构是轮询的,有没有并发执行机制呢?
发明者量化平台已经封装了部分 API 用以支持 并发机制: 发明者量化 - API文档
代码架构: (我本身也是菜鸟,架构是学习Z大的,如有错误 欢迎指出)
- // 其它函数
- 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 的参数值
- }
- }
1、 收益统计模块。
2、 UI界面、数据反馈、状态显示。
3、 交互模块。
4、 图表模块。
5、 策略逻辑(具体交易算法)
6、 交易模块。
7、 数据处理模块。
一个简单的策略框架:简单的策略框架(可以自行修改扩展)
这个策略框架基本上就是 之前的学习内容。各个方面代码组合起来的,仔细阅读代码,你会发现很熟悉。直接可以运行,不过没有写任何 触发*作的代码,可以自行扩展。下一章,我们会动手扩展这个策略框架,让策略真正的跑起来。