Покупательский контракт "Айсберг"

Автор:Нуль, Дата: 2014-07-24 14:39:00
Тэги:Помощь в торговлеАйсберг

Гигантские поручения обозначают то, что инвесторы при проведении крупных сделок, чтобы избежать чрезмерного воздействия на рынок, автоматически распадают большие поручения на несколько поручений, автоматически выполняют небольшие поручения в соответствии с текущей последней ценой покупки/продажи и ценовой стратегией, установленной клиентом, автоматически возобновляют поручения, когда предыдущий поручение полностью выполнено или последней ценой значительно отклоняется от текущей цены поручения. Примеры: Если число плавающих точек с однократным средним значением установлено на 10, то: Количество каждого поручения составляет от 90% до 110% от его среднего единовременного объема поручения. Цена поручения составляет 1* (длина поручения - 1) последней покупки, после чего новый поручение выполняется после того, как все сделки предыдущего поручения были завершены, после чего последней сделки автоматически отменяется и переназначается, когда цена последней сделки превышает глубину поручения. Заказ прекращается, когда общий объем стратегических сделок равен его общему количеству поручений. Заказ прекращается, когда цена последней сделки на рынке выше ее максимальной покупной цены, а заказ возобновляется после того, как последняя сделка снова выполняется ниже максимальной покупной цены.




function CancelPendingOrders() {
    while (true) {
        var orders = _C(exchange.GetOrders);
        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);
            }
        }
    }
}

var LastBuyPrice = 0;
var InitAccount = null;

function dispatch() {
    var account = null;
    var ticker = _C(exchange.GetTicker);
    // 在最新成交价格距离该笔委托超过委托深度*2时自动撤单并重新进行委托
    if (LastBuyPrice > 0) {
        // 订单没有完成
        if (_C(exchange.GetOrders).length > 0) {
            if (ticker.Last > LastBuyPrice && ((ticker.Last - LastBuyPrice) / LastBuyPrice) > (2*(EntrustDepth/100))) {
                Log('偏离过多, 最新成交价:', ticker.Last, '委托价', LastBuyPrice);
                CancelPendingOrders();
            } else {
                return true;
            }
        } else {
            account = _C(exchange.GetAccount);
            Log("买单完成, 累计花费:", _N(InitAccount.Balance - account.Balance), "平均买入价:", _N((InitAccount.Balance - account.Balance) / (account.Stocks - InitAccount.Stocks)));
        }
        LastBuyPrice = 0;
    }
    
    
    // 委托价格为最新买1价*(1-委托深度)
    var BuyPrice = _N(ticker.Buy * (1 - EntrustDepth/100));
    if (BuyPrice > MaxBuyPrice) {
        return true;
    }
    
    if (!account) {
        account = _C(exchange.GetAccount);
    }


    if ((InitAccount.Balance - account.Balance) >= TotalBuyNet) {
        return false;
    }
    
    var RandomAvgBuyOnce = (AvgBuyOnce * ((100 - FloatPoint) / 100)) + (((FloatPoint * 2) / 100) * AvgBuyOnce * Math.random());
    var UsedMoney = Math.min(account.Balance, RandomAvgBuyOnce, TotalBuyNet - (InitAccount.Balance - account.Balance));
    
    var BuyAmount = _N(UsedMoney / BuyPrice);
    if (BuyAmount < MinStock) {
        return false;
    }
    LastBuyPrice = BuyPrice;
    exchange.Buy(BuyPrice, BuyAmount, '花费: ', _N(UsedMoney), '上次成交价', ticker.Last);
    return true;
}

function main() {
    if (exchange.GetName().indexOf('Futures_') != -1) {
        throw "只支持现货";
    }
    CancelPendingOrders();
    InitAccount = _C(exchange.GetAccount);
    Log(InitAccount);
    if (InitAccount.Balance < TotalBuyNet) {
        throw "账户余额不足";
    }
    LoopInterval = Math.max(LoopInterval, 1);
    while (dispatch()) {
        Sleep(LoopInterval * 1000);
    }
    Log("委托全部完成", _C(exchange.GetAccount));
}


Связанные

Больше