Как использовать бесмозговых роботов с высокочастотной стратегией в 80 строках кода

Автор:Лидия., Создано: 2023-12-25 13:12:00, Обновлено: 2024-01-02 21:23:26

img

Наблюдение за возможностями

Недавно я обнаружил, что Binance имеет валютный рынок STORJ очень странно непреднамеренно, когда я наблюдал за рынком, объем торговли очень большой, и частота торговли очень быстрая, конкретная одна-минутная линия K следующего графика, мы можем видеть, что объем торговли каждой минуты являются последовательными, и минуты K-линия может быть замечена в длинной нижней линии тени.

img

Посмотрите на Binance 1-секундную K-линию, я узнал конец истории, кто-то продает 10 000-20 000 STORJ каждые 5-7 с, независимо от стоимости, и разбивает небольшую дыру в K-линии непосредственно, в то время как цена восстанавливается в краткосрочной перспективе. Эта операция была, очевидно, вызвана роботом на айсберге комиссии. Эта операция продажи длилась очень долго, в общей сложности на уровне 10 миллионов долларов, и во многих случаях вызвала скольжение до 0,1%, что означает, что исполнитель этой стратегии потерял десятки тысяч долларов в скольжении только на торговле. Но с такой механической операцией и активной торговлей, была явная возможность для рыночного скальпирования.

img

Простое изменение к первоначальной стратегии HF, и через несколько минут у меня появился бот, который специализируется на использовании этой безмозговой продажи айсбергов.

Идея стратегии

Поскольку рынок продает по рыночной цене каждые несколько секунд, нам просто нужно найти глубину 10k в книге заказов на покупку и повесить заказ перед ней. Так что когда айсберг продает, высокая вероятность того, что робот, производящий рынок, просто может получить, и в это время транзакция очень активна, кратковременное снижение цены также вызвало некоторые заказы на покупку. По той же причине, заказы на продажу могут быть брошены в тренд, так что повторяющиеся операции. Частота транзакций очень высока, даже если каждый раз доходность не очень велика, общая доходность также существенна. Конечно, предпосылка всего заключается в том, чтобы иметь счет с низкой платой, если как покупка, так и продажа сборов составляют 0,1%, то места недостаточно, чтобы оплатить сборы.

Выполнение стратегии

Стратегия работает следующим образом, сначала ни одна из прибылей не печаталась, поэтому я изменил ее сегодня днем, и распечатал прибыль, сумасшедшие роботы продажи изменили объем примерно до 5000 за раз, так что это прошло оптимальное время для арбитража. Я, вероятно, зарабатываю 100-200U в час вначале, ключ - это безопасность и низкая стоимость. С другой стороны, комиссионная айсберга на самом деле имеет много навыков, если вы знаете, как писать стратегию, вы можете потратить десять минут на FMZ, чтобы написать комиссионную айсберг, которая наблюдает глубину ордера покупки, чтобы решить размер и цену ордера, наблюдает размер активного ордера покупки, чтобы скорректировать размер ожидающего ордера и взять рынок и другие характеристики, легко экономия десятки тысяч долларов от мониторинга.

img

Исходный код стратегии

Стратегический код очень прост, всего 80 строк, который подходит для новичков, вот некоторые из параметров, таких как точность заказа и так далее, написанные фиксированы в программе, вы можете изменить параметры следующим образом. Рекомендуется сохранить его, в случае любой биржевой торговых пар или трейдеры выходят из-под контроля, вы можете свободно взимать с них некоторые проценты в любое время.

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

Больше