Comment exploiter les robots sans cerveau pour les vendre avec une stratégie de haute fréquence de 80 lignes de code

Auteur:Le foin, Créé à partir de:

img

L'occasion de voir

Ces deux derniers jours, en regardant le marché, j'ai découvert par hasard que Binance avait un marché Bitcoin STORJ. C'est étrange, le volume des transactions est très important et la fréquence des transactions est très rapide.imgL'observation de la ligne K de 1 seconde du Binance montre que les dérivés sont détectés: une personne creuse un trou directement sur la ligne K à raison de 20 000 STORJ à intervalles de 5 à 7 s, sans tenir compte des coûts, et le prix se redresse à court terme. L'opération est apparemment causée par un robot commandé par un iceberg.img

En quelques minutes, le robot spécialisé dans l'exploitation de cette bêtise de vendeur d'iceberg a réussi à modifier sa stratégie de haute fréquence instantanée.

L'idée stratégique

Puisque le prix du marché est vendu toutes les quelques secondes, nous n'avons qu'à trouver 10 000 profondeurs dans le carnet de commandes et à accrocher le bloc à l'avant. Ainsi, lors de la vente de cet iceberg, il y a de fortes chances que le robot du marché puisse recevoir, et les transactions sont très actives à ce moment-là, la chute instantanée des prix a également déclenché des commandes.

Les performances stratégiques

La stratégie est la suivante: au début, les bénéfices n'étaient pas imprimés, cet après-midi, ils ont été modifiés, les bénéfices ont été imprimés, le robot de vente folle a modifié la quantité de chaque fois pour environ 5000, donc la période de l'optimisation est passée. Au début, vous pouvez probablement faire 100-200U par heure, la clé est sans risque et peu coûteux.

img

Le code source de la stratégie

Le code de la stratégie est très simple, seulement 80 lignes. Pour les débutants, certains paramètres, tels que la précision, sont déjà écrits dans le programme et peuvent être modifiés par vous-même.img

function CancelPendingOrders() {
    var orders = _C(exchange.GetOrders)
    for (var j = 0; j < orders.length; j++) {
        exchange.CancelOrder(orders[j].Id, orders[j])
    }
}

function onexit(){
    CancelPendingOrders()
}

function GetPrice(Type, Depth) {
    var sumAmount = 0
    var checkAmount = Type == "Buy" ? CheckBuyAmount : CheckSellAmount
    var deep = Type == "Buy" ? Depth.Bids : Depth.Asks
    for(var i = 0; i < Math.min(20, deep.length); i++) {
        if(Type == "Buy"  && deep[i].Price == lastBuyPrice && buyId){
            sumAmount += deep[i].Amount - amountBuy //这里要减去自己的挂单
        }else if(Type == "Sell"  && deep[i].Price == lastSellPrice && sellId){
            sumAmount += deep[i].Amount - amountSell
        }else{
            sumAmount += deep[i].Amount
        }
        if(sumAmount >= checkAmount){
            return deep[i].Price
        }
    }
    return deep[19].Price
}

function OnTick() {
    var depth = _C(exchange.GetDepth)
    var buyPrice = _N(Math.min(GetPrice("Buy", depth) + 0.0001, depth.Asks[0].Price-0.0001) , 4) //保证在盘口
    var sellPrice = _N(Math.max(GetPrice("Sell", depth) - 0.0001, depth.Bids[0].Price+0.0001), 4)
    LogStatus('buy_price:'+buyPrice, '  sell price: '+sellPrice)
    if ((sellPrice - buyPrice) < DiffPrice) {
        buyPrice = 0
    }
    if(sellPrice != lastSellPrice && sellId){
        exchange.CancelOrder(sellId);
        sellId = 0
        lastSellPrice = 0
    }
    if(buyPrice != lastBuyPrice && buyId){
        exchange.CancelOrder(buyId);
        buyId = 0
        lastBuyPrice = 0
    }   
    var acc = _C(exchange.GetAccount)
    if(account.Stocks+account.FrozenStocks != acc.Stocks+acc.FrozenStocks){
        LogProfit((acc.Stocks+acc.FrozenStocks)*depth.Bids[0].Price+acc.Balance+acc.FrozenBalance - 2000)
        Log('free '+acc.Stocks, ' lock: '+ acc.FrozenStocks, ' total: ' , (acc.Stocks+acc.FrozenStocks)*depth.Bids[0].Price+acc.Balance+acc.FrozenBalance)
    }
    account = acc
    amountBuy = _N(Math.min(account.Balance / buyPrice - 0.1, Amount), 0)
    amountSell = _N(account.Stocks, 0)
    if (sellPrice > 0 && amountSell > 40 && sellId == 0) {
        sellId = exchange.Sell(_N(sellPrice,4), amountSell)
        lastSellPrice = sellPrice
    }
    if (buyPrice>0 && amountBuy > 40 && buyId == 0) {
        buyId = exchange.Buy(_N(buyPrice,4), amountBuy)
        lastBuyPrice = buyPrice
    }
    Sleep(Interval)
}
var account = {Stocks:0, FrozenStocks:0, Balance:0, FrozenBalance:0}
var buyId = 0
var sellId = 0
var lastBuyPrice = 0
var lastSellPrice = 0
var amountSell = 0
var amountBuy = 0
function main() {
    CancelPendingOrders()
    while (true) {
        OnTick()
    }
}

Plus de

point de contrôleMon Dieu, combien ça coûte de courir?

yc123hS'il vous plaît, professeur, si cette stratégie est en vigueur, est-ce que c'est au début de chaque tour que vous voyez souvent les deux messages d'échec des commandes précédentes à la révocation (c'est-à-dire que les bons de vente sont en vigueur) qui indiquent que la stratégie est efficace?

Le foinC'est une facture nulle.

yc123hMerci, je voudrais aussi vous poser une question sur les paramètres. Comme cette stratégie de haute fréquence, comment optimiser les paramètres. Par exemple, j'ai vu la stratégie que vous avez partagée en 2014, l'intervalle de formation par défaut atteint 3500 ms. Si c'est une fréquence élevée, l'intervalle de formation par défaut ne devrait-il pas être un peu plus court?

Le foinL'échec de la révocation est une transaction, et gagner de l'argent pour prouver qu'elle fonctionne