2017年的** 优宽量化 **高速运转,本次更新的是“商品期货交易类库”中的CTA策略框架。该策略框架后台自动提供数据和基础服务,借助该策略框架可以大幅提高策略编写效率,正常几百行的策略,用CTA策略框架几十行就能实现一个并发稳定可实盘的多品种策略。另外,配合专门的程序化交易数据结构和丰富的金融统计函数库,同样支持复杂的逻辑应用,简单又不失灵活。
1、如下图,在策略广场找到“商品期货交易类库”,复制到自己账户的控制中心。
2、如下图,写策略时勾选“商品期货交易类库”。
- 原始需求
策略设计
策略编写
策略回测
原始需求 价格包含了一切,并且最能贴近趋势,灵敏度高,但是会有很多噪音,产生虚假信号;长期均线在判断趋势上一般比较准确,但是长期均线有着严重的滞后问题。在这里我们用短期均线代替价格,过滤日常杂波,具体为使用短期均线与长期均线的相对位置关系,形成买卖依据。
策略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)
}
});
}
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
}
});
}
** 优宽量化 量化平台,专业打造“一站式”量化交易解决方案,致力于服务机构和量化投资者。**