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

CTA策略之商品期货定时启停机器人

Author: 扫地僧, Date: 2021-11-03 10:37:26
Tags: 商品期货JavaScript工具

一、摘要

众所周知由于商品期货交易时间规则限制,白天只有4个小时的交易时间,夜盘只有2~4个小时的交易时间,再加上某些品种还没有夜盘交易时间,综合下来平均一天只有6个小时的交易时间。如果使用优宽量化机器人24小时不停运行策略,则有一半多的时间是在无谓的消耗。所以很多人定个闹钟来启动和停止机器人,但这么做并不能保证每次的准时,而且每次需要登录网页并不方便。本篇就创建一个管理机器人的机器人教大家如何四折使用优宽量化。

二、判断商品期货交易所是否开市

由于商品期货除了周六周末闭市外,在国家法定节假日也会闭市,所以在日期的选择上有不确定性。那么折中的办法是:结合当前热门合约的成交量变动情况,就可以判断当前是否开市。如果当前热门合约的成交量一直在累加,则说明交易所处于开市状态;如果当前热门合约的成交量不动,则说明交易所处于闭市状态。如下面的代码:

function isTrading() {
    let records = exchange.GetRecords();
    if (!records) return;
    let newVolume = records[records.length - 1].Volume;
    if (newVolume == lastVolume) {
        return;
    } else if (lastVolume == 0) {
        lastVolume = newVolume;
        return;
    }
    lastVolume = newVolume;
    return true;
}

三、停止和启动机器人命令

在优宽量化的扩展API中,可以使用StopRobot()函数来停止正在运行的机器人,使用RestartRobot()函数来启动已经停止的机器人,但是在这之前需要请求 https://www.youquant.com/api/v1? URL,以及对“secretKey”和“accessKey”进行md5加密操作,才能调用StopRobot()函数和RestartRobot()。如下面的代码:

// 获取参数对象
function getParam(version, ak, method, args){
    return {
        'version': version,
        'access_key': ak,
        'method': method,
        'args': JSON.stringify(args),
        'nonce': new Date().getTime()
    }
}

// md5加密
function md5(param){
    let paramUrl = param.version + "

// 设置全局变量参数
var secretKey = "f88b07cbf2023937aa8a4894702e0a09";
var accessKey = "ddbbeaf65a8a4fc9cc12c405aa3b247e";
var botId = 266250;
var code = 'rb000';

// 固定参数
var lastVolume = 0;

// 获取参数对象
function getParam(version, ak, method, args){
    return {
        'version': version,
        'access_key': ak,
        'method': method,
        'args': JSON.stringify(args),
        'nonce': new Date().getTime()
    }
}

// md5加密
function md5(param){
    let paramUrl = param.version + "|" + param.method + "|" + param.args + "|" + param.nonce + "|" + secretKey
    return Hash("md5", "hex", paramUrl);
}

// 获取请求URL
function getFinalUrl(param){
    let url = "https://www.fmz.com/api/v1?";
    return url + "access_key=" + accessKey + "&nonce=" + param.nonce + "&args=" + param.args + "&sign=" + param.sign + "&version=" + param.version + "&method=" + param.method;
}

// 获取API信息
function getAPIInfo(method, dateInfo){
    let param = getParam("1.0.0", accessKey, method, dateInfo);
    let md5Result = md5(param);
    param.sign = md5Result;
    let finalUrl = getFinalUrl(param);
    let info = HttpQuery(finalUrl);
    return JSON.parse(info);
}

// 用arguments关键字获取参数数组
function getArgs(){
    return [].slice.call(arguments);
}

// 根据合约成交量判断是否开市
function isTrading() {
    let records = _C(exchange.GetRecords);
    let newVolume = records[records.length - 1].Volume;
    if (newVolume == lastVolume) {
        return;
    } else if (lastVolume == 0) {
        lastVolume = newVolume;
        return;
    }
    lastVolume = newVolume;
    return true;
}

// 策略入口函数
function main() {
    SetErrorFilter('not login');
    while (true) {
        if (!exchange.IO("status")) {
            Sleep(10000);
            continue;
        }
        if (exchange.SetContractType(code)) break;
    }
    while (true) {
        let info = getAPIInfo('GetRobotDetail', getArgs(botId));
        if (isTrading()) {
            if (info.data.result.robot.status == 4) {
                getAPIInfo('RestartRobot', getArgs(botId));
                Log('启动策略')
            }
        } else {
            if (info.data.result.robot.status == 1) {
                getAPIInfo('StopRobot', getArgs(botId));
                Log('停止策略')
            }
        }
        Sleep(10000);
    }
}


template: strategy.tpl:40:21: executing "strategy.tpl" at <.api.GetStrategyListByName>: wrong number of args for GetStrategyListByName: want 7 got 6