В процессе загрузки ресурсов... загрузка...

Шаблон стратегии позволяет беспрепятственно использовать WebSocket Market

Автор:FMZ~Lydia, Создано: 2024-10-30 14:23:04, Обновлено: 2024-11-01 10:37:04

img

Это шаблон рынка WebSocket, официально разработанный FMZ. Приветствуем всех пользователей, чтобы скопировать и использовать его:https://www.fmz.com/strategy/470349

Зачем нам WebSocket?

В настоящее время стратегия FMZ в основном основана на традиционной инкапсуляции REST API. Каждый шаг доступа к API требует установления сетевого соединения, а данные рынка получаются посредством опроса. Этот метод прост и прост в использовании, и он полностью достаточен для большинства потребностей.

Однако протокол REST имеет врожденную проблему задержки. Когда требуется несколько торговых пар и несколько стратегий обмена, проблема задержки будет увеличена. Хотя функция Go платформы может выполняться одновременно, проблема задержки все еще существует, что затрудняет удовлетворение потребностей относительно высокочастотной стратегии торговли. Кроме того, если слишком много торговых пар и частота опроса слишком быстрая, она столкнется с лимитом частоты доступа торговой платформы.

В настоящее время серверы бирж также находятся под большой нагрузкой. Все они предоставляют полный протокол WebSocket и рекомендуют его пользователям API. По сравнению с протоколом REST, WebSocket предоставляет постоянный двухсторонний метод соединения, который позволяет биржам отправлять данные клиенту в режиме реального времени, избегая частых запросов и ответов, что значительно снижает задержку.

Введение в шаблон WebSocket ticker

Платформа FMZ Quant Trading поддерживает протокол WebSocket в течение длительного времени, и это относительно удобно для вызова, но для начинающих пользователей все еще слишком сложно обрабатывать несколько подписок, подписываться на несколько биржевых тикеров и эффективно и удобно встраивать их во весь процесс стратегии. Этот публичный шаблон WebSocket для ускорения данных тикеров в режиме реального времени решает эту проблему. Он очень прост в использовании и полностью совместим с текущим вложенным вызовом API. Для большинства оригинальных стратегий REST вы можете просто изменить их и использовать их непосредственно для ускорения вашей стратегии.

Ключевые особенности:

  • Поддержка различных бирж: Эта стратегия поддерживает соединения WebSocket нескольких бирж, таких как Binance, OKX, Bybit, Bitget и т. Д. Пользователи могут следовать методу упаковки этого шаблона, чтобы поддерживать больше бирж сами.
  • Настраиваемые подписки: позволяет подписываться на конкретные рыночные каналы (например, глубина, сделки и т.д.) и эффективно обрабатывать полученные данные для немедленного использования в торговых стратегиях.
  • Расширенное обращение с ошибками: Встроенный механизм отслеживания ошибок и повторного подключения WebSocket для обеспечения надежности и непрерывности потока данных.

Краткое введение в принцип осуществления

Обратите внимание, что эта стратегия использует TypeScript. Если вы знакомы только с JavaScript, это может показаться немного странным. TypeScript вводит систему типов и более богатые языковые функции, основанные на JavaScript. Для таких приложений, как количественная торговля, которым необходимо обрабатывать сложную логику, использование TypeScript может уменьшить потенциальные ошибки и улучшить читаемость и поддержание кода. Поэтому рекомендуется кратко изучить его.

Кроме того, стратегия использует асинхронный механизм платформы FMZ. Дочерняя нить может отправлять сообщения в основную нить через функцию __threadPostMessage. Этот метод асинхронный и подходит для уведомления основной нитки об обновлениях данных, генерируемых в дочерней нитке. Главная нить и дочерняя нить могут обмениваться данными через функции __threadGetData и __threadSetData. Этот метод позволяет нитям получать доступ и модифицировать общие состояния. Если вы хотите узнать о мультитрейдинге в сочетании с документацией платформы, эта стратегия также является хорошим примером обучения.

Основной принцип этой стратегии заключается в подключении к основным биржам цифровой валюты через WebSocket и получении рыночных данных (таких как глубинная информация и информация о транзакциях) в режиме реального времени для обеспечения поддержки данных для количественных торговых решений.

Настройки подключения WebSocketФункцияsetupWebsocketиспользуется для инициализации соединения WebSocket и получения данных рынка.main_exchanges, указывающий обменник для подключения.

  • MyDial Функция: Создайте соединение WebSocket, запишите время соединения и выведите время закрытия при закрытии соединения.
  • updateSymbols Функция: Регулярно проверяйте наличие новых заявок на подписку и по мере необходимости обновляйте текущий список торговых пар.

2. Обработка данныхОбъектsupportsопределяет поддерживаемые обменники и их функции обработки (такие какBinanceФункция обработки для каждого обмена отвечает за анализ полученного сообщения и извлечение соответствующих данных.

  • processMsg Функция: обрабатывать сообщения с обмена, идентифицировать различные типы данных (такие как обновления глубины, транзакции и т. д.) и форматировать их в единый объект события.

3. Данные о подпискеПри каждом соединении система подписывается на соответствующие каналы данных рынка на основе текущей торговой пары.

  • getFunction Функция: Получить соответствующую функцию обработки в соответствии с именем обмена.
  • this.wssPublic Функция: Инициализируйте соединение WebSocket и начните принимать данные.

4. Управление нитьюЗапускать нить для каждого обмена, получать данные в режиме реального времени и обрабатывать данные с помощью функций обратного вызова.

  • threadMarket Функция: Принимать данные в подчиненной нише, анализировать и хранить последнюю информацию о глубине и транзакции.

5. Перепишите метод сбора данныхПерепишите методы получения глубокой и торговой информации для каждой биржи, отдавая приоритет возвращению данных, которые обновляются в режиме реального времени.

Как использовать шаблон

  1. Инициализация: Использование$.setupWebsocket()для инициализации соединения WebSocket целевой обменной системы.
  2. Подписка: Система автоматически подписывается на соответствующие каналы (такие как глубина, торговля и т.д.) для продуктов, которыми вы торгуете.
  3. Получение данныхПозвонив вGetDepth()иGetTrades()функции, глубина рынка и записи транзакций автоматически возвращаются с использованием данных WebSocket в режиме реального времени.
  4. Обработка ошибок: Стратегия включает в себя механизм отслеживания ошибок соединения и данных, а также попытки автоматического восстановления соединения при потере соединения.

Если в стратегию добавляется функция EventLoop ((), она будет изменена на механизм запуска. Когда есть обновление данных wss, она автоматически будет получать его немедленно, и ждать, если нет последних данных. Это эквивалентно интеллектуальной функции сна. Конечно, вы также можете использовать режим сна напрямую.

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

Обратитесь к моему предыдущему руководству по стратегии торговли с несколькими валютами:https://www.fmz.com/bbs-topic/10508, который можно легко модифицировать для поддержки 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);
    }
}

Больше