3
Подписаться
1444
Подписчики

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

Создано: 2023-12-24 21:37:45, Обновлено: 2023-12-26 15:40:23
comments   7
hits   5239

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

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

Недавно, когда я смотрел на рынок, я случайно обнаружил, что рынок STORJ, монеты на Binance, был очень странным. Объем торговли был очень большим, а частота торговли была очень быстрой. Конкретная минутная K-линия выглядит следующим образом. Вы можете видеть, что объем торгов за минуту довольно постоянен, а на минутной линии можно увидеть длинную нижнюю тень. Как использовать бездумных роботов-продавцов с помощью высокочастотной стратегии в 80 строках кода Наблюдая за 1-секундной линией K Binance, мы нашли подсказку. Кто-то продавал 10 000–20 000 STORJ каждые 5–7 секунд, независимо от стоимости, и напрямую попадал в небольшую дыру в линии K. Она восстановится внутри. Эта операция, очевидно, была инициирована роботом, заказанным Iceberg. Эта операция по продаже длилась очень долго, а общая сумма оценивалась в десятки миллионов долларов. Во многих случаях проскальзывание достигало 11000, что означает, что исполнитель этой стратегии потерял десятки тысяч долларов просто из-за проскальзывания транзакции. Доллар. Однако такие механические операции и активные транзакции создают очевидные возможности для маркет-мейкинга и скальпинга. Как использовать бездумных роботов-продавцов с помощью высокочастотной стратегии в 80 строках кода

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

Стратегическое мышление

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

Стратегия эффективности

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

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

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

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

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