Die Strategie des gleichmäßigen Kaufs und Verkaufs (2018-03-27 15:55:36)

Schriftsteller:Null, Datum: 2014-07-06
Tags:

Ebenseitige Kauf- und Verkaufsstrategie, mehr machen, wenn die EMA die langsame Linie auf der schnellen Linie überschreitet, und gleichstellen, wenn die EMA die schnelle Linie auf der mittleren Linie überschreitet oder ein Stopp/Stopp-Verlust erreicht wird.



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

Mehr