Ma单均线趋势交易

Author: ipqhjjybj, Date: 2017-06-04 21:55:07
Tags: TrendMA


/*
策略出处: internet
策略名称: MA 单均线趋势策略
策略作者: ipqhjjybj
策略描述: 均线向上做多,均线向下做空 , bitcoin只做多
趋势跟踪策略

*/

MA_Length  			=	120	   // 计算通道中值的窗口数  
trailingPrcnt 		=   15    // 移动止损
LoopInterval  		=   60 	   // 轮询间隔(秒)
SlidePrice          =	0.3    // 滑动价(元)
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, orders[j]);
            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 minMoney			= 100;		// 如果资金小于该数值,则不买入
var LastRecord 			= null;		// 初始化上一个记录


function onTick(exchange) {

	var ticker = GetTicker();
    // Buy or Sell, Cancel pending orders first
    CancelPendingOrders();
    var account = GetAccount();

    if (true) {
        var records = exchange.GetRecords();
        if (!records || records.length < (MA_Length + 3)) {
            return;
        }
        // Price not change
        var newLast = records[records.length-1];
        if ((!LastRecord) || (LastRecord.Time == newLast.Time && LastRecord.Close == newLast.Close)) {
            LastRecord = newLast;
            return;
        }
        LastRecord = newLast;

        var kk_MA = TA.MA(records , MA_Length);

        var ma_inc = kk_MA[kk_MA.length-1] / kk_MA[kk_MA.length-2];

        Log( "kk_MA 1", kk_MA[kk_MA.length-1] , "kk_MA 2", kk_MA[kk_MA.length-2] )
        //Log(newLast);
        // var kk_ATR = TA.ATR(records , KK_Length);
        // var kk_Mid = TA.MA(records, KK_Length);
        // var kk_Up  = kk_Mid[kk_Mid.length-1] + kk_ATR[kk_ATR.length-1] * kkDev;
        //var kk_Down= kk_Mid - kk_ATR * kkDev

        //Log("LastRecord.Close",LastRecord.Close ,"kk_up",kk_Up,"intraTradeHigh",intraTradeHigh);
        if( account.Stocks <= exchange.GetMinStock() ){
        	if(ma_inc > 1.000001){

        		var price = ticker.Last + SlidePrice;
		        var amount = adjustFloat(account.Balance / price);
		        if (account.Balance > minMoney && amount >= exchange.GetMinStock()) {
		        	Log("start buy");
		        	if (exchange.Buy(price, amount, "做多")) {
		        		LastBuyPrice = LastHighPrice = price;
		        	}
		        } 
        	}
        }
        else if( exchange.GetMinStock() < account.Stocks ){
        	if(ma_inc < 0.999999){	// 移动止损
        		var price = ticker.Last - SlidePrice;
		    	var sellAmount = account.Stocks;
		    	if (sellAmount > exchange.GetMinStock()) {
		    		Log("start sell");
		    		exchange.Sell(ticker.Last - SlidePrice, sellAmount, "卖出");
		    		LastSellPrice = LastLowPrice = price;
		    	} 
        	}
        }
    }
}


function main() {
    InitAccount = GetAccount();
    Log(exchange.GetName(), exchange.GetCurrency(), InitAccount);

    LoopInterval = Math.max(LoopInterval, 1);  
    while (true) {
        onTick(exchange);
        Sleep(LoopInterval*1000);
    }
}



Related

More

FMZ_JH 请问 为什么要写这么多Sleep(Interval); 程序在速度上延迟太高了怎么办?