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

Торговля

exchange.Buy

Вexchange.Buy()Функция используется для размещения заказов на покупку.Buy()функция является членом функции обмена объекта {@var/EXCHANGE exchange}.Buy()функция работает на обменном счете, связанном с объектом обменаexchangeЦель функций (методов) членовexchangeОбъект связан только сexchange, и не будет повторяться после документации.

Успешный заказ возвращает ID заказа, неудачный заказ возвращает нулевое значение. АтрибутIdструктуры порядка {@struct/Order Order} платформы FMZ состоит из кода продукта биржи и идентификатора оригинального заказа биржи, разделенных английскими запятой.Idформат спотовой торговой парыETH_USDTпорядок биржи OKX:ETH-USDT,1547130415509278720- Да. Когда вы звонитеexchange.Buy()функция для размещения заказа, возвратного значения заказаIdсогласуется сIdатрибут структуры порядка {@struct/Order Order}.

строка, нулевое значение

обмен.покупка ((цена, сумма) обмен.покупка ((цена, сумма,...args)

ВpriceПараметр используется для установки цены заказа. цены неправда Номер ВamountПараметр используется для установки суммы заказа. сумма Истинно Номер Расширенные параметры, которые могут выводить сопроводительную информацию в этот журнал заказов,argПараметры могут быть переданы более чем одному. арг ложное string, number, bool, object, array, null и любой другой тип, поддерживаемый системой

function main() {
    var id = exchange.Buy(100, 1);
    Log("id:", id);
}
def main():
    id = exchange.Buy(100, 1)
    Log("id:", id)
void main() {
    auto id = exchange.Buy(100, 1);
    Log("id:", id);
}

Номер порядка, возвращенныйexchange.Buy()может использоваться для запроса информации о заказе и отмены заказа.

// The following is an error call
function main() {
    exchange.SetContractType("quarter")
  
    // Set the shorting direction
    exchange.SetDirection("sell")     
    // If you place a buy order, an error will be reported, and shorting can only be sold
    var id = exchange.Buy(50, 1)

    // Set the long direction
    exchange.SetDirection("buy")      
    // If you place a sell order, it will report an error, go long, only buy
    var id2 = exchange.Sell(60, 1)    
  
    // Set direction to close long positions
    exchange.SetDirection("closebuy")    
    // If you place a buy order, it will report an error, close long, only sell
    var id3 = exchange.Buy(-1, 1)        
  
    // Set direction to close short positions
    exchange.SetDirection("closesell")   
    // If you place a sell order, it will report an error, close short, only buy
    var id4 = exchange.Sell(-1, 1)       
}
# The following is an error call
def main():
    exchange.SetContractType("quarter")
    exchange.SetDirection("sell")
    id = exchange.Buy(50, 1)
    exchange.SetDirection("buy")
    id2 = exchange.Sell(60, 1)
    exchange.SetDirection("closebuy")
    id3 = exchange.Buy(-1, 1)
    exchange.SetDirection("closesell")
    id4 = exchange.Sell(-1, 1)
// The following is an error call
void main() {
    exchange.SetContractType("quarter");
    exchange.SetDirection("sell");
    auto id = exchange.Buy(50, 1);
    exchange.SetDirection("buy");
    auto id2 = exchange.Sell(60, 1);
    exchange.SetDirection("closebuy");
    auto id3 = exchange.Buy(-1, 1);
    exchange.SetDirection("closesell");
    auto id4 = exchange.Sell(-1, 1);
}

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

direction is sell, invalid order type Buy
direction is buy, invalid order type Sell
direction is closebuy, invalid order type Buy
direction is closesell, invalid order type Sell
// For example, the trading pair: ETH_BTC, place a buy order at the market price
function main() {
    // Place a buy order at the market price and buy ETH coins with a value of 0.1 BTC (denominated currency)
    exchange.Buy(-1, 0.1)    
}
def main():
    exchange.Buy(-1, 0.1)
void main() {
    exchange.Buy(-1, 0.1);
}

Порядок на рынке.

При размещении ордера на фьючерсный контракт вы должны обратить внимание на то, правильно ли установлено направление торговли, так как будет сообщена ошибка, если направление торговли и функция торговли не совпадают. ПараметрpriceУстановлено на-1для размещения рыночных ордеров, который требует интерфейса размещения ордеров биржи для поддержки рыночных ордеров.amountПри размещении рыночных заказов на криптовалютные фьючерсные контракты параметр суммыamountесть количество контрактов. Есть несколько криптовалютных бирж, которые не поддерживают интерфейс рыночного заказа во время торговли в режиме реального времени. Количество заказов для рыночных заказов на некоторых спотовых биржах - это количество торговых монет. Пожалуйста, обратитесь кСпециальные инструкции по обменуУказание пользователя для подробной информации. Если вы используете более старую версию докера, возвращается значение заказаIdВ соответствии сexchange.Buy()функция может отличаться от возвратной стоимости ордераIdописано в настоящем документе.

{@fun/Trade/exchange.Sell exchange.Sell}, {@fun/Futures/exchange.SetContractType exchange.SetContractType}, {@fun/Futures/exchange.SetDirection exchange.SetDirection}

exchange.Sell

Вexchange.Sell()Функция используется для размещения ордеров продажи.

Успешный заказ возвращает ID заказа, неудачный заказ возвращает нулевое значение.Idструктуры порядка {@struct/Order Order} платформы FMZ состоит из кода продукта биржи и идентификатора оригинального заказа биржи, разделенных английскими запятой.Idформат спотовой торговой парыETH_USDTпорядок биржи OKX:ETH-USDT,1547130415509278720Когда звонишьexchange.Sell()функция для размещения заказа, возвратного значения заказаIdсогласуется сIdатрибут структуры порядка {@struct/Order Order}. строка, нулевое значение

обмен.продажа ((цена, сумма) обмен.продажа ((цена, сумма,...args)

ВpriceПараметр используется для установки цены заказа. цены неправда Номер ВamountПараметр используется для установки суммы заказа. сумма Истинно Номер Расширенные параметры, которые могут выводить сопроводительную информацию в этот журнал заказов,argПараметры могут быть переданы более чем одному. арг ложное string, number, bool, object, array, null и любой другой тип, поддерживаемый системой

function main(){
    var id = exchange.Sell(100, 1)
    Log("id:", id)
}
def main():
    id = exchange.Sell(100, 1)
    Log("id:", id)
void main() {
    auto id = exchange.Sell(100, 1);
    Log("id:", id);
}

Номер порядка, возвращенныйexchange.Sell()может использоваться для запроса информации о заказе и отмены заказов.

// The following is an error call
function main() {
    exchange.SetContractType("quarter")
  
    // Set the shorting direction
    exchange.SetDirection("sell")     
    // If you place a buy order, an error will be reported, and shorting can only be sold
    var id = exchange.Buy(50, 1)                  

    // Set the long direction
    exchange.SetDirection("buy")      
    // If you place a sell order, it will report an error, go long, only buy
    var id2 = exchange.Sell(60, 1)    
  
    // Set direction to close long positions
    exchange.SetDirection("closebuy")    
    // If you place a buy order, it will report an error, close long, only sell
    var id3 = exchange.Buy(-1, 1)        
  
    // Set direction to close short positions
    exchange.SetDirection("closesell")   
    // If you place a sell order, it will report an error, close short, only buy
    var id4 = exchange.Sell(-1, 1)       
}
# The following is an error call
def main():
    exchange.SetContractType("quarter")
    exchange.SetDirection("sell")
    id = exchange.Buy(50, 1)
    exchange.SetDirection("buy")
    id2 = exchange.Sell(60, 1)
    exchange.SetDirection("closebuy")
    id3 = exchange.Buy(-1, 1)
    exchange.SetDirection("closesell")
    id4 = exchange.Sell(-1, 1)
// The following is an error call
void main() {
    exchange.SetContractType("quarter");
    exchange.SetDirection("sell");
    auto id = exchange.Buy(50, 1);
    exchange.SetDirection("buy");
    auto id2 = exchange.Sell(60, 1);
    exchange.SetDirection("closebuy");
    auto id3 = exchange.Buy(-1, 1);
    exchange.SetDirection("closesell");
    auto id4 = exchange.Sell(-1, 1);
}

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

direction is sell, invalid order type Buy
direction is buy, invalid order type Sell
direction is closebuy, invalid order type Buy
direction is closesell, invalid order type Sell
// For example, the trading pair: ETH_BTC, place a sell order at the market price
function main() {
    // Note: place a market order to sell, sell 0.2 ETH
    exchange.Sell(-1, 0.2)   
}
def main():
    exchange.Sell(-1, 0.2)
void main() {
    exchange.Sell(-1, 0.2);
}

Порядок на рынке.

При размещении заказа на фьючерсный контракт вы должны обратить внимание на то, правильно ли установлено направление торговли, так как будет сообщена ошибка, если направление торговли и функция торговли не совпадают. ПараметрpriceУстановлено на-1для размещения рыночных ордеров, который требует, чтобы интерфейс размещения ордеров биржи поддерживал рыночные ордера.amountПри размещении рыночных ордеров на криптовалютные фьючерсные контракты, параметр суммыamountЕсть несколько криптовалютных бирж, которые не поддерживают интерфейс рыночных заказов во время торговли в режиме реального времени. Если вы используете более старую версию докера, возвращается значение заказаIdВ соответствии сexchange.Sell()функция может отличаться от возвратной стоимости ордераIdописано в настоящем документе.

{@fun/Trade/exchange.Buy exchange.Buy}, {@fun/Futures/exchange.SetContractType exchange.SetContractType}, {@fun/Futures/exchange.SetDirection exchange.SetDirection}

exchange.CreateOrder

Вexchange.CreateOrder()функция используется для размещения заказа.

Если заказ успешно размещен, возвращается идентификатор заказа; если заказ не выполняется, возвращается значение null.Idструктуры порядка {@struct/Order Order} платформы FMZ состоит из кода продукта биржи и идентификатора оригинального заказа биржи, разделенных английскими запятой.Idформат ордера спотовой торговой парыETH_USDTна бирже OKX составляет:ETH-USDT,1547130415509278720Когда звонишьexchange.CreateOrder(symbol, side, price, amount)функция для размещения заказа, возвращаемая стоимость заказаIdсогласуется сIdсвойство структуры порядка {@struct/Order Order}. строка, нулевое значение

exchange.CreateOrder ((символ, сторона, цена, сумма) exchange.CreateOrder ((символ, сторона, цена, сумма,...args)

Параметрsymbolиспользуется для указания конкретной торговой пары и кода контракта ордера.exchange.CreateOrder(symbol, side, price, amount)функция размещения заказа,exchangeявляется объектом спотового обмена. Если валютой ордера является USDT, а валютой торгов - BTC, параметрsymbolявляется:"BTC_USDT", в формате торговой пары, определенной платформой FMZ.exchange.CreateOrder(symbol, side, price, amount)функция размещения заказа,exchangeявляется объектом фьючерсного обмена. Если ордер является ордером BTCs U-стандартного вечного контракта, параметрsymbolявляется:"BTC_USDT.swap", а формат представляет собой сочетаниеторговые парыикод контрактаопределяется платформой FMZ, разделенной символом ..exchange.CreateOrder(symbol, side, price, amount)функция размещения заказа,exchangeявляется объектом фьючерсного обмена. Если ордер является ордером BTCs U-стандартного опционного контракта, параметрsymbolявляется:"BTC_USDT.BTC-240108-40000-C"(взять Binance Option BTC-240108-40000-C в качестве примера), и формат является комбинациейторговые парыопределены платформой FMZ и конкретным кодом контракта опциона, определенным биржей, разделенным символом .. символ Истинно строка Вsideпараметр используется для указания направления торговли ордера. Для объектов спотового обмена необязательные значенияsideпараметры:buy, sell. buyозначает покупку, иsellозначает продажу. Для фьючерсных обменных объектов необязательные значенияsideпараметры:buy, closebuy, sell, closesell. buyозначает открытие длинной позиции,closebuyозначает закрытие длинной позиции,sellозначает открытие короткой позиции, иclosesellозначает закрытие короткой позиции.

сторона неправда строка ПараметрpriceЦена -1 указывает на то, что заказ является рыночным. цены Истинно Номер ПараметрamountУкажите, что когда ордер представляет собой ордер на покупку на рынке, количество ордера - это сумма покупки; количество ордера ордера на покупку на рынке некоторых спотовых бирж - это количество торговых монет.Специальные инструкции по обменув руководстве пользователя. сумма Истинно Номер Расширенные параметры могут выводить дополнительную информацию в этот журнал заказов.argпараметры могут быть переданы. арг ложное Любой тип, поддерживаемый системой, например строка, число, bool, объект, массив, нулевое значение и т. д.

function main() {
    var id = exchange.CreateOrder("BTC_USDT", "buy", 60000, 0.01)           // Spot exchange objects place orders for currency-to-currency transactions BTC_USDT trading pairs
    // var id = exchange.CreateOrder("BTC_USDT.swap", "buy", 60000, 0.01)   // Futures exchange objects place orders for BTC's U-standard perpetual contracts
    Log("Order Id:", id)
}
def main():
    id = exchange.CreateOrder("BTC_USDT", "buy", 60000, 0.01)          # Spot exchange objects place orders for currency-to-currency transactions BTC_USDT trading pairs
    # id = exchange.CreateOrder("BTC_USDT.swap", "buy", 60000, 0.01)   # Futures exchange objects place orders for BTC's U-standard perpetual contracts
    Log("Order Id:", id)
void main() {
    auto id = exchange.CreateOrder("BTC_USDT", "buy", 60000, 0.01);           // Spot exchange objects place orders for currency-to-currency transactions BTC_USDT trading pairs
    // auto id = exchange.CreateOrder("BTC_USDT.swap", "buy", 60000, 0.01);   // Futures exchange objects place orders for BTC's U-standard perpetual contracts
    Log("Order Id:", id);
}

Объекты спотового обмена и фьючерсные обмены называютexchange.CreateOrder()функция размещения заказа.

{@fun/Trade/exchange.Buy exchange.Buy}, {@fun/Trade/exchange.Sell exchange.Sell}

exchange.CancelOrder

Вexchange.CancelOrder()функция используется для отмены заказа. АтрибутIdструктуры порядка {@struct/Order Order} платформы FMZ состоит из кода продукта биржи и идентификатора оригинального заказа биржи, разделенных английскими запятой.Idформат ордера спотовой торговой парыETH_USDTна бирже OKX составляет:ETH-USDT,1547130415509278720- Да. ПараметрorderIdпрошел в, когда звонитьexchange.CancelOrder()Функция отмены заказа соответствуетIdсвойство структуры порядка {@struct/Order Order}.

Вexchange.CancelOrder()функция возвращает истинное значение, напримерtrueозначает, что запрос на отмену ордера был отправлен успешно.false, означает, что запрос на отмену ордера не был отправлен. Вернутое значение представляет только успех или неудачу запроса, отправленного для определения того, отменяет ли биржа заказ.exchange.GetOrders()чтобы определить, отменяется ли приказ. Буль

Обмен.ОтменаЗаказа ((ЗаказId) Обмен.Отменить Заказ ((ЗаказId,...args)

ВorderIdПараметр используется для указания ордера, который должен быть отменен. Упорядочен Истинно число, строка Расширенные параметры, вы можете вывести прилагаемую информацию к этому журналу вывода,argПараметры могут быть переданы более чем одному. арг ложное string, number, bool, object, array, null и любой другой тип, поддерживаемый системой

function main(){
    var id = exchange.Sell(99999, 1)
    exchange.CancelOrder(id)
}
def main():
    id = exchange.Sell(99999, 1)
    exchange.CancelOrder(id)
void main() {
    auto id = exchange.Sell(99999, 1);
    exchange.CancelOrder(id);
}

Отмените заказ.

function main() {
    if (exchange.GetName().includes("Futures_")) {
        Log("Set the contract as: perpetual contract, set the trade direction as: open long position.")
        exchange.SetContractType("swap")
        exchange.SetDirection("buy")
    }
    
    var ticker = exchange.GetTicker()
    exchange.Buy(ticker.Last * 0.5, 0.1)
    
    var orders = exchange.GetOrders()
    for (var i = 0 ; i < orders.length ; i++) {
        exchange.CancelOrder(orders[i].Id, "Cancelled orders:", orders[i])
        Sleep(500)
    }
}
def main():
    if exchange.GetName().find("Futures_") != -1:
        Log("Set the contract as: perpetual contract, set the trade direction as: open long position.")
        exchange.SetContractType("swap")
        exchange.SetDirection("buy")
    
    ticker = exchange.GetTicker()
    exchange.Buy(ticker["Last"] * 0.5, 0.1)            

    orders = exchange.GetOrders()
    for i in range(len(orders)):
        exchange.CancelOrder(orders[i]["Id"], "Cancelled orders:", orders[i])
        Sleep(500)
void main() {
    if (exchange.GetName().find("Futures_") != std::string::npos) {
        Log("Set the contract as: perpetual contract, set the trade direction as: open long position.");
        exchange.SetContractType("swap");
        exchange.SetDirection("buy");
    }            

    auto ticker = exchange.GetTicker();
    exchange.Buy(ticker.Last * 0.5, 0.1);            

    auto orders = exchange.GetOrders();
    for (int i = 0 ; i < orders.size() ; i++) {
        exchange.CancelOrder(orders[i].Id, "Cancelled orders:", orders[i]);
        Sleep(500);
    }
}

Функции API FMZ, которые могут производить функции вывода журналов, такие как:Log(), exchange.Buy(), exchange.CancelOrder()может быть последовал некоторым сопутствующим параметрам выхода после необходимых параметров.exchange.CancelOrder(orders[i].Id, orders[i]), так что при отмене заказа ID которогоorders[i].Id, информация о заказе выводится с ним. То есть структура {@struct/Order Order}orders[i].

Если вы используете более старую версию докера, параметр orderId функции exchange.CancelOrder() может отличаться от orderId, описанного в текущем документе.

{@fun/Trade/exchange.Buy exchange.Buy}, {@fun/Trade/exchange.Sell exchange.Sell}, {@fun/Trade/exchange.GetOrders exchange.GetOrders}

exchange.GetOrder

Вexchange.GetOrder()функция используется для получения информации о заказе.

Запрос деталей порядка в соответствии с номером порядка и возвращение структуры {@struct/Order Order}, если запрос удастся, или возвращение null, если запрос не удастся. {@struct/Order Order}, нулевое значение

Обмен.GetOrder ((OrderId)

ВorderIdПараметр используется для указания порядка запроса. АтрибутIdструктуры порядка {@struct/Order Order} платформы FMZ состоит из кода продукта биржи и идентификатора оригинального заказа биржи, разделенных английскими запятой.Idформат ордера спотовой торговой парыETH_USDTна бирже OKX составляет:ETH-USDT,1547130415509278720- Да. ПараметрorderIdпрошел в, когда звонитьexchange.GetOrder()Функция запроса заказа соответствуетIdсвойство структуры порядка {@struct/Order Order}.

Приказ неправда строка

function main(){
    var id = exchange.Sell(1000, 1)
    // Parameter id is the order number, you need to fill in the number of the order you want to query
    var order = exchange.GetOrder(id)      
    Log("Id:", order.Id, "Price:", order.Price, "Amount:", order.Amount, "DealAmount:",
        order.DealAmount, "Status:", order.Status, "Type:", order.Type)
}
def main():
    id = exchange.Sell(1000, 1)
    order = exchange.GetOrder(id)
    Log("Id:", order["Id"], "Price:", order["Price"], "Amount:", order["Amount"], "DealAmount:", 
        order["DealAmount"], "Status:", order["Status"], "Type:", order["Type"])
void main() {
    auto id = exchange.Sell(1000, 1);
    auto order = exchange.GetOrder(id);
    Log("Id:", order.Id, "Price:", order.Price, "Amount:", order.Amount, "DealAmount:", 
        order.DealAmount, "Status:", order.Status, "Type:", order.Type);
}

Вexchange.GetOrder()Функция не поддерживается некоторыми биржами.AvgPriceатрибут в структуре {@struct/Order Order} возвращаемого значения - это средняя цена транзакции. Некоторые биржи не поддерживают это поле, а если нет, то оно установлено на 0. Если вы используете более старую версию докера,orderIdпараметрexchange.GetOrder()функция может отличаться отorderIdописано в текущей документации. Обмены, которые не поддерживаютexchange.GetOrder()Функция:

Имя функции Не поддерживаемые спотовые обмены Фьючерсные биржи без поддержки
Получить Ордер Zaif / Coincheck / Bitstamp

{@struct/Order Order}, {@fun/Trade/exchange.GetOrders exchange.GetOrders}, {@fun/Trade/exchange.GetHistoryOrders exchange.GetHistoryOrders}

exchange.GetOrders

Вexchange.GetOrders()Функция используется для получения невыполненных заказов.

Вexchange.GetOrders()функция возвращает массив {@struct/Order Order} структур, если запрос на данные удается, и возвращает нулевые значения, если запрос на данные не удается. {@struct/Order Order} массив, нулевое значение

Обмен.GetOrders ((() обмен.GetOrders (символ)

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

символ ложное строка

/*backtest
start: 2024-05-21 00:00:00
end: 2024-09-05 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

function main() {
    var arrSymbol = ["ETH_USDT", "BTC_USDT", "LTC_USDT", "SOL_USDT"]

    for (var symbol of arrSymbol) {
        var t = exchange.GetTicker(symbol)
        exchange.CreateOrder(symbol, "buy", t.Last / 2, 0.01)
    }

    var spotOrders = exchange.GetOrders()

    var tbls = []
    for (var orders of [spotOrders]) {
        var tbl = {type: "table", title: "test GetOrders", 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])
        }
        tbls.push(tbl)
    }

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

    // Print out the information once and then return to prevent the order from being executed during the subsequent backtest and affecting data observation
    return
}
'''backtest
start: 2024-05-21 00:00:00
end: 2024-09-05 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
'''

import json

def main():
    arrSymbol = ["ETH_USDT", "BTC_USDT", "LTC_USDT", "SOL_USDT"]

    for symbol in arrSymbol:
        t = exchange.GetTicker(symbol)
        exchange.CreateOrder(symbol, "buy", t["Last"] / 2, 0.01)

    spotOrders = exchange.GetOrders()

    tbls = []
    for orders in [spotOrders]:
        tbl = {"type": "table", "title": "test GetOrders", "cols": ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], "rows": []}
        for order in orders:
            tbl["rows"].append([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType])
        tbls.append(tbl)

    LogStatus("`" + json.dumps(tbls) +  "`")

    return
/*backtest
start: 2024-05-21 00:00:00
end: 2024-09-05 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

void main() {
    auto arrSymbol = {"ETH_USDT", "BTC_USDT", "LTC_USDT", "SOL_USDT"};
    
    for (const auto& symbol : arrSymbol) {
        auto t = exchange.GetTicker(symbol);
        exchange.CreateOrder(symbol, "buy", t.Last / 2, 0.01);
    }

    auto spotOrders = exchange.GetOrders();

    json tbls = R"([])"_json;
    std::vector<std::vector<Order>> arr = {spotOrders};
    for (const auto& orders : arr) {
        json tbl = R"({
            "type": "table", 
            "title": "test GetOrders", 
            "cols": ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"],
            "rows": []
        })"_json;

        for (const auto& order : orders) {
            json arrJson = R"([])"_json;

            arrJson.push_back("Symbol");
            arrJson.push_back("Id");
            arrJson.push_back(order.Price);
            arrJson.push_back(order.Amount);
            arrJson.push_back(order.DealAmount);
            arrJson.push_back(order.AvgPrice);
            arrJson.push_back(order.Status);
            arrJson.push_back(order.Type);
            arrJson.push_back(order.Offset);
            arrJson.push_back(order.ContractType);

            tbl["rows"].push_back(arrJson);
        }

        tbls.push_back(tbl);
    }
    
    LogStatus(_D(), "\n", "`" + tbls.dump() + "`");

    return;
}

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

/*backtest
start: 2024-05-21 00:00:00
end: 2024-09-05 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

function main() {
    var arrSymbol = ["BTC_USDT.swap", "BTC_USDT.quarter", "ETH_USDT.swap", "ETH_USDT.quarter"]

    for (var symbol of arrSymbol) {
        var t = exchange.GetTicker(symbol)
        exchange.CreateOrder(symbol, "buy", t.Last / 2, 1)
        exchange.CreateOrder(symbol, "sell", t.Last * 2, 1)
    }

    var defaultOrders = exchange.GetOrders()
    var swapOrders = exchange.GetOrders("USDT.swap")
    var futuresOrders = exchange.GetOrders("USDT.futures")
    var btcUsdtSwapOrders = exchange.GetOrders("BTC_USDT.swap")

    var tbls = []
    var arr = [defaultOrders, swapOrders, futuresOrders, btcUsdtSwapOrders]
    var tblDesc = ["defaultOrders", "swapOrders", "futuresOrders", "btcUsdtSwapOrders"]
    for (var index in arr) {
        var orders = arr[index]
        var tbl = {type: "table", title: tblDesc[index], 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])
        }
        tbls.push(tbl)
    }

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

    // Print out the information once and then return to prevent the order from being executed during the subsequent backtest and affecting data observation
    return
}
'''backtest
start: 2024-05-21 00:00:00
end: 2024-09-05 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
'''

import json

def main():
    arrSymbol = ["BTC_USDT.swap", "BTC_USDT.quarter", "ETH_USDT.swap", "ETH_USDT.quarter"]

    for symbol in arrSymbol:
        t = exchange.GetTicker(symbol)
        exchange.CreateOrder(symbol, "buy", t["Last"] / 2, 1)
        exchange.CreateOrder(symbol, "sell", t["Last"] * 2, 1)

    defaultOrders = exchange.GetOrders()
    swapOrders = exchange.GetOrders("USDT.swap")
    futuresOrders = exchange.GetOrders("USDT.futures")
    btcUsdtSwapOrders = exchange.GetOrders("BTC_USDT.swap")

    tbls = []
    arr = [defaultOrders, swapOrders, futuresOrders, btcUsdtSwapOrders]
    tblDesc = ["defaultOrders", "swapOrders", "futuresOrders", "btcUsdtSwapOrders"]
    for index in range(len(arr)):
        orders = arr[index]
        tbl = {"type": "table", "title": tblDesc[index], "cols": ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], "rows": []}
        for order in orders:
            tbl["rows"].append([order["Symbol"], order["Id"], order["Price"], order["Amount"], order["DealAmount"], order["AvgPrice"], order["Status"], order["Type"], order["Offset"], order["ContractType"]])
        tbls.append(tbl)

    LogStatus("`" + json.dumps(tbls) +  "`")

    return
/*backtest
start: 2024-05-21 00:00:00
end: 2024-09-05 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

void main() {
    auto arrSymbol = {"BTC_USDT.swap", "BTC_USDT.quarter", "ETH_USDT.swap", "ETH_USDT.quarter"};
    
    for (const auto& symbol : arrSymbol) {
        auto t = exchange.GetTicker(symbol);
        exchange.CreateOrder(symbol, "buy", t.Last / 2, 1);
        exchange.CreateOrder(symbol, "sell", t.Last * 2, 1);
    }
    
    auto defaultOrders = exchange.GetOrders();
    auto swapOrders = exchange.GetOrders("USDT.swap");
    auto futuresOrders = exchange.GetOrders("USDT.futures");
    auto btcUsdtSwapOrders = exchange.GetOrders("BTC_USDT.swap");
    
    json tbls = R"([])"_json;
    std::vector<std::vector<Order>> arr = {defaultOrders, swapOrders, futuresOrders, btcUsdtSwapOrders};
    std::string tblDesc[] = {"defaultOrders", "swapOrders", "futuresOrders", "btcUsdtSwapOrders"};
    for (int index = 0; index < arr.size(); index++) {
        auto orders = arr[index];
        json tbl = R"({
            "type": "table", 
            "cols": ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"],
            "rows": []
        })"_json;
        tbl["title"] = tblDesc[index];
    
        for (const auto& order : orders) {
            json arrJson = R"([])"_json;

            arrJson.push_back(order.Symbol);
            arrJson.push_back(to_string(order.Id));    // The Id attribute type in the Order structure is TId, which is encoded using a C++ function to_string built into the FMZ platform.
            arrJson.push_back(order.Price);
            arrJson.push_back(order.Amount);
            arrJson.push_back(order.DealAmount);
            arrJson.push_back(order.AvgPrice);
            arrJson.push_back(order.Status);
            arrJson.push_back(order.Type);
            arrJson.push_back(order.Offset);
            arrJson.push_back(order.ContractType);
    
            tbl["rows"].push_back(arrJson);
        }
    
        tbls.push_back(tbl);
    }
    
    LogStatus(_D(), "\n", "`" + tbls.dump() + "`");
    
    return;
}

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

function main() {
    var orders = exchange.GetOrders("BTC_USDT")           // Examples of spot products
    // var orders = exchange.GetOrders("BTC_USDT.swap")   // Examples of futures products
    Log("orders:", orders)
}
def main():
    orders = exchange.GetOrders("BTC_USDT")          # Examples of spot products
    # orders = exchange.GetOrders("BTC_USDT.swap")   # Examples of futures products
    Log("orders:", orders)
void main() {
    auto orders = exchange.GetOrders("BTC_USDT");           // Examples of spot products
    // auto orders = exchange.GetOrders("BTC_USDT.swap");   // Examples of futures products
    Log("orders:", orders);
}

Когда вы звонитеexchange.GetOrders()Функция, пропускать вSymbolпараметр для запроса данных о заказах для конкретной торговой пары и кода контракта.

ВGetOrdersфункция, сценарии использования параметра символа обобщены следующим образом:

Классификация обмена символ Параметры Объем запроса Примечание
Площадь Не передавать параметр символа Запрос всех спотовых торговых пар Для всех сценариев вызова, если интерфейс обмена не поддерживает его, будет сообщена ошибка и будет возвращено нулевое значение.
Площадь Укажите тип торговли, параметр символа: BTC_USDT Запрос указанной торговой пары BTC_USDT Для объектов спотового обмена формат параметра символа: BTC_USDT
Фьючерсы Не передавать параметр символа Запрос всех торговых продуктов в пределах текущего диапазона размеров торговой пары и кода контракта Если текущая торговая пара BTC_USDT и код контракта swap, будут запрошены все постоянные контракты с маржировкой USDT. Это эквивалентно вызовуGetOrders("USDT.swap")
Фьючерсы Укажите тип торговли, параметр символа: BTC_USDT.swap Запрос постоянного контракта на основе USDT для определенного BTC Формат символа параметра для фьючерсных биржевых объектов: комбинацияторговые парыикод контрактаопределены платформой FMZ, разделенные символами"..
Фьючерсы Укажите диапазон торговых продуктов, параметр символа: USDT.swap Запрос всех бессрочных контрактов на основе USDT -
Фьючерсные биржи, поддерживающие опционы Не передавать параметр символа Запрос всех опционных контрактов в пределах текущего диапазона размеров торговых пар Если текущая торговая пара BTC_USDT, контракт устанавливается на опционный контракт, например, опционный контракт Binance: BTC-240108-40000-C
Фьючерсные биржи, поддерживающие опционы Уточнить конкретные торговые продукты Запрос указанного опциона Например, для Binance Futures Exchange параметр символа: BTC_USDT.BTC-240108-40000-C
Фьючерсные биржи, поддерживающие опционы Укажите диапазон торговых продуктов, параметр символа: USDT.option Запрос всех контрактов на опционы на основе USDT -

ВGetOrdersфункция, фьючерсный обмен объект запрос диапазон измерений обобщается следующим образом:

символ Параметры Определение диапазона запроса Примечание
USDT.swap Периодический контрактный диапазон на основе USDT. Для

размеры, которые не поддерживаются интерфейсом API обмена, будет сообщена ошибка и возвращено нулевое значение, когда звонит. USDT.futures. USDT-основанный диапазон контрактов на доставку. ∙ ∙ ∙ USD.swap ∙ ∙ ∙ Диапазон валютных постоянных Контракты. USD.futures. Диапазон доставки на основе валюты Контракты. Оптимизация USDT.Опция USDT.Опционный контракт на основе USDT. Оптиции в долларах США. Оптиции в валютах. ∙ ∙ USDT.futures_combo ∙ Ряд комбинаций CFD. ∙ Фьючерс_Дерибит Биржа ∙∙∙ USD.futures_ff ∙∙ Ряд контрактов на поставку смешанной маржи. ∙∙ Фьючерс_Кракен Биржа. USD.swap_pf. Диапазон смешанных маржинальных вечных контрактов. Фьючерс_Кракен Биржа.

Когда счет, представленный обменным объектомexchangeне имеет ожидаемых заказов в рамкахдиапазон запросаиликонкретные торговые инструменты(активные заказы в невыполненном состоянии), вызов этой функции возвращает пустой массив, то есть:[]- Да. При вызове функции GetOrders с этими биржами, если параметр инструмента не передается, запрашиваются только незавершенные заказы текущего инструмента, а не незавершенные заказы всех инструментов (поскольку интерфейс обмена не поддерживает это). Zaif, MEXC, LBank, Korbit, Coinw, BitMart, Bithumb, BitFlyer, BigONE. Я не знаю, как это сделать.

Обмены, которые не поддерживаютexchange.GetOrders()Функция:

Имя функции Не поддерживаемые спотовые обмены Фьючерсные биржи без поддержки
GetOrders Фьючерсы_Бибокс

{@struct/Order Order}, {@fun/Trade/exchange.GetOrder exchange.GetOrder}, {@fun/Trade/exchange.GetHistoryOrders exchange.GetHistoryOrders}

exchange.GetHistoryOrders

Вexchange.GetHistoryOrders()Функция используется для получения текущей торговой пары, исторических заказов на контракты; она поддерживает спецификацию конкретных торговых сортов.

Вexchange.GetHistoryOrders()функция возвращает массив {@struct/Order Order} структур, если запрос на данные удается, и null, если запрос не удается. {@struct/Order Order} массивы, нулевые значения

Обмен.GetHistoryOrders ((() exchange.GetHistoryOrders (символ) exchange.GetHistoryOrders ((символ, с тех пор) exchange.GetHistoryOrders ((символ, с тех пор, предел) Обмен.GetHistoryOrders ((поскольку) exchange.GetHistoryOrders ((поскольку, ограничение)

ВsymbolПараметр используется для указания торгового символа.BTC_USDTТорговая пара, например,exchangeявляется объектом спотового обмена, формат параметра дляsymbolэтоBTC_USDTЕсли это объект биржи фьючерсов, например, вечный контракт, формат параметра дляsymbolявляется:BTC_USDT.swap- Да. Если вы запрашиваете данные ордера опционных контрактов, установить параметрsymbolдо"BTC_USDT.BTC-240108-40000-C"Формат представляет собой комбинациюторговые парыопределены платформой FMZ и конкретным кодом контракта опциона, определенным биржей, разделенным символом .. Если этот параметр не выполнен, то по умолчанию будут запрошены данные ордера текущей установленной торговой пары и код контракта.

символ ложное строка ВsinceПараметр используется для указания времени начала запроса в миллисекундах. с тех пор ложное Номер ВlimitПараметр используется для указания количества заказов для запроса. предел ложное Номер

function main() {
    var historyOrders = exchange.GetHistoryOrders()
    Log(historyOrders)
}
def main():
    historyOrders = exchange.GetHistoryOrders()
    Log(historyOrders)
void main() {
    auto historyOrders = exchange.GetHistoryOrders();
    Log(historyOrders);
}
  • Когда?symbol, since, limitпараметры не указаны, запрос по умолчанию - текущая торговая пара, исторические заказы контракта. Запросы исторических заказов в пределах определенного диапазона ближе всего к текущему времени, диапазон запроса зависит от одного диапазона запроса обменного интерфейса.
  • Когдаsymbolпараметр указан, запрос истории заказов для установленного типа торговли.
  • Когдаsinceпараметр указан, запрос в направлении текущего времени с использованиемsinceВремя запечатлено как время начала.
  • Еслиlimitпараметр указан, запрос возвращается после достаточного количества записей.
  • Эта функция поддерживается только для обменов, которые обеспечивают интерфейс исторического запроса заказа.

Обмены, которые не поддерживаютexchange.GetHistoryOrders()Функция:

Имя функции Не поддерживаемые спотовые обмены Фьючерсные биржи без поддержки
Заказы GetHistory Zaif / Upbit / Coincheck / Bitstamp / Bithumb / BitFlyer / BigONE Фьючерсы_dYdX / Фьючерсы_Бибокс / Фьючерсы_АполлоX

{@struct/Order Order}, {@fun/Trade/exchange.GetOrder exchange.GetOrder}, {@fun/Trade/exchange.GetOrders exchange.GetOrders}

exchange.SetPrecision

exchange.SetPrecision()Функция используется для установки точностиexchangeОбъект обменаценыисумма заказа, после настройки, система будет игнорировать избыточные данные автоматически.

Смена.УстановкаПрецизия ((ценаПрецизия, суммаПрецизия)

ВpricePrecisionПараметр используется для контроля точности данных о ценах. ЦенаПрецизия неправда Номер ВamountPrecisionПараметр используется для контроля точности количества данных, которые должны быть заказаны. суммаПрецизия Истинно Номер

function main(){
    // Set the decimal precision of price to 2 bits, and the decimal precision of variety order amount to 3 bits
    exchange.SetPrecision(2, 3)
}
def main():
    exchange.SetPrecision(2, 3)
void main() {
    exchange.SetPrecision(2, 3);
}

Система обратного тестирования не поддерживает эту функцию, и числовая точность системы обратного тестирования обрабатывается автоматически.

{@fun/Trade/exchange.Buy exchange.Buy}, {@fun/Trade/exchange.Sell exchange.Sell}

exchange.SetRate

Установите текущий обменный курс обменного объекта.

Exchange.SetRate ((курс)

Вrateпараметр используется для определения обменного курса конверсии. ставка неправда Номер

function main(){
    Log(exchange.GetTicker())
    // Set exchange rate conversion
    exchange.SetRate(7)
    Log(exchange.GetTicker())
    // Set to 1, no conversion
    exchange.SetRate(1)
}
def main():
    Log(exchange.GetTicker())
    exchange.SetRate(7)
    Log(exchange.GetTicker())
    exchange.SetRate(1)
void main() {
    Log(exchange.GetTicker());
    exchange.SetRate(7);
    Log(exchange.GetTicker());
    exchange.SetRate(1);
}

Если стоимость обменного курса установлена с использованиемexchange.SetRate()Затем вся информация о ценах, такие как тикеры, глубины, цены заказа и т. д. для биржи, представленной текущимexchangeобменный объект будет конвертироваться, умножив его на установленный обменный курс 7.exchangeявляется обменом с долларом США в качестве номинальной валюты.exchange.SetRate(7), все цены на живом рынке будут конвертироваться в цены, близкие кCNYНоминальное число умножить на 7.

{@fun/Market/exchange.GetRate exchange.GetRate} - Я не знаю.

exchange.IO

Вexchange.IO()функция используется для других вызовов интерфейсов, связанных с объектом обмена.

Вexchange.IO()функция вызывает другие интерфейсы, связанные с объектом обмена, возвращая запрошенные данные ответа при успешном вызове, и возвращает null при неудачном вызове. string, number, bool, object, array, null и любой другой тип, поддерживаемый системой

exchange.IO(k,...args)

Вkпараметр используется для настройки типа вызова, с необязательными значениями"api", "currency", "base", "trade_margin", "trade_normal", "public_base", "mbase", selfTradePreventionMode, simulate, cross, dual, unifiedи так далее. k неправда строка Расширенные параметры, переданные в соответствии с конкретным сценарием вызова,argИз-за полиморфного механизмаexchange.IO()Для определения числа и типа параметров,exchange.IO()Функции неопределенны. арг Истинно string, number, bool, object, array, null и любые другие типы, поддерживаемые системой

function main() {
    var arrOrders = [
        {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"},
        {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"2","posSide":"long"}
    ]
    
    // Call exchange.IO to access the exchange's bulk order interface directly
    var ret = exchange.IO("api", "POST", "/api/v5/trade/batch-orders", "", JSON.stringify(arrOrders))
    Log(ret)
}
import json
def main():
    arrOrders = [
        {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"}, 
        {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"2","posSide":"long"}
    ]
    ret = exchange.IO("api", "POST", "/api/v5/trade/batch-orders", "", json.dumps(arrOrders))
    Log(ret)
void main() {
    json arrOrders = R"([
        {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"},
        {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"2","posSide":"long"}
    ])"_json;
    auto ret = exchange.IO("api", "POST", "/api/v5/trade/batch-orders", "", arrOrders.dump());
    Log(ret);
}

Использованиеexchange.IO("api", httpMethod, resource, params, raw)Форма вызоваexchange.IO()Это позволит вам расширить функциональность, которая не добавлена к платформе FMZ.POSTЗапрос не требует от вас беспокоиться о шифровании, подписании или проверке параметров, которые уже обрабатываются FMZ внизу, пока вы заполняете соответствующие параметры.OKX ExchangeФьючерсные контракты, и использовать параметрrawдля передачи параметров порядка:

var amount = 1
var price = 10
var basecurrency = "ltc"
function main () {
    // Note that both amount.toString() and price.toString() have a ' character on the left and right side
    var message = "symbol=" + basecurrency + "&amount='" + amount.toString() + "'&price='" + price.toString() + "'&side=buy" + "&type=limit"
    var id = exchange.IO("api", "POST", "/v1/order/new", message)
}
amount = 1
price = 10
basecurrency = "ltc"
def main():
    message = "symbol=" + basecurrency + "&amount='" + str(amount) + "'&price='" + str(price) + "'&side=buy" + "&type=limit"
    id = exchange.IO("api", "POST", "/v1/order/new", message)
void main() {
    auto amount = 1.0;
    auto price = 10.0;
    auto basecurrency = "ltc";
    string message = format("symbol=%s&amount=\"%.1f\"&price=\"%.1f\"&side=buy&type=limit", basecurrency, amount, price);
    auto id = exchange.IO("api", "POST", "/v1/order/new", message);
}

Если ключевое значение вparamsпараметр (т.е. Http запрос параметр) является строкой, он должен быть написан в одиночных кавычках (т.е. символ ') вокруг значения параметра, чтобы обернуть значение параметра.

function main() {
    var ret = exchange.IO("api", "GET", "https://www.okx.com/api/v5/account/max-withdrawal", "ccy=BTC")
    Log(ret)
}
def main():
    ret = exchange.IO("api", "GET", "https://www.okx.com/api/v5/account/max-withdrawal", "ccy=BTC")
    Log(ret)
void main() {
    auto ret = exchange.IO("api", "GET", "https://www.okx.com/api/v5/account/max-withdrawal", "ccy=BTC");
    Log(ret);
}

Он поддерживает передачу полных параметров url, которые могут пропустить операцию переключения базового адреса (вызовexchange.SetBase()функции).

function main(){
    var ret = exchange.IO("api", "GET", "/api/v5/trade/orders-pending", "instType=SPOT")
    Log(ret)
}
def main():
    ret = exchange.IO("api", "GET", "/api/v5/trade/orders-pending", "instType=SPOT")
    Log(ret)
void main() {
    auto ret = exchange.IO("api", "GET", "/api/v5/trade/orders-pending", "instType=SPOT");
    Log(ret);
}

Пример вызова без параметраraw:

function main() {
    // For example, if you set the current trading pair of the exchange object to BTC_USDT at the beginning of the live trading, print the current trading pair tickers
    Log(exchange.GetTicker())
    // Switch the trading pair to LTC_BTC      
    exchange.IO("currency", "LTC_BTC")
    Log(exchange.GetTicker())
}
def main():
    Log(exchange.GetTicker())
    exchange.IO("currency", "LTC_BTC")
    Log(exchange.GetTicker())
void main() {
    Log(exchange.GetTicker());
    exchange.IO("currency", "LTC_BTC");
    Log(exchange.GetTicker());
}

Переключите торговую пару текущей биржи, так что она будет переключать торговую пару, настроенную по кодупри создании торговли в режиме реального времениилипри обратном тестировании.

function main () {
    // exchanges[0] is the first exchange object added when the live trading is created 
    exchanges[0].IO("base", "https://api.huobi.pro")
}
def main():
    exchanges[0].IO("base", "https://api.huobi.pro")
void main() {
    exchanges[0].IO("base", "https://api.huobi.pro");
}```
For example, the default base address when the exchange object is wrapped is ```https://api.huobipro.com```, and when you need to switch to ```https://api.huobi.pro```, use the following code to switch:
```javascript
function main() {
    exchange.SetBase("https://api.bitfinex.com")
    exchange.IO("mbase", "https://api-pub.bitfinex.com")
}
def main():
    exchange.SetBase("https://api.bitfinex.com")
    exchange.IO("mbase", "https://api-pub.bitfinex.com")
void main() {
    exchange.SetBase("https://api.bitfinex.com");
    exchange.IO("mbase", "https://api-pub.bitfinex.com");
}

Для бирж с разными базовыми адресами для интерфейса тикера и торгового интерфейса, например, Bitfinex Futures имеет два адреса, один для интерфейса тикера и другой для торгового интерфейса.exchange.SetBase("xxx"). Фьючерсы Bitfinex переключаются на общедоступный интерфейс с использованием базового адресаexchange.IO("mbase", "xxx").

I. Для бирж, ориентированных на криптовалюты, другие вызовы интерфейсов API, которые не являются единообразными, с параметромkУстановлено на"api":

exchange.IO("api", httpMethod, resource, params, raw)
  • httpMethod : Параметр является типом строки, заполните тип запросаPOST, GET, и т.д.
  • ресурс: Параметр имеет тип строки и заполняет путь запроса; он поддерживает использование полных путей запроса, см. справочный пример для деталей.
  • params: Параметр представляет собой тип строки, заполненный параметрами запроса, закодированныйURL.
  • raw: параметр является параметром строки raw и может быть пропущен.

Вexchange.IO("api", httpMethod, resource, params, raw)вызов функции будет получать доступ к интерфейсу обмена и возвращает null, если вызов не удастся и произойдет ошибка. Только реальная торговля поддерживает звонкиexchange.IO("api", httpMethod, resource, params, raw) function.

II. Для переключения торговых пар параметрkУстановлено на"currency":

exchange.IO("currency", currency)
  • currency: Параметр представляет собой тип строки с единым форматами верхних букв, используя подчерк для разделенияbaseCurrencyотquoteCurrency, например:BTC_USDT.

    1. Система обратного тестирования теперь поддерживает переключение торговых пар (только для цифровых валют спотовых обменных объектов), при обратном тестировании, вы должны обратить внимание, что вы можете переключаться только на торговые пары с той же номинальной валютой, например, текущая торговая параETH_BTCМожно только переключиться наLTC_BTC, не кLTC_USDT.
    2. Для фьючерсных контрактов на криптовалюты объект биржи переключает торговые пары, и код контракта должен быть повторно установлен, чтобы определить, какой контракт будет торговаться.
    3. Использование функции {@fun/Account/exchange.SetCurrency exchange.SetCurrency} для переключения торговых пар точно так же, как использованиеexchange.IO("currency", currency)чтобы сменить торговые пары.

III. Используется для переключения на режим учетной записи с объектом левериджного воздействия криптовалютной спотовой биржи:

  • ПараметрkУстановлено на"trade_margin"Для размещения ордеров и получения активов счета будет доступ к интерфейсу спотового левериджа биржи. Если биржа проводит различие между полной маржой и изолированной маржой при спотовом рычаге, используется:exchange.IO("trade_super_margin")перейти на полную маржу для счета с кредитным плечом, иexchange.IO("trade_margin")перейти на изолированную маржу для счета с кредитным плечом.
  • ПараметрkУстановлено на"trade_normal"перейти на обычный режим спотового счета.

Спотовые биржи, поддерживающие переключение между моделями счетов с кредитным плечом:

Обмены Особые замечания
ОКX Торговые пары в режиме учетного счета с кредитным плечом отличаются от обычных, некоторые торговые пары могут их не иметь.exchange.IO("trade_super_margin")перейти на полную позицию для счетов с кредитным плечом и использоватьexchange.IO("trade_margin")Использоватьtrade_normalИспользоватьexchange.IO("tdMode", "cross")для прямого указания режима использования кредитного плеча.
Хьюби Торговые пары с использованием рычага на счетах отличаются от обычных, некоторые торговые пары могут их не иметь.trade_marginперейти на позицию счета с кредитным плечом по позициям, использоватьtrade_super_marginИспользоватьtrade_normalперейти на обычный режим "валюта-валюта".
Binance Режим счета с использованием кредитного плеча делится на позицию по позиции и полную позицию, использованиеtrade_marginчтобы переключиться на положение по положению, использоватьtrade_super_marginперейти на полное положение, использоватьtrade_normalперейти на обычный режим "валюта-валюта".
Ворота Режим счета с использованием кредитного плеча делится на позицию по позиции и полную позицию, использованиеtrade_marginчтобы переключиться на положение по положению, использоватьtrade_super_marginперейти на полное положение, использоватьtrade_normalперейти на обычный режим "валюта-валюта".
AscendEx Использованиеexchange.IO("trade_margin")перейти на режим счета с кредитным плечом иexchange.IO("trade_normal")чтобы вернуться в обычный режим учетной записи.
Ух ты! Использованиеexchange.IO("trade_margin")перейти на режим счета с кредитным плечом иexchange.IO("trade_normal")чтобы вернуться в обычный режим учетной записи.
CoinEx Использованиеexchange.IO("trade_margin")перейти на режим счета с кредитным плечом иexchange.IO("trade_normal")чтобы вернуться в обычный режим учетной записи.

IV. Другие функции переключения:Посмотрите наexchange.IO()функция дляДругие функции переключенияв руководстве пользователя.

{@fun/NetSettings/exchange.SetBase exchange.SetBase}, {@fun/Account/exchange.SetCurrency exchange.SetCurrency}, {@var EXCHANGE_OP_IO_CONTROL}

exchange.Log

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

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

ВorderTypeпараметр используется для настройки типа выходного журнала, необязательными значениями являются {@var/LOG_TYPE/LOG_TYPE_BUY LOG_TYPE_BUY}, {@var/LOG_TYPE/LOG_TYPE_SELL LOG_TYPE_SELL}, {@var/LOG_TYPE/LOG_TYPE_CANCEL LOG_TYPE_CANCEL}. Порядок Тип Истинно Номер ВpriceПараметр используется для установки цены, отображаемой в журнале вывода. цены Истинно Номер ВamountПараметр используется для установки количества размещенных заказов, отображаемых в журнале вывода. сумма Истинно Номер Расширенные параметры, которые могут выводить сопутствующую информацию в этот журнал,argПараметры могут быть переданы более чем одному. арг ложное string, number, bool, object, array, null и любой другой тип, поддерживаемый системой

var id = 123
function main() {
    // Order type buy, price 999, amount 0.1
    exchange.Log(LOG_TYPE_BUY, 999, 0.1)      
    // Cancel the order
    exchange.Log(LOG_TYPE_CANCEL, id)         
}
id = 123
def main():
    exchange.Log(LOG_TYPE_BUY, 999, 0.1)
    exchange.Log(LOG_TYPE_CANCEL, id)
void main() {
    auto id = 123;
    exchange.Log(LOG_TYPE_BUY, 999, 0.1);
    exchange.Log(LOG_TYPE_CANCEL, id);
}

Использованиеexchange.Log(orderType, price, amount)Одно из наиболее распространенных сценариев - использовать {@fun/Trade/exchange.IOexchange.IO} функция для доступа к интерфейсу биржи для создания условных заказов, но с использованиемexchange.IO()Функция не выводит информацию о журнале транзакций в записи журнала торговли в режиме реального времени.exchange.Log()Функция может быть использована для дополнения выходного журнала с целью записи информации о размещении заказов, и то же самое относится к операциям по снятию заказов.

КогдаorderTypeпараметр:LOG_TYPE_CANCEL,priceПараметр - это идентификатор порядка отозванного заказа, который используется для печати журнала вывода, когда заказ отозван непосредственно с помощьюexchange.IO()Функция.exchange.Log()функция - это членская функция обменного объекта {@var/EXCHANGE exchange} в отличие от глобальной функции {@fun/Log Log}.

{@fun/Log Log}, {@var/EXCHANGE exchange}, {@var/LOG_TYPE/LOG_TYPE_BUY LOG_TYPE_BUY}, {@var/LOG_TYPE/LOG_TYPE_SELL LOG_TYPE_SELL}, {@var/LOG_TYPE/LOG_TYPE_CANCEL LOG_TYPE_CANCEL}

exchange.Encode

Вexchange.Encode()Функция используется для расчетов шифрования подписи.

Вexchange.Encode()функция возвращает вычисленное значение кодирования хэша. строка

exchange.Encode ((algo, inputФормат, выходФормат, данные) exchange.Encode ((algo, inputFormat, outputFormat, data, keyФормат, ключ)

Параметрalgoявляется алгоритмом, используемым для расчета кодирования. Поддерживаемые настройки: raw (без использования алгоритма), sign, signTx, md4, md5, sha256, sha512, sha1, keccak256, sha3.224, sha3.256, sha3.384, sha3.512, sha3.keccak256, sha3.keccak512, sha512.384, sha512.256, sha512.224, emd160, ripke2b.256, blake2b.512, blake2s.128, blake2s.256.algoтакже поддерживает: text.encoder.utf8, text.decoder.utf8, text.encoder.gbk, text.decoder.gbk, для кодирования и декодирования строк. Параметрalgoтакже поддерживает: алгоритм ed25519. Он поддерживает использование различных хэш-алгоритмов, например, параметрalgoможет быть написано как ed25519.md5, ed25519.sha512 и т. д. Поддерживаетed25519.seedрасчеты. что-то неправда строка Используется для определения формата данныхdataпараметр.inputFormatпараметр может быть установлен на один из: raw, hex, base64, и string. raw означает, что данные являются сырыми данными, hex означает, что данные являютсяhexbase64 означает, что данныеbase64кодируется, и string означает, что данные являются строкой. ввод Формат Истинно строка Используется для указания формата выходной информации.outputFormatпараметр поддерживает следующие настройки: raw, hex, base64, string. raw означает, что данные являются сырыми данными, hex означает, что данныеhexbase64 означает, что данныеbase64кодируется, и string означает, что данные являются строкой. Выход Формат Истинно строка Параметрdataэто данные, которые должны быть обработаны. данные неправда строка Используется для определения формата данныхkeyпараметр.keyпараметр может быть установлен на один из: raw, hex, base64, и string. raw означает, что данные являются сырыми данными, hex означает, что данные являютсяhexbase64 означает, что данныеbase64кодируется, и string означает, что данные являются строкой. keyФормат ложное строка Вkeyпараметр используется для указания ключа, используемого в расчете подписи, и он может быть использован в качестве строки простого текста."{{accesskey}}", "{{secretkey}}"ссылаясь наaccessKeyиsecretKeyКонфигурировано в объекте обмена {@var/EXCHANGE exchange}. Ключ ложное строка

function main() {
    var APIKEY = "your Access Key(Bitmex API ID)"
    var expires = parseInt(Date.now() / 1000) + 10
    var signature = exchange.Encode("sha256", "string", "hex", "GET/realtime" + expires, "hex", "{{secretkey}}")
    var client = Dial("wss://www.bitmex.com/realtime", 60)
    var auth = JSON.stringify({args: [APIKEY, expires, signature], op: "authKeyExpires"})
    var pos = 0
    client.write(auth)
    client.write('{"op": "subscribe", "args": "position"}')
    while (true) {
        bitmexData = client.read()
        if(bitmexData.table == 'position' && pos != parseInt(bitmexData.data[0].currentQty)){
            Log('position change', pos, parseInt(bitmexData.data[0].currentQty), '@')
            pos = parseInt(bitmexData.data[0].currentQty)
        }
    }
}
import time
def main():
    APIKEY = "your Access Key(Bitmex API ID)"
    expires = int(time.time() + 10)
    signature = exchange.Encode("sha256", "string", "hex", "GET/realtime" + expires, "hex", "{{secretkey}}")
    client = Dial("wss://www.bitmex.com/realtime", 60)
    auth = json.dumps({"args": [APIKEY, expires, signature], "op": "authKeyExpires"})
    pos = 0
    client.write(auth)
    client.write('{"op": "subscribe", "args": "position"}')
    while True:
        bitmexData = json.loads(client.read())
        if "table" in bitmexData and bitmexData["table"] == "position" and len(bitmexData["data"]) != 0 and pos != bitmexData["data"][0]["currentQty"]:   
            Log("position change", pos, bitmexData["data"][0]["currentQty"], "@")
            pos = bitmexData["data"][0]["currentQty"]
void main() {
    auto APIKEY = "your Access Key(Bitmex API ID)";
    auto expires = Unix() + 10;
    auto signature = exchange.Encode("sha256", "string", "hex", format("GET/realtime%d", expires), "hex", "{{secretkey}}");
    
    auto client = Dial("wss://www.bitmex.com/realtime", 60);
    json auth = R"({"args": [], "op": "authKeyExpires"})"_json;            

    auth["args"].push_back(APIKEY);
    auth["args"].push_back(expires);
    auth["args"].push_back(signature);
    auto pos = 0;
    client.write(auth.dump());
    client.write("{\"op\": \"subscribe\", \"args\": \"position\"}");
    while(true) {
        auto bitmexData = json::parse(client.read());
        if(bitmexData["table"] == "position" && bitmexData["data"][0].find("currentQty") != bitmexData["data"][0].end() && pos != bitmexData["data"][0]["currentQty"]) {
            Log("test");
            Log("position change", pos, bitmexData["data"][0]["currentQty"], "@");
            pos = bitmexData["data"][0]["currentQty"];
        }
    }
}

Пример сдвига изменения позиции BitMEX (протокол wss):

Только реальная торговля поддерживает звонкиexchange.Encode()Функция."{{accesskey}}", "{{secretkey}}"ссылки действительны только в том случае, еслиexchange.Encode()функция используется.

{@var/EXCHANGE exchange}, {@fun/Global/Encode Encode}

exchange.Go

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

Вexchange.Go()Функция возвращает одновременный объект сразу, и вы можете использоватьwait()Метод этого одновременного объекта для получения результата одновременного запроса. объект

обмен.Пойди (метод) обмен.Go ((метод,...args)

Вmethodпараметр используется для указания имени параллельной функции. Обратите внимание, что параметр является строкой имени функции, а не ссылкой на функцию. метод Истинно строка Параметры доодновременное выполнение функций, может быть более одного параметраarg. Тип и количество параметровargзависит от параметровфункция одновременного исполнения- Да. арг ложное string, number, bool, object, array, function, null и все другие типы, поддерживаемые системой

function main(){
    // The following four operations are concurrently executed asynchronously by multiple threads and do not take time and return immediately
    var a = exchange.Go("GetTicker")
    var b = exchange.Go("GetDepth") 
    var c = exchange.Go("Buy", 1000, 0.1)
    var d = exchange.Go("GetRecords", PERIOD_H1)
           
    // Call the wait method to wait for the return of the ticker results asynchronously 
    var ticker = a.wait()            
    // Returns the depth, or null if it fails 
    var depth = b.wait()             
    // return order number, limited to 1 second timeout, if timeout, returns undefined, the object can continue to call wait if the last wait timeout 
    var orderId = c.wait(1000)
    if(typeof(orderId) == "undefined") {
        // Timeout, reacquire
        orderId = c.wait()
    }
    var records = d.wait()
}
def main():
    a = exchange.Go("GetTicker")
    b = exchange.Go("GetDepth")
    c = exchange.Go("Buy", 1000, 0.1)
    d = exchange.Go("GetRecords", PERIOD_H1)            

    ticker, ok = a.wait()
    depth, ok = b.wait()
    orderId, ok = c.wait(1000)
    if ok == False:
        orderId, ok = c.wait()
    records, ok = d.wait()
void main() {
    auto a = exchange.Go("GetTicker");
    auto b = exchange.Go("GetDepth");
    auto c = exchange.Go("Buy", 1000, 0.1);
    auto d = exchange.Go("GetRecords", PERIOD_H1);            

    Ticker ticker;
    Depth depth;
    Records records;
    TId orderId;
    a.wait(ticker);
    b.wait(depth);
    if(!c.wait(orderId, 300)) {
        c.wait(orderId);
    }
    d.wait(records);
}

Exchange.Go()Пример использования функции, для определенияundefinedиспользоватьtypeof(xx) === "undefined", потому чтоnull == undefinedдействителен в JavaScript.

function main() {
    var d = exchange.Go("GetRecords", PERIOD_H1)
    // Waiting for K-line results
    var records = d.wait()
    // Here waits an asynchronous operation that has been waited and finished, it will return null, and log the error message
    var ret = d.wait()
}
def main():
    d = exchange.Go("GetRecords", PERIOD_H1)
    records, ok = d.wait()
    ret, ok = d.wait()
void main() {
    auto d = exchange.Go("GetRecords", PERIOD_H1);
    Records records;
    d.wait(records);
    Records ret;
    d.wait(ret);
}

Звонитьwait()Метод на одновременном объекте, который был выпущен, сообщает об ошибке:

function main() {
    while(true) {
        var beginTS = new Date().getTime()
        var arrRoutine = []
        var arrTicker = []
        var arrName = []
        for(var i = 0; i < exchanges.length; i++) {
            arrRoutine.push(exchanges[i].Go("GetTicker"))
            arrName.push(exchanges[i].GetName())
        }            

        for(var i = 0; i < arrRoutine.length; i++) {
            arrTicker.push(arrRoutine[i].wait())
        }
        var endTS = new Date().getTime()            

        var tbl = {
            type: "table", 
            title: "ticker", 
            cols: ["index", "name", "latest-deal-price"], 
            rows: []
        }
        
        for(var i = 0; i < arrTicker.length; i++) {
            tbl.rows.push([i, arrName[i], arrTicker[i].Last])
        }            

        LogStatus(_D(), "Total time taken to obtain tickers from multiple exchanges concurrently:", endTS - beginTS, "millisecond", "\n", "`" + JSON.stringify(tbl) + "`")
        Sleep(500)
    }
}
import time 
import json
def main():
    while True:
        beginTS = time.time()
        arrRoutine = []
        arrTicker = []
        arrName = []
        for i in range(len(exchanges)):
            arrRoutine.append(exchanges[i].Go("GetTicker"))
            arrName.append(exchanges[i].GetName())            

        for i in range(len(exchanges)):
            ticker, ok = arrRoutine[i].wait()
            arrTicker.append(ticker)            

        endTS = time.time()
        tbl = {
            "type": "table", 
            "title": "ticker", 
            "cols": ["index", "name", "latest-deal-price"], 
            "rows": [] 
        }            

        for i in range(len(arrTicker)):
            tbl["rows"].append([i, arrName[i], arrTicker[i]["Last"]])            

        LogStatus(_D(), "Total time taken to obtain tickers from multiple exchanges concurrently:", endTS - beginTS, "second", "\n", "`" + json.dumps(tbl) + "`")
        Sleep(500)
void main() {
    while(true) {
        int length = exchanges.size();
        auto beginTS = UnixNano() / 1000000;
        Ticker arrTicker[length] = {};
        string arrName[length] = {};
        
        // Note that to add several exchange objects, several exchanges[n].Go functions have to be executed here, this example is to add four exchange objects, the details can be modified
        auto r0 = exchanges[0].Go("GetTicker");
        auto r1 = exchanges[1].Go("GetTicker");
        auto r2 = exchanges[2].Go("GetTicker");
        auto r3 = exchanges[3].Go("GetTicker");
        GoObj *arrRoutine[length] = {&r0, &r1, &r2, &r3};
        
        for(int i = 0; i < length; i++) {
            arrName[i] = exchanges[i].GetName();
        }            

        for(int i = 0; i < length; i++) {
            Ticker ticker;
            arrRoutine[i]->wait(ticker);
            arrTicker[i] = ticker;
        }        
        auto endTS = UnixNano() / 1000000;            

        json tbl = R"({
            "type": "table", 
            "title": "ticker", 
            "cols": ["index", "name", "latest-deal-price"], 
            "rows": [] 
        })"_json;            

        for(int i = 0; i < length; i++) {
            json arr = R"(["", "", ""])"_json;
            arr[0] = format("%d", i);
            arr[1] = arrName[i];
            arr[2] = format("%f", arrTicker[i].Last);
            tbl["rows"].push_back(arr);
        }            

        LogStatus(_D(), "Total time taken to obtain tickers from multiple exchanges concurrently:", format("%d", endTS - beginTS), "millisecond", "\n", "`" + tbl.dump() + "`");
        Sleep(500);
    }
}

Одновременный доступ к нескольким биржевым тикерам:

function main() {
    /*  
        Testing with OKX futures order interface
        POST /api/v5/trade/order        
    */
    
    var beginTS = new Date().getTime()
    var param = {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"}
    var ret1 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", JSON.stringify(param))
    var ret2 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", JSON.stringify(param))
    var ret3 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", JSON.stringify(param))
    
    var id1 = ret1.wait()
    var id2 = ret2.wait()
    var id3 = ret3.wait()
    var endTS = new Date().getTime()                

    Log("id1:", id1)
    Log("id2:", id2)
    Log("id3:", id3)
    Log("Concurrent order placement time consumption:", endTS - beginTS, "millisecond")
}
import time
import json
def main():
    beginTS = time.time()
    param = {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"}
    ret1 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", json.dumps(param))
    ret2 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", json.dumps(param))
    ret3 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", json.dumps(param))            

    id1, ok1 = ret1.wait()
    id2, ok2 = ret2.wait()
    id3, ok3 = ret3.wait()
    endTS = time.time()            

    Log("id1:", id1)
    Log("id2:", id2)
    Log("id3:", id3)
    Log("Concurrent order placement time consumption:", endTS - beginTS, "second")
void main() {
    auto beginTS = UnixNano() / 1000000;
    json param = R"({"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"})"_json;
    auto ret1 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", param.dump());
    auto ret2 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", param.dump());
    auto ret3 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", param.dump());            

    json id1 = R"({})"_json;
    json id2 = R"({})"_json;
    json id3 = R"({})"_json;            

    ret1.wait(id1);
    ret2.wait(id2);
    ret3.wait(id3);
    auto endTS = UnixNano() / 1000000;            

    Log("id1:", id1);
    Log("id2:", id2);
    Log("id3:", id3);
    Log("Concurrent order placement time consumption:", endTS - beginTS, "millisecond");
}

Одновременные призывыexchange.IO("api", ...)Функция:

Эта функция создает задачи выполнения с несколькими потоками только при выполнении в реальной торговле, обратное тестирование не поддерживает одновременное выполнение задач с несколькими потоками (обратное тестирование доступно, но все еще выполняется последовательно). Послеexchange.Go()функция возвращает объект, егоwait()функция вызвана через этот объект, чтобы получить данные, возвращенные нитью.wait()Функция должна быть вызвана, чтобы получить данные, прежде чем нить будет выпущена автоматически.wait()Если функция не указана, нить не будет выпущена автоматически, даже если произойдет тайм-аут. Результат нитки должен быть получен до того, как она будет выпущена автоматически (независимо от успеха или неудачи вызова интерфейса для одновременного доступа). Проще говоря, запрашиваемый нить должна быть получена с помощьюwait()Функция независимо от того, удается или не удается выполнение, и ресурс потока, запрошенныйexchange.Go()функция должна быть автоматически освобождена докером. Вwait()Метод поддерживает параметр тайм-аут: Без параметра тайм-аута, то есть,wait(), или с параметром времени отключения 0, то есть,wait(0).wait()блокирует функцию и ждет, пока не закончится выполнение параллельного потока, возвращая результат выполнения параллельного потока. Установите параметр тайм-аута -1, т.е.wait(-1).wait()функция возвращает сразу, с различными значениями возврата для разных языков программирования, см. этот подраздел для примера вызова. Установите конкретный параметр задержки,wait(300), иwait()Функция будет ждать максимум 300 миллисекунд, прежде чем вернуться.

Если результатом финальногоwait()функция не получена, ресурсы потока не будут автоматически высвобождены, что приведет к накоплению запрошенных потоков, и более 2000 сообщат об ошибке:"too many routine wait, max is 2000"- Да. Поддерживаемые функции:GetTicker, GetDepth, GetTrades, GetRecords, GetAccount, GetOrders, GetOrder, CancelOrder, Buy, Sell, GetPositions, IOВсе эти функции выполняются на основе текущего обменного объекта {@var/EXCHANGE exchange} при одновременном вызове. Разница между языком Python и языком JavaScript заключается в том, чтоwait()функция одновременных объектов в языке Python возвращает два параметра. Первый параметр является результатом, возвращенным асинхронным вызовом API, а второй параметр указывает, завершился ли асинхронный вызов.


def main():
    d = exchange.Go("GetRecords", PERIOD_D1)
    # ok will return True definitely, unless the strategy is stopped
    ret, ok = d.wait()          
    # If the wait times out, or if it waits for an instance that has already ended, ok returns False
    ret, ok = d.wait(100)  

{@fun/Global/Mail_Go Mail_Go}, {@fun/Global/HttpQuery_Go HttpQuery_Go}, {@fun/Global/EventLoop EventLoop}

Рынок Счет