Tài nguyên đang được tải lên... tải...

Nhiều sàn giao dịch chia sẻ chiến lược hợp lý

Tác giả:@cqz, Tạo: 2022-06-27 21:26:27, Cập nhật: 2023-09-18 19:44:32

img

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

Vì lý do tính năng lỏng lẻo, khi thị trường có sự biến động giá lớn, sự chênh lệch giá sẽ hình thành ngay lập tức giữa các sàn giao dịch. Chiến lược là để nắm bắt các quá trình thực hiện các giao dịch nhanh chóng để hoàn thành việc mua và bán thấp. Có một khách hàng hỏi tôi tại sao tôi phải chọn nhiều sàn giao dịch, điều này là không thể tránh khỏi, chúng tôi chọn chênh lệch giá ngay lập tức giữa các sàn giao dịch, và càng nhiều sàn giao dịch, cơ hội chênh lệch giá hình thành sau khi giao dịch sẽ càng lớn.

Logic cơ bản của chiến lược
  1. Tương tự như việc truy cập thông tin giao dịch của nhiều sàn giao dịch, phải truy cập đồng thời, giảm sự chậm trễ giao dịch, truy cập đồng thời các tiện ích plugin mà tôi đã chia sẻ.Plugin đồng bộ đa sàn giao dịch
  2. Kết hợp tất cả các giao dịch mua và bán trên các sàn giao dịch để có được một thông tin giao dịch được kết hợp, trong đó RealPrice là giá sau khi khấu trừ chi phí giao dịch.
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ừ thông tin giao dịch kết hợp, tính toán chênh lệch tỷ lệ lãi suất cao nhất. Vì chúng ta là người mua, tức là mua từ giá thấp nhất, bán từ giá cao nhất, miễn là bid.RealPrice > ask.RealPrice có không gian 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],
        });
    }
    //按最优价差排序
    ret.sort((a, b) => {
        return (b.Bid.RealPrice - b.Ask.RealPrice) - (a.Bid.RealPrice - a.Ask.RealPrice);
    });
    return ret;
}
  1. Ở đây, chúng ta đã có được thông tin về sự chênh lệch tỷ lệ lãi suất trong thị trường, làm thế nào để lựa chọn hoặc không thực hiện giao dịch, và số lượng giao dịch ít nhất, đây là một số điểm để phán đoán:
  • Tài sản còn lại hiện tại
  • Giá chênh lệch lớn (giá chênh lệch quá nhỏ chỉ cân bằng số tiền, giá chênh lệch đủ lớn để tối đa hóa số lượng giao dịch)
  • Số lượng đơn hàng bị treo
    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. Tính toán số lượng đơn đặt hàng để thực hiện giao dịch, chiến lược sử dụng cách ăn đơn trực tiếp bằng điểm trượt để đặt hàng cùng một lúc
            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. Điều còn lại là tính toán lợi nhuận, xử lý lệnh dừng lỗ thất bại và những thứ khác.
Chiến lược này mang lại lợi ích thực tế

img img img

Hiện tại, các bản đồ thực hiện cho thấy, logic cốt lõi 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, hãy cùng tham gia vào cuộc trao đổi định lượng của Old Autumn:https://t.me/laoqiu_arbitrage


Có liên quan

Thêm nữa

Ianzeng123Hiểu được cách đặt parameter minTakerAmount

Cô dâu cũng vậy.Một số người cho rằng, việc này có thể gây ra sự bất ổn trong thị trường.

Johnny.Tôn vinh

H503059288Tác giả của bài viết này là Kim Hyung-min.