Chiến lược mua bán ngang hàng (2018-03-27 15:55:36)

Tác giả:Không, Ngày: 2014-07-06 07:59:42
Tags:

Chiến lược mua bán đường ngang, làm nhiều khi đường EMA nhanh vượt qua đường chậm, đứng yên khi đường EMA trung vượt qua đường nhanh hoặc đạt đến mức dừng / dừng lỗ.



function adjustFloat(v) {
    return Math.floor(v*1000)/1000;
}

function CancelPendingOrders() {
    while (true) {
        var orders = null;
        while (!(orders = exchange.GetOrders())) {
            Sleep(Interval);
        }
    
        if (orders.length == 0) {
            return;
        }
    
        for (var j = 0; j < orders.length; j++) {
            exchange.CancelOrder(orders[j].Id);
            if (j < (orders.length-1)) {
                Sleep(Interval);
            }
        }
    }
}

function GetAccount() {
    var account;
    while (!(account = exchange.GetAccount())) {
        Sleep(Interval);
    }
    return account;
}

function GetTicker() {
    var ticker;
    while (!(ticker = exchange.GetTicker())) {
        Sleep(Interval);
    }
    return ticker;
}

var STATE_WAIT_BUY      = 0;
var STATE_WAIT_SELL     = 1;
var STATE_BUY           = 2;
var STATE_SELL          = 3;
var STATE_WAIT_SELL_ALL = 4;

var State = STATE_WAIT_BUY;
var lastRecord = null;
var InitAccount = null;
var LastBuyPrice = 0.0;
var LastHighPrice = 0.0;

function onTick(exchange) {
    var records = exchange.GetRecords();
    if (!records || records.length < (EMA_Slow + 3)) {
        return;
    }
    var newLast = records[records.length-1];
    if ((!lastRecord) || (lastRecord.Time == newLast.Time && lastRecord.Close == newLast.Close)) {
        lastRecord = newLast;
        return;
    }
    lastRecord = newLast;
    
    
    var ticker = GetTicker();

    var emaFast = TA.EMA(records, EMA_Fast);
    var emaSlow = TA.EMA(records, EMA_Slow);
    var emaMid = TA.EMA(records, EMA_Mid);
    
    if (State == STATE_WAIT_BUY && 
        (emaFast[emaFast.length-1] >= emaSlow[emaSlow.length-1]) 
        && (emaFast[emaFast.length-2] < emaSlow[emaSlow.length-2])
        && (emaFast[emaFast.length-1] > emaMid[emaSlow.length-1])) {
        State = STATE_BUY;
    } else if (State == STATE_WAIT_SELL) {
        var ratioStopLoss = Math.abs((LastHighPrice - ticker.Last) / LastHighPrice) * 100;
        var ratioStopProfit = Math.abs((ticker.Last - LastBuyPrice) / LastBuyPrice) * 100;
        
        if (emaFast[emaFast.length-1] < emaMid[emaFast.length-1]) {
            State = STATE_SELL;
            Log("EMA 快线下穿中线", "Fast:", adjustFloat(emaFast[emaFast.length-1]), "Mid", adjustFloat(emaMid[emaFast.length-1]));
        } else if (ticker.Last < LastHighPrice && ratioStopLoss >= StopLoss) {
            State = STATE_SELL;
            Log("开始止损, 当前下跌点数:", adjustFloat(ratioStopLoss), "当前价格", ticker.Last, "对比价格", adjustFloat(LastHighPrice));
        } else if (ticker.Last > LastBuyPrice && ratioStopProfit >= StopProfit) {
            State = STATE_SELL;
            Log("开始止赢, 当前上涨点数:", adjustFloat(ratioStopProfit), "当前价格", ticker.Last, "对比价格", adjustFloat(LastBuyPrice));
        }
        LastHighPrice = Math.max(LastHighPrice, ticker.Last);
    }
    
    if (State != STATE_BUY && State != STATE_SELL && State != STATE_WAIT_SELL_ALL) {
        return;
    }

    // Buy or Sell, Cancel pending orders first
    CancelPendingOrders();

    var account = GetAccount();
    
    if (State == STATE_BUY) {
        var price = ticker.Last + SlidePrice;
        var amount = adjustFloat(account.Balance / price);
        if (amount >= exchange.GetMinStock()) {
            if (exchange.Buy(price, amount)) {
                State = STATE_WAIT_SELL;
                LastBuyPrice = LastHighPrice = price;
            }
        }
    } else {
        var sellAmount = account.Stocks - InitAccount.Stocks;
        if (sellAmount > exchange.GetMinStock()) {
            // STATE_WAIT_SELL or STATE_WAIT_SELL_ALL
            State = STATE_WAIT_SELL_ALL;
            exchange.Sell(ticker.Last - SlidePrice, sellAmount);
        } else {
            // No stocks, wait buy and log profit
            LogProfit(account.Balance - InitAccount.Balance);
            Log(account);
            State = STATE_WAIT_BUY;
        }
    }
}

function main() {
    InitAccount = GetAccount();
    Log(exchange.GetName(), exchange.GetCurrency(), InitAccount);
    while (true) {
        onTick(exchange);
        Sleep(10000);
    }
}

Thêm nữa