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

Chiến lược mua lại và theo dõi tỷ lệ tài trợ FMZ

Tác giả:FMZ~Lydia, Tạo: 2024-11-04 14:54:42, Cập nhật: 2024-11-15 09:54:33

img

Chiến lược mua lại và giám sát tỷ lệ tài trợ tương lai đa nền tảng

Mô tả:

Chiến lược này được sử dụng để thu thập và theo dõi tỷ lệ tài trợ từ nhiều nền tảng tương lai như OKCoin, Binance, Bitget, vv. Nó thăm dò thị trường hợp đồng vĩnh cửu của các sàn giao dịch khác nhau thông qua các luồng song song và thu thập dữ liệu tỷ lệ tài trợ, trong khi sử dụng một cơ chế trì hoãn để tối ưu hóa tần suất yêu cầu.

Bài viết này thực hiện một số thay đổi cho chiến lược để hỗ trợ hiển thị và hỗ trợ các chức năng đẩy báo động tỷ lệ.

Địa chỉ nguồn mở:https://www.fmz.com/strategy/470345

Chức năng:

  • Hỗ trợ đa nền tảng: Đồng bộ hóa tỷ lệ tài trợ trên nhiều nền tảng giao dịch và thiết lập thời gian yêu cầu khác nhau cho mỗi nền tảng.
  • Việc mua lại biểu tượng cụ thể: Hỗ trợ để có được tỷ lệ tài trợ của các cặp giao dịch cụ thể (chẳng hạn như BTC/USDT, ETH/USDT).
  • Tối ưu hóa cho các nền tảng khác nhau: Phân biệt giữa các nền tảng không cần phải truy vấn từng thị trường một (như Binance) và các nền tảng cần đi qua tất cả các thị trường (như OKCoin).
  • Hiển thị tỷ lệ: Hiển thị tỷ lệ tài trợ của nhiều nền tảng giao dịch. Bởi vì khoảng thời gian thu thập khác nhau, chúng được điều chỉnh đồng đều thành tỷ lệ 24h để so sánh trực tiếp.
  • Đẩy cảnh báo tốc độ: Một ngưỡng nhất định có thể được thiết lập, và khi tỷ lệ tương đương 24h vượt quá tùy chỉnh, nó sẽ được đẩy đến APP di động FMZ.

Hướng dẫn:

Bạn có thể điều chỉnh danh sách nền tảng, danh sách biểu tượng và khoảng thời gian thăm dò ý kiến khi cần thiết để đáp ứng nhu cầu giao dịch cụ thể của bạn.

Mã chiến lược

Kịch bản được chia thành một số phần chính:

  1. bắt đầuFundingWorker: Bắt đầu một chủ đề riêng biệt cho mỗi sàn giao dịch để theo dõi tỷ lệ tài trợ để tránh hạn chế do một chủ đề đơn yêu cầu quá nhiều dữ liệu.
  2. getCác khoản tài trợ: Đọc dữ liệu tỷ lệ tài trợ cho một trao đổi cụ thể từ lưu trữ.
  3. UpdateStatus: Xử lý và cập nhật bảng tỷ lệ tài trợ cho tất cả các sàn giao dịch, hiển thị dữ liệu tổng hợp dưới dạng bảng và ghi lại các biểu tượng có phí cao.
  4. chính: Bắt đầu chương trình chính, bắt đầu chủ đề giám sát và thường xuyên cập nhật tình trạng tỷ lệ tài trợ tổng hợp.
// Start the funding rate monitoring thread and create a separate thread for each exchange's funding rate data
function startFundingWorker() {
    exchanges.forEach((_, pos) => {
        __Thread(function (pos) {
            let e = exchanges[pos]
            let eName = e.GetName()
            // Set request delays for different exchanges to prevent frequent requests from causing throttling
            let delaySettings = {
                'Futures_OKCoin': 20,
                'Futures_Binance': 500,
                'Futures_MEXC': 100,
            }
            // Need to traverse the list of exchange names for all markets, these exchanges do not support getting all trading pairs at once
            let needInterate = ['Futures_OKCoin', 'Futures_Bitget','Futures_OKX', 'Futures_KuCoin', 'Futures_MEXC'] 
            // Set delay based on exchange name
            let delay = function () {
                let n = delaySettings[eName]
                if (n) {
                    Sleep(n)
                }
            }
            // Set the update interval to update every two minutes
            let epoch = 60000 * 2;
            let ts = 0;
            let fundings = {}
            // Infinite loop, get funding rate at fixed intervals
            while (true) {
                let now = new Date().getTime()
                if (now - ts < epoch) {
                    // If the update cycle is not reached, pause for 1 second and then continue checking
                    Sleep(1000)
                    continue
                }
                let markets = e.GetMarkets()
                if (!markets) {
                    // If market information cannot be obtained, try again after a delay
                    Sleep(1000)
                    continue
                }
                // If the exchange is in the list that needs to be traversed, request the funding rate for each market
                if (needInterate.includes(eName)) {
                    for (let symbol in markets) {
                        if (symbol.includes('.swap') && symbol.includes('_USDT')) {
                            let ret = e.GetFundings(symbol)
                            if (ret) {
                                for (let r of ret) {
                                    fundings[r.Symbol] = r
                                }
                            }
                            delay();
                        }
                    }
                } else {
                    // For exchanges not in the traversal list, only request the funding rate of USDT.swap
                    let ret = e.GetFundings('USDT.swap')
                    if (ret) {
                        for (let r of ret) {
                            fundings[r.Symbol] = r
                        }
                    }
                }
                // Update data timestamp
                ts = now
                // Stores the exchange's funding rate data
                __threadSetData(0, eName+"_funding", fundings)
            }
        }, pos)
    })
}

// Get the funding rate data of the specified exchange
function getFundings(eName) {
    let efundings = __threadGetData(0, eName+"_funding")
    if (!efundings) {
        return null
    }
    return efundings
}

// Update the funding rate table and display it in the log
function UpdateStatus(){
    let table = { 
        type: 'table', 
        title: 'Funding Rate%', 
        cols: ['index', 'symbol'], // Initialization column, containing symbol
        rows: [] 
    };
    let fundingRates = {};
    exchanges.forEach((e) => {
        let eName = e.GetName();
        if (fundings[eName]) {
            for (let symbol in fundings[eName]) {
                // Parse short symbol names and remove unnecessary prefixes
                let short_symbol = symbol.split('_')[0].replace(/^(100|1000|10000|100000|1000000|10000000)|^(100|1000|10000|100000|1000000|10000000)$/g, '');
                let rate = fundings[eName][symbol].Rate;
                let day = 24 / (fundings[eName][symbol].Interval / 3600000)
                // Initialize symbol data structure
                if (!fundingRates[short_symbol]) {
                    fundingRates[short_symbol] = { total: 0, count: 0,  day_rate: {},  next_time: {}, last_time:0};
                }
                // Record and push rates that exceed the threshold
                if (Math.abs(rate) > 0.01 && Date.now() - fundingRates[short_symbol].last_time > 30*60*1000) {
                    Log(e.GetName(), symbol, rate, '@')
                    fundingRates[short_symbol].last_time = Date.now()
                }
                fundingRates[short_symbol].total += rate;
                fundingRates[short_symbol].count++;
                fundingRates[short_symbol].day_rate[eName] = _N(rate * day , 6); // Record rates
                fundingRates[short_symbol].next_time[eName] = _N((fundings[eName][symbol].Time - Date.now()) / 3600000 , 1) + 'h'
            }
        }
    });
    // Added rate columns and next update time columns for each exchange
    for (let e of exchanges) {
        table.cols.push(e.GetName()+' Rate');
        table.cols.push('Next Time');
    }
   
    table.cols.push('Average Rate'); // Add an average rate column
    let i = 0;
    // Iterate over each symbol and fill in the data
    for (let symbol in fundingRates) {
        let data = fundingRates[symbol];
        if (data.count == 1) {
            continue // Symbols containing only a single data point are ignored
        }
        let averageRate = data.total / data.count; // Calculate average rate
        let row = [i++, symbol];
        for (let e of exchanges) {
            row.push(data.day_rate[e.GetName()] || null); // Filling the fees of various exchanges
            row.push(data.next_time[e.GetName()] || null);
        }
        row.push(_N(averageRate, 6)); // Filling average rate
        table.rows.push(row);
    }
    LogStatus('`' + JSON.stringify(table) + '`');
}

// Main function, start funding rate monitoring and status update
var fundings = {}
function main() {
    startFundingWorker() // Start monitoring threads for each exchange
    while (true) {
        exchanges.forEach((e) => {
            let eName = e.GetName()
            let eFundings = getFundings(eName)
            fundings[eName] = eFundings
        })
        Sleep(15000) // Update every 15 seconds
        UpdateStatus()
    }
}

Thêm nữa