【001】单平台均衡策略 【研究】

Author: 风利, Date: 2018-03-23 00:49:35
Tags: Balance

这个需要建仓,比如账户有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);
    }
}

Related

More