7
tập trung vào
350
Người theo dõi

Chia sẻ logic của chiến lược chênh lệch giá giao ngay trên nhiều sàn giao dịch

Được tạo ra trong: 2022-06-27 21:26:27, cập nhật trên: 2024-12-02 21:35:44
comments   4
hits   9491

Chia sẻ logic của chiến lược chênh lệch giá giao ngay trên nhiều sàn giao dịch

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

Do lý do thanh khoản, khi có lượng bán hoặc kéo lớn trên thị trường, chắc chắn sẽ có biến động giá lớn và sẽ có chênh lệch giá tạm thời giữa các sàn giao dịch. Chiến lược là nắm bắt những khoảnh khắc này và thực hiện giao dịch nhanh để hoàn tất quá trình mua vào giá thấp và bán ra giá cao. Một số khách hàng hỏi tôi tại sao tôi có nhiều sàn giao dịch như vậy. Đây là điều không thể tránh khỏi. Chúng tôi kiếm tiền từ chênh lệch giá tức thời giữa các sàn giao dịch. Càng có nhiều sàn giao dịch, sẽ càng có nhiều cơ hội chênh lệch giá sau khi giao cắt.

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

Chia sẻ logic của chiến lược chênh lệch giá giao ngay trên nhiều sàn giao dịch Chia sẻ logic của chiến lược chênh lệch giá giao ngay trên nhiều sàn giao dịch Chia sẻ logic của chiến lược chênh lệch giá giao ngay trên nhiều sàn giao dịch

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

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

Cuối cùng, chào mừng bạn tham gia Sàn giao dịch định lượng Laoqiu: https://t.me/laoqiu_arbitrage