Multi-Exchange Spot Spread Arbitrage Strategy Perkongsian Logik

Penulis:Mimpi kecil, Dicipta: 2022-07-12 17:20:06, Dikemas kini: 2023-09-25 19:47:14

img

Prinsip-prinsip strategi

Oleh kerana alasan kecairan, apabila terdapat sejumlah besar menghancurkan dan menarik di pasaran, pasti akan ada turun naik harga yang besar, dan perbezaan harga serta-merta akan terbentuk di antara bursa, dan strategi adalah untuk menangkap saat-saat ini di mana perdagangan cepat dilaksanakan untuk menyelesaikan proses membeli rendah dan menjual tinggi. Beberapa pelanggan bertanya kepada saya mengapa saya perlu mendapatkan begitu banyak pertukaran. Ini tidak dapat dielakkan. Apa yang kita perolehi adalah perbezaan harga serta-merta antara pertukaran. Semakin banyak pertukaran, semakin banyak peluang untuk perbezaan harga yang terbentuk selepas persilangan.

Logik asas strategi
  1. Untuk mendapatkan maklumat pasaran pelbagai bursa secara serentak, ia mesti diperoleh secara serentak untuk mengurangkan kelewatan pasaran yang diperoleh.Multi-Exchange Simultaneous Plug-in
  2. Gabungkan permintaan dan tawaran semua pesanan pertukaran untuk mendapatkan maklumat pesanan gabungan, di mana RealPrice adalah harga selepas mengurangkan yuran pengendalian,
function createOrders(depths, askOrders, bidOrders) {
    let asksIndex = 0;
    let bidIndex = 0;
    for (let i = 0; i < depths.length; i++) {
        let exchangeTariff = getExchangeTariff(i);
        let asks = depths[i].Asks;
        let bids = depths[i].Bids;
        for (let j = 0; j < Math.min(asks.length, bids.length, 20); j++) {
            if (asks[j].Amount >= minTakerAmount) {
                askOrders[asksIndex] = {
                    "Price": asks[j].Price,
                    "Amount": asks[j].Amount,
                    "Fee": asks[j].Price * exchangeTariff,
                    "RealPrice": asks[j].Price * (1 + exchangeTariff),
                    "Index": i,
                };
                asksIndex++;
            }
            if (bids[j].Amount >= minTakerAmount) {
                bidOrders[bidIndex] = {
                    "Price": bids[j].Price,
                    "Amount": bids[j].Amount,
                    "Fee": bids[j].Price * exchangeTariff,
                    "RealPrice": bids[j].Price * (1 - exchangeTariff),
                    "Index": i,
                };
                bidIndex++;
            }
        }
    }
    askOrders.sort(function (a, b) {
        return a.RealPrice - b.RealPrice;
    });
    bidOrders.sort(function (a, b) {
        return b.RealPrice - a.RealPrice;
    });
}
  1. Mengira penyebaran arbitraj terbaik dari gabungan maklumat pasaran. Oleh kerana kita mengambil pesanan, iaitu, membeli dari harga yang paling rendah meminta dan menjual dari harga tawaran tertinggi, selagi bid.RealPrice > ask.RealPrice, terdapat ruang untuk keuntungan
function getArbitrageOrders(askOrders, bidOrders) {
    let ret = [];
    for (let i = 0; i < askOrders.length; i++) {
        for (let j = 0; j < bidOrders.length; j++) {
            let bidOrder = bidOrders[j];
            let askOrder = askOrders[i];
            if (bidOrder.Index === askOrder.Index) {
                continue
            }
            let minMigrateDiffPrice = ((askOrder.Price + bidOrder.Price) / 2 * minMigrateDiffPricePercent / 100);
            if (bidOrder.RealPrice - askOrder.RealPrice > minMigrateDiffPrice) {
                ret.push({
                    "Ask": askOrder,
                    "Bid": bidOrder,
                })
            }
        }
    }
    if (ret.length === 0) {
        ret.push({
            "Ask": askOrders[0],
            "Bid": bidOrders[0],
        });
    }
    //Sort by best spread
    ret.sort((a, b) => {
        return (b.Bid.RealPrice - b.Ask.RealPrice) - (a.Bid.RealPrice - a.Ask.RealPrice);
    });
    return ret;
}
  1. Pada ketika ini, kita telah memperoleh maklumat mengenai penyebaran arbitrase di pasaran, jadi terdapat beberapa titik pertimbangan mengenai cara memilih sama ada untuk melaksanakan perdagangan dan berapa banyak untuk berdagang:
  • Aktif selebihnya semasa
  • Saiz penyebaran (jika penyebaran terlalu kecil, hanya jumlah mata wang akan diseimbangkan, dan jika penyebaran cukup besar, jumlah perdagangan akan dimaksimumkan)
  • Bilangan pesanan yang belum selesai
    var askOrder = arbitrageOrder.Ask;
    var bidOrder = arbitrageOrder.Bid;
    var perAmountFee = arbitrageOrder.Ask.Fee + arbitrageOrder.Bid.Fee;
    var minRealDiffPrice = (askOrder.Price + bidOrder.Price) / 2 * minDiffPricePercent / 100;
    var minMigrateDiffPrice = ((askOrder.Price + bidOrder.Price) / 2 * minMigrateDiffPricePercent / 100);
    var curRealDiffPrice = arbitrageOrder.Bid.RealPrice - arbitrageOrder.Ask.RealPrice;
    var buyExchange = exchanges[arbitrageOrder.Ask.Index];
    var sellExchange = exchanges[arbitrageOrder.Bid.Index];
    var buySellAmount = 0;
    if (curRealDiffPrice > minRealDiffPrice) {
        buySellAmount = math.min(
            bidOrder.Amount,
            askOrder.Amount,
            maxTakerAmount,
            runningInfo.Accounts[bidOrder.Index].CurStocks,
            runningInfo.Accounts[askOrder.Index].CurBalance / askOrder.Price
        );
    } else if (bidOrder.Index !== askOrder.Index) {
        if (migrateCoinEx == -1) {
            if (curRealDiffPrice > minMigrateDiffPrice && runningInfo.Accounts[bidOrder.Index].CurStocks - runningInfo.Accounts[askOrder.Index].CurStocks > maxAmountDeviation) {
                buySellAmount = math.min(
                    bidOrder.Amount,
                    askOrder.Amount,
                    maxTakerAmount,
                    runningInfo.Accounts[bidOrder.Index].CurStocks,
                    runningInfo.Accounts[askOrder.Index].CurBalance / askOrder.Price,
                    runningInfo.Accounts[bidOrder.Index].CurStocks - ((runningInfo.Accounts[bidOrder.Index].CurStocks + runningInfo.Accounts[askOrder.Index].CurStocks) / 2)
                );
                if (buySellAmount >= minTakerAmount) {
                    Log("Start exchange balancing!");
                }
            }
        } else if (migrateCoinEx == askOrder.Index) {
            if (curRealDiffPrice > minMigrateDiffPrice && runningInfo.Accounts[bidOrder.Index].CurStocks > 0) {
                buySellAmount = math.min(
                    bidOrder.Amount,
                    askOrder.Amount,
                    maxTakerAmount,
                    runningInfo.Accounts[bidOrder.Index].CurStocks,
                    runningInfo.Accounts[askOrder.Index].CurBalance / askOrder.Price
                );
                if (buySellAmount >= minTakerAmount) {
                    Log("Initiate currency migration:", exchanges[bidOrder.Index].GetName(), "-->", exchanges[askOrder.Index].GetName());
                }
            }
        }
    }
  1. Selepas mengira bilangan pesanan yang akan diletakkan, transaksi boleh dilaksanakan. Strategi ini menggunakan kaedah menambah langsung slippage dan mengambil pesanan pada masa yang sama
            var buyWait = buyExchange.Go("Buy", _N(askOrder.Price * (1.01), pricePrecision), buySellAmount);
            var sellWait = sellExchange.Go("Sell", _N(bidOrder.Price * (0.99), pricePrecision), buySellAmount);
            var startWaitTime = new Date().getTime()
            Sleep(3000);
            var buyOrder = buyWait.wait()
            var sellOrder = sellWait.wait()
  1. Semua yang tinggal adalah logik mengira pulangan, mengendalikan kehilangan berhenti pada pesanan gagal, dan sebagainya.
Keuntungan sebenar strategi

img img img

Paparan bot sebenar semasa, logik teras kekal tidak berubah, dioptimumkan untuk menyokong pelbagai mata wang

https://www.fmz.com/robot/464965

Akhirnya, selamat datang untuk menyertai Komunikasi Pertukaran Kuantitatif Laoqiu:https://t.me/laoqiu_arbitrage


Berkaitan

Lebih lanjut