温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

JavaScript怎么实现商品期货移仓类库

发布时间:2022-03-25 17:04:53 来源:亿速云 阅读:122 作者:iii 栏目:互联网科技

这篇文章主要介绍“JavaScript怎么实现商品期货移仓类库”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript怎么实现商品期货移仓类库”文章能帮助大家解决问题。

设计实现

编写商品期货策略的时候,经常有移仓的需求。那么如何实现这样的操作呢?在商品期货多品种主力自动移仓海龟交易策略中我们看到了相关移仓操作的实现。借鉴策略中的移仓机制,我们设计一个「商品期货移仓类库」。

移仓操作其实并不复杂,只是在需要移仓的时候,把当前仓位平掉再到需要移动到的合约开出新仓位即可。具体设计出两种使用场景。

  • A合约 -> B合约
    待策略中编写的条件触发,执行一次A合约到B合约的移仓操作。
    例如一次按钮交互操作触发:

    var q = $.NewTaskQueue()                        // 生成用于具体下单操作的对象,源自商品期货交易类库var t = $.NewTransfer(exchange, q, $.IsTrading) // 生成处理移仓操作的对象...var cmd = GetCommand() // 获取交互命令if(cmd) {              // 接收到任何交互命令t.process("rb2010", "rb2101")  // 执行移仓}...


  • 切换主力合约
    检测系统中主力合约变更,进行当前旧主力合约到新主力合约的移仓操作。

该模板类库不设计参数。

// 导出函数(接口)$.NewTransfer = function (e, taskQueue, IsTrading) {var self = {}self.currSymbol = ""self.e = eself.q = taskQueueself.IsTrading = IsTradingself.arrAction = []    self.process = function(symbolA, symbolB) {if((typeof(symbolB) == "undefined" && !self.IsTrading(symbolA)) || (typeof(symbolB) != "undefined" && !self.IsTrading(symbolA) && !self.IsTrading(symbolB))) {return 
        }        self.arrAction = []// 检测参数是否有symbolB , 没有即为检测主力合约 , 有则为移仓具体合约if(typeof(symbolB) == "undefined") {// 检测symbolA合约是否为XX888 或者 XX000if(symbolA.indexOf("888") == -1 && symbolA.indexOf("000") == -1) {throw "缺少symbolB参数!"}// 检测是否触发移仓var insDetail = nullif(self.currSymbol == "") {insDetail = _C(self.e.SetContractType, symbolA)self.currSymbol = insDetail.InstrumentID}insDetail = _C(self.e.SetContractType, symbolA)if(self.currSymbol != insDetail.InstrumentID) {var oldSymbol = self.currSymbolvar pos = self.q.GetPosition(self.e, oldSymbol)if(pos && pos.Amount > 0) {// 移仓self.arrAction = [oldSymbol, insDetail.InstrumentID, pos]Log("开始移仓:", self.arrAction[0], "->", self.arrAction[1], self.arrAction, "#FF0000")
                } else {self.currSymbol = insDetail.InstrumentID}
            }
        } else {// 检测是否有symbolA持仓var pos = self.q.GetPosition(self.e, symbolA)if(pos && pos.Amount > 0) {// 移仓self.arrAction = [symbolA, symbolB, pos]Log("开始移仓:", self.arrAction[0], "->", self.arrAction[1], self.arrAction, "#FF0000")
            } else {Log("没有检测到", symbolA, "的仓位,pos:", pos, "#FF0000")
            }
        }if(self.arrAction.length == 3) {self.q.pushTask(self.e, self.arrAction[0], (self.arrAction[2].Type == PD_LONG || self.arrAction[2].Type == PD_LONG_YD ? "closebuy" : "closesell"), self.arrAction[2].Amount, function(task, ret){if(!ret) {Log(self.arrAction[0], "移仓平仓失败!", self.arrAction[0], "->", self.arrAction[1], "#FF0000")return 
                }Log("移仓进度平仓成功,开始开仓!", self.arrAction[1], "数量:", self.arrAction[2].Amount, "#FF0000")self.q.pushTask(self.e, self.arrAction[1], (self.arrAction[2].Type == PD_LONG || self.arrAction[2].Type == PD_LONG_YD ? "buy" : "sell"), self.arrAction[2].Amount, function(task, ret){if(!ret) {Log(self.arrAction[1], "移仓开仓失败!", self.arrAction[0], "->", self.arrAction[1], "#FF0000")return 
                    }Log("移仓成功!", self.arrAction[0], "->", self.arrAction[1], "#FF0000")
                })
            })
        }while(self.q.size() > 0) {self.q.poll()Sleep(500)
        }
    }return self}// 测试函数,在主策略中执行function main() {var q = $.NewTaskQueue()var t = $.NewTransfer(exchange, q, $.IsTrading)var isTransfer = falsevar isFirst = truevar n = 0while(true) {if(exchange.IO("status")) {LogStatus(_D(), "已经连接!")if(isFirst) {isFirst = false exchange.SetContractType("rb1905")exchange.SetDirection("buy")var ticker = exchange.GetTicker()exchange.Buy(ticker.Last + 10, 1)Log(exchange.GetPosition())
            }            // 检测主力合约移仓t.process("rb888")            // 模拟触发一次/*            if(n == 20) {                t.process("rb1905", "rb1910")               }            */// 检测条件触发移仓/*            var cmd = GetCommand()            if(cmd) {                isTransfer = true            }            if(isTransfer) {                t.process("rb2010", "rb2101")                isTransfer = false            }            */} else {LogStatus(_D(), "未连接!")
        }n++Sleep(1000)
    }
}

该模板类库中的main函数即为在主策略中的测试代码,例如下图:

JavaScript怎么实现商品期货移仓类库

回测测试

JavaScript怎么实现商品期货移仓类库

测试代码在开始时,开出一个仓位,随后使用主力合约检测的方式移仓。

或者使用具体条件触发一次移仓,进行测试。

JavaScript怎么实现商品期货移仓类库

只进行一次具体的移仓操作。

JavaScript怎么实现商品期货移仓类库

关于“JavaScript怎么实现商品期货移仓类库”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI