На квадратной странице (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.

Спасибо за чтение