手把手教你把「商品期货计划委托工具」改造成一个日内策略

Author: 雨幕(youquant), Created: 2019-11-26 09:21:54, Updated: 2024-12-31 09:59:30

手把手教你把「商品期货计划委托工具」改造成一个日内策略

手把手教你把「商品期货计划委托工具」改造成一个日内策略

上一期文章中我们学习了「如何编写一个商品期货计划委托工具」,这是一个半手动的交易策略。那么我们如何实现一个自动的计划委托策略呢?这期文章我们就来一起实现,改造这个工具,改造成一个自动交易的策略。

  • ### 策略思路

同样使用委托一个订单后,自动生成止损、止盈、反手委托任务的机制,只不过第一个委托订单,按照1分钟级别均线和当前价格的偏离程度来作为触发条件,做回归策略,收盘前平仓。策略并不复杂。

  • 策略实现细节

    • 策略轮询逻辑中的数据准备
    // 获取行情
    exchange.SetContractType(_EntrustSymbol)    // 设置合约例如设置参数_EntrustSymbol为rb2001
    var ticker = _C(exchange.GetTicker)         // 获取tick数据
    var records = _C(exchange.GetRecords)       // 获取K线数据,设置K线周期为1分钟,这里获取的就是1分钟周期K线数据
    $.PlotRecords(records, "K")                 // 画图,画出K线
    var nowTs = new Date().getTime()            // 获取当前时间,时间戳。
    

    获取这些数据用于之后的计算。

    • 需要计算每天早上开盘后的均线

    首先要判断出当前以日为单位,开盘时第一根K线的时间戳:

    for (var j = records.length - 1; j > -1; j--) {
        var ts = records[j].Time
        if (ts % (1000 * 60 * 60 * 24) == 3600000) {    // 60 * 60 * 1000 = 3600000
            if (oneDayBeginTS != ts) {
                oneDayBeginTS = ts
                Log("新的一天开始!")
                // 清空任务队列
                IsEntrust = false // 设置的一个全局变量标记,用来标记当前是不是已经触发委托,这里是在新的一天开始时重置
            }
            break
        }
    }
    

    这段代码,就是倒序遍历K线数据,判断第一个符合ts % (1000 * 60 * 60 * 24) == 3600000的K线BAR,ts为K线的时间戳,ts1000 * 60 * 60 * 24求余,得出一天中,已经渡过了多少毫秒。当这个数值等于3600000时即判断为新的开盘时间开始,因为是早晨9:00开盘,60 * 60 * 1000 = 3600000当时间渡过了3600000毫秒(1小时)时,正好是北京时间9:00。从而拿到每天开盘的第一根K线Bar的时间戳:oneDayBeginTS = ts

    然后计算均线:

    var sum = 0
    var count = 0
    var avg = 0
    for (var n = 0 ; n < records.length; n++) {
        if (records[n].Time >= oneDayBeginTS) {
            sum += records[n].Close
            count++
            if (n == records.length - 1) {
                avg = sum / count
                $.PlotLine("avg", avg, records[n].Time)   # 画出均线
            }
        }
    }
    
    • 计算ATR

    使用5日ATR指标作为偏离程度的参照,首先计算ATR:

    var records_Day = _C(exchange.GetRecords, PERIOD_D1)   // 获取日K线
    if (records_Day.length <= 5) {   // K线数量必须满足ATR周期,否则直接返回。
        LogStatus("收集K线")
        Sleep(2000)
        return 
    }
    var atr = TA.ATR(records_Day, 5)         // 计算ATR指标
    var _Dis = atr[atr.length - 2] * 0.5     // 获取前一BAR的ATR指标值,可以乘以一个系数作为调整
    
    • 收盘前平仓
    if (nowTs + 1000 * 60 > oneDayBeginTS + 1000 * 60 * 60 * 6) {
        p.CoverAll()
        _TaskQueue = []
    }
    
    
    - 触发委托条件
    
    
    

    if (Math.abs(records[records.length - 1].Close - avg) > _Dis && !IsEntrust) { var task = { taskType : ENTRUST, taskSymbol : _EntrustSymbol, taskPrice : records[records.length - 1].Close, taskAmount : _EntrustAmount, taskDirection : records[records.length - 1].Close - avg > 0 ? “sell” : “buy”, taskTrigger : records[records.length - 1].Close - avg > 0 ? 1 : -1, // 大于触发
    taskFinished : false }

    Log("请注意,创建委托任务", task, "#FF0000")
    _TaskQueue.push(task)
    IsEntrust = true
    

    } “`

    可以看到,和上一篇文章中的创建委托任务代码使用方式类似。由条件Math.abs(records[records.length - 1].Close - avg) > _Dis && !IsEntrust作为触发条件,只要当前的收盘价减去均线当前数值的绝对值大于_Dis这个浮动的触发距离,就创建委托任务。 该委托任务如果触发执行,会和上篇文章一样,自动创建一些列的止盈、止损、反手任务。

  • 回测测试

回测配置: 手把手教你把「商品期货计划委托工具」改造成一个日内策略

回测结果: 手把手教你把「商品期货计划委托工具」改造成一个日内策略

手把手教你把「商品期货计划委托工具」改造成一个日内策略

回测日志: 手把手教你把「商品期货计划委托工具」改造成一个日内策略

回测收益并不是很高,但是交易频率相对较高,手续费如果有返还可能可以考虑下。 策略为教学策略,思路仅供参考,值得学习一下实现时的几个小细节,例如时间控制等。

策略地址:https://www.youquant.com/strategy/176022


相关内容

更多内容