На квадратной странице (https://www.fmz.com/square) платформы FMZ Quant есть много интересных стратегий. В то время большинство API-интерфейсов криптовалютных бирж использовали протокол rest
. Многие стратегии основаны на интерфейсе rest
, поэтому иногда обновление рыночных котировок происходит медленно. Кроме того, было несколько случаев, когда в ближайшем будущем интерфейс биржи rest
выходил из строя, что приводило к тому, что стратегия не работала должным образом.
Пока стратегия модифицируется, добавление поддержки интерфейса websocket требует внесения некоторых изменений в код стратегии, что обычно довольно хлопотно (сложность изменить стратегию намного выше, чем ее переписать).
Как можно не менять код стратегии, а использовать интерфейс рыночных котировок вебсокета?
Вот полная гибкость платформы FMZ Quant, которую мы можем использовать:
- Используйте стратегию «библиотека классов шаблонов».
- Выполнение операции «Хук» для получения котировок биржевого рынка, функция типа
exchange.GetTicker
.
Таким образом, не изменяя код стратегии, пусть стратегия использует данные, управляемые и продвигаемые рыночным интерфейсом websocket
.
Язык написания кода использует язык программирования JavaScript.
Стратегия анализа
Например, когда нам нужно модифицировать классическую стратегию «Ледокол»
Адрес стратегии: https://www.fmz.com/strategy/9929
Давайте посмотрим на код стратегии и обнаружим, что стратегия основана на tick
рыночной котировке. Он в основном использует свойства Buy
, Sell
и Last
в данных ticker
. Данные ticker
получаются функцией API платформы FMZ Quant: exchange.GetTicker
. Теперь цель ясна, мы можем заменить функцию exchange.GetTicker
операцией Hook
(то есть заменить ее другой версией).
Однако мы не можем переписать его в коде стратегии «ледокол», это повлияет на логику стратегии, мы хотим бесшовную стыковку с вебсокетом!
Так что нам нужен следующий главный герой для дебюта.
Функция «библиотека классов шаблонов» и функция «init» работают вместе.
Мы создаем «библиотеку классов шаблонов» с именем: «SeamlessConnWS».
Затем установите 2 параметра в шаблон SeamlessConnWS
.
- Исуседвебсокет
- Hook_GetTicker@IsUsedWebSocket
Эти два элемента используются для управления использованием функции интерфейса websocket
, а элемент управления указывает, следует ли открывать конкретный интерфейс рыночных котировок. Из-за ограничения этой статьи мы выполняем операцию hook
только для интерфейса exchange.GetTicker
. Следовательно, нам нужно включить параметр (Hook_GetTicker
) интерфейса GetTicker
в режим websocket
.
Как только шаблон создан, мы можем прописать в шаблоне конкретный доступ к интерфейсу биржи websocket
, подписаться на определенные котировки, а затем ждать, пока код функции биржи отправит данные. Конкретный код здесь не описывается, вы можете обратиться к коду SeamlessConnWS
(уже с открытым исходным кодом) и официальной документации API FMZ Quant. Стоит отметить, что функция init
в шаблоне и глобальные переменные _DictConnectCreater
, _ConnMap
:
Часть кода:
var _DictConnectCreater = { "Huobi" : WSConnecter_Huobi, "Binance" : WSConnecter_Binance, }
var _ConnMap = {}
function init () { if (IsUsedWebSocket) { var connectCreater = null if (exchanges.length != 1) { Log("Switching to the ws interface only for the "exchange" exchange object (ie, the first added exchange object)") } var isFound = false for (var name in _DictConnectCreater) { if (exchange.GetName() == name) { connectCreater = _DictConnectCreater[name] isFound = true } }
if (!isFound) { throw "Did not find an implementation" } if (Hook_GetTicker) { var symbol = exchange.GetCurrency() _ConnMap.GetTicker = connectCreater("GetTicker", symbol) exchange.GetTicker = function () { return _C(_ConnMap.GetTicker.Read) } } // ... } }
Видно, что этот шаблон реализует только рыночный интерфейс websocket
двух бирж, а именно Binance и Huobi. Функция init
предназначена для того, чтобы убедиться, что когда стратегия «Ледокол» вызывает шаблон SeamlessConnWS
, функция init
будет выполняться первой во время реального хода рынка.
мы можем заменить содержимое функции exchange.GetTicker
на код использования интерфейса websocket
, тем самым добившись бесшовной стыковки с рынком вебсокетов.
SeamlessConnWS
адрес шаблона: https://www.fmz.com/strategy/167755
Как это использовать
Кусок торта! После копирования шаблона SeamlessConnWS
в вашу библиотеку стратегий вы можете просто использовать стратегию «Ледокол», чтобы сослаться на него, как показано на рисунке:
не забудьте нажать кнопку «Проверить шаблон» и кнопку «Сохранить».
Создайте робота по стратегии «Ледокол» в реальном времени, биржа выбирает торговую пару.
Откройте параметры управления на шаблоне SeamlessConnWS
.
Запустите его:
Чтобы легко увидеть отправленные данные, в строке 157 мы специально добавили код журнала печати, он будет выводить данные, отправленные биржей.
Отображение в журнале робота:
Таким образом, нам не нужно изменять какую-либо строку кода стратегии, и достигается плавная стыковка с интерфейсом рынка websocket
.
Этот пример предназначен только для стратегии использования функции интерфейса рынка exchange.GetTicker
, другие интерфейсы рынка, такие как exchange.GetDepth
, exchange.GetTrades
и exchange.GetRecords
, являются той же процедурой! Для стандартного шаблона SeamlessConnWS
можно попробовать его расширить.
Для реализации конкретной ссылки websocket
в шаблоне используйте функцию Dial
(см. документацию API о функции Dial), которую можно настроить по мере необходимости. Например, вы можете указать параметр -2 для функции read()
, которая возвращает только самые последние данные в буфере, который принимает соединение websocket
.
Спасибо за чтение