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

Một mẫu chiến lược cho phép bạn sử dụng WebSocket Market liền mạch

Tác giả:FMZ~Lydia, Tạo: 2024-10-30 14:23:04, Cập nhật: 2024-11-01 10:37:04

img

Đây là một mẫu thị trường WebSocket chính thức được phát triển bởi FMZ. Chào mừng tất cả người dùng sao chép và sử dụng nó:https://www.fmz.com/strategy/470349

Tại sao chúng ta cần WebSocket?

Hiện nay, chiến lược FMZ chủ yếu dựa trên việc đóng gói API REST truyền thống. Mỗi bước truy cập API đòi hỏi phải thiết lập kết nối mạng, và dữ liệu thị trường được thu thập thông qua thăm dò ý kiến. Phương pháp này đơn giản và dễ sử dụng, và nó hoàn toàn đủ cho hầu hết các nhu cầu.

Tuy nhiên, giao thức REST có một vấn đề chậm trễ vốn có. Khi nhiều cặp giao dịch và nhiều chiến lược trao đổi được yêu cầu, vấn đề chậm trễ sẽ được phóng đại. Mặc dù chức năng Go của nền tảng có thể được thực hiện đồng thời, vấn đề chậm trễ vẫn tồn tại, điều này làm cho việc đáp ứng nhu cầu giao dịch chiến lược tần số tương đối cao trở nên khó khăn. Ngoài ra, nếu có quá nhiều cặp giao dịch và tần số thăm dò quá nhanh, nó sẽ gặp giới hạn tần số truy cập của nền tảng giao dịch.

Hiện tại, các máy chủ của các sàn giao dịch cũng đang chịu gánh nặng nặng. Tất cả chúng đều cung cấp giao thức WebSocket hoàn chỉnh và khuyến cáo nó cho người dùng API. So với giao thức REST, WebSocket cung cấp một phương pháp kết nối hai chiều liên tục, cho phép sàn giao dịch đẩy dữ liệu đến khách hàng trong thời gian thực, tránh các yêu cầu và phản hồi thường xuyên, do đó làm giảm đáng kể độ trễ. Nói chung, nếu thời gian chậm trong việc truy cập API REST là khoảng 20ms, thì thời gian chậm trong việc đẩy dữ liệu qua WebSocket là khoảng 2ms. Ngoài ra, liên kết với giao thức WebSocket không bị giới hạn bởi tần số truy cập nền tảng, và có thể đăng ký hàng chục cặp giao dịch cùng một lúc.

Giới thiệu về mẫu WebSocket ticker

Nền tảng FMZ Quant Trading đã hỗ trợ giao thức WebSocket trong một thời gian dài, và nó tương đối thuận tiện để gọi, nhưng đối với người dùng mới, nó vẫn quá phức tạp để xử lý nhiều đăng ký, đăng ký nhiều ticker trao đổi và nhúng chúng một cách hiệu quả và thuận tiện vào toàn bộ quy trình chiến lược. Mẫu tăng tốc dữ liệu ticker thời gian thực WebSocket công cộng này giải quyết vấn đề này. Nó rất dễ sử dụng và hoàn toàn tương thích với cuộc gọi API được đóng gói hiện tại. Đối với hầu hết các chiến lược REST ban đầu, bạn chỉ cần sửa đổi chúng và sử dụng chúng trực tiếp để tăng tốc chiến lược của mình.

Các đặc điểm chính:

  • Hỗ trợ đa sàn giao dịch: Chiến lược này hỗ trợ kết nối WebSocket của nhiều sàn giao dịch, chẳng hạn như Binance, OKX, Bybit, Bitget, v.v. Người dùng có thể làm theo phương pháp đóng gói của mẫu này để hỗ trợ nhiều sàn giao dịch hơn.
  • Các thuê bao có thể tùy chỉnh: Nó cho phép đăng ký các kênh thị trường cụ thể (như chiều sâu, giao dịch, v.v.) và xử lý hiệu quả dữ liệu nhận được để sử dụng ngay lập tức trong các chiến lược giao dịch.
  • Quản lý lỗi nâng cao: Thiết lập theo dõi lỗi và cơ chế kết nối lại WebSocket để đảm bảo độ tin cậy và tính liên tục của luồng dữ liệu.

Một giới thiệu ngắn gọn về nguyên tắc thực hiện

Lưu ý rằng chiến lược này sử dụng TypeScript. Nếu bạn chỉ quen thuộc với JavaScript, nó có thể trông hơi kỳ lạ. TypeScript giới thiệu một hệ thống kiểu và các tính năng ngôn ngữ phong phú hơn dựa trên JavaScript. Đối với các ứng dụng như giao dịch định lượng cần xử lý logic phức tạp, sử dụng TypeScript có thể làm giảm các lỗi tiềm ẩn và cải thiện khả năng đọc và duy trì mã. Do đó, bạn nên học nó một cách ngắn gọn.

Ngoài ra, chiến lược này sử dụng cơ chế không đồng bộ của nền tảng FMZ. Các chủ đề con có thể gửi tin nhắn đến chủ đề chính thông qua chức năng __threadPostMessage. Phương pháp này không đồng bộ và phù hợp để thông báo cho chủ đề chính của các bản cập nhật dữ liệu được tạo trong chủ đề con. Chủ đề chính và chủ đề con có thể chia sẻ dữ liệu thông qua các chức năng __threadGetData và __threadSetData. Phương pháp này cho phép các chủ đề truy cập và sửa đổi trạng thái chia sẻ. Nếu bạn muốn tìm hiểu về đa chủ đề, kết hợp với tài liệu nền tảng, chiến lược này cũng là một ví dụ học tập tốt.

Nguyên tắc chính của chiến lược này là kết nối với các sàn giao dịch tiền kỹ thuật số chính thống thông qua WebSocket và nhận dữ liệu thị trường (như thông tin sâu và thông tin giao dịch) theo thời gian thực để cung cấp hỗ trợ dữ liệu cho các quyết định giao dịch định lượng.

1. Cài đặt kết nối WebSocketChức năngsetupWebsocketđược sử dụng để khởi tạo một kết nối WebSocket và nhận dữ liệu thị trường.main_exchanges, chỉ ra trao đổi để kết nối với.

  • MyDial chức năng: Tạo một kết nối WebSocket, ghi lại thời gian kết nối, và đầu ra thời gian đóng khi đóng kết nối.
  • updateSymbols chức năng: Kiểm tra thường xuyên xem có yêu cầu đăng ký mới hay không và cập nhật danh sách cặp giao dịch hiện tại nếu cần thiết.

2. Xử lý dữ liệuĐối tượngsupportsxác định các sàn giao dịch được hỗ trợ và chức năng xử lý của chúng (chẳng hạn nhưBinanceCác chức năng xử lý cho mỗi trao đổi chịu trách nhiệm phân tích tin nhắn nhận được và chiết xuất dữ liệu có liên quan.

  • processMsg chức năng: Xử lý tin nhắn từ trao đổi, xác định các loại dữ liệu khác nhau (chẳng hạn như cập nhật độ sâu, giao dịch, vv), và định dạng chúng thành một đối tượng sự kiện thống nhất.

3. Dữ liệu đăng kýTại mỗi kết nối, hệ thống sẽ đăng ký các kênh dữ liệu thị trường có liên quan dựa trên cặp giao dịch hiện tại.

  • getFunction chức năng: Nhận chức năng xử lý tương ứng theo tên trao đổi.
  • this.wssPublic chức năng: Bắt đầu kết nối WebSocket và bắt đầu nhận dữ liệu.

4. Quản lý ThreadBắt đầu một chủ đề cho mỗi trao đổi, nhận dữ liệu trong thời gian thực và xử lý dữ liệu thông qua các chức năng gọi lại.

  • threadMarket chức năng: Nhận dữ liệu trong một chủ đề con, phân tích và lưu trữ thông tin sâu và giao dịch mới nhất.

5. Viết lại phương pháp thu thập dữ liệuViết lại các phương pháp để có được thông tin sâu và giao dịch cho mỗi sàn giao dịch, ưu tiên trả lại dữ liệu được cập nhật trong thời gian thực.

Cách sử dụng mẫu

  1. Bắt đầu: Sử dụng$.setupWebsocket()để khởi tạo kết nối WebSocket của trao đổi mục tiêu.
  2. Đăng ký: Hệ thống sẽ đăng ký các kênh có liên quan (như chiều sâu, giao dịch, v.v.) tự động cho các sản phẩm bạn giao dịch.
  3. Thu thập dữ liệu: Bằng cách gọiGetDepth()GetTrades()các chức năng, độ sâu thị trường và các hồ sơ giao dịch được trả về tự động bằng cách sử dụng dữ liệu thời gian thực WebSocket.
  4. Xử lý lỗi: Chiến lược bao gồm một cơ chế theo dõi để ghi lại các lỗi kết nối và dữ liệu, và cố gắng kết nối lại tự động nếu kết nối bị mất.

Nếu chức năng EventLoop được thêm vào chiến lược, nó sẽ được thay đổi thành một cơ chế kích hoạt. Khi có cập nhật dữ liệu wss, nó sẽ tự động lấy nó ngay lập tức, và chờ nếu không có dữ liệu mới nhất. Nó tương đương với chức năng ngủ thông minh. Tất nhiên, bạn cũng có thể sử dụng ngủ trực tiếp.

function main() {
    $.setupWebsocket()
    while (true) {
        exchanges.map(e=>{
            Log(e.GetName(), e.GetDepth())
            Log(e.GetName(), e.GetTrades())
        })
        EventLoop(100) // trigger by websocket
    }
}

Hãy tham khảo hướng dẫn chiến lược giao dịch đa tiền tệ trước đây của tôi:https://www.fmz.com/bbs-topic/10508, có thể được sửa đổi dễ dàng để hỗ trợ WebSocket:

function MakeOrder() {
    for (let i in Info.trade_symbols) {
        let symbol = Info.trade_symbols[i];
        let buy_price = exchange.GetDepth(symbol + '_USDT').Asks[0].Price;
        let buy_amount = 50 / buy_price;
        if (Info.position[symbol].value < 2000){
            Trade(symbol, "buy", buy_price, buy_amount, symbol);
        }
    }
}

function OnTick() {
    try {
        UpdatePosition();
        MakeOrder();
        UpdateStatus();
    } catch (error) {
        Log("loop error: " + error);
    }
}

function main() {
    $.setupWebsocket()
    InitInfo();
    while (true) {
        let loop_start_time = Date.now();
        if (Date.now() - Info.time.last_loop_time > Info.interval * 1000) {
            OnTick();
            Info.time.last_loop_time = Date.now();
            Info.time.loop_delay = Date.now() - loop_start_time;
        }
        Sleep(5);
    }
}

Thêm nữa