这个需要建仓,比如账户有5000块钱,跟1个币,如果币的价值大于账户的余额5000了并且差价超过阀值,比如币现在值6000块钱,就卖掉(6000-5000)/6000/2个币,说明币升值了,把钱兑换回来,如果币贬值了,比如4000块钱了,就买入(5000-4000)/4000/2个币, 币跌的时候买一些回来,如果再涨了,就再卖掉,好像天平一样,两边不同的对冲,所以我命名为均衡策略
/* 单平台策略*/ function adjustFloat(v) { // 处理数据的自定义函数 ,可以把参数 v 处理 返回 保留3位小数(floor向下取整) return Math.floor(v*1000)/1000; // 先乘1000 让小数位向左移动三位,向下取整 整数,舍去所有小数部分,再除以1000 , 小数点向右移动三位,即保留三位小数。 } function GetTicker() { //定义获取行情函数,获取卖一价,买一价,最后成交价,成交量,时间等 var ticker; while (!(ticker = exchange.GetTicker())) { Sleep(Interval); } return ticker; } function GetAccount() { //定义获得账户信息,持币数目,资金量 var account; while (!(account = exchange.GetAccount())) { Sleep(Interval); } return account; } function CancelPendingOrders() { //定义函数取消挂单的订单 var ret = false; while (true) { var orders = null; while (!(orders = exchange.GetOrders())) { Sleep(Interval); } if (orders.length == 0) { return ret; } for (var j = 0; j < orders.length; j++) { exchange.CancelOrder(orders[j].Id); ret = true; if (j < (orders.length-1)) { Sleep(Interval); } } } return ret; } function updateProft(accountInit, accountNow, ticker) { //更新自己账户的收益情况 LogProfit(accountNow.Balance + accountNow.FrozenBalance + ((accountNow.Stocks + accountNow.FrozenStocks - accountInit.Stocks - accountInit.FrozenStocks) * ticker.Buy) - accountInit.Balance - accountInit.FrozenBalance); } var STATE_WAIT_IDLE = 0; //定义变量操作状态默认值为 0 var STATE_WAIT_BUY = 1; //定义变量操作状态等待买入状态为1 var STATE_WAIT_SELL = 2; //定义变量操作状态等待卖出状态为2 var State = STATE_WAIT_IDLE; //定义变量State 默认状态为0 var InitAccount = null; //定义账户初始状态为NULL function onTick() { //定义函数onTick 为判定逻辑操作买入与卖出状态 var opSuccess = false; //定义变量opSuccess 起始状态为 false if (State != STATE_WAIT_IDLE) { //判断函数如果 初始状态不为0,为真,也就是现在有买入挂单,与卖出挂单 opSuccess = !CancelPendingOrders(); //并且变量操作没有执行取消挂单操作 State = STATE_WAIT_IDLE; //定义变量State 默认为默认状态(等待状态) } var portfolio = GetAccount(); //定义变量 portfolio 是获取账户信息 var ticker = GetTicker(); //定义变量 Ticker 是获得行情信息 if (opSuccess) { //如果opSuccess为真的话,就是跟新自己的收益 updateProft(InitAccount, portfolio, ticker); } // 下面是策略逻辑的精髓所在 var diff = portfolio.Balance - (portfolio.Stocks * ticker.Sell); //定义变量diff 账户的收益=账户金额- 账户数量*卖一价 if (diff > threshold) { //如果差额大于 阈值 threshold(默认值为10) var amount = adjustFloat(diff / 2 / ticker.Buy); if (amount < 0.001) { return; } exchange.Buy(ticker.Buy*1.1, amount); State = STATE_WAIT_BUY; } else if (diff <= -threshold) { var amount2 = adjustFloat(Math.abs(diff) / 2 / ticker.Sell); if (amount2 < 0.001) { return; } exchange.Sell(ticker.Sell*0.9, amount2); //这里添加了滑价,所以其中的价格为*0.9 这也这样的方式需要优化 State = STATE_WAIT_SELL; } } function main() { //这里调用了主函数进行操作 InitAccount = GetAccount(); LoopInterval = Math.max(LoopInterval, 1); //这里使用JS内置函数Math.max() 方法可返回两个指定的数中带有较大的值的那个数。 while (1) { onTick(); Sleep(LoopInterval * 1000); } }