Sumber dimuat naik... memuat...

Pertukaran berbilang bursa saham yang berbeza strategi logik

Penulis:@cqz, Dicipta: 2022-06-27 21:26:27, Dikemas kini: 2024-12-02 21:35:44

img

Prinsip-prinsip strategi

Oleh kerana alasan kecairan, apabila pasaran mempunyai pergerakan harga besar, ia pasti akan menghasilkan turun naik harga yang besar, dan perbezaan harga akan terbentuk antara bursa, strategi adalah untuk menangkap proses pembelian rendah dan jual tinggi yang dilakukan dengan segera. Pelanggan bertanya mengapa saya membuat banyak bursa, ini adalah wajar, kita membuat perbezaan harga sesaat antara bursa, dan semakin banyak bursa, peluang harga yang terbentuk selepas persilangan pasti lebih besar.

Logika utama strategi
  1. Untuk mendapatkan maklumat transaksi pelbagai bursa secara serentak, anda mesti mengaksesnya secara serentak, mengurangkan kelewatan transaksi yang diperoleh, dan akses serentak ke plugin alat yang saya kongsikan.Plugin yang disambungkan ke pelbagai bursa
  2. Menggabungkan semua tawaran dan permintaan yang diperdagangkan oleh bursa untuk mendapatkan maklumat perbelanjaan yang digabungkan, di mana RealPrice adalah harga selepas mengurangkan yuran urus niaga.
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. Dari maklumat peredaran yang digabungkan, perhitungan perbezaan faedah yang paling banyak. Oleh kerana kita membeli satu, iaitu membeli dari harga paling rendah untuk meminta, dan menjual dari harga tertinggi untuk menawarkan, hanya jika bid.RealPrice > ask.RealPrice mempunyai ruang 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],
        });
    }
    //按最优价差排序
    ret.sort((a, b) => {
        return (b.Bid.RealPrice - b.Ask.RealPrice) - (a.Bid.RealPrice - a.Ask.RealPrice);
    });
    return ret;
}
  1. Di sini kita telah mendapat maklumat mengenai perbezaan harga yang boleh digunakan di pasaran, bagaimana untuk memilih sama ada untuk menjalankan perdagangan, dan berapa banyak perdagangan yang boleh dilakukan, berikut adalah beberapa perkara yang perlu dipertimbangkan:
  • Aset yang masih ada
  • Besarnya perbezaan harga (perbezaan harga yang terlalu kecil hanya menyamakan jumlah mata wang, harga yang cukup besar untuk memaksimumkan jumlah transaksi)
  • Jumlah pesanan yang dipotong
    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("启动交易所平衡!");
                }
            }
        } 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("启动货币迁移:", exchanges[bidOrder.Index].GetName(), "-->", exchanges[askOrder.Index].GetName());
                }
            }
        }
    }
  1. Menghitung jumlah pesanan yang akan dijalankan, strategi menggunakan cara makan pesanan secara langsung dengan menggeser titik
            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 tinggal adalah logik untuk mengira keuntungan, menangani perintah berhenti rugi yang gagal dan sebagainya.
Manfaat Strategi ini

img img img

Pada masa yang sama, ia menunjukkan bahawa logik teras tidak berubah dan menyokong multi-mata wang yang dioptimumkan.

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

Akhirnya, selamat datang untuk menyertai perkongsian kuantitatif:https://t.me/laoqiu_arbitrage


Berkaitan

Lebih lanjut

ianzeng123Ya, bagaimana parameter minTakerAmount ditetapkan?

Perempuan juga."Saya takut pasar raya kecil akan berlari".

Johnny.Pujian

h503059288Saya tidak mahu mengkritiknya.