千家信息网

如何移植一个my语言策略

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"如何移植一个my语言策略",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何移植一个my语言策略"吧!对于趋势策略移植来说是非常简单的,我
千家信息网最后更新 2026年11月02日如何移植一个my语言策略

本篇内容主要讲解"如何移植一个my语言策略",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何移植一个my语言策略"吧!

对于趋势策略移植来说是非常简单的,我们可以使用一段范例代码,填充驱动策略的数据计算部分代码,填充交易信号触发条件即可。

  • 可复用的范例代码:

    以用于OKEX期货的策略为例。

    // 全局变量var IDLE = 0var LONG = 1var SHORT = 2var OPENLONG = 3var OPENSHORT = 4var COVERLONG = 5var COVERSHORT = 6  var BREAK = 9var SHOCK = 10  var _State = IDLEvar Amount = 0                 // 记录持仓数量var TradeInterval = 500        // 轮询间隔var PriceTick = 1              // 价格一跳var Symbol = "this_week"  function OnTick(){    // 驱动策略的行情处理部分    // 待填充...         // 交易信号触发处理部分    // 待填充...      // 执行交易逻辑    var pos = null    var price = null    var currBar = records[records.length - 1]    if(_State == OPENLONG){        pos = GetPosition(PD_LONG)        // 判断是不是 满足状态,如果满足 修改状态        if(pos[1] >= Amount){            _State = LONG            Amount = pos[1]   // 更新实际量            return        }        price = currBar.Close - (currBar.Close % PriceTick) + PriceTick * 2        Trade(OPENLONG, price, Amount - pos[1], pos, PriceTick)                // (Type, Price, Amount, CurrPos, PriceTick)    }      if(_State == OPENSHORT){        pos = GetPosition(PD_SHORT)        if(pos[1] >= Amount){            _State = SHORT            Amount = pos[1]   // 更新实际量            return        }        price = currBar.Close - (currBar.Close % PriceTick) - PriceTick * 2        Trade(OPENSHORT, price, Amount - pos[1], pos, PriceTick)    }      if(_State == COVERLONG){        pos = GetPosition(PD_LONG)        if(pos[1] == 0){            _State = IDLE            return        }        price = currBar.Close - (currBar.Close % PriceTick) - PriceTick * 2        Trade(COVERLONG, price, pos[1], pos, PriceTick)    }        if(_State == COVERSHORT){        pos = GetPosition(PD_SHORT)        if(pos[1] == 0){            _State = IDLE            return        }        price = currBar.Close - (currBar.Close % PriceTick) + PriceTick * 2        Trade(COVERSHORT, price, pos[1], pos, PriceTick)    }}  // 交易逻辑部分function GetPosition(posType) {    var positions = _C(exchange.GetPosition)    var count = 0    for(var j = 0; j < positions.length; j++){        if(positions[j].ContractType == Symbol){            count++        }    }      if(count > 1){        throw "positions error:" + JSON.stringify(positions)    }      for (var i = 0; i < positions.length; i++) {        if (positions[i].ContractType == Symbol && positions[i].Type === posType) {            return [positions[i].Price, positions[i].Amount];        }    }    Sleep(TradeInterval);    return [0, 0];}  function CancelPendingOrders() {    while (true) {        var orders = _C(exchange.GetOrders)        for (var i = 0; i < orders.length; i++) {            exchange.CancelOrder(orders[i].Id);            Sleep(TradeInterval);        }        if (orders.length === 0) {            break;        }    }}  function Trade(Type, Price, Amount, CurrPos, OnePriceTick){    // 处理交易    if(Type == OPENLONG || Type == OPENSHORT){                 // 处理开仓        exchange.SetDirection(Type == OPENLONG ? "buy" : "sell")        var pfnOpen = Type == OPENLONG ? exchange.Buy : exchange.Sell        var idOpen = pfnOpen(Price, Amount, CurrPos, OnePriceTick, Type)        Sleep(TradeInterval)        if(idOpen) {            exchange.CancelOrder(idOpen)        } else {            CancelPendingOrders()        }    } else if(Type == COVERLONG || Type == COVERSHORT){        // 处理平仓        exchange.SetDirection(Type == COVERLONG ? "closebuy" : "closesell")        var pfnCover = Type == COVERLONG ? exchange.Sell : exchange.Buy        var idCover = pfnCover(Price, Amount, CurrPos, OnePriceTick, Type)        Sleep(TradeInterval)        if(idCover){            exchange.CancelOrder(idCover)        } else {            CancelPendingOrders()        }    } else {        throw "Type error:" + Type    }}  function main() {     // 设置合约    exchange.SetContractType(Symbol)      while(1){        OnTick()        Sleep(1000)    }}


  • 举例:双均线策略的移植

    麦语言回测:

    麦语言策略代码:

    MA5^^MA(C,5);MA15^^MA(C,15);CROSSUP(MA5,MA15),BPK;CROSSDOWN(MA5,MA15),SPK;


  • 移植为JavaScript策略

    首先给可复用的范例代码填充上行情获取、指标计算部分:

    // 驱动策略的行情处理部分var records = _C(exchange.GetRecords)  if (records.length < 15) {    return }  var ma5 = TA.MA(records, 5)var ma15 = TA.MA(records, 15)var ma5_pre = ma5[ma5.length - 3]var ma15_pre = ma15[ma15.length - 3]var ma5_curr = ma5[ma5.length - 2]var ma15_curr = ma15[ma15.length - 2]


    可以看到,双均线策略非常简单,只是首先获取K线数据records,然后使用TA函数库的均线函数TA.MA计算出5日均线、15日均线(回测界面上可以看到,K线周期设置的是日K线,所以TA.MA(records, 5)计算出的就是5日均线,TA.MA(records, 15)15日均线)。
    然后获取ma5指标数据的倒数第二个点ma5_curr(指标值),倒数第三个点ma5_pre(指标值),ma15指标数据同理。然后就可以使用这些指标数据去判断金叉死叉了,如图:

    只要形成这样的状态,即为确定的金叉死叉。

    那么判断信号的部分就可以写成:

    if(_State == IDLE && ma5_pre < ma15_pre && ma5_curr > ma15_curr){         _State = OPENLONG    Amount = 1}  if(_State == IDLE && ma5_pre > ma15_pre && ma5_curr < ma15_curr){         _State = OPENSHORT    Amount = 1}  if(_State == LONG && ma5_pre > ma15_pre && ma5_curr < ma15_curr){         _State = COVERLONG    Amount = 1}  if(_State == SHORT && ma5_pre < ma15_pre && ma5_curr > ma15_curr){         _State = COVERSHORT    Amount = 1}


    这样就移植OK了,可以回测试下:

    可以看到回测结果基本一样,这样如果希望对于策略继续增加交互功能、增加数据处理(例如K线合成)、增加自定义的图表画图显示就可以实现了。

    • JavaScript策略的回测
      回测配置:

      回测结果:

    • my语言的回测

到此,相信大家对"如何移植一个my语言策略"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

策略 移植 均线 部分 处理 语言 指标 数据 代码 交易 信号 实际 状态 范例 驱动 内容 函数 指标值 结果 行情 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技与互联网 科技制造互联网公司 金融科技 互联网金融 互联网科技股票 北京禾田雨橡互联网科技 友谊互联网络科技 伴你行互联网科技有限公司 中国互联网金融科技基金 哈尔滨新华互联网科技 南山科技园互联网公司有哪些 佳云科技和互联网广告 互联网和黑科技的看法 互联网5g黑科技有哪些 杭州壁岐互联网科技有限公司 九思连强互联网电子科技有限公司 西安有哪些互联网高科技企业 张家口科技产业互联网平台 玉溪新华互联网科技怎么选 亚光科技低轨卫星互联网 颐高云石互联网科技 华服互联网科技靠谱吗 北京路客互联网科技有限公司 新浪科技互联网 深圳天众互联网科技公司 南山科技园互联网公司有哪些 互联网金融中的现代科技 浙江互联网科技研学营 科技互联网的核心竞争力 广州梦谷互联网科技有限公司领导 数字科技和互联网金融哪个好
0