Phân phối logic chiến lược đa sàn giao dịch Spread Spot Arbitration

Tác giả:Giấc mơ nhỏ, Tạo: 2022-07-12 17:20:06, Cập nhật: 2023-09-25 19:47:14

img

Nguyên tắc chiến lược

Do lý do thanh khoản, khi có một lượng lớn phá vỡ và kéo vào thị trường, chắc chắn sẽ có biến động giá lớn, và một sự khác biệt giá ngay lập tức sẽ được hình thành giữa các sàn giao dịch, và chiến lược là nắm bắt những khoảnh khắc này trong đó các giao dịch nhanh được thực hiện để hoàn thành quá trình mua thấp và bán cao. Một số khách hàng hỏi tôi tại sao tôi phải có rất nhiều trao đổi. Điều này là không thể tránh khỏi. Những gì chúng tôi kiếm được là sự khác biệt giá ngay lập tức giữa các sàn giao dịch.

Logic cốt lõi của chiến lược
  1. Để thu thập thông tin thị trường đa sàn giao dịch đồng thời, nó phải được thu thập đồng thời để giảm sự chậm trễ của thị trường thu được.Plug-in đồng thời đa trao đổi
  2. Kết hợp yêu cầu và cầu của tất cả các lệnh trao đổi để có được thông tin lệnh kết hợp, trong đó RealPrice là giá sau khi khấu trừ phí xử lý,
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. Tính toán chênh lệch chênh lệch tốt nhất từ thông tin thị trường kết hợp. Vì chúng tôi đang thực hiện lệnh, tức là mua từ giá thấp nhất yêu cầu và bán từ giá cao nhất đề nghị, miễn là bid.RealPrice > ask.RealPrice, có không gian cho lợi nhuận
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. Tại thời điểm này, chúng tôi đã có được thông tin về chênh lệch chênh lệch trên thị trường, vì vậy có một số điểm phán đoán về cách chọn có nên thực hiện giao dịch hay không và giao dịch bao nhiêu:
  • Tài sản còn lại hiện tại
  • Kích thước của chênh lệch (nếu chênh lệch quá nhỏ, chỉ số tiền tệ sẽ được cân bằng, và nếu chênh lệch đủ lớn, số lượng giao dịch sẽ được tối đa hóa)
  • Số lượng đơn đặt hàng đang chờ
    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. Sau khi tính toán số lượng lệnh được đặt, giao dịch có thể được thực hiện.
            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. Tất cả những gì còn lại là logic tính toán lợi nhuận, xử lý dừng lỗ trên các lệnh thất bại, v.v.
Lợi nhuận thực tế của chiến lược

img img img

Hiển thị bot thực hiện tại, logic cốt lõi vẫn không thay đổi, tối ưu hóa để hỗ trợ nhiều loại tiền tệ

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

Cuối cùng, xin chào tham gia thông báo trao đổi định lượng Laoqiu:https://t.me/laoqiu_arbitrage


Có liên quan

Thêm nữa