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

Auteur:Je ne sais pas., Créé: 2023-12-25 13:12:00, mis à jour: 2024-01-02 21:23:26

img

Observation des opportunités

Récemment, j'ai découvert que Binance a un marché de monnaie STORJ est très étrange involontairement quand je regardais le marché, le volume de négociation est très grand, et la fréquence de négociation est très rapide, la ligne K spécifique d'une minute du graphique suivant, nous pouvons voir que le volume de négociation de chaque minute sont cohérents, et la ligne K minute peut être vu dans une longue ligne d'ombre inférieure.

img

Observez avec Binance 1-seconde K-line, j'ai découvert la fin de l'histoire, quelqu'un est commercialisé 10 000-20 000 STORJs tous les 5-7s, indépendamment du coût, et brisant un petit trou dans la ligne K directement, tandis que le prix se rétablit à court terme. Cette opération a été évidemment causée par un robot sur une commission d'iceberg. Cette opération de vente a duré très longtemps, totalisant un niveau estimé à 10 millions de dollars, et dans de nombreux cas a causé un glissement allant jusqu'à 0,1%, ce qui signifie que l'exécuteur de cette stratégie a perdu des dizaines de milliers de dollars en glissement sur le commerce seulement. Mais avec une telle opération mécanique et un trading actif, il y avait une opportunité claire de faire du scalping sur le marché.

img

Un simple changement à la stratégie HF spot d'origine, et en quelques minutes j'ai eu ce bot qui se spécialise dans l'exploitation de cette vente stupide de commissions d'iceberg.

Idée de stratégie

Puisque le marché vend au prix du marché toutes les quelques secondes, nous avons juste besoin de trouver la profondeur de 10k dans le carnet d'ordres d'achat et accrocher l'ordre devant elle. Ainsi, lorsque l'iceberg vend, une forte probabilité que le robot de fabrication de marché peut simplement recevoir, et à ce moment-là, la transaction est très active, la baisse momentanée du prix a également déclenché certains ordres d'achat. De la même manière, les ordres de vente suspendus peuvent être jetés dans la tendance, donc des opérations répétées. La fréquence des transactions est très élevée, même si chaque fois le rendement n'est pas assez grand, le rendement total est également substantiel. Bien sûr, la prémisse de tout est d'avoir un compte à faible frais, si les frais d'achat et de vente sont à la fois 0,1%, l'espace n'est pas suffisant pour payer les frais.

Résultats de la stratégie

La stratégie fonctionne comme suit, au début, aucun des bénéfices n'était imprimé, alors je l'ai changé cet après-midi, et j'ai imprimé les bénéfices, les robots de vente fous ont changé le volume à environ 5000 à la fois, donc c'est passé le moment optimal pour l'arbitrage. Je fais probablement 100-200U par heure au début, la clé est sans risque et à faible coût. D'un autre côté, la commission de l'iceberg a en fait beaucoup de compétences, si vous savez écrire une stratégie, vous pouvez passer dix minutes sur FMZ pour écrire la stratégie de la commission de l'iceberg qui observe la profondeur de l'ordre d'achat pour décider de la taille et du prix de l'ordre, observe la taille de l'ordre d'achat actif pour ajuster la taille de l'ordre en attente et prendre le marché et d'autres caractéristiques de surveillance, économisant facilement des dizaines de milliers de dollars.

img

Code source de la stratégie

Le code de la stratégie est très simple, seulement 80 lignes, qui convient aux débutants, voici quelques-uns des paramètres tels que la précision de l'ordre et ainsi de suite écrit fixé dans le programme, vous pouvez modifier les paramètres comme suit.

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 //Subtract your own pending orders here
        }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) //Guaranteed at the market
    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
var log_account_time = 0
function main() {
    CancelPendingOrders()
    while (true) {
        OnTick()
    }
}

Plus de