Multi-Exchange Spot Spread Arbitrage Strategi Logic Sharing

Penulis:Mimpi kecil, Dibuat: 2022-07-12 17:20:06, Diperbarui: 2023-09-25 19:47:14

img

Prinsip-prinsip strategi

Karena alasan likuiditas, ketika ada sejumlah besar menghancurkan dan menarik di pasar, pasti akan ada fluktuasi harga yang besar, dan perbedaan harga instan akan terbentuk antara bursa, dan strategi adalah untuk menangkap saat-saat di mana perdagangan cepat dilaksanakan untuk menyelesaikan proses membeli rendah dan menjual tinggi. Beberapa klien bertanya kepada saya mengapa saya harus mendapatkan begitu banyak pertukaran. Ini tidak dapat dihindari. Apa yang kita dapatkan adalah perbedaan harga instan antara pertukaran. Semakin banyak pertukaran, semakin banyak peluang untuk perbedaan harga yang terbentuk setelah crossover.

Logika inti dari strategi
  1. Untuk memperoleh informasi pasar multi-exchange secara bersamaan, informasi pasar multi-exchange harus diperoleh secara bersamaan untuk mengurangi keterlambatan pasar yang diperoleh.Multi-Exchange Simultaneous Plug-in
  2. Gabungkan permintaan dan penawaran dari semua pesanan pertukaran untuk mendapatkan informasi pesanan gabungan, di mana RealPrice adalah harga setelah mengurangi biaya penanganan,
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. Menghitung spread arbitrage terbaik dari informasi pasar gabungan. Karena kita mengambil pesanan, yaitu, membeli dari harga paling rendah meminta dan menjual dari harga penawaran tertinggi, selama bid.RealPrice > ask.RealPrice, ada 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 titik ini, kami telah memperoleh informasi tentang spread arbitrage di pasar, sehingga ada beberapa poin penilaian tentang bagaimana memilih apakah akan melakukan perdagangan dan berapa banyak untuk perdagangan:
  • Aktif yang tersisa saat ini
  • Ukuran spread (jika spread terlalu kecil, hanya jumlah mata uang yang akan diseimbangkan, dan jika spread cukup besar, jumlah perdagangan akan dimaksimalkan)
  • Jumlah pesanan yang sedang menunggu
    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. Setelah menghitung jumlah order yang akan ditempatkan, transaksi dapat dieksekusi.
            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. Yang tersisa adalah logika menghitung pengembalian, menangani stop loss pada pesanan yang gagal, dan sebagainya.
Keuntungan sebenarnya dari strategi

img img img

Tampilan bot nyata saat ini, logika inti tetap tidak berubah, dioptimalkan untuk mendukung beberapa mata uang

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

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


Berkaitan

Lebih banyak