Пункт 001 Одноразовая платформа Стратегия сбалансированности Пункт исследования

Автор:Ветер, Дата: 2018-03-23 00:49:35
Тэги:Баланс

Это требует создания хранилища, например, 5000 долларов в счете, и 1 монета, и если стоимость монеты больше, чем баланс в счете, 5000, и разница превышает порог, например, монета сейчас стоит 6000 долларов, продать, чтобы показать, что монета выросла, обменять деньги обратно, если она обесценилась, например, 4000 долларов, купить, купить, если она упала, купить еще, если она упала, продать, как будто это нечто вроде нефтяного баланса, так что я называю это балансирующей стратегией.



/* 单平台策略*/


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);
    }
}

Связанные

Больше