Loading ...

商品期货 - 形态策略(增强型锤子)

Author: Hukybo, Date: 2018-06-09 09:10:11
Tags: Commodity-futures


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

function main() { // 主程序
    var contractTypeDic = {}; // 新建一个合约品种对象
    var contractTypeArr1 = contractType.split(","); // 处理合约类型
    var contractTypeArr2 = []; // 新建一个空数组
    for (var i = 0; i < contractTypeArr1.length; i++) {
        contractTypeArr2.push(contractTypeArr1[i].split('/'));
    } // 批量处理
    for (var key = 0; key < contractTypeArr2.length; key++) {
        for (var kay = 0; kay < contractTypeArr2[key].length; kay++) {
            contractTypeDic[contractTypeArr2[key][1]] = {
                unit: Number(contractTypeArr2[key][2]),
                falsePosition: 0
            }
        }
    } // 批量处理,给合约品种对象添加属性
    var re = /\/\d{1,3}/gm // 正则表达式
    var name = contractType.replace(re, ""); // 处理下单合约名称字符串
    // 调用商品期货交易类库中的CTA框架。参数1:用每个品种的指数数据产生信号,用每个品种的当前主力合约下单。参数2:策略逻辑的回调函数。
    $.CTA(name, function(st) {
        var bars = st.records; // 获取K线数组
        if (!bars || bars.length < maLen + 1) {
            return;
        } // 检测K线数据的长度。如果K线数据过短,则继续等待数据
        var ma = TA.MA(bars, maLen); // 获取移动平均线数组
        var ma1 = ma[ma.length - 2]; // 获取上根K线的移动平均线数据
        var close1 = bars[bars.length - 2].Close; // 获取上根K线的数据
        var longArr = talib.CDLHAMMER(bars) // 调用talib库中的锤子线形态,返回数组
        var shortArr = talib.CDLINVERTEDHAMMER(bars) // 调用talib库中的倒锤子线形态,返回数组
        var long = longArr[longArr.length - 2] // 获取上根K线锤子线形态数据
        var short = shortArr[shortArr.length - 2] // 获取上根K线倒锤子线形态数据
        if (contractTypeDic[st.symbol].falsePosition > 0 && (close1 < ma1 || short > 0)) {
            contractTypeDic[st.symbol].falsePosition = 0;
            return -contractTypeDic[st.symbol].unit;
        } // 平多单
        if (contractTypeDic[st.symbol].falsePosition < 0 && (close1 > ma1 || long > 0)) {
            contractTypeDic[st.symbol].falsePosition = 0;
            return contractTypeDic[st.symbol].unit;
        } // 平空单
        if (contractTypeDic[st.symbol].falsePosition == 0 && close1 > ma1 && long > 0) {
            contractTypeDic[st.symbol].falsePosition = 1;
            return contractTypeDic[st.symbol].unit;
        } // 开多单
        if (contractTypeDic[st.symbol].falsePosition == 0 && close1 < ma1 && short > 0) {
            contractTypeDic[st.symbol].falsePosition = -1;
            return -contractTypeDic[st.symbol].unit;
        } // 开空单
    });
}

Related

More