Les ressources ont été chargées... Je charge...

Le contrat est passé

Auteur:Un coup de poing pour un garçon, Date: 2020-04-05 21h24 et 29h
Les étiquettes:

Je suis désolé.


/*backtest
start: 2020-01-08 00:00:00
end: 2020-04-06 00:00:00
period: 1d
exchanges: [{"eid":"Futures_OKCoin","currency":"ETH_USD","stocks":1400}]
args: [["PRICE_PRECISION",2],["AMOUNT_PRECISION",4]]
*/

var tempOrders = [];

var COLOR = {
    GREEN: '#00a500',
    RED: '#ff0000',
    GRAY: '#b2b2b2',
    ORANGE: '#ff9e38'
}

function cancelOrder(ex,order_id){
    if (!order_id) return Log('不正确的订单id', order_id);
	Log("取消订单" + order_id);
	ex.CancelOrder(order_id);
	Sleep(500);
	var orders=_C(ex.GetOrders);
	var find=false;
	for (var i=0;i<orders.length;++i){
		if (orders[i].Id===order_id){
			find=true;
			break;
		}
	}
	if (find){
		cancelOrder(ex.order_id);
	}
}

var trade = function(direction, amount) {
    var ticker = _C(exchange.GetTicker);
    exchange.SetDirection(direction);
    var price = 0
    if (_.contains(['buy', 'closesell'], direction)) {
        price = _N(new Decimal(ticker.Last).plus(SLIP_POINT).toNumber(), PRICE_PRECISION);
    } else {
        price = _N(new Decimal(ticker.Last).minus(SLIP_POINT).toNumber(), PRICE_PRECISION);
    }
    var orderInfo = null;
    var avgPrice = null;
    var oid = null;
    var beginTime = null;
    var dealAmount = _.reduce(tempOrders, function(p, n) {
        return new Decimal(p).plus(n.DealAmount).toNumber();
    }, 0);
    var remainAmount = Math.floor(new Decimal(amount).minus(dealAmount).toNumber());
    if (remainAmount < 1) {
        avgPrice = _N(new Decimal(_.reduce(tempOrders, function(p, n) {
            return new Decimal(p).plus(new Decimal(n.AvgPrice).mul(n.DealAmount).mul(FACE_VALUE)).toNumber()
        }, 0)).div(new Decimal(dealAmount).mul(FACE_VALUE)).toNumber(), PRICE_PRECISION);
        orderInfo = {
            Id: _.last(tempOrders).Id,
            Type: _.contains(['buy', 'closebuy'], direction) ? PD_LONG : PD_SHORT,
            Price: price,
            AvgPrice: avgPrice,
            Amount: amount,
            DealAmount: dealAmount,
            Orders: _.pluck(tempOrders, 'Id')
        }
        tempOrders = [];
        return orderInfo;
    } else {
        oid = _.contains(['buy', 'closesell'], direction) ? exchange.Buy(price, remainAmount) : exchange.Sell(price, remainAmount);
        if (oid) {
            beginTime = Unix();
            while(1) {
                orderInfo = _C(exchange.GetOrder, oid);
                if (orderInfo.Status !== ORDER_STATE_PENDING) {
                    tempOrders.push(orderInfo);
                    return trade(direction, amount);
                }
                if (Unix() - beginTime >= TRADE_TIMEOUT) {
                    Log('交易超时, 撤销订单' + oid + COLOR.RED);
                    cancelOrder(exchange, oid);
                    continue;
                }
                Sleep(250);
            }
        } else {
            return null;
        }
    }
}
$.OpenPos = function(direction, amount) {
    return trade(direction, amount);
};

$.ClosePos = function(direction, amount) {
    return trade('close' + direction, amount);
}

function main() {
    exchange.SetContractType('this_week');
    exchange.SetPrecision(PRICE_PRECISION, 0);
    Log($.OpenPos('buy', 2));
    $.OpenPos('sell', 1);
    $.ClosePos('buy', 1);
    $.ClosePos('buy', 1);
    $.ClosePos('sell', 1);
    Log(exchange.GetPosition());
}

Plus de

XMaxZone est une zoneLe montant de la subvention est calculé en fonction de l'évolution de l'activité de l'entreprise.

XMaxZone est une zoneUne fois que vous ouvrez un marché et que vous le replacez, cela indique que vous n'avez pas assez de positions.

les garde-corpsId: _.last ((tempOrders).Id Vous demandez s'il y a un problème?

Bth2020Comment ce modèle est-il référencé?