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

商品期货交易类库之CTA策略框架

Author: 扫地僧, Created: 2017-10-11 19:06:12, Updated: 2019-07-31 18:14:49

商品期货交易类库之CTA策略框架

2017年的** 优宽量化 **高速运转,本次更新的是“商品期货交易类库”中的CTA策略框架。该策略框架后台自动提供数据和基础服务,借助该策略框架可以大幅提高策略编写效率,正常几百行的策略,用CTA策略框架几十行就能实现一个并发稳定可实盘的多品种策略。另外,配合专门的程序化交易数据结构和丰富的金融统计函数库,同样支持复杂的逻辑应用,简单又不失灵活。

一、如何使用CTA策略框架

1、如下图,在策略广场找到“商品期货交易类库”,复制到自己账户的控制中心。

2、如下图,写策略时勾选“商品期货交易类库”。

二、如何用CTA策略框架编写一个均线策略模型

  • 原始需求
  • 策略设计

  • 策略编写

  • 策略回测

  • 原始需求 价格包含了一切,并且最能贴近趋势,灵敏度高,但是会有很多噪音,产生虚假信号;长期均线在判断趋势上一般比较准确,但是长期均线有着严重的滞后问题。在这里我们用短期均线代替价格,过滤日常杂波,具体为使用短期均线与长期均线的相对位置关系,形成买卖依据。

  • 策略A设计(持续持仓策略) 持多单。短期均线与长期均线至少有2个周期的金叉。 持空单。短期均线与长期均线至少有2个周期的死叉。

  • 策略B设计(非持续持仓策略) 开多单。多头无持仓,并且短期均线与长期均线至少有3个周期的金叉。 开空单。空头无持仓,并且短期均线与长期均线至少有3个周期的死叉。 平多单。多头有持仓,并且短期均线与长期均线至少有1个周期的死叉。 平空单。空头有持仓,并且短期均线与长期均线至少有1个周期的金叉。

  • 策略A编写

function main() {

    /*
    直接使用商品期货类库的CTA策略框架,该框架一共有3个参数: 
    1、参数1是字符串类型,单个或多个合约代码。
    ···例如:rb1801或rb1801,MA801,ru1801
    
    2、参数2是一个函数,用来写交易逻辑。
    ···该函数参数1为K线,参数2为当前品种持仓数量, 正数指多仓, 负数指空仓, 0则无持仓,参数3为合约名称
    ···用户可以指定该函数的返回值为n
    ···n = 0 : 指全部平仓(不管当前是多仓还是空仓)
    ···n > 0 : 如果当前无持仓则开n个多单,如果当前持多仓则加n个多单, 如果当前为空仓则平n个空单
    ···n < 0 : 如果当前无持仓则开n个空单,如果当前持空仓则加n个空单, 如果当前为多仓则平n个多单
    ···无返回值表示什么也不做
        
    3、第3个参数是数字类型,等待时间间隔,单位是毫秒,可以不写,默认是500毫秒
    */
    $.CTA("RB000,RU000,CF000,TA000,I000,PP000,P000,L000,J000,JM000", function(r, mp, symbol) {

        //K线长度过滤
        if (r.length < 20) {
            return
        }

        //调用cross交叉函数
        var cross = _Cross(TA.EMA(r, 5), TA.EMA(r, 20));

        //如果当前没有持仓,并且短期均线与长期均线至少有3个周期的金叉,就开Lots个多单
        //如果当前持有空仓,并且短期均线与长期均线至少有3个周期的金叉,就反手开多单
        if (mp <= 0 && cross > 2) {
            Log(symbol, "金叉周期", cross, "当前持仓", mp);
            return 1 * (mp < 0 ? 2 : 1)
        }

        //如果当前没有持仓,并且短期均线与长期均线至少有3个周期的死叉,就开Lots个空单
        //如果当前持有多仓,并且短期均线与长期均线至少有3个周期的死叉,就反手开空单
        if (mp >= 0 && cross < -2) {
            Log(symbol, "死叉周期", cross, "当前持仓", mp);
            return -1 * (mp > 0 ? 2 : 1)
        }
    });
}

  • 策略B编写
function main() {

    //同上
    $.CTA(Symbols, function(r, mp, symbol) {
    
        //K线长度过滤
        if (r.length < SlowPeriod) {
            return
        }
        
        //调用cross交叉函数
        var cross = _Cross(TA.EMA(r, FastPeriod), TA.EMA(r, SlowPeriod));
        
        //如果当前没有持仓,并且短期均线与长期均线至少有3个周期的金叉,就开Lots个多单
        if (mp === 0 && cross > 3) {
            Log(symbol, "金叉周期", cross, "当前持仓", mp);
            return Lots
        }

        //如果当前持有多仓,并且短期均线与长期均线至少有1个周期的死叉,就平Lots个多单
        if (mp > 0 && cross < -1) {
            Log(symbol, "死叉周期", cross, "当前持仓", mp);
            return -Lots
        }

        //如果当前没有持仓,并且短期均线与长期均线至少有3个周期的死叉,就开Lots个空单
        if (mp === 0 && cross < -3) {
            Log(symbol, "死叉周期", cross, "当前持仓", mp);
            return -Lots
        }

        //如果当期持有空仓,并且短期均线与长期均线至少有1个周期的金叉,就平Lots个空单
        if (mp < 0 && cross > 1) {
            Log(symbol, "金叉周期", cross, "当前持仓", mp);
            return Lots
        }
    });
}
  • 策略回测


** 优宽量化 量化平台,专业打造“一站式”量化交易解决方案,致力于服务机构和量化投资者。**


相关内容

更多内容