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

Разработчики квантовой платформы API: улучшение опыта стратегического проектирования

Автор:Изобретатели количественного измерения - мечты, Создано: 2024-06-28 09:08:29, Обновлено: 2024-07-24 12:00:40

[TOC]

img

Преамбула

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

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

Грамматический справочник:https://www.fmz.com/syntax-guideПользовательские инструкции:https://www.fmz.com/user-guide

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

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

新增exchange.GetTickers函数

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

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

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

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

Мы проверили окружающую среду с помощью ОКХ:

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()У нас есть четыре параметра функции.symbolsidepriceamount

Опрос на ОКХ с использованием фьючерсных дисков:

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 Live Display:

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) +  "`")
}

img

新增exchange.GetPositions函数

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

exchange.GetPositions()Функции могут быть вызваны тремя способами:

  • exchange.GetPositions ((() При отсутствии каких-либо параметров запрос хранить данные в соответствии с текущими параметрами сделки/контрактного кода.
  • exchange.GetPositions ((ETH_USDT.swap кнопка) При указании информации о конкретных сортах (формат ETH_USDT.swap, определенный платформой FMZ) запрашивается информация о хранении конкретных сортов.
  • exchange.GetPositions (("") Запросите все данные о текущих измерениях, доступных для интерфейсов хранения на бирже.

Опрос на ОКХ с использованием фьючерсных дисков:

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В этом случае можно получить данные о хранении постоянных контрактов ETH на U-битах.

img

Когда проникаетexchange.GetPositions()Параметры функции - это пустые строки.""Если вы хотите получить данные о всех контрактах, которые вы храните, вы можете использовать этот веб-сайт.

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

升级exchange.GetTicker函数

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

ПараметрыsymbolОбъекты биржиexchangeНа данный момент существуют две версии:

  • Объекты обмена Формат:AAA_BBBААА обозначает базовую валюту, BBB обозначает котировочную валюту. Например: BTC_USDT - насущная торговая пара.
  • Объекты фьючерсных бирж Формат:AAA_BBB.XXXААА обозначает базовую валюту, BBB обозначает котировочную валюту, XXX обозначает контрактный код, например, бессрочный контракт swap. Например: BTC_USDT.swap, постоянный контракт на U-бит BTC.

Проверка в условиях реального рынка фьючерсов:

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()Функция также добавляет параметры symbol. Это позволяет напрямую указывать разновидности при запросе данных глубины.

Проверка в условиях реального рынка фьючерсов:

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()Функция также добавляет параметры symbol.

Проверка в условиях реального рынка фьючерсов:

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-строка, которые запрос указывает непосредственно с параметрами символов.

exchange.GetRecords()Призыв функции:

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

Проверка в условиях реального рынка фьючерсов:

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)
}

img

升级exchange.GetOrders函数

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

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

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

Опрос на ОКХ с использованием фьючерсных дисков:

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

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

    // 写入图表
    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 торговая пара, все незавершенные подвешенные списки на постоянные контракты swap.

img

Укажите параметрыETH_USDT.swapПри параметре, запрашиваемом для длительных контрактов в паре ETH_USDT, все незавершенные подвешенные списки.

img

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

升级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.

Опрос на ОКХ с использованием фьючерсных дисков:

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函数

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

Например:

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

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

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

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

影响exchange.CancelOrder函数

Это повышениеexchange.CancelOrder()Влияние функцийexchange.GetOrder()Функции одинаковые.

影响exchange.Buy函数

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

影响exchange.Sell函数

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

4. Корректировка структуры

Структура тикера

Это обновление добавляет в конструкцию Ticker поле Symbol, которое записывает информацию о том, для какой разновидности существует нынешняя структура Ticker. Формат поляexchange.GetTicker()Формат параметров символов функции полностью совпадает.

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

Это обновление добавляет в структуру Order поле Symbol, которое форматируется так, чтобы соответствоватьexchange.GetTicker()Формат параметров символов функции полностью совпадает. Это обновление также изменило поле Id в структуре Order, чтобы записать информацию о сортах, исходную информацию о заказах в новом формате Order Id.exchange.GetOrder()Указание на ID заказа в функции, больше не обсуждается здесь.

Позиционные структуры

Это обновление добавляет в конструктор Position поле Symbol, которое форматируется сexchange.GetTicker()Формат параметров символов функции полностью совпадает.

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

Для удовлетворения потребностей пользователей обновление будет совместимо с дисками, и система ретроспекции будет полностью адаптирована в течение недели. Если коды отдельных стратегий затронуты, пожалуйста, сделайте изменения в соответствии с инструкцией этой статьи.

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

1, Account Структура Новые поля Equity, UPnL

Функции-члены для объектов фьючерсных биржGetAccountВозвращениеAccountСтруктура была расширена.

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

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

Поддержка параметров символов для функций SetMarginLevel

Для членской функции 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)
}

Больше

Я не знаю.Я спросил, что случилось с моим новым роботом, возвращающий ID, который также содержит имена транзакций, долгое время изучал, а также логин после заказа, который теперь не отображается, также из-за обновления администратора?

Чан Чжи Чжун/upload/asset/2ffc0f961149326b78aed.png Если вы не знаете, что это за проблема, пожалуйста, ответьте, что это за проблема, вызванная обновлением интерфейса.

Экнемюс 希望exchange.Buy函数能增加开止损单的功能。。

НанСЕГОригинальное название

Я не знаю.Хорошо.

Изобретатели количественного измерения - мечтыХорошо, попробуйте на этой странице. Спасибо за вопрос.

Я не знаю.Да, extMsg1, extMsg2 не отображается.

Изобретатели количественного измерения - мечтыЗдравствуйте, это неизбежное изменение, поскольку обновленная система напрямую указывает разновидность заказа, и ID заказа должен содержать информацию о разновидности, иначе невозможно определить, какая разновидность этого заказа, и не может быть вызван при отзыве (поскольку большинство бирж требуют указать разновидность и указать ID при отзыве). Вы сказали, что послезаказная информация не отображается, то есть: exchange.Buy ((price, amount, extMsg1, extMsg2) при вызове extMsg1, extMsg2 не отображается в журнале?

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

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

Изобретатели количественного измерения - мечтыВ то же время, в некоторых странах существуют существенные различия в условиях и механизмах поддержки.

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