[TOC]
После 9 лет технической итерации платформа FMZ Quant Trading была многократно реконструирована, хотя как пользователи мы, возможно, не заметили этого.
Для того, чтобы сделать разработку стратегии более удобной, логику торговли более понятной и легкой для начинающих, платформа обновила интерфейс API, используемый стратегией. Докеры, использующие последнюю версию, могут включить эти новые функции. Платформа по-прежнему в наибольшей степени совместима со старыми вызовами интерфейса. Информация о новых функциях интерфейса API была обновлена в документации API платформы FMZ Quant Trading:
Руководство по синтаксису:https://www.fmz.com/syntax-guideРуководство пользователя:https://www.fmz.com/user-guide
Итак, давайте быстро посмотрим, какие интерфейсы были обновлены и какие изменения необходимы для использования старых стратегий, чтобы сделать их совместимыми с текущим 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)
}
Таким образом, только триexchange.CreateOrder()
Призывы к функциям использовались для размещения трех фьючерсных ордеров разных сортов и направлений.
Новое приложениеexchange.GetHistoryOrders()
Функция также требует поддержки интерфейса обмена.
Для запроса исторических заказов интерфейсы, реализованные различными биржами, сильно различаются:
Детальное описание функции здесь не повторяется, вы можете обратиться к руководству по синтаксису в документации 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) + "`")
}
Старая версия функции сбора данных о местоположенииexchange.GetPosition()
. Это обновление добавляет новую функцию получения позиции, чтобы лучше соответствовать семантике имен функций:exchange.GetPositions()
. В то же время, он все еще совместим/усовершенствован с функцией GetPosition.
Обратите внимание, что названия двух функций отличаются только последним s. Поскольку GetPositions более семантически правильный, рекомендуется использовать GetPositions в будущем.
Вexchange.GetPositions()
Функция имеет три формы вызова:
Обмен.GetPositions ((() Когда параметры не передаются, данные о положении всех сортов в текущем измерении запрашиваются в соответствии с настройками текущеготорговые пары / код контракта.
exchange.GetPositions ((BTC_USD.swap
, ETH_USDT.swap
, ETH_USDT.quarter
, и т.д.
BTC_USD.swap: вечный контракт на валюте BTC
exchange.GetPositions ((
Некоторые специальные подразделения по размеру валютных контрактов:
USDT.futures_combo: Фьючерс_Deribit exchange
Испытание с использованием среды моделирования фьючерсов 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
, можно получить данные о позиции U-основанных вечных контрактов ETH
Когда параметрыexchange.GetPositions()
В случае, если данные о позиции не передаются, можно получить данные о позиции всех постоянных контрактов на базе U, перечисленных на бирже (поскольку текущая торговая пара BTC_USDT, а контракт является свопом, запрос основан на текущей торговой паре и диапазоне измерений контракта).exchange.GetPositions("USDT.swap")
и указание диапазона запросов.
Основная модернизация рыночной функцииexchange.GetTicker()
Это позволяет функции запросить данные рынка непосредственно в соответствии с информацией о продукте, указанной параметром без текущей торговой пары и кода контракта. Это упрощает процесс написания кода. В то же время, он все еще совместим с методом вызова без прохождения параметров, и в наибольшей степени совместим со старой стратегией платформы.
Параметрsymbol
имеет различные форматы для спотов/фьючерсов на предмет обменаexchange
:
AAA_BBB
, AAA обозначает baseCurrency, то есть торговую валюту, а BBB обозначает quoteCurrency, то есть валюту ценообразования.
Например: спотовая торговая пара BTC_USDT.AAA_BBB.XXX
, AAA представляет baseCurrency, то есть торговую валюту, BBB представляет quoteCurrency, то есть валюту ценообразования, а XXX представляет собой код контракта, такой как вечный контракт swap.
Например: BTC_USDT.swap, BTCvar 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
}
Запрос партии рыночных данных для определенного символа стал намного проще.
Подобно функции 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"))
}
Подобно функции 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) + "`")
}
Это обновление также совместимо с параметром символа, указаннымexchange.Go()
функция при одновременном вызове интерфейса API платформы.
Функция GetRecords была значительно скорректирована на этот раз. В дополнение к поддержке параметра символа для прямого указания информации о типе запрашиваемых данных K-линии, исходный параметр периода сохраняется для указания периода 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 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)
}
Функция GetOrders также добавляетsymbol
параметры, которые могут быть использованы для указания конкретного символа и запроса незавершенных заказов (ожидаемых заказов) этого символа; он также поддерживает запрос незавершенных заказов (ожидаемых заказов) всех символов в указанном диапазоне размеров.
Вexchange.GetOrders()
функция может быть вызвана следующими способами:
Испытание с использованием среды моделирования фьючерсов 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", "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) + "`")
}
При отсутствии параметров требуются незавершенные ордера (ожидаемые ордера) всех видов в диапазоне размеров текущей торговой пары (BTC_USDT) и кода контракта (swap).
Когда параметрETH_USDT.swap
В случае, если указанный параметр не выполнен, требуются незавершенные заказы (ожидаемые заказы) ETH
Когда шнур"USDT.swap"
При прохождении процедуры, требуются незавершенные заказы (ожидаемые заказы) всех бессрочных контрактов на основе USDT.
Он по-прежнему совместим со старой функцией присвоения позиций и также добавляет параметр символа, который может указывать информацию о типе конкретных запрошенных данных о позиции.
Использование этой функции точно такое же, какexchange.GetPositions()
.
Для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")
}
Это обновление в основном влияет на параметр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
.
Для функции exchange.GetPosition() для получения данных о позиции добавляется новое имя exchange.GetPositions(), и оба поведения точно одинаковы.
Старое определение: функция exchange.GetPosition(, при вызове без указания каких-либо параметров, получает данные о положении конкретного контракта, установленные текущей торговой парой и кодом контракта. После корректировки и модификации новая функция exchange.GetPosition ((), при вызове без указания каких-либо параметров, получает позиции всех разновидностей в диапазоне измерений, определяемом текущей установленной торговой парой и кодом контракта.
Например, текущая торговая пара BTC_USDT и код контракта swap.
exchange.GetPosition() // Equivalent to calling exchange.GetPosition("USDT.swap")
Эта функция запрашивает данные о позиции постоянных контрактов на основе U всех валют.
Старое определение: функция exchange.GetOrders(), при вызове без указания каких-либо параметров, получает все незавершенные заказы текущей торговой пары. После корректировки и модификации новое определение: функция exchange.GetOrders(), при вызове без указания каких-либо параметров, получает незавершенные заказы всех спотовых торговых пар.
Старое определение: функция exchange.GetOrders(), при вызове без указания каких-либо параметров, получает все незавершенные заказы конкретного контракта, установленные текущей торговой парой и кодом контракта. После корректировки и модификации новое определение: функция exchange.GetOrders(), при вызове без указания каких-либо параметров, получает все незавершенные заказы диапазона измерений, определенного текущей торговой парой и кодом контракта.
Например, текущая торговая пара BTC_USD и код контракта квартал.
exchange.GetOrders() // Equivalent to calling exchange.GetOrders("USD.futures")
Эта функция запрашивает данные о остающихся заказах всех фьючерсных контрактов на основе монет.
Данное обновление добавляет поле "Символ" в структуру Ticker, которая записывает рыночную информацию текущей структуры Ticker.
Формат этого поля точно такой же, как формат параметра символаexchange.GetTicker()
function.
Это обновление добавляет поле Символ в структуру Порядка, и формат этого поля точно такой же, как формат параметра символаexchange.GetTicker()
Функция.
Это обновление также изменяет поле ID структуры заказа, записывая информацию о продукте и первоначальную информацию о заказе в новом формате ID заказа.exchange.GetOrder()
Функция, которая не будет повторяться здесь.
Это обновление добавляет в структуру Позиции поле "Символ". Формат этого поля точно такой же, как формат параметра символаexchange.GetTicker()
function.
Согласно обновлению интерфейса API стратегии платформы, система обратного тестирования платформы была обновлена синхронно; Кроме того, система обратного тестирования добавила поддержку:
ПоляAccount
структуру, возвращеннуюGetAccount
Фьючерсный обменный объект.
Собственный капитал Общий капитал текущей валюты маржинального актива. За исключением нескольких фьючерсных бирж, которые не поддерживают это поле, большинство бирж поддерживают это поле. Он в основном используется для расчета прибыли и убытка маржинального счета в режиме реального времени.
UPnL Нереализованная прибыль и убытки всех позиций, удерживаемых в валюте текущего маржинального актива.
Функция-член 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)
}
ПолеCtValCcy
записывает единицу стоимости контракта. Единицей стоимости контракта могут быть: BTC, USD, ETH и т.д.
ПолеCtVal
вносит стоимость контракта торгуемого продукта на биржу, а единицей является валюта, зарегистрированная вCtValCcy
Например:CtVal
равен 0,01 иCtValCcy
это