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

利用回归幅度构建多品种反转系统

Author: 扫地僧, Date: 2021-11-04 14:54:15
Tags: 多品种震荡JavaScript

摘要

河水并不需要计划自己的行进路线,却毫无例外的到达海洋。价格也同样如此,它总是沿着最小阻力线去运动,它总是怎么容易怎么来。如果上升的阻力比下跌的阻力小,价格就会上涨,反之亦然。通常一个大幅度的反转形态,意味着随后会有更大幅度的运动。无论是上升趋势,还是下降趋势,在每一次重大的趋势运动之后,都将产生一定程度的回撤。回撤与原有价格幅度往往构成一定程度的百分比,就称之为百分比回撤。 点击阅读更多内容


/*backtest
start: 2016-01-01 09:00:00
end: 2019-01-01 15:00:00
period: 1h
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES","minfee":10,"fee":[0,0]}]
*/

function main() {
    // 参数
    cycleLength = 50;                                                    // 周期长度
    backRatio = 1;                                                       // 回撤比率
    contractType = 'rb000/rb888,ru000/ru888';                            // 合约类型
    unit = 1;                                                            // 下单数量
    
    // 仓位表
    var contractType_Dic = {};                                           // 创建一个空对象,用于接收不同的合约类型
    var contractType_Array1 = contractType.split(",");                   // 分割合约类型参数
    var contractType_Array2 = [];                                        // 创建一个空数组,用于接收不同的交易合约
    for (var i = 0; i < contractType_Array1.length; i++) {               // 遍历每个设置的合约
        contractType_Array2.push(contractType_Array1[i].split('/')[1]);  // 分别存储交易合约
    }
    contractType_Array2.toString();                                      // 把数组转变为字符串
    for (var key in contractType_Array2) {                               // 遍历字符串
        contractType_Dic[contractType_Array2[key]] = {
            falsePosition: 0                                             // 把每个交易合约的初始仓位赋值为0
        }
    }
    
    // CTA框架
    $.CTA(contractType, function(st) {
        var bars = st.records;                                           // 获取K线数组
        var j = bars[bars.length - 2].Close;                             // 获取上根K线收盘价
        var high = TA.Highest(bars, cycleLength, 'High');                // 计算N日内的最高价
        var low = TA.Lowest(bars, cycleLength, 'Low');                   // 计算N日内的最低价
        var highBack = high * (1 - backRatio / 100);                     // 计算N日内的最高价的回撤1%的值
        var lowBack = low * (1 + backRatio / 100);                       // 计算N日内的最低价的回撤1%的值
        
        // 过滤K线数量
        if (!bars || bars.length < cycleLength + 1) {
            return;
        }
        
        //多头平仓
        if (contractType_Dic[st.symbol].falsePosition > 0 && j < (lowBack + highBack) / 2) {
            contractType_Dic[st.symbol].falsePosition = 0;
            return -unit;
        }
        
        //空头平仓
        if (contractType_Dic[st.symbol].falsePosition < 0 && j > (lowBack + highBack) / 2) {
            contractType_Dic[st.symbol].falsePosition = 0;
            return unit;
        }
        
        //多头开仓
        if (contractType_Dic[st.symbol].falsePosition == 0 && j > lowBack && j > highBack) {
            contractType_Dic[st.symbol].falsePosition = 1;
            return unit;
        }
        
        //空头开仓
        if (contractType_Dic[st.symbol].falsePosition == 0 && j < lowBack && j < highBack) {
            contractType_Dic[st.symbol].falsePosition = -1;
            return -unit;
        }
        
    });
}
template: strategy.tpl:40:21: executing "strategy.tpl" at <.api.GetStrategyListByName>: wrong number of args for GetStrategyListByName: want 7 got 6