Это шаблон рынка WebSocket, официально разработанный FMZ. Приветствуем всех пользователей, чтобы скопировать и использовать его:https://www.fmz.com/strategy/470349
В настоящее время стратегия FMZ в основном основана на традиционной инкапсуляции REST API. Каждый шаг доступа к API требует установления сетевого соединения, а данные рынка получаются посредством опроса. Этот метод прост и прост в использовании, и он полностью достаточен для большинства потребностей.
Однако протокол REST имеет врожденную проблему задержки. Когда требуется несколько торговых пар и несколько стратегий обмена, проблема задержки будет увеличена. Хотя функция Go платформы может выполняться одновременно, проблема задержки все еще существует, что затрудняет удовлетворение потребностей относительно высокочастотной стратегии торговли. Кроме того, если слишком много торговых пар и частота опроса слишком быстрая, она столкнется с лимитом частоты доступа торговой платформы.
В настоящее время серверы бирж также находятся под большой нагрузкой. Все они предоставляют полный протокол WebSocket и рекомендуют его пользователям API. По сравнению с протоколом REST, WebSocket предоставляет постоянный двухсторонний метод соединения, который позволяет биржам отправлять данные клиенту в режиме реального времени, избегая частых запросов и ответов, что значительно снижает задержку.
Платформа FMZ Quant Trading поддерживает протокол WebSocket в течение длительного времени, и это относительно удобно для вызова, но для начинающих пользователей все еще слишком сложно обрабатывать несколько подписок, подписываться на несколько биржевых тикеров и эффективно и удобно встраивать их во весь процесс стратегии. Этот публичный шаблон WebSocket для ускорения данных тикеров в режиме реального времени решает эту проблему. Он очень прост в использовании и полностью совместим с текущим вложенным вызовом API. Для большинства оригинальных стратегий REST вы можете просто изменить их и использовать их непосредственно для ускорения вашей стратегии.
Ключевые особенности:
Обратите внимание, что эта стратегия использует 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. Перепишите метод сбора данныхПерепишите методы получения глубокой и торговой информации для каждой биржи, отдавая приоритет возвращению данных, которые обновляются в режиме реального времени.
$.setupWebsocket()
для инициализации соединения WebSocket целевой обменной системы.GetDepth()
иGetTrades()
функции, глубина рынка и записи транзакций автоматически возвращаются с использованием данных WebSocket в режиме реального времени.Если в стратегию добавляется функция 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);
}
}