[TOC]

Количественная торговая платформа Inventor прошла 9-летнюю технологическую итерацию и много раз реконструировалась, хотя мы, как пользователи, могли этого не заметить. За последние два года платформа провела множество оптимизаций и обновлений с точки зрения пользовательского опыта, включая комплексное обновление пользовательского интерфейса, обогащение часто используемых инструментов количественной торговли и добавление большей поддержки данных бэктестинга.
Чтобы сделать разработку стратегии более удобной, торговую логику более понятной и облегчить новичкам начало работы, платформа обновила API-интерфейс, используемый стратегией. Используйте последнюю версию вашего хоста, чтобы включить эти новые функции. Платформа сохраняет максимальную совместимость с вызовами старых интерфейсов. Информация о новых функциях интерфейса API была обновлена в документации API платформы количественной торговли Inventor:
Давайте кратко рассмотрим, какие интерфейсы были обновлены и какие изменения необходимы для того, чтобы сделать старые стратегии совместимыми с текущим API.
Для разработки многовариантных стратегий и стратегий полного мониторинга рыночной ситуации. Этот агрегированный рыночный интерфейс необходим для упрощения разработки стратегий и избежания необходимости изобретать велосипед. Количественная торговая платформа изобретателя инкапсулирует в себе такие API-интерфейсы бирж.
Если на бирже нет этого интерфейса (отдельные биржи), позвоните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
}

Новый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)
}

Это заняло всего 3 разаexchange.CreateOrder()Вызов функции размещает три фьючерсных ордера разных видов и направлений.
Новыйexchange.GetHistoryOrders()Функция используется для получения исторических заказов транзакций определенного продукта. Эта функция также требует поддержки интерфейса биржи.
Для запроса исторических заказов интерфейсы, реализованные различными биржами, существенно различаются:
Такие интерфейсы инкапсулируются с максимальной степенью совместимости, и при реальном использовании следует обращать внимание на то, соответствуют ли они требованиям и ожиданиям стратегии.
Подробное описание функции здесь не повторяется, вы можете обратиться к руководству по синтаксису в документации API:
https://www.fmz.com/syntax-guide#fun_exchange.gethistoryorders
Протестировано с использованием спотовой торговой среды Binance:
function main() {
var orders = exchange.GetHistoryOrders("ETH_USDT")
// 写入图表
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) + "`")
}

Старая версия функции сбора данных о местоположении:exchange.GetPosition(). Для лучшего соответствия семантике именования функций это обновление добавляет новую функцию для получения позиций:exchange.GetPositions(). В то же время он по-прежнему совместим/обновлен с функцией GetPosition.
Обратите внимание, что имена двух функций отличаются только завершающим s. Поскольку GetPositions семантически более корректен, рекомендуется использовать GetPositions в будущем.
exchange.GetPositions()Существует три формы вызовов функций:
exchange.GetPositions() Если параметры не переданы, текущийТорговые пары / Код контрактаЗапросить данные о местоположении всех разновидностей в текущем измерении.
exchange.GetPositions(“ETH_USDT.swap”)
При указании конкретной информации о продукте (формат ETH_USDT.swap определяется платформой FMZ) запросите данные о позиции конкретного продукта.
Пример:BTC_USD.swap、ETH_USDT.swap、ETH_USDT.quarterждать.
BTC_USD.swap: бессрочный контракт на валюту BTC.
ETH_USDT.swap: бессрочный контракт ETH на основе U.
ETH_USDC.swap: бессрочный контракт с маржой USDC на ETH. (Помимо USDT, вы также можете указать другую quoteCurrency, которая не будет здесь повторяться)
ETH_USDT.quarter: квартальный контракт на поставку ETH на основе U.
BTC_USD.BTC-USD-201226-24250-C: опционный контракт с маржинальной торговлей монетами BTC.
exchange.GetPositions(“USDT.swap”) Запросить данные о положении всех символов в соответствии с указанным диапазоном размеров. USDT.swap: диапазон бессрочных контрактов на основе U. USDT.futures: Диапазон контрактов на поставку, деноминированных в U. USDC.swap: диапазон бессрочных контрактов с маржой USDC. (Помимо USDT, вы также можете указать другую quoteCurrency, которая не будет здесь повторяться) USDC.futures: Диапазон фьючерсных контрактов с маржой USDC. USD.swap: Диапазон бессрочных контрактов на основе валюты. USD.futures: Диапазон фьючерсных контрактов на валюту. USDT.option: диапазон опционных контрактов на основе U. USD.option: Диапазон опционных контрактов на основе валюты.
Некоторые специальные подразделения размеров биржевых контрактов: USDT.futures_combo: комбинация CFD биржи Futures_Deribit. USD.futures_ff:Контракт на поставку смешанной маржи на бирже Futures_Craken. USD.swap_pf: Фьючерсы_Гибридно-маржинальный бессрочный контракт на бирже Kraken.
Для измерений, которые не поддерживаются интерфейсом API обмена, будет выведено сообщение об ошибке и при вызове будет возвращено нулевое значение.
Тестирование с использованием среды моделирования фьючерсов OKX:
function main() {
exchange.IO("simulate", true)
exchange.SetCurrency("BTC_USDT")
exchange.SetContractType("swap")
var p1 = exchange.GetPositions()
var p2 = exchange.GetPositions("BTC_USDT.swap")
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) + "`")
}

При входящемexchange.GetPositions()Параметры функции:ETH_USDT.swapПри использовании бессрочного контракта на основе ETH U вы можете получить данные о позиции бессрочного контракта на основе ETH U.
Если не импортированоexchange.GetPositions()При использовании функции в качестве параметра можно получить данные о позициях всех бессрочных контрактов U-margin, котирующихся на бирже (поскольку текущей торговой парой является BTC_USDT, а контрактом является своп, запрос основан на текущей торговой паре и Диапазон размеров контракта). Это эквивалентно вызовуexchange.GetPositions("USDT.swap"), укажите область запроса.
Недавно добавленная функция GetFundings позволяет получить ставку финансирования бессрочных контрактов на фьючерсных биржах. Функция принимает один параметр-символ. Функция возвращает массив структур финансирования.
BTC_USDT.swap. Если в функцию не передано ни одного параметра или передан диапазон, появится сообщение об ошибке, сообщающее о том, что параметр символа не поддерживается.Функция рынкаexchange.GetTicker()Это обновление в основном добавляет параметры символов. Эту функцию можно использовать для прямого запроса рыночных данных в соответствии с информацией о продукте, указанной в параметрах, независимо от текущей торговой пары и кода контракта. Упрощает процесс написания кода. При этом он по-прежнему совместим с методом вызова без передачи параметров и в максимальной степени совместим со старыми стратегиями платформы.
параметрsymbolДля обмена объектамиexchangeСуществуют различные форматы для спотовых/фьючерсных сделок:
AAA_BBBAAA представляет baseCurrency, т. е. валюту транзакции, а BBB представляет quoteCurrency, т. е. валюту ценообразования. Названия валют написаны заглавными буквами.
Например: спотовая торговая пара BTC_USDT.AAA_BBB.XXX, AAA представляет baseCurrency, т. е. валюту транзакции, BBB представляет quoteCurrency, т. е. валюту ценообразования, а XXX представляет код контракта, например, бессрочный контрактный своп. Названия валют указаны заглавными буквами, а коды контрактов — строчными буквами.
Например: BTC_USDT.swap, бессрочный контракт BTC на основе U.Протестировано с использованием реальной среды 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
}

Запрос пакета рыночных данных по указанному символу стал намного проще.
То же, что и функция GetTickerexchange.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"))
}

То же, что и функция GetTickerexchange.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) + "`")
}

Это обновление также совместимо сexchange.Go()Когда функция одновременно вызывает интерфейс API платформы, параметр символа передается для указания информации о продукте.
На этот раз функция GetRecords была существенно скорректирована, в дополнение к поддержке параметра symbol для непосредственного указания информации о типе запрашиваемых данных K-line. Исходный параметр периода сохраняется для указания периода K-линии, а параметр предела добавляется для указания ожидаемой длины K-линии при запросе. Он также совместим со старой версией функции GetRecords, которая передает только параметр периода.
exchange.GetRecords()Как вызвать функцию:
Протестировано с использованием реальной среды 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相邻Bar时间差值:", r1[1].Time - r1[0].Time, "毫秒, Bar长度:", r1.length)
Log("r2相邻Bar时间差值:", r2[1].Time - r2[0].Time, "毫秒, Bar长度:", r2.length)
Log("r3相邻Bar时间差值:", r3[1].Time - r3[0].Time, "毫秒, Bar长度:", r3.length)
Log("r4相邻Bar时间差值:", r4[1].Time - r4[0].Time, "毫秒, Bar长度:", r4.length)
Log("r5相邻Bar时间差值:", r5[1].Time - r5[0].Time, "毫秒, Bar长度:", r5.length)
}

Функция GetOrders также добавляетsymbolПараметры, вы можете указать конкретный продукт и запросить незавершенные заказы (отложенные заказы) этого продукта; вы также можете запросить незавершенные заказы (отложенные заказы) всех продуктов в указанном диапазоне измерений.
exchange.GetOrders()Функцию можно вызвать следующими способами:
Тестирование с использованием среды моделирования фьючерсов OKX:
function main() {
exchange.IO("simulate", true)
exchange.SetCurrency("BTC_USDT")
exchange.SetContractType("swap")
// 写入图表
var tbls = []
for (var symbol of ["null", "ETH_USDT.swap", "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) + "`")
}
ETH_USDT.swapПараметр, запрос невыполненных ордеров (отложенных ордеров) бессрочного контракта ETH с маржой USDT."USDT.swap"Запросить все невыполненные ордера (отложенные ордера) бессрочных контрактов с маржой USDT.Он по-прежнему совместим со старым наименованием функций получения местоположения, а также добавляет параметр символа, который может указывать информацию о типе конкретных запрошенных данных местоположения. Использование функций иexchange.GetPositions()Полностью соответствует.
дляexchange.IO("api", ...)Метод вызова функции был обновлен для поддержки прямой передачи полного адреса запроса для всех объектов обмена.
Например, если вы хотите вызвать интерфейс OKX:
GET https://www.okx.com /api/v5/account/max-withdrawal ccy: BTC
Поддержка прямой записи на базовый адресhttps://www.okx.com, нет необходимости переключать базовый адрес перед вызовом функции ввода-вывода.
Тестирование с использованием среды моделирования фьючерсов OKX:
function main() {
exchange.IO("simulate", true)
return exchange.IO("api", "GET", "https://www.okx.com/api/v5/account/max-withdrawal", "ccy=BTC")
}

Это обновление в основном затрагиваетexchange.GetOrder(id)Параметры функцииidПараметр id изменяется с исходного идентификатора биржевого ордера на строковый формат, содержащий разновидность торговли. Все упакованные идентификаторы заказов на платформе FMZ имеют этот формат.
Например:
123456
До этого обновления, если вы хотите вызвать функцию GetOrder, передаваемый идентификатор заказа будет следующим:123456。BTC-USDT。
Обратите внимание, что здесь упоминается код торгового продукта, названный биржей, а не торговая пара, определенная платформой FMZ.После этого обновления,exchange.GetOrder(id)Формат идентификатора параметра, который должна передать функция, изменяется следующим образом:BTC-USDT,123456。
Позвольте мне сначала объяснить, почему сделан именно такой дизайн: Поскольку на этот раз функция CreateOrder была обновлена для непосредственного указания продукта для размещения заказа (заказанный продукт может отличаться от текущей установленной торговой пары и кода контракта), если возвращаемый идентификатор заказа не содержит информации о продукте. Тогда этот идентификатор заказа будет недоступен для использования. Потому что при проверке заказа вы не знаете, к какому типу (контракту) относится заказ. Большинство бирж требуют указывать параметры, описывающие код товара при проверке и отмене заказов.
Как учесть этот эффект: Если вы используете функцию exchange.IO для прямого вызова интерфейса заказа биржи с целью размещения заказа, возвращаемое значение обычно содержит исходный символ биржи (код продукта) и исходный идентификатор заказа. Затем, объединив эти два значения с помощью английских запятых, вы получите идентификатор заказа, определенный платформой FMZ. Аналогично, если вы используете интерфейс заказа, инкапсулированный платформой FMZ, для размещения заказа, поскольку начало идентификатора заказа — это торговый код продукта, если вам нужно использовать исходный идентификатор заказа, вам нужно только удалить код продукта и запятая.
Это обновление предназначено дляexchange.CancelOrder()Влияние функций иexchange.GetOrder()Функции те же.
Это обновление предназначено дляexchange.Buy()Влияние функций иexchange.GetOrder()Функции те же.exchange.Buy()Идентификатор ордера, возвращаемый функцией, представляет собой новую структуру, например, идентификатор, возвращаемый при размещении фьючерсного ордера на бирже OKX:LTC-USDT-SWAP,1578360858053058560。
Это обновление предназначено дляexchange.Sell()Влияние функций иexchange.GetOrder()Функции те же.exchange.Sell()Идентификатор ордера, возвращаемый функцией, представляет собой новую структуру, например, идентификатор, возвращаемый при размещении фьючерсного ордера на бирже OKX:ETH-USDT-SWAP,1578360832820125696。
Эту функцию поддерживают только объекты фьючерсной биржи. Для функции exchange.GetPosition() для получения данных о позиции добавлено новое имя exchange.GetPositions(), и их поведение абсолютно одинаково.
Старое определение: функция exchange.GetPosition(). При вызове без указания каких-либо параметров она получает данные о позиции конкретного контракта, заданного текущей торговой парой и кодом контракта.
После корректировки и модификации новое определение выглядит так: функция exchange.GetPosition(). При вызове без указания каких-либо параметров она получает позиции всех разновидностей в диапазоне измерений, определяемом текущей установленной торговой парой и кодом контракта.
Например, текущая торговая пара — BTC_USDT, а код контракта — swap. В это время звоните:
exchange.GetPosition() // 等价于调用 exchange.GetPosition("USDT.swap")
Эта функция запросит данные о позициях бессрочных контрактов U-margin всех валют.
Старое определение: функция exchange.GetOrders(). При вызове без указания каких-либо параметров она извлекает все невыполненные ордера для текущей торговой пары.
После корректировки и модификации новое определение выглядит так: функция exchange.GetOrders(). При вызове без указания каких-либо параметров она получает незавершенные ордера всех спотовых торговых пар.
Старое определение: функция exchange.GetOrders(). При вызове без указания каких-либо параметров она извлекает все незавершенные ордера определенного контракта, заданного текущей торговой парой и кодом контракта.
После корректировки и модификации новое определение: функция exchange.GetOrders(). При вызове без указания каких-либо параметров она получает все незавершенные ордера в диапазоне измерений, определяемом текущей установленной торговой парой и кодом контракта.
Например, текущая торговая пара — BTC_USD, а код контракта — quarter. В это время звоните:
exchange.GetOrders() // 等价于调用 exchange.GetOrders("USD.futures")
Эта функция запросит данные о невыполненных заказах по всем фьючерсным контрактам с маржой на монеты.
Это обновление добавляет поле «Символ» в структуру тикера, в котором регистрируется рыночная информация о продукте текущей структуры тикера. Формат этого поля:exchange.GetTicker()Формат символьных параметров функции точно такой же.
Это обновление добавляет поле Символ в структуру Заказа. Формат этого поля такой же, какexchange.GetTicker()Формат символьных параметров функции точно такой же. Это обновление также изменяет поле «Идентификатор» структуры заказа для записи информации о продукте и исходной информации о заказе в новом формате идентификатора заказа. ссылаться наexchange.GetOrder()Описание идентификатора заказа в функции здесь повторяться не будет.
Это обновление добавляет поле Символ в структуру Позиция. Формат этого поля такой же, какexchange.GetTicker()Формат символьных параметров функции точно такой же.
Функция GetFundings возвращает массив структур финансирования.
{
"Info": {...}, // 交易所资金费率接口原始应答数据
"Symbol": "BTC_USDT.swap", // FMZ平台定义的品种名称
"Interval": 28800000, // 8小时间隔,单位毫秒
"Time": 1729728000000, // 本期资金费率收取时间
"Rate": 0.0001, // 资金费率,即 0.01 %
}
Для удовлетворения потребностей пользователей это обновление сначала будет совместимо с реальным рынком, а система бэктестинга будет адаптирована в течение недели. Если затронуты отдельные коды стратегий, следуйте инструкциям в этой статье, чтобы внести изменения и адаптации.
В соответствии с обновлением интерфейса API стратегии платформы, интерфейсы API в системе бэктестинга платформы были обновлены синхронно; кроме того, в систему бэктестинга добавлена поддержка:
Функции-члены для объектов фьючерсной биржиGetAccountВозвращатьсяAccountСтруктура была расширена за счет полей.
Функция-член SetMarginLevel объекта фьючерсной биржи была обновлена для добавления символа параметра.
Пример теста:
function main() {
exchange.SetCurrency("ETH_USDT")
exchange.SetContractType("swap")
// 当前交易对为ETH_USDT,合约代码为swap,设置杠杆值为10
exchange.SetMarginLevel(10)
// 直接指定交易对BTC_USDT,合约代码swap,设置杠杆值20
exchange.SetMarginLevel("BTC_USDT.swap", 20)
}
CtValCcyЗапишите единицу стоимости контракта. Единицей стоимости контракта может быть: BTC, USD, ETH и т. д.CtValЗапишите стоимость одного контракта этого торгового продукта на бирже, в единицахCtValCcyАктуальность полевой записи. Например:CtValсоставляет 0,01,CtValCcy«BTC» означает, что один контракт стоит 0,01 BTC.