Cómo explotar robots de venta sin cerebro con una estrategia de alta frecuencia en 80 líneas de código

El autor:- ¿ Por qué?, Creado: 2023-12-25 13:12:00, Actualizado: 2024-01-02 21:23:26

img

Observación de las oportunidades

Recientemente, descubrí que Binance tiene un mercado de moneda STORJ es muy extraño involuntariamente cuando estaba viendo el mercado, el volumen de operaciones es muy grande, y la frecuencia de operaciones es muy rápido, la línea específica de un minuto K del siguiente gráfico, podemos ver que el volumen de operaciones de cada minuto son consistentes, y el minuto K-línea se puede ver en una larga línea de sombra inferior.

img

Observe con Binance 1-segundo K-line, descubrí el final de la historia, alguien se comercializa 10.000-20.000 STORJs cada 5-7s, independientemente del costo, y rompiendo un pequeño agujero en la línea K directamente, mientras que el precio se recupera a corto plazo. Esta operación fue obviamente causada por un robot en una comisión de iceberg. Esta operación de venta duró durante un tiempo muy largo, estimando un nivel de $ 10 millones, y en muchos casos causó un deslizamiento de hasta el 0,1%, lo que significa que el ejecutor de esta estrategia perdió decenas de miles de dólares en deslizamiento solo en el comercio. Pero con una operación tan mecánica y una negociación activa, había una clara oportunidad para hacer scalping en el mercado.

img

Un simple cambio a la estrategia original spot HF, y en unos minutos tengo este bot que se especializa en la explotación de esta venta sin cerebro de comisiones de iceberg.

Idea de estrategia

Dado que el mercado vende al precio de mercado cada pocos segundos, solo necesitamos encontrar la profundidad de 10k en el libro de órdenes de compra y colgar la orden delante de él. Para que cuando el iceberg venda, una alta probabilidad de que el robot de creación de mercado pueda recibir, y en este momento la transacción esté muy activa, la disminución momentánea del precio también desencadenó algunas órdenes de compra. Por la misma razón, las órdenes de venta colgantes pueden lanzarse en la tendencia, por lo que las operaciones repetidas. La frecuencia de las transacciones es muy alta, incluso si cada vez que el rendimiento no es bastante grande, el rendimiento total también es sustancial. Por supuesto, la premisa de todo es tener una cuenta de tarifas bajas, si las tarifas de compra y venta son del 0,1%, entonces el espacio no es suficiente para pagar las tarifas.

Desempeño de la estrategia

La estrategia funciona de la siguiente manera, al principio, ninguna de las ganancias se imprimía, así que la cambié esta tarde, e imprimí las ganancias, los robots de venta locos han cambiado el volumen a alrededor de 5000 a la vez, por lo que ha pasado el momento óptimo para el arbitraje. Probablemente estoy haciendo 100-200U por hora al principio, la clave es libre de riesgo y bajo costo. Por otro lado, la comisión del iceberg realmente tiene muchas habilidades, si sabes cómo escribir una estrategia, puedes pasar diez minutos en FMZ para escribir la estrategia de la comisión del iceberg que observa la profundidad de la orden de compra para decidir el tamaño y el precio de la orden, observa el tamaño de la orden de compra activa para ajustar el tamaño de la orden pendiente y tomar el mercado y otras características de monitoreo, ahorrando decenas de miles de dólares de monitoreo fácilmente.

img

Código fuente de la estrategia

El código de la estrategia es muy simple, sólo 80 líneas, que es adecuado para principiantes, aquí están algunos de los parámetros tales como precisión de orden y así sucesivamente escrito fijo en el programa, se puede cambiar los parámetros de la siguiente manera.

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()
    }
}

Más.