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

Подробное объяснение обновления FMZ Quant API: улучшение опыта разработки стратегии

Автор:FMZ~Lydia, Создано: 2024-07-05 09:44:08, Обновлено: 2024-07-25 15:15:03

[TOC]

img

Подробное объяснение обновления FMZ Quant API: улучшение опыта разработки стратегии

Преамбула

После 9 лет технической итерации платформа FMZ Quant Trading была многократно реконструирована, хотя как пользователи мы, возможно, не заметили этого.

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

Руководство по синтаксису:https://www.fmz.com/syntax-guideРуководство пользователя:https://www.fmz.com/user-guide

Итак, давайте быстро посмотрим, какие интерфейсы были обновлены и какие изменения необходимы для использования старых стратегий, чтобы сделать их совместимыми с текущим API.

1. Новый интерфейс API

Добавлена функция "GetTickers"

Для разработки стратегий многопродукта и стратегий полного мониторинга рынка, агрегированный рыночный интерфейс имеет важное значение.

Если биржа не имеет этого интерфейса (индивидуальные биржи), при вызовеexchange.GetTickers(), отображается сообщение об ошибке: Не поддерживается.

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

exchange.GetTickers()Функция является полнофункциональной версией запросаexchange.GetTicker()функция (внимательно посмотрите, разница между этими двумя функциями названия только единственное и множественное число).

Мы используем среду симуляции точек OKX для тестирования:

function main() {
    exchange.IO("simulate", true)

    var tickers = exchange.GetTickers()
    if (!tickers) {
        throw "tickers error"
    }

    var tbl = {type: "table", title: "test tickers", cols: ["Symbol", "High", "Open", "Low", "Last", "Buy", "Sell", "Time", "Volume"], rows: []}
    for (var i in tickers) {
        var ticker = tickers[i]
        tbl.rows.push([ticker.Symbol, ticker.High, ticker.Open, ticker.Low, ticker.Last, ticker.Buy, ticker.Sell, ticker.Time, ticker.Volume])
    }

    LogStatus("`" + JSON.stringify(tbl) +  "`")
    return tickers.length
}

img

Добавлена функция Exchange.CreateOrder

Новое приложениеexchange.CreateOrder()В центре внимания этого обновления.exchange.CreateOrder()Это позволяет напрямую указывать тип и направление ордера в параметрах функции. таким образом, он больше не зависит от текущей торговой пары, кода контракта, направления торговли и других настроек системы.

В многовидовых сценариях размещения торговых заказов и одновременных сценариях сложность проектирования значительно снижается.exchange.CreateOrder()Функцииsymbol, side, price, amount.

Испытание с использованием среды моделирования фьючерсов OKX:

function main() {
    exchange.IO("simulate", true)

    var id1 = exchange.CreateOrder("ETH_USDT.swap", "buy", 3300, 1)
    var id2 = exchange.CreateOrder("BTC_USDC.swap", "closebuy", 70000, 1)
    var id3 = exchange.CreateOrder("LTC_USDT.swap", "sell", 110, 1)

    Log("id1:", id1, ", id2:", id2, ", id3:", id3)
}

img

Таким образом, только триexchange.CreateOrder()Призывы к функциям использовались для размещения трех фьючерсных ордеров разных сортов и направлений.

Добавлена функция Exchange.GetHistoryOrders

Новое приложениеexchange.GetHistoryOrders()Функция также требует поддержки интерфейса обмена.

Для запроса исторических заказов интерфейсы, реализованные различными биржами, сильно различаются:

  • Некоторые поддерживают страничные запросы, в то время как другие нет;
  • Некоторые биржи имеют период окна запроса, то есть заказы, старше N дней, не могут быть запрошены;
  • Большинство бирж поддерживают запросы в определенное время, но некоторые не поддерживают; Такие интерфейсы заключаются с максимальной степенью совместимости, и при фактическом использовании следует обратить внимание на то, отвечают ли они требованиям и ожиданиям стратегии.

Детальное описание функции здесь не повторяется, вы можете обратиться к руководству по синтаксису в документации API:

https://www.fmz.com/syntax-guide#fun_exchange.gethistoryorders

Испытано с помощью среды спотовой торговли Binance:

function main() {
    var orders = exchange.GetHistoryOrders("ETH_USDT")

    // Write to chart
    var tbl = {type: "table", title: "test GetHistoryOrders", cols: ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []}
    for (var order of orders) {
        tbl.rows.push([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType])
    }
    
    LogStatus("orders.length:", orders.length, "\n", "`" + JSON.stringify(tbl) +  "`")
}

img

Добавлена функция Exchange.GetPositions

Старая версия функции сбора данных о местоположенииexchange.GetPosition(). Это обновление добавляет новую функцию получения позиции, чтобы лучше соответствовать семантике имен функций:exchange.GetPositions(). В то же время, он все еще совместим/усовершенствован с функцией GetPosition.

Вexchange.GetPositions()Функция имеет три формы вызова:

  • Обмен.GetPositions ((() При отсутствии параметров требуются данные о позиции на основе текущих настроек торговой пары/кода контракта.
  • exchange.GetPositions ((ETH_USDT.swap) При указании информации о конкретном продукте (формат ETH_USDT.swap определяется платформой FMZ) запрашивайте данные о позиции конкретного продукта.
  • Обмен.GetPositions ((("") Запросить интерфейс обмена позиций для получения всех текущих размеров данных о позиции (разделено в зависимости от размера продукта обмена интерфейса) Испытание с использованием среды моделирования фьючерсов OKX:
function main() {
    exchange.IO("simulate", true)

    exchange.SetCurrency("BTC_USDT")
    exchange.SetContractType("swap")

    var p1 = exchange.GetPositions()
    var p2 = exchange.GetPositions("")

    var tbls = []
    for (var positions of [p1, p2]) {
        var tbl = {type: "table", title: "test GetPosition/GetPositions", cols: ["Symbol", "Amount", "Price", "FrozenAmount", "Type", "Profit", "Margin", "ContractType", "MarginLevel"], rows: []}
        for (var p of positions) {
            tbl.rows.push([p.Symbol, p.Amount, p.Price, p.FrozenAmount, p.Type, p.Profit, p.Margin, p.ContractType, p.MarginLevel])
        } 
        tbls.push(tbl)
    }

    LogStatus("`" + JSON.stringify(tbls) +  "`")
}

img

Когда параметр перешел кexchange.GetPositions()функция -ETH_USDT.swap, можно получить данные о позиции U-основанных вечных контрактов ETH.

img

Когда параметр перешел кexchange.GetPositions()Функция является пустой строкой , данные о положении всех U-основанных контрактов могут быть получены.

2. Обновление интерфейса API

Функция обновления Exchange.GetTicker

Основная модернизация рыночной функцииexchange.GetTicker()Это позволяет функции запросить данные рынка непосредственно в соответствии с информацией о продукте, указанной параметром без текущей торговой пары и кода контракта. Это упрощает процесс написания кода. В то же время, он все еще совместим с методом вызова без прохождения параметров, и в наибольшей степени совместим со старой стратегией платформы.

Параметрsymbolимеет различные форматы для спотов/фьючерсов на предмет обменаexchange:

  • Объект спотового обмена Формат:AAA_BBB, AAA обозначает baseCurrency, то есть торговую валюту, а BBB обозначает quoteCurrency, то есть валюту ценообразования. Например: спотовая торговая пара BTC_USDT.
  • Объект биржи фьючерсов Формат:AAA_BBB.XXX, AAA представляет baseCurrency, то есть торговую валюту, BBB представляет quoteCurrency, то есть валюту ценообразования, а XXX представляет собой код контракта, такой как вечный контракт swap. Например: BTC_USDT.swap, BTC's U-based perpetual contract. Испытано с помощью Binance Futures живая среда:
var symbols = ["BTC_USDT.swap", "BTC_USDT.quarter", "BTC_USD.swap", "BTC_USD.next_quarter", "ETH_USDT.swap"]

function main() {
    exchange.SetCurrency("ETH_USD")
    exchange.SetContractType("swap")

    var arr = []
    var t = exchange.GetTicker()
    arr.push(t)

    for (var symbol of symbols) {
        var ticker = exchange.GetTicker(symbol)
        arr.push(ticker)
    }

    var tbl = {type: "table", title: "test GetTicker", cols: ["Symbol", "High", "Open", "Low", "Last", "Buy", "Sell", "Time", "Volume"], rows: []}
    for (var ticker of arr) {
        tbl.rows.push([ticker.Symbol, ticker.High, ticker.Open, ticker.Low, ticker.Last, ticker.Buy, ticker.Sell, ticker.Time, ticker.Volume])
    }

    LogStatus("`" + JSON.stringify(tbl) +  "`")
    return arr
}

img

Запрос партии рыночных данных для определенного символа стал намного проще.

Обновление функции Exchange.GetDepth

Подобно функции GetTicker,exchange.GetDepth()Это позволяет нам напрямую указать символ при запросе данных глубины.

Испытано с использованием Binance Futures живой среды:

function main() {
    exchange.SetCurrency("LTC_USD")
    exchange.SetContractType("swap")

    Log(exchange.GetDepth())
    Log(exchange.GetDepth("ETH_USDT.quarter"))
    Log(exchange.GetDepth("BTC_USD.swap"))
}

img

Обновление функции Exchange.GetTrades

Подобно функции GetTicker,exchange.GetTrades()Это позволяет нам указать символ непосредственно при запросе данных о рыночных транзакциях.

Испытано с использованием Binance Futures живой среды:

function main() {
    var arr = []
    var arrR = []
    var symbols = ["LTC_USDT.swap", "ETH_USDT.quarter", "BTC_USD.swap"]    

    for (var symbol of symbols) {
        var r = exchange.Go("GetTrades", symbol)
        arrR.push(r)
    }

    for (var r of arrR) {
        arr.push(r.wait())
    }
    
    var tbls = []
    for (var i = 0; i < arr.length; i++) {
        var trades = arr[i]
        var symbol = symbols[i]

        var tbl = {type: "table", title: symbol, cols: ["Time", "Amount", "Price", "Type", "Id"], rows: []}
        for (var trade of trades) {
            tbl.rows.push([trade.Time, trade.Amount, trade.Price, trade.Type, trade.Id])
        }

        tbls.push(tbl)
    }

    LogStatus("`" + JSON.stringify(tbls) +  "`")
}

img

Это обновление также совместимо с параметром символа, указаннымexchange.Go()функция при одновременном вызове интерфейса API платформы.

Обновление функции Exchange.GetRecords

Функция GetRecords была значительно скорректирована на этот раз. В дополнение к поддержке параметра символа для прямого указания информации о типе запрашиваемых данных K-линии, исходный параметр периода сохраняется для указания периода K-линии, и добавляется предельный параметр для указания ожидаемой длины K-линии при запросе. В то же время, он также совместим со старой версией функции GetRecords, которая только проходит в параметре периода.

Способ вызоваexchange.GetRecords()Функция:

  • Обмен.GetRecords ((() Если параметры не указаны, то требуются данные K-линии продукта, соответствующие текущей торговой паре/коду контракта.
  • Обмен.GetRecords ((60 * 15) Если указан только параметр периода K-линии, то требуются данные K-линии продукта, соответствующие текущей торговой паре/коду контракта.
  • exchange.GetRecords ((BTC_USDT.swap) Когда указывается только информация о продукте, запрашиваются данные K-линии указанного продукта. К-линейный период является по умолчанию K-линейным периодом, установленным в интерфейсе обратного тестирования стратегии или в режиме реального времени.
  • exchange.GetRecords ((BTC_USDT.swap, 60 * 60) Укажите информацию о продукте и конкретный период K-линии для запроса данных K-линии.
  • exchange.GetRecords ((BTC_USDT.swap, 60, 1000) Укажите информацию о продукте, конкретный период K-линии и ожидаемую длину K-линии для запроса данных K-линии. Обратите внимание, что когда параметр предела превышает максимальную длину одного запроса от биржи, будет сгенерирован запрос обмена (т.е. несколько вызовов к интерфейсу K-линии биржи).

Испытано с использованием Binance Futures живой среды:

function main() {
    exchange.SetCurrency("ETH_USDT")
    exchange.SetContractType("swap")
    
    var r1 = exchange.GetRecords()
    var r2 = exchange.GetRecords(60 * 60)
    var r3 = exchange.GetRecords("BTC_USDT.swap")
    var r4 = exchange.GetRecords("BTC_USDT.swap", 60)
    var r5 = exchange.GetRecords("LTC_USDT.swap", 60, 3000)

    Log("r1 time difference between adjacent bars:", r1[1].Time - r1[0].Time, "Milliseconds, Bar length:", r1.length)
    Log("r2 time difference between adjacent bars:", r2[1].Time - r2[0].Time, "Milliseconds, Bar length:", r2.length)
    Log("r3 time difference between adjacent bars:", r3[1].Time - r3[0].Time, "Milliseconds, Bar length:", r3.length)
    Log("r4 time difference between adjacent bars:", r4[1].Time - r4[0].Time, "Milliseconds, Bar length:", r4.length)
    Log("r5 time difference between adjacent bars:", r5[1].Time - r5[0].Time, "Milliseconds, Bar length:", r5.length)
}

img

Обновление функции Exchange.GetOrders

Функция GetOrders также добавляетsymbolпараметры, которые могут указать тип текущих незавершенных заказов (ожидаемых заказов), которые должны быть запрошены непосредственно; он также поддерживает запрос всех ожидаемых заказов (независимо от типа); и совместим с оригинальным методом вызова.

Вexchange.GetOrders()функция может быть вызвана следующими способами:

  • Обмен.GetOrders ((() Запрос всех незавершенных ордеров по текущей торговой паре/коду контракта.
  • exchange.GetOrders ((BTC_USDT.swap) Запрос всех невыполненных заказов на бессрочные контракты на BTC с маржировкой в USDT.
  • Обмен.GetOrders (("") Запрос всех незавершенных заказов в текущем измерении биржи (разделенный в соответствии с измерением интерфейса API биржи).

Испытание с использованием среды моделирования фьючерсов OKX:

function main() {
    exchange.IO("simulate", true)

    exchange.SetCurrency("BTC_USDT")
    exchange.SetContractType("swap")

    // Write to chart
    var tbls = []
    for (var symbol of ["null", "ETH_USDT.swap", ""]) {
        var tbl = {type: "table", title: symbol, cols: ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []}

        var orders = null
        if (symbol == "null") {
            orders = exchange.GetOrders()
        } else {
            orders = exchange.GetOrders(symbol)
        }

        for (var order of orders) {
            tbl.rows.push([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType])
        }

        tbls.push(tbl)
    }
    
    LogStatus("`" + JSON.stringify(tbls) +  "`")
}

img

При отсутствии параметров запрос по умолчанию выполняется для всех незавершенных ожидаемых ордеров текущей торговой пары BTC_USDT и суап-вечного контракта.

img

КогдаETH_USDT.swapпараметр указан, требуются все невыполненные ожидаемые ордера вечного контракта торговой пары ETH_USDT.

img

Когда пустая строка""В случае, если заказ проходит, все незавершенные заказы всех контрактов с маржинальной ставкой в USDT запрашиваются.

Обновление функции exchange.GetPosition

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

Обновлениеexchange.IOФункция

Дляexchange.IO("api", ...)призывы функций, все объекты обмена были модернизированы для поддержки прямой передачи полных адресов запросов. Например, если вы хотите вызвать интерфейс OKX:

// GEThttps://www.okx.com/api/v5/account/max-withdrawal ccy: BTC

Поддерживает прямую запись на базовый адресhttps://www.okx.comбез необходимости сначала переключать базовый адрес, а затем вызывать функцию IO.

Испытание с использованием среды моделирования фьючерсов OKX:

function main() {
    exchange.IO("simulate", true)

    return exchange.IO("api", "GET", "https://www.okx.com/api/v5/account/max-withdrawal", "ccy=BTC")
}

img

3. Влияние интерфейса API

Влияет на функцию exchange.GetOrder

Это обновление в основном влияет на параметрidВ соответствии сexchange.GetOrder(id)Параметр id изменяется с исходного идентификатора заказа на последовательность, содержащую торговый продукт. Все идентификаторы заказов на платформе FMZ в этом формате.

Например:

  • Оригинальный идентификатор ордера биржи, определенный в ордере биржи, составляет:123456Перед этим обновлением, если вы хотите вызвать функцию GetOrder, ID заказа передается в123456.
  • Код товара, названный биржей, определенной в обменном заказе:BTC-USDT- Да. Обратите внимание, что это относится к коду торгового продукта, названному биржей, а не к торговой паре, определенной платформой FMZ.

После этого обновления формат идентификатора параметра, который необходимо передать вexchange.GetOrder(id)функция регулируется на:BTC-USDT,123456.

Прежде всего, позвольте мне объяснить, почему эта конструкция сделана: Поскольку функция CreateOrder была обновлена, чтобы указать тип ордера напрямую (тип размещенного ордера может отличаться от в настоящее время установленной торговой пары и кода контракта). Если возвращенный идентификатор ордера не содержит информацию о типе, то этот идентификатор ордера будет непригодным для использования. Поскольку при проверке ордера мы не знаем, для какого типа (контракта) предназначен ордер. Большинство бирж требуют указания параметров, описывающих код типа при проверке и отмене ордеров.

Как быть совместимым с этим воздействием: Если вы используетеexchange.IOФункция позволяет вызвать интерфейс обмена ордеров непосредственно для размещения заказа, возвращаемое значение обычно содержит оригинальный символ обмена (код продукта) и оригинальный идентификатор заказа. Затем соединение двух с английскими запятой будет идентификатором заказа, который соответствует определению платформы FMZ. Аналогичным образом, если вы используете платформу FMZ для размещения заказа, поскольку начало идентификатора заказа - это код торгового продукта, если вам нужно использовать исходный идентификатор заказа, просто удалите код продукта и запятую.

Влияет на функцию обмена.Отменить заказ.

Влияние этого обновления наexchange.CancelOrder()функция такая же, как иexchange.GetOrder() function.

Влияет на функцию обмена.

Влияние этого обновления наexchange.Buy()функция такая же, как иexchange.GetOrder()Функция. Идентификатор заказа, возвращенныйexchange.Buy()функция представляет собой новую структуру, например, ID, возвращаемое при размещении фьючерсного ордера на бирже OKX, является:LTC-USDT-SWAP,1578360858053058560.

Влияет на обмен.Функция продажи.

Влияние этого обновления наexchange.Sell()функция такая же, как иexchange.GetOrder()Функция. Идентификатор заказа, возвращенныйexchange.Sell()функция представляет собой новую структуру, например, ID, возвращаемое при размещении фьючерсного ордера на бирже OKX, является:ETH-USDT-SWAP,1578360832820125696.

4. Структурные изменения

Структура клеток

Данное обновление добавляет поле "Символ" в структуру Ticker, которая записывает рыночную информацию текущей структуры Ticker. Формат этого поля точно такой же, как формат параметра символаexchange.GetTicker() function.

Структура порядка

Это обновление добавляет поле Символ в структуру Порядка, и формат этого поля точно такой же, как формат параметра символаexchange.GetTicker()Функция. Это обновление также изменяет поле ID структуры заказа, записывая информацию о продукте и первоначальную информацию о заказе в новом формате ID заказа.exchange.GetOrder()Функция, которая не будет повторяться здесь.

Структура позиции

Это обновление добавляет в структуру Позиции поле "Символ". Формат этого поля точно такой же, как формат параметра символаexchange.GetTicker() function.

5. Система обратного тестирования

Чтобы удовлетворить потребности пользователей, это обновление сначала будет совместимо с торговлей в режиме реального времени, а система обратного тестирования будет адаптирована в течение недели.

Дополнительные обновления

1. Новые поля в структуре счетов

ПоляAccountструктуру, возвращеннуюGetAccountФьючерсный обменный объект.

  • Собственный капитал Общий капитал текущей валюты маржинального актива. За исключением нескольких фьючерсных бирж, которые не поддерживают это поле, большинство бирж поддерживают это поле. Он в основном используется для расчета прибыли и убытка маржинального счета в режиме реального времени.

  • UPnL Нереализованная прибыль и убытки всех позиций, удерживаемых в валюте текущего маржинального актива.

Функция SetMarginLevel обновлена для поддержки параметра символа

Функция-член SetMarginLevel объекта фьючерсной биржи была обновлена и добавлен символ параметра.

Пример испытания:

function main() {
    exchange.SetCurrency("ETH_USDT")
    exchange.SetContractType("swap")
    
    // The current trading pair is ETH_USDT, the contract code is swap, and the leverage value is set to 10
    exchange.SetMarginLevel(10)
    
    // Directly specify the trading pair BTC_USDT, contract code swap, and set the leverage value to 20
    exchange.SetMarginLevel("BTC_USDT.swap", 20)
}

Больше