均线买卖策略 (2018-03-27 15:55:36)

Author: Zero, Date: 2014-07-06 07:59:42
Tags:

均线买卖策略, 当EMA快线上穿慢线的时候,做多,当EMA中线上穿快线或者达到的止盈/止损的时候,平仓。



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

More