资源加载中... loading...

3.5 策略框架模板

Author: 发明者量化-小小梦, Created: 2017-01-19 16:04:24, Updated: 2017-10-11 10:27:27

3.5 策略框架模板


使用策略框架模板只用很少的代码就可以构建简单的趋势型策略,如果有一定编程基础,也可写出对冲类型的策略。

img

  • 使用步骤:

    • 1、如上图在策略广场找到 该模板,复制到自己账号的控制中心。

    • 2、写策略时引用上 “策略框架模板” 如下图:

      img

  • 贴出测试“策略框架模板”的策略代码(已经在策略编写页面的模板栏勾选“策略框架模板”):

    var TASK_IDLE = 0;          // 空闲状态命令
    var TASK_OPEN_LONG = 1;     // 建多仓命令
    var TASK_OPEN_SHORT = 2;    // 建空仓命令
    var TASK_ADD = 3;           // 加仓命令
    var TASK_ST = 4;            // 止损命令
    var TASK_COVER = 5;         // 平仓命令
    function onTick1() {        // 趋势系统1: 均线  具体买卖逻辑实现
        // MA 
        var records = _C(exchanges[0].GetRecords);
        if(records.length < 11){
            return $.TaskCmd(TASK_IDLE);
        }
        var ema_fast = TA.MA(records, 7);
        var ema_slow = TA.MA(records, 10);
        var data = "fast[-2]:" + ema_fast[ema_fast.length - 2] + " slow[-2]" + ema_slow[ema_slow.length - 2] + " fast[-1]:" + ema_fast[ema_fast.length - 1] + " slow[-1]:" + ema_slow[ema_slow.length - 1];
        $.AddData(0, "MA", data);
        if (ema_fast[ema_fast.length - 1] < ema_slow[ema_slow.length - 1] && ema_fast[ema_fast.length - 2] > ema_slow[ema_slow.length - 2]) {
            return $.TaskCmd(TASK_COVER);
        }else if(ema_fast[ema_fast.length - 1] > ema_slow[ema_slow.length - 1] && ema_fast[ema_fast.length - 2] < ema_slow[ema_slow.length - 2]){
            return $.TaskCmd(TASK_OPEN_LONG, 0.5);
        }
        return $.TaskCmd(TASK_IDLE);
    }
    function onTick2() {        // 趋势系统2:MACD  具体买卖逻辑实现
        // MACD
        var records = _C(exchanges[1].GetRecords);
        if(records.length < 15){
            return $.TaskCmd(TASK_IDLE);
        }
        var macd = TA.MACD(records);
        var dif = macd[0];
        var dea = macd[1]; 
        var data = "dif[-2]:" + dif[dif.length - 2] + " dea[-2]" + dea[dea.length - 2] + " dif[-1]:" + dif[dif.length - 1] + " dea[-1]:" + dea[dea.length - 1];
        $.AddData(1, "MACD", data);
        if (dif[dif.length - 1] > dea[dea.length - 1] && dif[dif.length - 2] < dea[dea.length - 2]) {
            return $.TaskCmd(TASK_COVER);
        }else if(dif[dif.length - 1] < dea[dea.length - 1] && dif[dif.length - 2] > dea[dea.length - 2]){
            return $.TaskCmd(TASK_OPEN_LONG, 0.8);
        }
        return $.TaskCmd(TASK_IDLE);
    }
    function main() {
        $.Relation_Exchange_onTick(exchanges[0], onTick1);    // 把 添加的第一个交易所  关联  趋势系统1 即 均线MA 
        $.Relation_Exchange_onTick(exchanges[1], onTick2);    // 把 添加的第二个交易所  关联  趋势系统2 即 MACD
        $.Trend();  // 不用传参数。                             // 启动模板
    }
    
  • 导出函数介绍:

    • 命令:
    TASK_IDLE = 0;          // 空闲状态命令
    TASK_OPEN_LONG = 1;     // 建多仓命令
    TASK_OPEN_SHORT = 2;    // 建空仓命令
    TASK_ADD = 3;           // 加仓命令
    TASK_ST = 4;            // 止损命令
    TASK_COVER = 5;         // 平仓命令
    

    在策略里面这些状态是必须定义的,否则模板无法识别。

    • 1、 $.Relation_Exchange_onTick(p1, p2); 参数 p1 : 交易所对象, 比如 exchanges[0] 即 机器人配置页面 添加的第一个交易所对象。 参数 p2 : 自定义的交易逻辑函数如 例子中的 onTick1 函数,传入函数名就可以。

    • 2、 $.TaskCmd(p1, p2); 参数 p1 : 发送给模板执行的命令,如: TASK_OPEN_LONG // 建多仓命令 参数 p2 : 发送 TASK_IDLE 、TASK_COVER 命令时 可以不传参数。其他命令需要跟随一个数量参数即 p2 ,表示要操作的数量。 调用需要 return $.TaskCmd(p1, p2); 在onTick 函数中返回。

    • 3、 $.Trend(); 无参数

    • 4、 $.AddData(p1, p2, p3); // 向状态栏 表格末尾添加 内容。 参数 p1 : 要添加的表格的索引, 0 为第一个, 1 为第二个(前提是用$.Relation_Exchange_onTick已经关联了第二个交易所) 参数 p2 : 添加内容的属性名, 本例中 添加 指标的数据显示在状态栏表格。(MA 和 MACD)

      参数 p3 : 字符串,把想显示的数据 转换为字符串传入p3 这个参数位置。

  • 看下例子中的交易逻辑 函数 onTick1 的代码分析:

    function onTick1() {        // 趋势系统1: 均线  具体买卖逻辑实现
        // MA 
        var records = _C(exchanges[0].GetRecords); // 用跟 onTick1 函数 绑定的交易所 exchanges[0] 对象 获取该交易所的K线数据。
        if(records.length < 11){                   // 判断K线数据是否足够长度
            return $.TaskCmd(TASK_IDLE);           // K线数据长度不足时,发送等待命令。程序则不执行下面的代码。
        }
        var ema_fast = TA.MA(records, 7);          // 根据长度足够的K线数据计算 周期为7 的均线数据 即: 快线
        var ema_slow = TA.MA(records, 10);         // 计算 慢线
        var data = "fast[-2]:" + ema_fast[ema_fast.length - 2] + " slow[-2]" + ema_slow[ema_slow.length - 2] + " fast[-1]:" + ema_fast[ema_fast.length - 1] + " slow[-1]:" + ema_slow[ema_slow.length - 1];
        // 处理数据 组合为 字符串 data
        $.AddData(0, "MA", data);                  // 向状态栏表格 添加数据显示
        if (ema_fast[ema_fast.length - 1] < ema_slow[ema_slow.length - 1] && ema_fast[ema_fast.length - 2] > ema_slow[ema_slow.length - 2]) {               // 平仓触发判断
            return $.TaskCmd(TASK_COVER);          // 发送平仓命令
        }else if(ema_fast[ema_fast.length - 1] > ema_slow[ema_slow.length - 1] && ema_fast[ema_fast.length - 2] < ema_slow[ema_slow.length - 2]){           // 开仓触发判断
            return $.TaskCmd(TASK_OPEN_LONG, 0.5); // 发送开多仓命令
        }
        return $.TaskCmd(TASK_IDLE);               // 没有任何 触发,发送等待命令。
    }
    
  • 运行显示:

    img

    img

  • 策略框架模板的交互功能

    因为模板没有添加交互控件的功能,所以交互控件只能添加在引用 “策略框架模板” 的策略上,添加也比较简单。 步骤: 1、在策略交互添加一个 字符串类型的控件 ,控件 名称就写 JS_code 如图: img

    2、然后点击 绿色的加号, 点击保存。会显示如图: img

    3、在策略运行的时候 所有的命令都有显示 可以直接复制 ,向策略发出命令。 img

    4、命令格式是 CMD(index, CMD_STR, amount) 第一个参数: index 是指 操作哪一个 交易所, index 的位置写 0 ,即代表 操作 第一个交易所,以此类推。 第二个参数: 在表格头部显示的命令。 第三个参数: 要操作的数量。

    举例子: img

    其它命令 使用方法相同。

交易逻辑是随便写的,请勿实盘!。 如果BUG 建议 欢迎拍砖!^^


More

律吕调阳 每次在我疑惑的时候,总能在梦总的文中找到方向,谢谢

发明者量化-小小梦 ^_^ 哈哈 有帮助就好 ~大家一起进步!