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

Встроенные функции

Глобальный

Версия

Возвращает номер текущей версии системы.

Номер текущей версии системы, например:3.6- Да. строка

Версия ((()

function main() {
    Log("version:", Version())
}
def main():
    Log("version:", Version())
void main() {
    Log("version:", Version());
}

Номер версии системы - это номер версии программы Dockers.

Спать.

Функция сна, вызывающая паузу программы на некоторое время.

Сон ((миллисекунда)

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

function main() {
    Sleep(1000 * 10)   // Wait for 10 seconds
    Log("Waited for 10 seconds")
}
def main():
    Sleep(1000 * 10)
    Log("Waited for 10 seconds")
void main() {
    Sleep(1000 * 10);
    Log("Waited for 10 seconds");
}

Например, при выполненииSleep(1000)Он поддерживает операции с временем сна менее 1 миллисекунды, например, настройкаSleep(0.1). Он поддерживает минимальный параметр0.000001, т.е. наносекундная спячка, где 1 наносекунда равна1e-6миллисекунд. При написании стратегий вPythonязык,Sleep(millisecond)Не рекомендуется использовать эту функцию для выборов с интервалом, операций с временем ожидания.time.sleep(second)ФункцияPythonЭто...timeЭто потому, что использованиеtime.sleep(second)функция в стратегии заставляет программу стратегии ждать определенный период времени фактически при обратном тестировании (не пропуская временные ряды системы обратного тестирования), поэтому она заставляет стратегию проводить обратное тестирование очень медленно.

IsVirtual

Определить, является ли среда управления стратегией системой обратного тестирования.

Стратегия возвращает истинное значение, например:trueпри запуске в среде системы обратного тестирования стратегия возвращает ложное значение, например:falseпри работе в среде реального трейдинга. Буль

Виртуальная?

function main() {
    if (IsVirtual()) {
        Log("The current backtest system environment.")
    } else {
        Log("The current live trading environment.")
    }
}
def main():
    if IsVirtual():
        Log("The current backtest system environment.")
    else:
        Log("The current live trading environment.")
void main() {
    if (IsVirtual()) {
        Log("The current backtest system environment.");
    } else {
        Log("The current live trading environment.");
    }
}

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

Почта

Отправь мне письмо.

Успешная доставка электронной почты возвращает истинное значение, например,true, и неудачная доставка возвращает ложное значение, например,false- Да. Буль

Почта ((smtpСервер, smtpИмя пользователя, smtpПароль, mailTo, заголовок, тело)

Используется для определенияSMTPадрес обслуживания отправителя электронной почты. smtpServer неправда строка Используется для указания адреса электронной почты отправителя. smtpUsername (имя пользователя) неправда строка ВSMTPпароль для почтового ящика отправителя электронной почты. smtpPassword (пароль) неправда строка Используется для указания адреса электронной почты получателя. mailTo неправда строка Заголовок электронной почты. Заголовок неправда строка Корпус почты. тело неправда строка

function main(){
    Mail("smtp.163.com", "asdf@163.com", "password", "111@163.com", "title", "body")
}
def main():
    Mail("smtp.163.com", "asdf@163.com", "password", "111@163.com", "title", "body")
void main() {
    Mail("smtp.163.com", "asdf@163.com", "password", "111@163.com", "title", "body");
}

ВsmtpPasswordпараметр устанавливает пароль дляSMTPСервис, а не пароль почтового ящика. При установкеsmtpServerпараметр, если вам нужно изменить порт, вы можете добавить номер порта прямо в параметреsmtpServerНапример: QQ mailsmtp.qq.com:587, который доступен для тестирования. Если сообщается ошибка:unencryped connection, вам нужно изменитьsmtpServerВ соответствии сMailФормат параметра:ssl://xxx.com:xxx, например,sslМетодSMTPдля почты QQ:ssl://smtp.qq.com:465илиsmtp://xxx.com:xxx- Да. Это не работает в системе обратного тестирования.

{@fun/Global/Mail_Go Mail_Go} Я не знаю.

Mail_Go

Асинхронная версияMail function.

ВMail_GoФункция возвращает одновременный объект сразу, и вы можете использоватьwaitУспешная доставка почты возвращает истинное значение, например,true, и неудачная доставка возвращает ложное значение, например,false- Да. объект

Mail_Go ((smtpServer, smtpUsername, smtpPassword, mailTo, название, корпус)

Он используется для определенияSMTPсервисный адрес отправителя электронной почты. smtpServer Истинно строка Он используется для указания адреса электронной почты отправителя электронной почты. smtpUsername (имя пользователя) Истинно строка ВSMTPпароль для почтового ящика отправителя электронной почты. smtpPassword (пароль) Истинно строка Используется для указания адреса электронной почты получателя электронной почты. mailTo Истинно строка Заголовок электронной почты. Заголовок Истинно строка Корпус почты. тело Истинно строка

function main() {
    var r1 = Mail_Go("smtp.163.com", "asdf@163.com", "password", "111@163.com", "title", "body")
    var r2 = Mail_Go("smtp.163.com", "asdf@163.com", "password", "111@163.com", "title", "body")
    
    var ret1 = r1.wait()
    var ret2 = r2.wait()
    
    Log("ret1:", ret1)
    Log("ret2:", ret2)
}
# Not supported.
// Not supported.

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

{@fun/Global/Mail Mail} Я не знаю.

НастроитьErrorFilter

Профиль ошибок.

УстановитеErrorFilter (фильтр)

Регулярная строка выражений. фильтры неправда строка

function main() {
    SetErrorFilter("502:|503:|tcp|character|unexpected|network|timeout|WSARecv|Connect|GetAddr|no such|reset|http|received|EOF|reused")
}
def main():
    SetErrorFilter("502:|503:|tcp|character|unexpected|network|timeout|WSARecv|Connect|GetAddr|no such|reset|http|received|EOF|reused")
void main() {
    SetErrorFilter("502:|503:|tcp|character|unexpected|network|timeout|WSARecv|Connect|GetAddr|no such|reset|http|received|EOF|reused");
}

Фильтрация распространенных ошибок.

function main() {
    // A random query for a non-existent order with an id of 123, allowing the interface to report an error deliberately
    var order = exchange.GetOrder("123")
    Log(order)
    // Filter http502 errors, GetOrder interface errors, after setting the error filter, the second call to GetOrder will no longer report errors
    SetErrorFilter("502:|GetOrder")
    order = exchange.GetOrder("123")
    Log(order)
}
def main():
    order = exchange.GetOrder("123")
    Log(order)
    SetErrorFilter("502:|GetOrder")
    order = exchange.GetOrder("123")
    Log(order)
void main() {
    TId orderId;
    Order order = exchange.GetOrder(orderId);
    Log(order);
    SetErrorFilter("502:|GetOrder");
    order = exchange.GetOrder(orderId);
    Log(order);
}

Отфильтровать сообщение об ошибке интерфейса.

Регистрации ошибок, совпадающие с этим регулярным выражением, не будут загружены в систему журналов. Вы можете вызвать его несколько раз (без ограничения на количество раз), чтобы установить несколько условий фильтра. Регулярные выражения, установленные несколько раз, будут накапливаться и вступать в силу одновременно. Вы можете установить пустую строку для сброса регулярного выражения, используемого для фильтрации журналов ошибок:SetErrorFilter("")Фильтрованные журналы больше не записываются в файл базы данных, соответствующий идентификатору торговли в каталоге Docker, чтобы предотвратить частое сообщение об ошибках от раздутия файла базы данных.

GetPid

Получите идентификатор торгового процесса.

Возвращение идентификатора торгового процесса. строка

GetPid ((()

function main(){
    var id = GetPid()
    Log(id)
}
def main():
    id = GetPid()
    Log(id)
void main() {
    auto id = GetPid();
    Log(id);
}

ПолучитьLastError

Получил последнее сообщение об ошибке.

Последнее сообщение об ошибке. строка

ПолучитьLastError()

function main(){
    // Because the order number 123 does not exist, so there will be an error.
    exchange.GetOrder("123")
    var error = GetLastError()
    Log(error)
}
def main():
    exchange.GetOrder("123")
    error = GetLastError()
    Log(error)
void main() {
    // Order ID type: TId, so you can't pass in a string, we place an order that doesn't meet the exchange specification to trigger
    exchange.GetOrder(exchange.Buy(1, 1));
    auto error = GetLastError();
    Log(error);
}

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

Получить команду

Получает команду стратегического взаимодействия.

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

Получить команду ((()

function main(){
    while(true) { 
        var cmd = GetCommand()
        if (cmd) { 
            Log(cmd)
        }
        Sleep(1000) 
    }
}
def main():
    while True:
        cmd = GetCommand()
        if cmd:
            Log(cmd)
        Sleep(1000)
void main() {
    while(true) {
        auto cmd = GetCommand();
        if(cmd != "") {
            Log(cmd);
        }
        Sleep(1000);
    }
}

Выявляет команду взаимодействия и используетLogФункция вывода команды взаимодействия при ее обнаружении.

function main() {
    while (true) {
        LogStatus(_D())
        var cmd = GetCommand()
        if (cmd) {
            Log("cmd:", cmd)    
            var arr = cmd.split(":")
            if (arr[0] == "buy") {
                Log("Buy, the control without number")
            } else if (arr[0] == "sell") {
                Log("Sell, the control with the number of:", arr[1])
            } else {
                Log("Other controls trigger:", arr)
            }
        }
        Sleep(1000)
    } 
}
def main():
    while True:
        LogStatus(_D())
        cmd = GetCommand()
        if cmd:
            Log("cmd:", cmd)
            arr = cmd.split(":")
            if arr[0] == "buy":
                Log("Buy, the control without number")
            elif arr[0] == "sell":
                Log("Sell, the control with the number of:", arr[1])
            else:
                Log("Other controls trigger:", arr)
        Sleep(1000)
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
void split(const string& s,vector<string>& sv,const char flag = ' ') {
    sv.clear();
    istringstream iss(s);
    string temp;            

    while (getline(iss, temp, flag)) {
        sv.push_back(temp);
    }
    return;
}            

void main() {
    while(true) {
        LogStatus(_D());
        auto cmd = GetCommand();
        if (cmd != "") {
            vector<string> arr;
            split(cmd, arr, ':');
            if(arr[0] == "buy") {
                Log("Buy, the control without number");
            } else if (arr[0] == "sell") {
                Log("Sell, the control with the number of:", arr[1]);
            } else {
                Log("Other controls trigger:", arr);
            }
        }
        Sleep(1000);
    }
}

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

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

GetMeta

Получить значение мета написано при генерации кода регистрации стратегии.

Metaданные. строка

GetMeta ((()

function main() {
    // The maximum asset value of the denominated currency allowed by the strategy.
    var maxBaseCurrency = null
    
    // Get the metadata when creating the registration code.
    var level = GetMeta()
    
    // Detecting the conditions corresponding to Meta.
    if (level == "level1") {
        // -1 for unrestricted
        maxBaseCurrency = -1       
    } else if (level == "level2") {
        maxBaseCurrency = 10     
    } else if (level == "level3") {
        maxBaseCurrency = 1
    } else {
        maxBaseCurrency = 0.5
    }
    
    while(1) {
        Sleep(1000)
        var ticker = exchange.GetTicker()
        
        // Detect asset values
        var acc = exchange.GetAccount()
        if (maxBaseCurrency != -1 && maxBaseCurrency < acc.Stocks + acc.FrozenStocks) {
            // Stop executing strategy trading logic
            LogStatus(_D(), "level:", level, "Positions exceeding the usage limit of the registration code will no longer execute the strategy trading logic!")
            continue
        }
        
        // Other trading logic
        
        // Normal output of status bar information
        LogStatus(_D(), "level:", level, "The strategy is working properly! ticker data: \n", ticker)
    }
}
def main():
    maxBaseCurrency = null
    level = GetMeta()
    
    if level == "level1":
        maxBaseCurrency = -1       
    elif level == "level2":
        maxBaseCurrency = 10     
    elif level == "level3":
        maxBaseCurrency = 1
    else:
        maxBaseCurrency = 0.5
    
    while True:
        Sleep(1000)
        ticker = exchange.GetTicker()        
        acc = exchange.GetAccount()
        if maxBaseCurrency != -1 and maxBaseCurrency < acc["Stocks"] + acc["FrozenStocks"]:
            LogStatus(_D(), "level:", level, "Positions exceeding the usage limit of the registration code will no longer execute the strategy trading logic!")
            continue        
        
        # Other trading logic
        
        # Normal output of status bar information
        LogStatus(_D(), "level:", level, "The strategy is working properly! ticker data: \n", ticker)
void main() {
    auto maxBaseCurrency = 0.0;
    auto level = GetMeta();
    
    if (level == "level1") {
        maxBaseCurrency = -1;  
    } else if (level == "level2") {
        maxBaseCurrency = 10;
    } else if (level == "level3") {
        maxBaseCurrency = 1;
    } else {
        maxBaseCurrency = 0.5;
    }
    
    while(1) {
        Sleep(1000);
        auto ticker = exchange.GetTicker();  
        auto acc = exchange.GetAccount();
        if (maxBaseCurrency != -1 && maxBaseCurrency < acc.Stocks + acc.FrozenStocks) {
            // Stop execution strategy trading logic.
            LogStatus(_D(), "level:", level, "Positions exceeding the usage limit of the registration code will no longer execute the strategy trading logic!");
            continue;
        }
        
        // Other trading logic
        
        // Normal output of status bar information
        LogStatus(_D(), "level:", level, "The strategy is working properly! ticker data: \n", ticker);
    }
}

Пример сценария применения: использованиеMetaограничить объем активов, которыми управляет стратегия.

Сценарий применения: необходимо сделать капитальные лимиты для разных стратегических арендаторов.Metaзначение, установленное при генерации регистрационного кода, не может превышать 190 символов, аGetMeta()Если нет метаданных (Meta) устанавливается при генерировании кода регистрации стратегии,GetMeta()Функция возвращает null. Она не работает в системе обратного тестирования.

Назначьте

Для примитивныхSocketДоступ, поддержкаtcp, udp, tls, unixПоддержка 4 популярных протоколов связи:mqtt, nats, amqp, kafkaПоддержка подключения к базам данных:sqlite3, mysql, postgres, clickhouse.

ВDial()Обычный вызов возвращает объект соединения, который имеет три метода:read, writeиclose.readДля считывания данных используетсяwriteС помощью этого метода передаются данные иcloseметод используется для закрытия соединения. Вreadметод поддерживает следующие параметры:

  • Когда параметры не передаются, он блокирует до тех пор, пока сообщение не будет доступно и вернется, например:ws.read().
  • При передаче в качестве параметра единица составляет миллисекунды, указывая время ожидания сообщения.ws.read(2000)указывает время задержки в две секунды (2000 миллисекунд).
  • Следующие два параметра действительны только для WebSocket: Передача параметра-1означает, что функция возвращает сообщения немедленно, независимо от наличия или отсутствия сообщений, например:ws.read(-1)- Да. Передача параметра-2означает, что функция возвращает сразу с сообщением или без него, но возвращается только последнее сообщение, а буферизированное сообщение отбрасывается.ws.read(-2).

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

Сценарий Нет параметра Параметр: -1 Параметр: -2 Параметр: 2000, в миллисекундах
Данные уже в буфере Немедленно верните старые данные Немедленно верните старые данные Немедленно верните последние данные Немедленно верните старые данные
Нет данных в буфере Возвращение при блокировке данных Немедленно верните нуль Немедленно верните нуль Подождите 2000 мс, верните null, если нет данных, верните null, если есть данные
Соединение WebSocket отключено или повторно подключено базовым read() функция возвращает пустую строку, т.е.: , и write() функция возвращает 0. Ситуация обнаружена. Вы можете закрыть соединение с помощью функции close(), или если вы настроили автоматическое воссоединение, вам не нужно его закрывать, основной система автоматически воссоединит его.

объект

Выбрать адрес Назови (адрес, время выхода)

Адрес запроса. Адрес неправда строка секунды таймаута, Тайм-аут ложное Номер

function main(){
    // Dial supports tcp://,udp://,tls://,unix://protocol, you can add a parameter to specify the number of seconds for the timeout
    var client = Dial("tls://www.baidu.com:443")  
    if (client) {
        // write can be followed by a numeric parameter to specify the timeout, write returns the number of bytes successfully sent
        client.write("GET / HTTP/1.1\nConnection: Closed\n\n")
        while (true) {
            // read can be followed by a numeric parameter specifying the timeout in milliseconds. Returning null indicates an error or timeout or that the socket has been closed
            var buf = client.read()
            if (!buf) {
                 break
            }
            Log(buf)
        }
        client.close()
    }
}
def main():
    client = Dial("tls://www.baidu.com:443")
    if client:
        client.write("GET / HTTP/1.1\nConnection: Closed\n\n")
        while True:
            buf = client.read()
            if not buf:
                break
            Log(buf)
        client.close()
void main() {
    auto client = Dial("tls://www.baidu.com:443");
    if(client.Valid) {
        client.write("GET / HTTP/1.1\nConnection: Closed\n\n");
        while(true) {
            auto buf = client.read();
            if(buf == "") {
                break;
            }
            Log(buf);
        }
        client.close();
    }
}

Пример вызова функции Dial:

function main() {
    LogStatus("Connecting...")
    // Accessing WebSocket interface of Binance
    var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
    if (!client) {
        Log("Connection failed, program exited")
        return
    }
    
    while (true) {
        // read returns only the data retrieved after the read call
        var buf = client.read()      
        if (!buf) {
            break
        }
        var table = {
            type: 'table',
            title: 'Ticker Chart',
            cols: ['Currency', 'Highest', 'Lowest', 'Buy 1', 'Sell 1', 'Last traded price', 'Volume', 'Update time'],
            rows: []
        }
        var obj = JSON.parse(buf)
        _.each(obj, function(ticker) {
            table.rows.push([ticker.s, ticker.h, ticker.l, ticker.b, ticker.a, ticker.c, ticker.q, _D(ticker.E)])
        })
        LogStatus('`' + JSON.stringify(table) + '`')
    }
    client.close()
}
import json
def main():
    LogStatus("Connecting...")
    client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
    if not client:
        Log("Connection failed, program exited")
        return 
    
    while True:
        buf = client.read()
        if not buf:
            break
        table = {
            "type" : "table", 
            "title" : "Ticker Chart", 
            "cols" : ['Currency', 'Highest', 'Lowest', 'Buy 1', 'Sell 1', 'Last traded price', 'Volume', 'Update time'], 
            "rows" : [] 
        }
        obj = json.loads(buf)
        for i in range(len(obj)):
            table["rows"].append([obj[i]["s"], obj[i]["h"], obj[i]["l"], obj[i]["b"], obj[i]["a"], obj[i]["c"], obj[i]["q"], _D(int(obj[i]["E"]))])
        LogStatus('`' + json.dumps(table) + '`')
    client.close()
void main() {
    LogStatus("Connecting...");
    auto client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr");
    if(!client.Valid) {
        Log("Connection failed, program exited");
        return;
    }
    
    while(true) {
        auto buf = client.read();
        if(buf == "") {
            break;
        }
        json table = R"({
            "type" : "table", 
            "title" : "Ticker Chart", 
            "cols" : ["Currency", "Highest", "Lowest", "Buy 1", "Sell 1", "Last traded price", "Volume", "Update time"], 
            "rows" : []
        })"_json;
        json obj = json::parse(buf);
        for(auto& ele : obj.items()) {
            table["rows"].push_back({ele.value()["s"], ele.value()["h"], ele.value()["l"], ele.value()["b"], ele.value()["a"], ele.value()["c"], 
                ele.value()["q"], _D(ele.value()["E"])});
        }
        LogStatus("`" + table.dump() + "`");
    }
    client.close();
}

Для доступа к интерфейсу WebSocket Binance:

var ws = null 
function main(){
    var param = {
        "op": "subscribe",
        "args": [{
            "channel": "tickers",
            "instId": "BTC-USDT"
        }]
    }
    // When calling Dial function, specify reconnect=true to set reconnection mode and payload to be the message sent when reconnecting. When the WebSocket connection is disconnected, it will reconnect and send messages automatically.
    ws = Dial("wss://ws.okx.com:8443/ws/v5/public|compress=gzip_raw&mode=recv&reconnect=true&payload="+ JSON.stringify(param))
    if(ws){
        var pingCyc = 1000 * 20
        var lastPingTime = new Date().getTime()
        while(true){
            var nowTime = new Date().getTime()
            var ret = ws.read()
            Log("ret:", ret)
            if(nowTime - lastPingTime > pingCyc){
                var retPing = ws.write("ping")
                lastPingTime = nowTime
                Log("Send : ping", "#FF0000")
            }
            LogStatus("Current time:", _D())
            Sleep(1000)
        }
    }
}              

function onexit() {
    ws.close() 
    Log("exit")
}
import json
import time              

ws = None
def main():
    global ws 
    param = {
        "op": "subscribe",
        "args": [{
            "channel": "tickers",
            "instId": "BTC-USDT"
        }]
    }
    ws = Dial("wss://ws.okx.com:8443/ws/v5/public|compress=gzip_raw&mode=recv&reconnect=true&payload=" + json.dumps(param))
    if ws:
        pingCyc = 1000 * 20
        lastPingTime = time.time() * 1000
        while True:
            nowTime = time.time() * 1000
            ret = ws.read()
            Log("ret:", ret)
            if nowTime - lastPingTime > pingCyc:
                retPing = ws.write("ping")
                lastPingTime = nowTime
                Log("Send: ping", "#FF0000")
            LogStatus("Current time:", _D())
            Sleep(1000)              

def onexit():
    ws.close()
    Log("exit")
auto objWS = Dial("wss://ws.okx.com:8443/ws/v5/public|compress=gzip_raw&mode=recv&reconnect=true");              

void main() {
    json param = R"({
        "op": "subscribe",
        "args": [{
            "channel": "tickers",
            "instId": "BTC-USDT"
        }]
    })"_json;
    
    objWS.write(param.dump());
    if(objWS.Valid) {
        uint64_t pingCyc = 1000 * 20;
        uint64_t lastPingTime = Unix() * 1000;
        while(true) {
            uint64_t nowTime = Unix() * 1000;
            auto ret = objWS.read();
            Log("ret:", ret);
            if(nowTime - lastPingTime > pingCyc) {
                auto retPing = objWS.write("ping");
                lastPingTime = nowTime;
                Log("Send: ping", "#FF0000");
            }
            LogStatus("Current time:", _D());
            Sleep(1000);
        }
    }
}              

void onexit() {
    objWS.close();
    Log("exit");
}

Доступ к интерфейсу OKX WebSocket:

var ws = null               

function main(){
    var param = {"sub": "market.btcusdt.detail", "id": "id1"}
    ws = Dial("wss://api.huobi.pro/ws|compress=gzip&mode=recv&reconnect=true&payload="+ JSON.stringify(param))
    if(ws){
        while(1){
            var ret = ws.read()
            Log("ret:", ret)
            // Respond to heartbeat packet operations
            try {
                var jsonRet = JSON.parse(ret)
                if(typeof(jsonRet.ping) == "number") {
                    var strPong = JSON.stringify({"pong" : jsonRet.ping})
                    ws.write(strPong)
                    Log("Respond to ping, send pong:", strPong, "#FF0000")
                }
            } catch(e) {
                Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
            }
            
            LogStatus("Current time:", _D())
            Sleep(1000)
        }
    }
}              

function onexit() {
    ws.close() 
    Log("Execute the ws.close() function")
}
import json
ws = None              

def main():
    global ws
    param = {"sub" : "market.btcusdt.detail", "id" : "id1"}
    ws = Dial("wss://api.huobi.pro/ws|compress=gzip&mode=recv&reconnect=true&payload=" + json.dumps(param))
    if ws:
        while True:
            ret = ws.read()
            Log("ret:", ret)              
            # Respond to heartbeat packet operations
            try:
                jsonRet = json.loads(ret)
                if "ping" in jsonRet and type(jsonRet["ping"]) == int:
                    strPong = json.dumps({"pong" : jsonRet["ping"]})
                    ws.write(strPong)
                    Log("Respond to ping, send pong:", strPong, "#FF0000")
            except Exception as e:
                Log("e:", e)
                
            LogStatus("Current time:", _D())
            Sleep(1000)
    
def onexit():
    ws.close()
    Log("Execute the ws.close() function")  
using namespace std;
void main() {
    json param = R"({"sub" : "market.btcusdt.detail", "id" : "id1"})"_json;
    auto ws = Dial("wss://api.huobi.pro/ws|compress=gzip&mode=recv&reconnect=true&payload=" + param.dump());
    if(ws.Valid) {
        while(true) {
            auto ret = ws.read();
            Log("ret:", ret);              
            // Respond to heartbeat packet operations
            try 
            {
                auto jsonRet = json::parse(ret);
                if(jsonRet["ping"].is_number()) {
                    json pong = R"({"pong" : 0})"_json;
                    pong["pong"] = jsonRet["ping"];
                    auto strPong = pong.dump();
                    ws.write(strPong);
                    Log("Respond to ping, send pong:", strPong, "#FF0000");
                }
            } catch(exception &e) 
            {
                Log("e:", e.what());
            }
            
            LogStatus("Current time:", _D());
            Sleep(1000);
        }
    }
}              

void onexit() {
    // ws.close();
    Log("Execute the ws.close() function");
}

Доступ к интерфейсу Huobi's WebSocket:

function getLogin(pAccessKey, pSecretKey, pPassphrase) {
    // Signature function for login
    var ts = (new Date().getTime() / 1000).toString()
    var login = {
        "op": "login",
        "args":[{
            "apiKey"    : pAccessKey,
            "passphrase" : pPassphrase,
            "timestamp" : ts,
            "sign" : exchange.HMAC("sha256", "base64", ts + "GET" + "/users/self/verify", pSecretKey)   // exchange.HMAC has been deprecated and is temporarily supported. Please use the latest exchange.Encode function instead.
        }]
    }    
    return login
}                

var client_private = null 
function main() {
    // Because the read function uses a timeout setting, filtering the timeout reports errors that would otherwise be output with redundant errors
    SetErrorFilter("timeout")
    
    // Position channel subscription information
    var posSubscribe = {
        "op": "subscribe",
        "args": [{
            "channel": "positions",
            "instType": "ANY"
        }]
    }                

    var accessKey = "xxx"
    var secretKey = "xxx"
    var passphrase = "xxx"            

    client_private = Dial("wss://ws.okx.com:8443/ws/v5/private")
    client_private.write(JSON.stringify(getLogin(accessKey, secretKey, passphrase)))
    Sleep(3000)  // When logging in, you cannot subscribe to private channels immediately, you need to wait for server response
    client_private.write(JSON.stringify(posSubscribe))
    if (client_private) {
        var lastPingTS = new Date().getTime()
        while (true) {
            var buf = client_private.read(-1)
            if (buf) {
                Log(buf)
            }
            
            // Detect disconnection, reconnect
            if (buf == "" && client_private.write(JSON.stringify(posSubscribe)) == 0) {
                Log("Disconnection detected, close connection, reconnect")
                client_private.close()
                client_private = Dial("wss://ws.okx.com:8443/ws/v5/private")
                client_private.write(JSON.stringify(getLogin(accessKey, secretKey, passphrase)))
                Sleep(3000)
                client_private.write(JSON.stringify(posSubscribe))
            }
            
            // Send heartbeat packets
            var nowPingTS = new Date().getTime()
            if (nowPingTS - lastPingTS > 10 * 1000) {
                client_private.write("ping")
                lastPingTS = nowPingTS
            }            
        }        
    }
}                

function onexit() {    
    var ret = client_private.close()
    Log("Close the connection!", ret)
}
import json
import time
  
def getLogin(pAccessKey, pSecretKey, pPassphrase):
    ts = str(time.time())
    login = {
        "op": "login",
        "args":[{
            "apiKey"    : pAccessKey,
            "passphrase" : pPassphrase,
            "timestamp" : ts,
            "sign" : exchange.HMAC("sha256", "base64", ts + "GET" + "/users/self/verify", pSecretKey)
        }]
    }
    return login                 

client_private = None 
def main():
    global client_private
    SetErrorFilter("timeout")
    
    posSubscribe = {
        "op": "subscribe",
        "args": [{
            "channel": "positions",
            "instType": "ANY"
        }]
    }                  

    accessKey = "xxx"
    secretKey = "xxx"
    passphrase = "xxx"
    
    client_private = Dial("wss://ws.okx.com:8443/ws/v5/private")
    client_private.write(json.dumps(getLogin(accessKey, secretKey, passphrase)))
    Sleep(3000)
    client_private.write(json.dumps(posSubscribe))
    if client_private:
        lastPingTS = time.time() * 1000
        while True:
            buf = client_private.read(-1)
            if buf:
                Log(buf)
            
            if buf == "" and client_private.write(json.dumps(posSubscribe)) == 0:
                Log("Disconnection detected, close connection, reconnect")
                ret = client_private.close()
                client_private = Dial("wss://ws.okx.com:8443/ws/v5/private")
                client_private.write(json.dumps(getLogin(accessKey, secretKey, passphrase)))
                Sleep(3000)
                client_private.write(json.dumps(posSubscribe))
            
            nowPingTS = time.time() * 1000
            if nowPingTS - lastPingTS > 10 * 1000:
                client_private.write("ping")
                lastPingTS = nowPingTS                

def onexit():
    ret = client_private.close()
    Log("Close the connection!", ret)
auto client_private = Dial("wss://ws.okx.com:8443/ws/v5/private");                  

json getLogin(string pAccessKey, string pSecretKey, string pPassphrase) {
    auto ts = std::to_string(Unix());
    json login = R"({
        "op": "login",
        "args": [{
            "apiKey": "",
            "passphrase": "",
            "timestamp": "",
            "sign": ""
        }]
    })"_json;
    login["args"][0]["apiKey"] = pAccessKey;
    login["args"][0]["passphrase"] = pPassphrase;
    login["args"][0]["timestamp"] = ts;
    login["args"][0]["sign"] = exchange.HMAC("sha256", "base64", ts + "GET" + "/users/self/verify", pSecretKey);
    return login;
}                  

void main() {
    SetErrorFilter("timeout");
    json posSubscribe = R"({
        "op": "subscribe",
        "args": [{
            "channel": "positions",
            "instType": "ANY"
        }]
    })"_json;
    
    auto accessKey = "xxx";
    auto secretKey = "xxx";
    auto passphrase = "xxx";
    
    client_private.write(getLogin(accessKey, secretKey, passphrase).dump());
    Sleep(3000);
    client_private.write(posSubscribe.dump());                

    if (client_private.Valid) {
        uint64_t lastPingTS = Unix() * 1000;                  

        while (true) {
            auto buf = client_private.read(-1);
            if (buf != "") {
                Log(buf);
            }
            if (buf == "") {
                if (client_private.write(posSubscribe.dump()) == 0) {
                    Log("Disconnection detected, close connection, reconnect");
                    client_private.close();
                    client_private = Dial("wss://ws.okx.com:8443/ws/v5/private");
                    client_private.write(getLogin(accessKey, secretKey, passphrase).dump());
                    Sleep(3000);
                    client_private.write(posSubscribe.dump());
                }
            }
            
            uint64_t nowPingTS = Unix() * 1000;
            if (nowPingTS - lastPingTS > 10 * 1000) {
                client_private.write("ping");
                lastPingTS = nowPingTS;
            }
        }
    }
}                  

void onexit() {
    client_private.close();
    Log("exit");
}

Для доступа к интерфейсу аутентификации WebSocket OKX:

var client = null 
function main() {
    // client = Dial("sqlite3://:memory:")   // Using an in-memory database
    client = Dial("sqlite3://test1.db")      // Open/connect to the database file in the docker's directory
    
    // record handle
    var sqlite3Handle = client.fd()
    Log("sqlite3Handle:", sqlite3Handle)
    
    // Querying tables in the database
    var ret = client.exec("SELECT name FROM sqlite_master WHERE type='table'")
    Log(ret)
}

function onexit() {
    Log("Execute client.close()")
    client.close()
}
// Not supported
// Not supported

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

  • exec(sqlString): Используется для выполнения SQL заявлений таким же образом, какDBExec() function.
  • fd():fd()функция возвращает ручку (например, переменная ручка является рукой), которая будет использоваться другими потоками для повторного подключения (даже если объект, созданный Dial, уже был закрыт при исполненииclose()с функцией закрытия соединения) путем прохождения ручки вDial()функция, например,Dial(handle)Подключение для повторного использования. Ниже приведен пример функции Dial, соединяющейsqlite3 database.

Подробная информацияaddressпараметр, разделенный|символ после обычного адреса:wss://ws.okx.com:8443/ws/v5/publicЕсли есть.|символы в строке параметров, затем||Часть после этого - некоторые параметры параметров функции, и каждый параметр связан с&Например,ss5параметры прокси и сжатия могут быть установлены вместе следующим образом:Dial("wss://ws.okx.com:8443/ws/v5/public|proxy=socks5://xxx:9999&compress=gzip_raw&mode=recv")

Функции, поддерживаемые параметром адреса функции Dial Описание параметров
Параметры, связанные с сжатием данных протокола WebSocket: compress=value parameter compress - это метод сжатия, параметры сжатия: gzip_raw, gzip и т. д. Если метод gzip не является стандартным gzip, вы можете использовать расширенный метод: gzip_raw
Параметры, относящиеся к сжатию данных протокола WebSocket: mode=value parameter режим - это режим сжатия, параметр режима может быть двойным, отправка, recv. dual - это двустороннее сжатие, отправка сжатых данных, прием сжатых данных. отправка - это отправка сжатых данных. recv - это прием сжатых данных, локальная декомпрессия.
Протокол WebSocket устанавливает базовые параметры, связанные с автоматическим воссоединением: reconnect=значение параметра reconnect означает установить reconnect, reconnect=true означает включить reconnect. По умолчанию reconnect отсутствует, если этот параметр не установлен.
Протокол WebSocket устанавливает базовые параметры, связанные с автоматическим воссоединением: interval=value parameter интервал - это интервал повторных попыток, в миллисекундах, интервал=10000 - это интервал повторных попыток 10 секунд, по умолчанию 1 секунда, когда он не установлен, то есть интервал=1000.
Протокол WebSocket устанавливает базовые параметры, связанные с автоматическим воссоединением: полезная нагрузка=значение параметра полезная нагрузка - это сообщение подписки, которое необходимо отправить при повторном подключении WebSocket, например: полезная нагрузка=okokok.
Параметры, относящиеся к носкам5 прокси: proxy=значение параметра Прокси - это настройка прокси ss5, формат значения параметра: socks5://name:pwd@192.168.0.1:1080, имя - это имя пользователя сервера ss5, pwd - это пароль входа на сервер ss5, 1080 - это порт службы ss5.

ВDial()Функция поддерживается только для торговли в реальном времени. При подключении к базе данных с помощью функции Dial строка подключения записывается со ссылкой на проект драйвера языка go для каждой базы данных.

Базы данных поддерживаются Движущие проекты Соединительная строка Примечания
Склайт3 github.com/mattn/go-sqlite3 sqlite3://файл:test.db?cache=shared&mode=memory Вsqlite3://Префикс указывает, что используется база данных sqlite3, пример вызова:Dial("sqlite3://test1.db")
mysql github.com/go-sql-driver/mysql mysql://username:yourpassword@tcp(localhost:3306)/yourdatabase?charset=utf8mb4
послерост github.com/lib/pq postgres://user=postgres dbname=yourdatabase sslmode=disable password=yourpassword host=localhost port=5432
Кликхаус github.com/ClickHouse/clickhouse-go clickhouse://tcp://host:9000?username=username&password=yourpassword&database=youdatabase

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

Пример вызова частного интерфейса websocket backPack Exchange:

var client = null

function main() {
    // Base64-encoded public key of the key pair, i.e. the access key configured on FMZ
    var base64ApiKey = "xxx"

    var ts = String(new Date().getTime())
    var data = "instruction=subscribe&timestamp=" + ts + "&window=5000"

    // Since signEd25519 returns a base64 encoding, it contains the character "="
    var signature = signEd25519(data)
    
    // The payload may contain the character "=" after being encoded by JSON
    payload = {
        "method": "SUBSCRIBE",
        "params": ["account.orderUpdate"],
        "signature": [base64ApiKey, signature, ts, "5000"]
    }

    client = Dial("wss://ws.backpack.exchange")
    client.write(JSON.stringify(payload))
    if (!client) {
        Log("Connection failed, program exited")
        return
    }
    
    while (true) {
        var buf = client.read()      
        Log(buf)
    }    
}

function onexit() {
    client.close()
}

function signEd25519(data) {
    return exchange.Encode("ed25519.seed", "raw", "base64", data, "base64", "{{secretkey}}")
}

Следующий вызов в коде работает нормально:

client = Dial("wss://ws.backpack.exchange")
client.write(JSON.stringify(payload))

Если вы напишете это прямо вpayload, он будет работать неправильно, например:

client = Dial("wss://ws.backpack.exchange|payload=" + JSON.stringify(payload))

В настоящее время только JavaScript поддерживает использованиеmqtt, nats, amqp, иkafkaКод стратегии языка JavaScript используется в качестве примера, чтобы показать использование четырех протоколов:mqtt, nats, amqp, иkafka:

// We need to configure and deploy proxy servers for each protocol first.
// For the sake of demonstration, the subscription (read operation) and publishing (write operation) of the topic test_topic are all performed in the current strategy.
var arrConn = []
var arrName = []

function main() {
    LogReset(1)
    conn_nats = Dial("nats://admin@127.0.0.1:4222?topic=test_topic")
    conn_mqtt = Dial("mqtt://127.0.0.1:1883?topic=test_topic")
    conn_amqp = Dial("amqp://q:admin@127.0.0.1:5672/?queue=test_Queue")
    conn_kafka = Dial("kafka://localhost:9092/test_topic")
    arrConn = [conn_nats, conn_amqp, conn_mqtt, conn_kafka]
    arrName = ["nats", "amqp", "mqtt", "kafka"]

    while (true) {
        for (var i in arrConn) {
            var conn = arrConn[i]
            var name = arrName[i]

            // Write data
            conn.write(name + ", time: " + _D() + ", test msg.")
            
            // Read data
            var readMsg = conn.read(1000)
            Log(name + " readMsg: ", readMsg, "#FF0000")
        }

        Sleep(1000)
    }
}

function onexit() {
    for (var i in arrConn) {
        arrConn[i].close()
        Log("close", arrName[i], "connect")
    }
}

Подробная документация:Исследование FMZ: Практика протокола связи между стратегиями торговли в режиме реального времени

HttpQuery

Отправьте запрос на http.

Возвращает данные ответа запроса.JSONstring, он может быть проанализированJSON.parse()Функция вJavaScriptязыковой стратегии,json::parse()Функция вC++Если в структуре опций значение отладки установлено на true, возвращаемое значение является объектом (JSON); если значение отладки установлено на false, возвращаемое значение является строкой. строка, объект

HttpQuery ((url) HttpQuery ((url, параметры)

URL-адрес запроса HTTP. URL-адрес Истинно строка Например, настройки, связанные с запросом HTTP, могут быть структурированы следующим образом:

{
    method: "POST",
    body: "a=10&b=20&c=30",
    charset: "UTF-8",
    cookie: "session_id=12345; lang=en",
    profile: "chrome_103",
    debug: false,
    headers: {"TEST-HTTP-QUERY": "123"},
    timeout: 1000
}
  • профиль: используется для моделирования браузераtlsОтпечатки пальцев. Поддерживаемые настройки включают следующие параметры: chrome_:"chrome_103", "chrome_104", "chrome_105", "chrome_106", "chrome_107", "chrome_108", "chrome_109", "chrome_110", "chrome_111", "chrome_112", "chrome_117"... Сафари:"safari_15_6_1", "safari_16_0", "safari_ipad_15_6", "safari_ios_15_5", "safari_ios_15_6", "safari_ios_16_0"... Firefox_:"firefox_102", "firefox_104", "firefox_105", "firefox_106", "firefox_108", "firefox_110", "firefox_117"... опера_:"opera_89", "opera_90", "opera_91"... Заландо:"zalando_android_mobile", "zalando_ios_mobile"... Ники."nike_ios_mobile", "nike_android_mobile"... Облакостроитель:"cloudscraper"... Мммм."mms_ios"... mesh_:"mesh_ios", "mesh_ios_1", "mesh_ios_2", "mesh_android", "mesh_android_1", "mesh_android_2"... Подтверждение:"confirmed_ios", "confirmed_android"... Хорошо."okhttp4_android_7", "okhttp4_android_8", "okhttp4_android_9", "okhttp4_android_10", "okhttp4_android_11", "okhttp4_android_12", "okhttp4_android_13",
  • Debug: когда он настроен наtrue,HttpQueryПризыв функции возвращает полное сообщение ответа.false, только данные вBodyсообщения ответа возвращается.
  • Тайм-аут: настройка тайм-аута, установленная на 1000 означает 1 секунду тайм-аута.
  • Charset: поддерживает транскодирование запрошенных данных ответа, таких как GB18030. Все поля в этой структуре являются необязательными, например,profileполе может быть оставлено в стороне.

варианты ложное объект

function main(){
    // An example of GET access without parameters
    var info = JSON.parse(HttpQuery("https://www.okx.com/api/v5/public/time"))
    Log(info)
    // An example of GET access with parameters
    var ticker = JSON.parse(HttpQuery("https://www.okx.com/api/v5/market/books?instId=BTC-USDT"))
    Log(ticker)
}
import json
import urllib.request
def main():
    # HttpQuery does not support Python, you can use the urllib/urllib2 library instead
    info = json.loads(urllib.request.urlopen("https://www.okx.com/api/v5/public/time").read().decode('utf-8'))
    Log(info)
    ticker = json.loads(urllib.request.urlopen("https://www.okx.com/api/v5/market/books?instId=BTC-USDT").read().decode('utf-8'))
    Log(ticker)
void main() {
    auto info = json::parse(HttpQuery("https://www.okx.com/api/v5/public/time"));
    Log(info);
    auto ticker = json::parse(HttpQuery("https://www.okx.com/api/v5/market/books?instId=BTC-USDT"));
    Log(ticker);
}

Пример доступа к интерфейсу API публичного тикера OKX.

function main() {
    // Setting proxy and sending an http request for this time, no username, no password, this http request will be sent through the proxy
    HttpQuery("socks5://127.0.0.1:8889/http://www.baidu.com/")            

    // Setting proxy and sending an http request for this time, enter the user name and password, only the current call to HttpQuery takes effect, and then call HttpQuery again ("http://www.baidu.com") so that the proxy will not be used.
    HttpQuery("socks5://username:password@127.0.0.1:8889/http://www.baidu.com/")
}
# HttpQuery does not support Python, you can use the urllib/urllib2 library instead
void main() {
    HttpQuery("socks5://127.0.0.1:8889/http://www.baidu.com/");
    HttpQuery("socks5://username:password@127.0.0.1:8889/http://www.baidu.com/");
}

Функция HttpQuery использует настройки прокси.

ВHttpQuery()Функция поддерживает толькоJavaScript, C++язык,Pythonязык может использоватьurllibБиблиотека для отправки запросов Http напрямую.HttpQuery()используется в основном для доступа к интерфейсам биржи, которые не требуют подписи, например, общедоступным интерфейсам, таким как информация о тикерах.HttpQuery()может использоваться в системе обратного тестирования для отправки запросов (толькоGETДля получения данных, используемые в рамках реактестирования, используется 20 посещений различныхURLs, иHttpQuery()Когда те же самыеURLВторой раз,HttpQuery()Функция возвращает кэшированные данные, и больше не возникает фактических сетевых запросов.

{@fun/Global/HttpQuery_Go]

HttpQuery_Go

Отправляет запрос HTTP, асинхронную версиюHttpQuery function.

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

HttpQuery_Go ((url) HttpQuery_Go ((url, параметры)

URL-адрес запроса HTTP. URL-адрес Истинно строка Например, настройки, связанные с запросом HTTP, могут быть структурированы следующим образом:

{
    method: "POST",
    body: "a=10&b=20&c=30",
    charset: "UTF-8",
    cookie: "session_id=12345; lang=en",
    // profile: "",
    debug: false,
    headers: {"TEST-HTTP-QUERY": "123"},
    timeout: 1000
}
  • профиль: используется для моделирования браузераtls fingerprints.
  • Debug: когда он настроен наtrue, этоHttpQuery_GoПризыв функции возвращает полное сообщение ответа.false, только данные вBodyсообщения ответа возвращается.
  • Тайм-аут: настройка тайм-аута, установленная на 1000 означает 1 секунду тайм-аута. Все поля в этой структуре являются необязательными, например,profileполе может быть оставлено в стороне.

варианты ложное объект

function main() {
    // Create the first asynchronous thread
    var r1 = HttpQuery_Go("https://www.okx.com/api/v5/market/tickers?instType=SPOT")
    // Create the second asynchronous thread
    var r2 = HttpQuery_Go("https://api.huobi.pro/market/tickers")
    
    // Get the return value of the first asynchronous thread call
    var tickers1 = r1.wait()
    // Get the return value of the second asynchronous thread call
    var tickers2 = r2.wait()
    
    // Print results
    Log("tickers1:", tickers1)
    Log("tickers2:", tickers2)
}
# Not supported
// Not supported

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

ВHttpQuery_Go()Функция поддерживает толькоJavaScript,Pythonязык может быть использован сurllibБиблиотека для отправки запросов Http напрямую.HttpQuery_Go()используется в основном для доступа к интерфейсам, которые не требуют подписи на бирже, таким как общедоступные интерфейсы, такие как информация о тикерах.HttpQuery_GoФункция не поддерживается системой обратного тестирования.

{@fun/Global/HttpQuery HttpQuery} (См. также:

Кодировать

Эта функция кодирует данные в соответствии с введенными параметрами.

ВEncodeфункция возвращает данные после кодирования и шифрования. строка

Зашифровка ((algo, inputFormat, outputFormat, data) Зашифровка ((algo, inputFormat, outputFormat, data, keyФормат, ключ)

Параметрalgo- алгоритм, используемый при расчете кодирования.raw(не используется алгоритм), "знак", 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, ripemd160, blake2b.256, 2b.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секретный ключ, используемый дляHMACПараметрkeyтребуется, когда параметрalgoУстановлено наsignилиsignTx.keyпараметр не используется дляHMACшифрование, когдаalgoпараметр установлен на raw (поскольку алгоритм должен быть определен для шифрования HMAC). Ключ ложное строка

function main() {
    Log(Encode("raw", "raw", "hex", "example", "raw", "123"))            // 6578616d706c65
    Log(Encode("raw", "raw", "hex", "example"))                          // 6578616d706c65
    Log(Encode("sha256", "raw", "hex", "example", "raw", "123"))         // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
    Log(Encode("sha256", "raw", "hex", "example", "", "123"))            // 50d858e0985ecc7f60418aaf0cc5ab587f42c2570a884095a9e8ccacd0f6545c
    Log(Encode("sha256", "raw", "hex", "example", null, "123"))          // 50d858e0985ecc7f60418aaf0cc5ab587f42c2570a884095a9e8ccacd0f6545c
    Log(Encode("sha256", "raw", "hex", "example", "string", "123"))      // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
    
    Log(Encode("raw", "raw", "hex", "123"))           // 313233
    Log(Encode("raw", "raw", "base64", "123"))        // MTIz
    
    Log(Encode("sha256", "raw", "hex", "example", "hex", "313233"))      // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
    Log(Encode("sha256", "raw", "hex", "example", "base64", "MTIz"))     // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
}
def main():
    Log(Encode("raw", "raw", "hex", "example", "raw", "123"))            # 6578616d706c65
    Log(Encode("raw", "raw", "hex", "example", "", ""))                  # 6578616d706c65
    Log(Encode("sha256", "raw", "hex", "example", "raw", "123"))         # 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
    Log(Encode("sha256", "raw", "hex", "example", "", "123"))            # 50d858e0985ecc7f60418aaf0cc5ab587f42c2570a884095a9e8ccacd0f6545c            

    Log(Encode("sha256", "raw", "hex", "example", "string", "123"))      # 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
    
    Log(Encode("raw", "raw", "hex", "123", "", ""))           # 313233
    Log(Encode("raw", "raw", "base64", "123", "", ""))        # MTIz
    
    Log(Encode("sha256", "raw", "hex", "example", "hex", "313233"))      # 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
    Log(Encode("sha256", "raw", "hex", "example", "base64", "MTIz"))     # 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
void main() {
    Log(Encode("raw", "raw", "hex", "example", "raw", "123"));            // 6578616d706c65
    Log(Encode("raw", "raw", "hex", "example"));                          // 6578616d706c65
    Log(Encode("sha256", "raw", "hex", "example", "raw", "123"));         // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
    Log(Encode("sha256", "raw", "hex", "example", "", "123"));            // 50d858e0985ecc7f60418aaf0cc5ab587f42c2570a884095a9e8ccacd0f6545c            

    Log(Encode("sha256", "raw", "hex", "example", "string", "123"));      // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
                
    Log(Encode("raw", "raw", "hex", "123"));           // 313233
    Log(Encode("raw", "raw", "base64", "123"));        // MTIz
                
    Log(Encode("sha256", "raw", "hex", "example", "hex", "313233"));      // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
    Log(Encode("sha256", "raw", "hex", "example", "base64", "MTIz"));     // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
}

Пример вызова функции Encode.

function main(){
    var ret1 = Encode("text.encoder.utf8", "raw", "hex", "hello")     // e4bda0e5a5bd
    Log(ret1)    
    var ret2 = Encode("text.decoder.utf8", "hex", "string", ret1)   
    Log(ret2)            

    var ret3 = Encode("text.encoder.gbk", "raw", "hex", "hello")      // c4e3bac3
    Log(ret3)
    var ret4 = Encode("text.decoder.gbk", "hex", "string", ret3)
    Log(ret4)
}
def main():
    ret1 = Encode("text.encoder.utf8", "raw", "hex", "hello", "", "")     # e4bda0e5a5bd
    Log(ret1)    
    ret2 = Encode("text.decoder.utf8", "hex", "string", ret1, "", "")   
    Log(ret2)            

    ret3 = Encode("text.encoder.gbk", "raw", "hex", "hello", "", "")      # c4e3bac3
    Log(ret3)
    ret4 = Encode("text.decoder.gbk", "hex", "string", ret3, "", "")
    Log(ret4)
void main(){
    auto ret1 = Encode("text.encoder.utf8", "raw", "hex", "hello");     // e4bda0e5a5bd
    Log(ret1);    
    auto ret2 = Encode("text.decoder.utf8", "hex", "string", ret1);   
    Log(ret2);            

    auto ret3 = Encode("text.encoder.gbk", "raw", "hex", "hello");      // c4e3bac3
    Log(ret3);
    auto ret4 = Encode("text.decoder.gbk", "hex", "string", ret3);
    Log(ret4);
}

Параметрalgoтакже поддерживает: text.encoder.utf8, text.decoder.utf8, text.encoder.gbk, text.decoder.gbk для кодирования и декодирования строк.

ВEncode()Функция поддерживается только для живой торговли.keyиkeyFormatпараметры не переданы, тоkeyшифрование не используется.

UnixNano

Получите наносекундную временную отметку текущего момента.

ВUnixNano()Функция возвращает наносекундный временной штемпель. Номер

UnixNano ((()

function main() {
    var time = UnixNano() / 1000000
    Log(_N(time, 0))
}
def main():
    time = UnixNano()
    Log(time)
void main() {
    auto time = UnixNano();
    Log(time);
}

Если вам нужно получить миллисекундные временные отметки, вы можете использовать следующий код:

{@fun/Global/Unix Unix}

Unix

Получите временную отметку текущего момента на втором уровне.

Возвращает временную отметку второго уровня. Номер

Unix ((()

function main() {
    var t = Unix()
    Log(t)
}
def main():
    t = Unix()
    Log(t)
void main() {
    auto t = Unix();
    Log(t);
}

{@fun/Global/UnixNano UnixNano} Я не знаю.

GetOS

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

Информация о системе. строка

GetOS ((()

function main() {
    Log("GetOS:", GetOS())
}
def main():
    Log("GetOS:", GetOS())
void main() {
    Log("GetOS:", GetOS());
}

Например, призыв кGetOS()функция для докера, работающего наMac OSоперационная система может вернуть:darwin/amd64Потому что компьютеры Apple имеют несколько аппаратных архитектур.darwinэто названиеMac OS system.

MD5

Вычисляет хеш MD5 параметраdata.

Хэш-значение MD5. строка

MD5 (данные)

Данные, требующие вычисления MD5. данные неправда строка

function main() {
    Log("MD5", MD5("hello world"))
}
def main():
    Log("MD5", MD5("hello world"))
void main() {
    Log("MD5", MD5("hello world"));
}

ЗвонитьMD5("hello world")функция, возвращаемое значение:5eb63bbbe01eeed093cb22bb8f5acdc3.

{@fun/Global/EncodeEncode} - Я не знаю.

DBExec

Функции интерфейса базы данных.

Объект, содержащий результат выполнениякв. мзаявление, например:


{"columns":["TS","HIGH","OPEN","LOW","CLOSE","VOLUME"],"values":[[1518970320000,100,99.1,90,100,12345.6]]}

объект

DBExec ((sql)

кв. мстрока заявлений. кв. м неправда строка

function main() {
    var strSql = [
        ":CREATE TABLE TEST_TABLE(", 
        "TS INT PRIMARY KEY NOT NULL,",
        "HIGH REAL NOT NULL,", 
        "OPEN REAL NOT NULL,", 
        "LOW REAL NOT NULL,", 
        "CLOSE REAL NOT NULL,", 
        "VOLUME REAL NOT NULL)"
    ].join("")
    var ret = DBExec(strSql)
    Log(ret)
    
    // Add a piece of data
    Log(DBExec(":INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"))
    
    // Query data
    Log(DBExec(":SELECT * FROM TEST_TABLE;"))
}
def main():
    arr = [
        ":CREATE TABLE TEST_TABLE(", 
        "TS INT PRIMARY KEY NOT NULL,",
        "HIGH REAL NOT NULL,", 
        "OPEN REAL NOT NULL,", 
        "LOW REAL NOT NULL,", 
        "CLOSE REAL NOT NULL,", 
        "VOLUME REAL NOT NULL)"
    ]
    strSql = ""
    for i in range(len(arr)):
        strSql += arr[i]
    ret = DBExec(strSql)
    Log(ret)
    
    # Add a piece of data
    Log(DBExec(":INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"))
    
    # Query data
    Log(DBExec(":SELECT * FROM TEST_TABLE;"))
void main() {
    string strSql = ":CREATE TABLE TEST_TABLE(\
        TS INT PRIMARY KEY NOT NULL,\
        HIGH REAL NOT NULL,\
        OPEN REAL NOT NULL,\
        LOW REAL NOT NULL,\
        CLOSE REAL NOT NULL,\
        VOLUME REAL NOT NULL)";
    auto ret = DBExec(strSql);
    Log(ret);
    
    // Add a piece of data
    Log(DBExec(":INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"));
    
    // Query data
    Log(DBExec(":SELECT * FROM TEST_TABLE;"));
}

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

function main() {
    var strSql = [
        "CREATE TABLE TEST_TABLE(", 
        "TS INT PRIMARY KEY NOT NULL,",
        "HIGH REAL NOT NULL,", 
        "OPEN REAL NOT NULL,", 
        "LOW REAL NOT NULL,", 
        "CLOSE REAL NOT NULL,", 
        "VOLUME REAL NOT NULL)"
    ].join("")
    var ret = DBExec(strSql)
    Log(ret)
}
def main():
    arr = [
        "CREATE TABLE TEST_TABLE(", 
        "TS INT PRIMARY KEY NOT NULL,",
        "HIGH REAL NOT NULL,", 
        "OPEN REAL NOT NULL,", 
        "LOW REAL NOT NULL,", 
        "CLOSE REAL NOT NULL,", 
        "VOLUME REAL NOT NULL)"
    ]
    strSql = ""
    for i in range(len(arr)):
        strSql += arr[i]
    ret = DBExec(strSql)
    Log(ret)
void main() {
    string strSql = "CREATE TABLE TEST_TABLE(\
        TS INT PRIMARY KEY NOT NULL,\
        HIGH REAL NOT NULL,\
        OPEN REAL NOT NULL,\
        LOW REAL NOT NULL,\
        CLOSE REAL NOT NULL,\
        VOLUME REAL NOT NULL)";
    auto ret = DBExec(strSql);
    Log(ret);
}

Создайте стол.

function main() {
    var strSql = [
        "CREATE TABLE TEST_TABLE(", 
        "TS INT PRIMARY KEY NOT NULL,",
        "HIGH REAL NOT NULL,", 
        "OPEN REAL NOT NULL,", 
        "LOW REAL NOT NULL,", 
        "CLOSE REAL NOT NULL,", 
        "VOLUME REAL NOT NULL)"
    ].join("")
    Log(DBExec(strSql))
    
    // Add a piece of data
    Log(DBExec("INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"))
    
    // Query data
    Log(DBExec("SELECT * FROM TEST_TABLE;"))
    
    // Modify data
    Log(DBExec("UPDATE TEST_TABLE SET HIGH=? WHERE TS=?", 110, 1518970320000))    
    
    // Delete data
    Log(DBExec("DELETE FROM TEST_TABLE WHERE HIGH=?", 110))
}
def main():
    arr = [
        "CREATE TABLE TEST_TABLE(", 
        "TS INT PRIMARY KEY NOT NULL,",
        "HIGH REAL NOT NULL,", 
        "OPEN REAL NOT NULL,", 
        "LOW REAL NOT NULL,", 
        "CLOSE REAL NOT NULL,", 
        "VOLUME REAL NOT NULL)"
    ]
    strSql = ""
    for i in range(len(arr)):
        strSql += arr[i]
    Log(DBExec(strSql))
    
    # Add a piece of data
    Log(DBExec("INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"))
    
    # Query data
    Log(DBExec("SELECT * FROM TEST_TABLE;"))
    
    # Modify data
    Log(DBExec("UPDATE TEST_TABLE SET HIGH=? WHERE TS=?", 110, 1518970320000))
    
    # Delete data
    Log(DBExec("DELETE FROM TEST_TABLE WHERE HIGH=?", 110))
void main() {
    string strSql = "CREATE TABLE TEST_TABLE(\
        TS INT PRIMARY KEY NOT NULL,\
        HIGH REAL NOT NULL,\
        OPEN REAL NOT NULL,\
        LOW REAL NOT NULL,\
        CLOSE REAL NOT NULL,\
        VOLUME REAL NOT NULL)";
    Log(DBExec(strSql));            

    // Add a piece of data
    Log(DBExec("INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"));
    
    // Query data
    Log(DBExec("SELECT * FROM TEST_TABLE;"));
    
    // Modify data
    Log(DBExec("UPDATE TEST_TABLE SET HIGH=? WHERE TS=?", 110, 1518970320000));
    
    // Delete data
    Log(DBExec("DELETE FROM TEST_TABLE WHERE HIGH=?", 110));
}

Добавить, удалить, проверить и изменить записи в таблице.

ФункцияDBExec()может работать с базой данных торговли в режиме реального времени (SQLite database) путем передачи параметров.SQLiteСистема зарезервировала таблицы в базе данных торгов:kvdb, cfg, log, profit, chart, не используйте эти столы.СделкиНе рекомендуется выполнять такие операции, которые могут вызвать конфликты в системе.DBExec()Функция поддерживается только для торговли в режиме реального времени.

{@fun/Global/_G _G}

UUID

Создайте UUID.

32-разрядный UUID. строка

UUID (()

function main() {
    var uuid1 = UUID()
    var uuid2 = UUID()
    Log(uuid1, uuid2)
}
def main():
    uuid1 = UUID()
    uuid2 = UUID()
    Log(uuid1, uuid2)
void main() {
    auto uuid1 = UUID();
    auto uuid2 = UUID();
    Log(uuid1, uuid2);
}

ВUUID()Функция поддерживает только прямую торговлю.

Событие Loop

Слушайте события, он возвращается, когда есть какие-либоWebSocketчитаемые данные или одновременные задачи, такие как:exchange.Go(), HttpQuery_Go(), и т. д. завершены.

Если возвращенный объект не является нулевым,Eventсодержится в содержании возврата - тип запуска события. Например, следующая структура значения возврата:

{"Seq":1,"Event":"Exchange_GetTrades","ThreadId":0,"Index":3,"Nano":1682068771309583400}

объект

EventLoop ((() СобытиеLoop ((Timeout)

Параметрtimeoutэто время выхода, в миллисекундах.timeoutждет, пока событие произойдет, прежде чем вернется, если оно установлено на 0, если оно больше 0, оно устанавливает событие, чтобы ждать задержки, и возвращает самое последнее событие сразу, если оно меньше 0. Тайм-аут ложное Номер

function main() {
    var routine_getTicker = exchange.Go("GetTicker")
    var routine_getDepth = exchange.Go("GetDepth")
    var routine_getTrades = exchange.Go("GetTrades")
    
    // Sleep(2000), if the Sleep statement is used here, it will cause the subsequent EventLoop function to miss the previous events, because after waiting for 2 seconds, the concurrent function has received the data, and the subsequent EventLoop listening mechanism started, it misses these events.
    // These events will not be missed unless EventLoop(-1) is called at the beginning of the first line of code to first initialize the EventLoop's listening mechanism.            

    // Log("GetDepth:", routine_getDepth.wait()) If the wait function is called in advance to retrieve the result of a concurrent call to the GetDepth function, the event that the GetDepth function receives the result of the request will not be returned in the EventLoop function.
    var ts1 = new Date().getTime()
    var ret1 = EventLoop(0)
    
    var ts2 = new Date().getTime()
    var ret2 = EventLoop(0)
    
    var ts3 = new Date().getTime()
    var ret3 = EventLoop(0)
    
    Log("The first concurrent task completed was:", _D(ts1), ret1)
    Log("The second concurrent task completed was:", _D(ts2), ret2)
    Log("The third concurrent task completed was:", _D(ts3), ret3)
    
    Log("GetTicker:", routine_getTicker.wait())
    Log("GetDepth:", routine_getDepth.wait())
    Log("GetTrades:", routine_getTrades.wait())
}
import time
def main():
    routine_getTicker = exchange.Go("GetTicker")
    routine_getDepth = exchange.Go("GetDepth")
    routine_getTrades = exchange.Go("GetTrades")
    
    ts1 = time.time()
    ret1 = EventLoop(0)
    
    ts2 = time.time()
    ret2 = EventLoop(0)
    
    ts3 = time.time()
    ret3 = EventLoop(0)
    
    Log("The first concurrent task completed was:", _D(ts1), ret1)
    Log("The second concurrent task completed was:", _D(ts2), ret2)
    Log("The third concurrent task completed was:", _D(ts3), ret3)
    
    Log("GetTicker:", routine_getTicker.wait())
    Log("GetDepth:", routine_getDepth.wait())
    Log("GetTrades:", routine_getTrades.wait())
void main() {
    auto routine_getTicker = exchange.Go("GetTicker");
    auto routine_getDepth = exchange.Go("GetDepth");
    auto routine_getTrades = exchange.Go("GetTrades");
    
    auto ts1 = Unix() * 1000;
    auto ret1 = EventLoop(0);
    
    auto ts2 = Unix() * 1000;
    auto ret2 = EventLoop(0);
    
    auto ts3 = Unix() * 1000;
    auto ret3 = EventLoop(0);
    
    Log("The first concurrent task completed was:", _D(ts1), ret1);
    Log("The second concurrent task completed was:", _D(ts2), ret2);
    Log("The third concurrent task completed was:", _D(ts3), ret3);
    
    Ticker ticker;
    Depth depth;
    Trades trades;
    routine_getTicker.wait(ticker);
    routine_getDepth.wait(depth);
    routine_getTrades.wait(trades);
    
    Log("GetTicker:", ticker);
    Log("GetDepth:", depth);
    Log("GetTrades:", trades);
}

Первый звонокEventLoop()Функция в коде инициирует механизм для этого прослушиваемого события, и если первыйEventLoop()призыв начинается после обратного вызова события, он пропустит предыдущие события.EventLoop()если функция не вызвана вовремя, чтобы вывести их во время выполнения программы, последующие вызовы событий за пределами кэша 500 будут потеряны.EventLoop()функция не влияет на кэш очереди базовой системы WebSocket или кэши одновременных функций, таких какexchange.Go()Для этих кэшей все еще необходимо использовать соответствующие методы для извлечения данных.EventLoop()Функция для данных, которые были получены доEventLoop()Основная цельEventLoop()В этом случае, если вы хотите, чтобы ваша система получила новые сетевые данные, вы должны установить, что эта система получает новые сетевые данные.EventLoop()функция возвращает событие, просто проходит через все источники данных.exchange.Go()Попробуйте получить данные.EventLoop()Функция поддерживает только прямую торговлю. Слушать события в главной нитке при вызове из главной функцииmain()В стратегиях, написанных вJavaScriptязык,threading.Thread()функция создает нить, которая также может быть вызвана в функции выполнения threads, для прослушивания событий в текущей нитке.

{@fun/Global/Dial Dial}, {@fun/Trade/exchange.Go exchange.Go}, {@fun/Global/HttpQuery_Go HttpQuery_Go}

__Сервировать

В__ServeФункция используется для создания службы HTTP, службы TCP и службы Websocket (на основе протокола HTTP).

Возвращает строку, которая записывает IP-адрес и порт созданной службы.127.0.0.1:8088, [::]:8089.

строка

__Serve ((serveURI, обработчик) __Serve ((serveURI, обработчик,...args)

ВserveURIпараметр используется для настройки протокола, IP-адреса, порта и других настроек связи службы, таких какhttp://0.0.0.0:8088?gzip=true, то есть,http://:8088?gzip=true.

  • Протокол TCPserveURIнастройка параметров, таких какtcp://127.0.0.1:6666?tls=true; вы можете добавить сертификаты и частные ключи, такие какtls=true&cert_pem=xxxx&cert_key_pem=xxxx.
  • Протокол HTTPserveURIнастройки параметров, например:http://127.0.0.1:6666?gzip=true; вы можете установить настройки сжатия:gzip=true- Да. ВserveURIпараметр используется для Https, напримерhttps://127.0.0.1:6666?tls=true&gzip=true; вы можете добавитьcert_pemиcert_key_pemпараметры для загрузки сертификата.

служитьURI неправда строка ВhandlerПараметр используется для передачи в функции обработки маршрутизации (протокол HTTP), функции обработки сообщений (протокол TCP) и функции обработки потока (Websocket). Функция обратного вызова, передаваемая параметромhandlerможет определять несколько параметров, первым параметром является объект ctx (контекстный объект).

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

__Serve("http://:8088", function(ctx, a, b, c) {
    Log(`ctx.host():`, ctx.host(), ", a=", a, ", b=", b, ", c=", c)
}, 1, 2, 3)

Параметры1, 2, 3прошел в, когда звонить__Serve()функция соответствует параметрамa, b, cпрошел в функции обратного вызова.

арг ложное string, number, bool, object, array, function, null value и другие типы, поддерживаемые системой

function main() {
    let httpServer = __Serve("http://:8088?gzip=true", function (ctx) {
        Log("http connect from: ", ctx.remoteAddr(), "->", ctx.localAddr())
        let path = ctx.path()
        if (path == "/") {
            ctx.write(JSON.stringify({
                path: ctx.path(),
                method: ctx.method(),
                headers: ctx.headers(),
                cookie: ctx.header("Cookie"),
                remote: ctx.remoteAddr(),
                query: ctx.rawQuery()
            }))
        } else if (path == "/tickers") {
            let ret = exchange.GetTickers()
            if (!ret) {
                ctx.setStatus(500)
                ctx.write(GetLastError())
            } else {
                ctx.write(JSON.stringify(ret))
            }
        } else if (path == "/wss") {
            if (ctx.upgrade("websocket")) { // upgrade to websocket
                while (true) {
                    let r = ctx.read(10)
                    if (r == "") {
                        break
                    } else if (r) {
                        if (r == "ticker") {
                            ctx.write(JSON.stringify(exchange.GetTicker()))
                        } else {
                            ctx.write("not support")
                        }
                    }
                }
                Log("websocket closed", ctx.remoteAddr())
            }
        } else {
            ctx.setStatus(404)
        }
    })
    let echoServer = __Serve("tcp://:8089", function (ctx) {
        Log("tcp connect from: ", ctx.remoteAddr(), "->", ctx.localAddr())
        while (true) {
            let d = ctx.read()
            if (!d) {
                break
            }
            ctx.write(d)
        }
        Log("connect closed")
    })
    Log("http serve on", httpServer, "tcp serve on", echoServer)
    
    for (var i = 0; i < 5; i++) {
        if (i == 2) {
            // test Http
            var retHttp = HttpQuery("http://127.0.0.1:8088?num=123&limit=100", {"debug": true})
            Log("retHttp:", retHttp)
        } else if (i == 3) {
            // test TCP
            var tcpConn = Dial("tcp://127.0.0.1:8089")
            tcpConn.write("Hello TCP Server")
            var retTCP = tcpConn.read()
            Log("retTCP:", retTCP)
        } else if (i == 4) {
            // test Websocket
            var wsConn = Dial("ws://127.0.0.1:8088/wss|compress=gzip")
            wsConn.write("ticker")
            var retWS = wsConn.read(1000)
            Log("retWS:", retWS)
            // no depth
            wsConn.write("depth")
            retWS = wsConn.read(1000)
            Log("retWS:", retWS)
        }
        Sleep(1000)
    }
}
# Unsupported
// Unsupported
  • Эта функция поддерживает только стратегии языка JavaScript.
  • Служебная нить изолирована от глобального объема, поэтому она не поддерживает закрытия или ссылки на внешние переменные, пользовательские функции и т. Д.; однако она может вызвать все функции API платформы.
  • ВWebsocketВы можете установить ветвь маршрутизации в пути и разработать код реализации дляWebsocketВы можете ознакомиться с образцом кода в этом разделе.

Функция обратного вызова, передаваемая параметромhandlerполучаетctxпараметр.ctxпараметр - это контекстный объект, используемый для получения и записи данных, с следующими методами:

  • ctx.proto ((() Применяется к протоколу Http/TCP, возвращает имя протокола при вызове.HTTP/1.1, tcp.
  • ctx.host() Применяется к протоколу Http, он возвращает информацию хоста при вызове IP-адреса и порта.
  • ctx.path ((() Применяется к протоколу HTTP, возвращает путь запроса при вызове.
  • ctx.query (ключ) Применяется к протоколу Http, возвращает значение, соответствующее ключу в запросе при вызове.http://127.0.0.1:8088?num=123, и функция обработки обратного вызова, передаваемая параметромhandlerдоходы"123"когдаctx.query("num")называется.
  • ctx.rawQuery() Применяется к протоколу HTTP, при вызове возвращает исходный запрос в запросе (запрос запроса HTTP).
  • ctx.headers (включая заголовки) Применяется к протоколу HTTP и возвращает информацию заголовка запроса в запросе при вызове.
  • ctx.header (ключ) Применяется к протоколу HTTP, он возвращает значение ключа в заголовке запроса при вызове.User-Agentв заголовках текущей просьбы:ctx.header("User-Agent").
  • ctx.method (() Применяется к протоколу Http, возвращает метод запроса при вызове, напримерGET, POST, и т.д.
  • ctx.body ((() Применяется к запросу POST протокола HTTP и возвращает тело запроса при вызове.
  • ctx.setHeader ((ключ, значение) Применяется к протоколу Http для настройки запроса заголовка информации ответа сообщения.
  • ctx.setСтатус (код) Применяется к протоколу Http, устанавливается код состояния сообщения Http. Обычно код состояния Http устанавливается в конце ветви маршрутизации. Значение по умолчанию - 200.
  • ctx.remoteAddr ((() Применяется к протоколу HTTP/TCP, возвращает удаленный адрес клиента и порт в запросе при вызове.
  • ctx.localAddr() Применяется к протоколу HTTP/TCP, возвращает локальный адрес и порт службы при вызове.
  • ctx.upgrade ((websocket) Применяется для реализации протокола Websocket на основе протокола Http, переключаяctxКонтекстный объект к протоколу Websocket; возвращение булевого значения (правда), если переключение удалось, и булевого значения (ложь), если оно не удалось.
  • ctx.read ((timeout_ms) Применяется для реализации протокола Websocket/протокола TCP на основе протокола HTTP, считывает данные соединения Websocket и соединения TCP.readМетод не поддерживается в обычном протоколе HTTP. Вы можете указать параметр задержкиtimeout_msв миллисекундах.
  • ctx.write ((s) Применяется к протоколу HTTP/TCP, используется для записи строки данных.JSON.stringify()чтобы закодировать объект JSON в строку и затем написать его.WebSocketпротокол, вы можете использовать этот метод для передачи зашифрованной строки клиенту.

{@fun/Global/HttpQuery HttpQuery}, {@fun/Global/HttpQuery_Go HttpQuery_Go}

_G

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

Постоянно сохраненные данные ключевых значений вk-vпары ключевых значений. строка, число, bool, объект, массив, нулевое значение

_G() _G(k) _G(k, v)

Параметрkявляется именем ключа в сохраненной паре ключей и значений и не чувствителен к большим и малым буквам. k ложное строка, нулевое значение Параметрvявляется ключевым значением в сохраненной паре ключей-значений, которая может быть любыми данными, которые могут бытьJSONсериализирована. v ложное строка, число, bool, объект, массив, нулевое значение

function main(){
    // Set a global variable num with a value of 1
    _G("num", 1)     
    // Change a global variable num to the value of the string ok
    _G("num", "ok")    
    // Delete the global variable num
    _G("num", null)
    // Returns the value of the global variable num
    Log(_G("num"))
    // Delete all global variables
    _G(null)
    // Return to live trading ID
    var robotId = _G()
}
def main():
    _G("num", 1)     
    _G("num", "ok")    
    _G("num", None)
    Log(_G("num"))
    _G(None)
    robotId = _G()
void main() {
    _G("num", 1);
    _G("num", "ok");
    _G("num", NULL);
    Log(_G("num"));
    _G(NULL);
    // Not support auto robotId = _G();
}

Отдельная база данных для каждой торговли в режиме реального времени, данные, сохраненные_G()В случае завершения обратного тестирования, данные, сохраненные в системе обратного тестирования_G()При использовании_G()Функция сохранения сохраненных данных должна использоваться разумно в соответствии с памятью и жестким диском аппаратного устройства и не должна злоупотребляться. При звонке_G()в режиме реального времени и никаких параметров не передается,_G()функция возвращаетIdПри звонке на_G()функция, параметрvпередается как NULL, чтобы указать на удалениеk-vПри вызове_G()функция, только параметрkпроходит в строке, и_G()функция возвращает значение ключа, соответствующее сохраненному параметруkКогда звонишь_G()функция, только параметрkпередается в нулевом значении, что указывает на то, что все записиk-vпара ключевых значений удаляется.k-vпары ключей-значений были сохранены постоянно,_G()функция вызвана снова, передавая имя ключа, который был сохранен постоянно в качестве параметраk. Передача нового значения ключа в качестве параметраvОбновлю это.k-vпара ключевых значений.

{@fun/Global/DBExec DBExec}

_D

Преобразует миллисекундные временные отметки илиDateОбъекты для временных строк.

Временная цепь. строка

_D ((() _D (отметка времени) _D ((часовой штамп, fmt)

Миллисекундная временная марка илиDateОбъект. Временная печать ложное Номер, предмет Форматировать строку,JavaScriptформат языка по умолчанию:yyyy-MM-dd hh:mm:ss; Pythonформат языка по умолчанию:%Y-%m-%d %H:%M:%S; C++формат языка по умолчанию:%Y-%m-%d %H:%M:%S- Да. ФМТ ложное строка

function main(){
    var time = _D()
    Log(time)
}
def main():
    strTime = _D()
    Log(strTime)
void main() {
    auto strTime = _D();
    Log(strTime);
}

Получить и распечатать текущую временную строку:

function main() {
    Log(_D(1574993606000))
}
def main():
    # Running this code on a server in Beijing time: 2019-11-29 10:13:26 , a docker on another server in another region results in: 2019-11-29 02:13:26
    Log(_D(1574993606))
void main() {
    Log(_D(1574993606000));
}

Время - 1574993606000, с использованием кода конверсии:

function main() {
    Log(_D(1574993606000, "yyyy--MM--dd hh--mm--ss"))   // 2019--11--29 10--13--26
}
def main():
    # 1574993606 is timestamped in seconds.
    Log(_D(1574993606, "%Y--%m--%d %H--%M--%S"))        #  2019--11--29 10--13--26
void main() {
    Log(_D(1574993606000, "%Y--%m--%d %H--%M--%S"));    // 2019--11--29 10--13--26
}

Форматирование с параметромfmtотличается отJavaScript, Python, иC++языки, как показано в следующих примерах:

Возвращает текущую временную строку без прохождения любых параметров._D()Функция вPythonСтратегия, вы должны знать, что параметры прошли временные отметки второго уровня (миллисекундного уровня временных отметки в JavaScript и C ++ стратегии, где 1 секунда равна 1000 миллисекунд)._D()функция для анализа временной последовательности с читаемой временной меткой в живой торговли, вы должны обратить внимание на часовой пояс и время настройки операционной системы, где расположена программа Docker._D()функция анализирует временную метку в читаемую временную строку в зависимости от времени системы докера.

{@fun/Global/UnixNano UnixNano}, {@fun/Global/Unix Unix}

_N

Форматируйте число с плавающей запятой.

Форматированное число с плавающей запятой в соответствии с настройкой точности. Номер

_N() _N(num) _N ((num, точность)

Номер с плавающей запятой, который нужно отформатировать. число неправда Номер Настройка точности форматирования, параметрprecisionявляется целым числом, и параметрprecisionПо умолчанию 4. точность ложное Номер

function main(){
    var i = 3.1415
    Log(i)
    var ii = _N(i, 2)
    Log(ii)
}
def main():
    i = 3.1415
    Log(i)
    ii = _N(i, 2)
    Log(ii)
void main() {
    auto i = 3.1415;
    Log(i);
    auto ii = _N(i, 2);
    Log(ii);
}

Например,_N(3.1415, 2)удалит значение после3.1415два знака за десятичной запятой и функция возвращает3.14.

function main(){
    var i = 1300
    Log(i)
    var ii = _N(i, -3)
    // Check the logs and see that it is 1000
    Log(ii)
}
def main():
    i = 1300
    Log(i)
    ii = _N(i, -3)
    Log(ii)
void main() {
    auto i = 1300;
    Log(i);
    auto ii = _N(i, -3);
    Log(ii);
}

Если вам нужно изменить все цифры N слева от запятой на 0, вы можете написать это так:

Параметрprecisionможет быть положительным целым числом, отрицательным целым числом.

{@fun/Trade/exchange.SetPrecision exchange.SetPrecision} - Я не знаю.

_C

Попробуйте заново функцию допустимости ошибок интерфейса.

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

_C (((pfn) _C ((pfn,...args)

Параметрpfnявляется функцией ссылки, которая являетсяфункция обратного вызова- Да. пфн неправда Функция Параметры дофункции обратного вызова, может быть более одного параметраarg. Тип и количество параметровargзависит от параметровфункция обратного вызова- Да. арг ложное строка, число, bool, объект, массив, функция, все типы поддерживаются системой, такие как нулевые значения

function main(){
    var ticker = _C(exchange.GetTicker)
    // Adjust _C() function retry interval to 2 seconds
    _CDelay(2000)
    var depth = _C(exchange.GetDepth)
    Log(ticker)
    Log(depth)
}
def main():
    ticker = _C(exchange.GetTicker)
    _CDelay(2000)
    depth = _C(exchange.GetDepth)
    Log(ticker)
    Log(depth)
void main() {
    auto ticker = _C(exchange.GetTicker);
    _CDelay(2000);
    auto depth = _C(exchange.GetDepth);
    Log(ticker);
    Log(depth);
}

Для ошибочно-толерантных функций без параметров:

function main(){
    var records = _C(exchange.GetRecords, PERIOD_D1)
    Log(records)
}
def main():
    records = _C(exchange.GetRecords, PERIOD_D1)
    Log(records)
void main() {
    auto records = _C(exchange.GetRecords, PERIOD_D1);
    Log(records);
}

Для функций с параметрами, которые допускают ошибки:

var test = function(a, b){
    var time = new Date().getTime() / 1000
    if(time % b == 3){
        Log("Eligible!", "#FF0000")
        return true
    }
    Log("Retry!", "#FF0000")
    return false
}            

function main(){
    var ret = _C(test, 1, 5)
    Log(ret)
}
import time
def test(a, b):
    ts = time.time()
    if ts % b == 3:
        Log("Eligible!", "#FF0000")
        return True
    Log("Retry!", "#FF0000")
    return False            

def main():
    ret = _C(test, 1, 5)
    Log(ret)
// C++ does not support fault tolerance for custom functions in this way

Он также может быть использован для отказоустойчивости пользовательских функций:

В_C()function будет продолжать вызвать указанную функцию, пока она не вернется успешно (функция, на которую ссылается параметрpfnдоходынулевойилиложныйкогда вызовут, перепробует вызватьpfnНапример,_C(exchange.GetTicker). Интервал повторного попытки по умолчанию составляет 3 секунды, вы можете вызвать_CDelay()функция для установки интервала повторных попыток._CDelay(1000)средства для изменения интервала повторных попыток_C()Функция на 1 секунду. Пропускная способность к ошибкам может быть выполнена для, но не ограничивается, следующими функциями:

  • exchange.GetTicker()
  • exchange.GetDepth()
  • exchange.GetTrades()
  • exchange.GetRecords()
  • exchange.GetAccount()
  • exchange.GetOrders()
  • exchange.GetOrder()
  • exchange.GetPositions()Все могут быть вызваны_C()Функция допустимости неисправностей_C()функция не ограничивается вышеперечисленной функцией допустимости неисправности, параметромpfnявляется ссылкой на функцию, а не вызовом функции. Заметьте, что это_C(exchange.GetTicker), нет_C(exchange.GetTicker()).

_Кросс

Возвращает количество периодов пересечения массиваarr1и массивarr2.

Количество перекрестных периодов массиваarr1и массивarr2- Да. Номер

_Кросс ((arr1, arr2)

Элементы - это массивы типаnumber- Да. Arr1 неправда массив Элементы - это массивы типаnumber- Да. arr2 неправда массив

// Fast line indicator
var arr1 = [1,2,3,4,5,6,8,8,9]
// Slow line indicator
var arr2 = [2,3,4,5,6,7,7,7,7]
function main(){
    Log("_Cross(arr1, arr2) : ", _Cross(arr1, arr2))
    Log("_Cross(arr2, arr1) : ", _Cross(arr2, arr1))
}
arr1 = [1,2,3,4,5,6,8,8,9]     
arr2 = [2,3,4,5,6,7,7,7,7]
def main():
    Log("_Cross(arr1, arr2) : ", _Cross(arr1, arr2))
    Log("_Cross(arr2, arr1) : ", _Cross(arr2, arr1))
void main() {
    vector<double> arr1 = {1,2,3,4,5,6,8,8,9};
    vector<double> arr2 = {2,3,4,5,6,7,7,7,7};
    Log("_Cross(arr1, arr2) : ", _Cross(arr1, arr2));
    Log("_Cross(arr2, arr1) : ", _Cross(arr2, arr1));
}

Набор данных может быть смоделирован для проверки функции _Cross ((Arr1, Arr2):

Если возвращение значения_Cross()Если функция является положительным числом, она указывает на период восходящего проникновения, если она является отрицательным числом, она указывает на период нисходящего проникновения, 0 означает то же самое, что текущая цена.Анализ и инструкции по использованию встроенной функции _Кросс.

JSONParse

ФункцияJSONParse()используется для анализаJSON strings.

JSONОбъект. объект

JSONParse ((s)

JSONСтрока. с неправда строка

function main() {
    let s1 = '{"num": 8754613216564987646512354656874651651358}'
    Log("JSON.parse:", JSON.parse(s1))    // JSON.parse: {"num":8.754613216564988e+39}
    Log("JSONParse:", JSONParse(s1))      // JSONParse:  {"num":"8754613216564987646512354656874651651358"}
    
    let s2 = '{"num": 123}'
    Log("JSON.parse:", JSON.parse(s2))    // JSON.parse: {"num":123}
    Log("JSONParse:", JSONParse(s2))      // JSONParse:  {"num":123}
}
import json

def main():
    s1 = '{"num": 8754613216564987646512354656874651651358}'
    Log("json.loads:", json.loads(s1))    # json.loads: map[num:8.754613216564987e+39]
    Log("JSONParse:", JSONParse(s1))      # JSONParse:  map[num:8754613216564987646512354656874651651358]
    
    s2 = '{"num": 123}'
    Log("json.loads:", json.loads(s2))    # json.loads: map[num:123]
    Log("JSONParse:", JSONParse(s2))      # JSONParse:  map[num:123]
void main() {
    auto s1 = "{\"num\":8754613216564987646512354656874651651358}";
    Log("json::parse:", json::parse(s1));
    // Log("JSONParse:", JSONParse(s1));   // The function is not supported.
    
    auto s2 = "{\"num\":123}";
    Log("json::parse:", json::parse(s2));
    // Log("JSONParse:", JSONParse(s2));   // The function is not supported.
}

Строки JSON с большими значениями можно правильно анализировать, и это будет анализировать большие значения в виде типов строки.JSONParse()функция не поддерживается в системе обратного тестирования.

Логотип

Логотип

Журналы выводов.

Регистрация (...msgs)

Параметрmsgявляется содержанием вывода, и параметрmsgможет пройти более одного. СМС ложное строка, число, bool, объект, массив, любой тип, поддерживаемый системой, например null.

function main() {
    Log("msg1", "msg2", "msg3")
}
def main():
    Log("msg1", "msg2", "msg3")
void main() {
    Log("msg1", "msg2", "msg3");
}

Многочисленныеmsgпараметры могут быть переданы:

function main() {
    Log("Hello, FMZ Quant!@")
    Sleep(1000 * 5)
    // Add #ff0000 to the string to print the log in red and push the message
    Log("Hello, #ff0000@")
}
def main():
    Log("Hello, FMZ Quant!@")
    Sleep(1000 * 5)
    Log("Hello, #ff0000@")
void main() {
    Log("Hello, FMZ Quant!@");
    Sleep(1000 * 5);
    Log("Hello, #ff0000@");
}

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

function main() {
    Log("`data:image/png;base64,AAAA`")
}
def main():
    Log("`data:image/png;base64,AAAA`")
void main() {
    Log("`data:image/png;base64,AAAA`");
}

ВLog()функция поддерживает печатьbase64кодированные изображения, начиная с`и заканчивается`, например:

import matplotlib.pyplot as plt 
def main(): 
    plt.plot([3,6,2,4,7,1]) 
    Log(plt)

ВLog()Функция поддерживает прямую печатьPythonЭто...matplotlib.pyplotДо тех пор, пока объект содержитsavefigС помощью этого метода можно напечататьLogфункция, например:

function main() {
    Log("[trans]中文|abc[/trans]")
}
def main():
    Log("[trans]中文|abc[/trans]")
void main() {
    Log("[trans]中文|abc[/trans]");
}

ВLog()Функция поддерживает переключение языков.Log()функция выводит текст, который автоматически переключается на соответствующий язык на основе настройки языка на странице платформы, например:

ВLog()функция выводит сообщение о журнале в области журнала реального времени торгового процесса или системы обратного тестирования, и журнал сохраняется в базе данных реального времени торгового процесса при запуске реального времени торговли.Log()функция выводит сообщение, заканчивающееся@Нажмите на адрес электронной почты, адрес WebHook и т. д.Нажмите настройкиПодача сообщений не поддерживаетсяИнструменты отладки, система обратного тестирования. Существует ограничение частоты для push сообщения. Конкретные правила ограничения следующие: в течение 20-секундного цикла живой торговли будет сохранено и push только последнее push сообщение, а другие сообщения будут отфильтрованы и не push (вывод push log функцией Log будет распечатан и отображаться в регистре). ДляWebHookpush, вы можете использовать сервисную программу, написаннуюGolang:

package main
import (
    "fmt"
    "net/http"
)            

func Handle (w http.ResponseWriter, r *http.Request) {
    defer func() {
        fmt.Println("req:", *r)
    }()
}            

func main () {
    fmt.Println("listen http://localhost:9090")
    http.HandleFunc("/data", Handle)
    http.ListenAndServe(":9090", nil)
}

УстановленоWebHookвНажмите настройки: http://XXX.XX.XXX.XX:9090/data?data=Hello_FMZ- Да. После того, как я провел записьGolangПрограмма обслуживания, мы начинаем запускать стратегию живой торговли, следующая стратегия написана вJavaScriptИзучение языка, стратегия выполняетLog()Функция и подталкивание сообщения:

function main() {
    Log("msg", "@")
}

Программа обслуживания, написанная вGolangязык получает нажатие и сервисная программа печатает сообщение:

listen http://localhost:9090
req: {GET /data?data=Hello_FMZ HTTP/1.1 1 1 map[User-Agent:[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/xx.x.xxxx.xxx Safari/537.36] Accept-Encoding:[gzip]] {} <nil> 0 [] false 1XX.XX.X.XX:9090 map[] map[] <nil> map[] XXX.XX.XXX.XX:4xxx2 /data?data=Hello_FMZ <nil> <nil> <nil> 0xc420056300

{@fun/Log/LogReset LogReset}, {@fun/Log/LogVacuum LogVacuum}, {@fun/Log/LogReset LogReset}, {@fun/Log/LogVacuum LogVacuum}, {@fun/Log/LogVacuum LogVacuum}, {@fun/Log/LogReset LogReset}, {@fun/Log/LogVacuum LogVacuum}, {@fun/Log/LogVacuum LogVacuum}, {@fun/Log/LogVacuum}, {@fun/Log/LogVacuum}, {@fun/LogVacuum},

LogProfit

Запишите стоимость прибыли и убытков, напечатайте стоимость прибыли и убытков и набросьте кривую возврата на основе стоимости прибыли и убытков.

LogProfit (прибыль) LogProfit ((прибыль,... аргументы)

ПараметрprofitЭто данные о доходах, которые даются алгоритмом проектирования и расчетов в стратегии. прибыль Истинно Номер Расширенный параметр для вывода дополнительной информации в журнале доходов,argПараметры могут быть переданы более чем одному. арг ложное строка, число, bool, объект, массив, любой тип, поддерживаемый системой, например null.

function main() {
    // Print 30 points on the earnings chart
    for(var i = 0; i < 30; i++) {
        LogProfit(i, '&')
        Sleep(500)
    }
}
def main():
    for i in range(30):
        LogProfit(i, '&')
        Sleep(500)
void main() {
    for(int i = 0; i < 30; i++) {
        LogProfit(i, '&');
        Sleep(500);
    }
}

ВLogProfitфункция, если она заканчивается символом&, составляет только график доходов и не печатает журнал доходов.

{@fun/Log/LogProfitReset LogProfitReset} - Я не знаю.

LogProfitReset

Уберите все журналы доходов, графики доходов.

LogProfitReset (() LogProfitReset ((остаться)

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

function main() {
    // Print 30 points on the revenue chart, then reset and keep only the last 10 points
    for(var i = 0; i < 30; i++) {
        LogProfit(i)
        Sleep(500)
    }
    LogProfitReset(10)
}
def main():
    for i in range(30):
        LogProfit(i)
        Sleep(500)
    LogProfitReset(10)
void main() {
    for(int i = 0; i < 30; i++) {
        LogProfit(i);
        Sleep(500);
    }
    LogProfitReset(10);
}

{@fun/Log/LogProfit LogProfit} Я не знаю.

Регистрация

Выходная информация в строке состояния системы обратного тестирования или страницы торговли в режиме реального времени.

LogStatus ((...msgs)

Параметрmsgявляется содержанием вывода, и параметрmsgможет пройти более одного. СМС ложное строка, число, bool, объект, массив, любой тип, поддерживаемый системой, например null.

function main() {
    LogStatus('This is a general status alert')
    LogStatus('This is a status alert in red font #ff0000')
    LogStatus('This is a multi-line status message \n I am the second line')
}
def main():
    LogStatus('This is a general status alert')
    LogStatus('This is a status alert in red font #ff0000')
    LogStatus('This is a multi-line status message \n I am the second line')
void main() {
    LogStatus("This is a general status alert");
    LogStatus("This is a status alert in red font #ff0000");
    LogStatus("This is a multi-line status message \n I am the second line");
}

Поддерживает настройку цвета выходного содержимого:

function main() {
    var table = {type: 'table', title: 'Position information', cols: ['Column 1', 'Column 2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]}
    // JSON serialization with the ` character on both sides, as a complex message format (support tables currently)
    LogStatus('`' + JSON.stringify(table) + '`')                    
    // Table information can also appear in multiple rows
    LogStatus('First line of message\n`' + JSON.stringify(table) + '`\n third line of message')
    // It supports multiple tables at the same time, will be displayed in a group with TAB
    LogStatus('`' + JSON.stringify([table, table]) + '`')
    
    // You can also construct a button in the form, and use the GetCommand strategy to receive the contents of the cmd attribute                                
    var table = { 
        type: 'table', 
        title: 'Position operations', 
        cols: ['Column 1', 'Column 2', 'Action'], 
        rows: [ 
            ['abc', 'def', {'type':'button', 'cmd': 'coverAll', 'name': 'Close out positions'}]
        ]
    }
    LogStatus('`' + JSON.stringify(table) + '`') 
    // Or construct a separate button
    LogStatus('`' + JSON.stringify({'type':'button', 'cmd': 'coverAll', 'name': 'Close out positions'}) + '`') 
    // Customizable button style (bootstrap's button attribute)
    LogStatus('`' + JSON.stringify({'type':'button', 'class': 'btn btn-xs btn-danger', 'cmd': 'coverAll', 'name': 'Close out positions'}) + '`')
}
import json
def main():
    table = {"type": "table", "title": "Position information", "cols": ["Column 1", "Column 2"], "rows": [["abc", "def"], ["ABC", "support color #ff0000"]]}
    LogStatus('`' + json.dumps(table) + '`')
    LogStatus('First line of message\n`' + json.dumps(table) + '`\n third line of message')
    LogStatus('`' + json.dumps([table, table]) + '`')            

    table = {
        "type" : "table", 
        "title" : "Position operations", 
        "cols" : ["Column 1", "Column 2", "Action"], 
        "rows" : [
            ["abc", "def", {"type": "button", "cmd": "coverAll", "name": "Close out positions"}]
        ] 
    }
    LogStatus('`' + json.dumps(table) + '`')
    LogStatus('`' + json.dumps({"type": "button", "cmd": "coverAll", "name": "Close out positions"}) + '`')
    LogStatus('`' + json.dumps({"type": "button", "class": "btn btn-xs btn-danger", "cmd": "coverAll", "name": "Close out positions"}) + '`')
void main() {
    json table = R"({"type": "table", "title": "Position information", "cols": ["Column 1", "Column 2"], "rows": [["abc", "def"], ["ABC", "support color #ff0000"]]})"_json;
    LogStatus("`" + table.dump() + "`");
    LogStatus("First line of message\n`" + table.dump() + "`\n third line of message");
    json arr = R"([])"_json;
    arr.push_back(table);
    arr.push_back(table);
    LogStatus("`" + arr.dump() + "`");            

    table = R"({
        "type" : "table", 
        "title" : "Position operations", 
        "cols" : ["Column 1", "Column 2", "Action"], 
        "rows" : [
            ["abc", "def", {"type": "button", "cmd": "coverAll", "name": "Close out positions"}]
        ] 
    })"_json;
    LogStatus("`" + table.dump() + "`");
    LogStatus("`" + R"({"type": "button", "cmd": "coverAll", "name": "Close out positions"})"_json.dump() + "`");
    LogStatus("`" + R"({"type": "button", "class": "btn btn-xs btn-danger", "cmd": "coverAll", "name": "Close out positions"})"_json.dump() + "`");
}

Пример вывода данных в строке состояния:

function main() {
    var table = {
        type: "table",
        title: "status bar button style",
        cols: ["default", "original", "success", "info", "warning", "danger"], 
        rows: [
            [
                {"type":"button", "class": "btn btn-xs btn-default", "name": "default"},
                {"type":"button", "class": "btn btn-xs btn-primary", "name": "original"},
                {"type":"button", "class": "btn btn-xs btn-success", "name": "success"},
                {"type":"button", "class": "btn btn-xs btn-info", "name": "info"},
                {"type":"button", "class": "btn btn-xs btn-warning", "name": "warning"},
                {"type":"button", "class": "btn btn-xs btn-danger", "name": "danger"}
            ]
        ]
    }
    LogStatus("`" + JSON.stringify(table) + "`")
}
import json
def main():
    table = {
        "type": "table",
        "title": "status bar button style",
        "cols": ["default", "original", "success", "info", "warning", "danger"], 
        "rows": [
            [
                {"type":"button", "class": "btn btn-xs btn-default", "name": "default"},
                {"type":"button", "class": "btn btn-xs btn-primary", "name": "original"},
                {"type":"button", "class": "btn btn-xs btn-success", "name": "success"},
                {"type":"button", "class": "btn btn-xs btn-info", "name": "info"},
                {"type":"button", "class": "btn btn-xs btn-warning", "name": "warning"},
                {"type":"button", "class": "btn btn-xs btn-danger", "name": "danger"}
            ]
        ]
    }
    LogStatus("`" + json.dumps(table) + "`")
void main() {
    json table = R"({
        "type": "table",
        "title": "status bar button style",
        "cols": ["default", "original", "success", "info", "warning", "danger"], 
        "rows": [
            [
                {"type":"button", "class": "btn btn-xs btn-default", "name": "default"},
                {"type":"button", "class": "btn btn-xs btn-primary", "name": "original"},
                {"type":"button", "class": "btn btn-xs btn-success", "name": "success"},
                {"type":"button", "class": "btn btn-xs btn-info", "name": "info"},
                {"type":"button", "class": "btn btn-xs btn-warning", "name": "warning"},
                {"type":"button", "class": "btn btn-xs btn-danger", "name": "danger"}
            ]
        ]
    })"_json;
    LogStatus("`" + table.dump() + "`");
}

Он поддерживает проектирование кнопок управления в строке состояния (старая структура кнопок):

function main() {
    var table = {
        type: "table",
        title: "Status bar button disable, description function test",
        cols: ["Column 1", "Column 2", "Column 3"], 
        rows: []
    }
    var button1 = {"type": "button", "name": "button1", "cmd": "button1", "description": "This is the first button"}
    var button2 = {"type": "button", "name": "button2", "cmd": "button2", "description": "This is the second button, set to disabled", "disabled": true}
    var button3 = {"type": "button", "name": "button3", "cmd": "button3", "description": "This is the third button, set to enable", "disabled": false}
    table.rows.push([button1, button2, button3])
    LogStatus("`" + JSON.stringify(table) + "`")
}
import json
def main():
    table = {
        "type": "table",
        "title": "Status bar button disable, description function test",
        "cols": ["Column 1", "Column 2", "Column 3"], 
        "rows": []
    }
    button1 = {"type": "button", "name": "button1", "cmd": "button1", "description": "This is the first button"}
    button2 = {"type": "button", "name": "button2", "cmd": "button2", "description": "This is the second button, set to disabled", "disabled": True}
    button3 = {"type": "button", "name": "button3", "cmd": "button3", "description": "This is the third button, set to enable", "disabled": False}
    table["rows"].append([button1, button2, button3])
    LogStatus("`" + json.dumps(table) + "`")
void main() {
    json table = R"({
        "type": "table",
        "title": "Status bar button disable, description function test",
        "cols": ["Column 1", "Column 2", "Column 3"], 
        "rows": []
    })"_json;
    json button1 = R"({"type": "button", "name": "button1", "cmd": "button1", "description": "This is the first button"})"_json;
    json button2 = R"({"type": "button", "name": "button2", "cmd": "button2", "description": "This is the second button, set to disabled", "disabled": true})"_json;
    json button3 = R"({"type": "button", "name": "button3", "cmd": "button3", "description": "This is the third button, set to enable", "disabled": false})"_json;
    json arr = R"([])"_json;
    arr.push_back(button1);
    arr.push_back(button2);
    arr.push_back(button3);
    table["rows"].push_back(arr);
    LogStatus("`" + table.dump() + "`");
}

Установите отключенную функцию описания кнопки строки состояния (старая структура кнопки):

function test1() {
    Log("Calling custom functions")
}            

function main() {
    while (true) {
        var table = {
            type: 'table',
            title: 'operation',
            cols: ['column1', 'column2', 'Action'],
            rows: [
                ['a', '1', {
                    'type': 'button',                       
                    'cmd': "CoverAll",                      
                    'name': 'Close out positions'                           
                }],
                ['b', '1', {
                    'type': 'button',
                    'cmd': 10,                              
                    'name': 'Send values'
                }],
                ['c', '1', {
                    'type': 'button',
                    'cmd': _D(),                          
                    'name': 'Calling functions'
                }],
                ['d', '1', {
                    'type': 'button',
                    'cmd': 'test1',       
                    'name': 'Calling custom functions'
                }]
            ]
        }
        LogStatus(_D(), "\n", '`' + JSON.stringify(table) + '`')            

        var str_cmd = GetCommand()
        if (str_cmd) {
            Log("Received interaction data str_cmd:", "type:", typeof(str_cmd), "value:", str_cmd)
            if(str_cmd == "test1") {
                test1()
            }
        }            

        Sleep(500)
    }
}
import json
def test1():
    Log("Calling custom functions")            

def main():
    while True:
        table = {
            "type": "table", 
            "title": "operation", 
            "cols": ["column1", "column2", "Action"],
            "rows": [
                ["a", "1", {
                    "type": "button", 
                    "cmd": "CoverAll",
                    "name": "Close out positions"
                }],
                ["b", "1", {
                    "type": "button",
                    "cmd": 10,
                    "name": "Send values" 
                }], 
                ["c", "1", {
                    "type": "button",
                    "cmd": _D(),
                    "name": "Calling functions" 
                }],
                ["d", "1", {
                    "type": "button",
                    "cmd": "test1",
                    "name": "Calling custom functions" 
                }]
            ]
        }            

        LogStatus(_D(), "\n", "`" + json.dumps(table) + "`")
        str_cmd = GetCommand()
        if str_cmd:
            Log("Received interaction data str_cmd:", "type:", typeof(str_cmd), "value:", str_cmd)
            if str_cmd == "test1":
                test1()
        Sleep(500)
void test1() {
    Log("Calling custom functions");
}            

void main() {
    while(true) {
        json table = R"({
            "type": "table", 
            "title": "operation", 
            "cols": ["column1", "column2", "Action"],
            "rows": [
                ["a", "1", {
                    "type": "button", 
                    "cmd": "CoverAll",
                    "name": "Close out positions"
                }],
                ["b", "1", {
                    "type": "button",
                    "cmd": 10,
                    "name": "Send values" 
                }], 
                ["c", "1", {
                    "type": "button",
                    "cmd": "",
                    "name": "Calling functions" 
                }],
                ["d", "1", {
                    "type": "button",
                    "cmd": "test1",
                    "name": "Calling custom functions" 
                }]
            ]
        })"_json;
        table["rows"][2][2]["cmd"] = _D();
        LogStatus(_D(), "\n", "`" + table.dump() + "`");
        auto str_cmd = GetCommand();
        if(str_cmd != "") {
            Log("Received interaction data str_cmd:", "type:", typeof(str_cmd), "value:", str_cmd);
            if(str_cmd == "test1") {
                test1();
            }
        }
        Sleep(500);
    }
}

В сочетании сGetCommand()Функция, создать функцию взаимодействия кнопки строки состояния (старая структура кнопки):

function main() {
    var tbl = {
        type: "table",
        title: "operation",
        cols: ["column1", "column2"],
        rows: [
            ["Open position operation", {"type": "button", "cmd": "open", "name": "open position", "input": {"name": "number of open positions", "type": "number", "defValue": 1}}],
            ["Close position operation", {"type": "button", "cmd": "coverAll", "name": "close all positions"}]
        ] 
    }            

    LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
    while (true) {
        var cmd = GetCommand()
        if (cmd) {
            Log("cmd:", cmd)
        }
        Sleep(1000)
    }
}
import json            

def main():
    tbl = {
        "type": "table", 
        "title": "operation", 
        "cols": ["column1", "column2"],
        "rows": [
            ["Open position operation", {"type": "button", "cmd": "open", "name": "open position", "input": {"name": "number of open positions", "type": "number", "defValue": 1}}],
            ["Close position operation", {"type": "button", "cmd": "coverAll", "name": "close all positions"}]
        ]
    }            

    LogStatus(_D(), "\n", "`" + json.dumps(tbl) + "`")
    while True:
        cmd = GetCommand()
        if cmd:
            Log("cmd:", cmd)
        Sleep(1000)
void main() {
    json tbl = R"({
        "type": "table", 
        "title": "operation", 
        "cols": ["column1", "column2"],
        "rows": [
            ["Open position operation", {"type": "button", "cmd": "open", "name": "open position", "input": {"name": "number of open positions", "type": "number", "defValue": 1}}],
            ["Close position operation", {"type": "button", "cmd": "coverAll", "name": "close all positions"}]
        ]
    })"_json;            

    LogStatus(_D(), "\n", "`" + tbl.dump() + "`");
    while(true) {
        auto cmd = GetCommand();
        if(cmd != "") {
            Log("cmd:", cmd);
        }
        Sleep(1000);
    }
}

Вводные данные также поддерживаются при построении кнопок строки состояния для взаимодействия, и команды взаимодействия захватываютсяGetCommand()В конце концов.inputэлементы (старая структура кнопки) к структуре данных кнопки управления в строке состояния, например, добавление"input": {"name": "number of open positions", "type": "number", "defValue": 1}до{"type": "button", "cmd": "open", "name": "open position"}вызовет появление всплывающего окна с элементом управления окна ввода при нажатии кнопки (значение по умолчанию в окне ввода составляет 1, что является данными, установленнымиdefValueВы можете ввести данные, которые будут отправлены вместе с командой кнопки. Например, при запуске следующего тестового кода, после нажатия кнопки "открыть положение", появляется всплывающее окно с окном ввода. Введите 111 в окне ввода и нажмите OK.GetCommand()Функция затем захватит сообщение:open:111.

function main() {
    var tbl = {
        type: "table",
        title: "Demonstrate grouping button control",
        cols: ["operation"],
        rows: []
    }

    // Creating a grouping button control structure
    var groupBtn = {
        type: "button",
        cmd: "open",
        name: "open positions",
        group: [
            {"name": "orderType", "description": "下单方式|order type", "type": "selected", "defValue": "market order|pending order"},
            {"name": "tradePrice@orderType==1", "description": "交易价格|trade price", "type": "number", "defValue": 100},
            {"name": "orderAmount", "description": "委托数量|order amount", "type": "string", "defValue": 100},
            {"name": "boolean", "description": "yes/no|boolean", "type": "boolean", "defValue": true}
        ]
    }

    // test button 1
    var testBtn1 = {"type": "button", "name": "button1", "cmd": "button1", "description": "This is the first button."}
    var testBtn2 = {"type": "button", "name": "button2", "cmd": "button2", "description": "This is the second button.", "input": {"name": "number of positions opened", "type": "number", "defValue": 1}}

    // Add groupBtn to tbl
    tbl.rows.push([groupBtn])
    // It supports multiple buttons in a cell of a status bar table, i.e. the data in a cell is an array of button structures: [testBtn1, testBtn2].
    tbl.rows.push([[testBtn1, testBtn2]])

    while (true) {
        LogStatus("`" + JSON.stringify(tbl) + "`", "\n", "The grouping button control can also be set directly on the status bar in addition to being set on the status bar form:", "`" + JSON.stringify(groupBtn) + "`")
        var cmd = GetCommand()
        if (cmd) {
            Log("cmd:", cmd)
        }
        Sleep(5000)
    }
}
import json

def main():
    tbl = {
        "type": "table",
        "title": "Demonstrate grouping button control",
        "cols": ["operation"],
        "rows": []
    }

    groupBtn = {
        "type": "button",
        "cmd": "open",
        "name": "open positions",
        "group": [
            {"name": "orderType", "description": "下单方式|order type", "type": "selected", "defValue": "market order|pending order"},
            {"name": "tradePrice@orderType==1", "description": "交易价格|trade price", "type": "number", "defValue": 100},
            {"name": "orderAmount", "description": "委托数量|order amount", "type": "string", "defValue": 100},
            {"name": "boolean", "description": "yes/no|boolean", "type": "boolean", "defValue": True}
        ]
    }

    testBtn1 = {"type": "button", "name": "button1", "cmd": "button1", "description": "This is the first button."}
    testBtn2 = {"type": "button", "name": "button2", "cmd": "button2", "description": "This is the second button.", "input": {"name": "number of positions opened", "type": "number", "defValue": 1}}

    tbl["rows"].append([groupBtn])
    tbl["rows"].append([[testBtn1, testBtn2]])

    while True:
        LogStatus("`" + json.dumps(tbl) + "`", "\n", "The grouping button control can also be set directly on the status bar in addition to being set on the status bar form:", "`" + json.dumps(groupBtn) + "`")
        cmd = GetCommand()
        if cmd:
            Log("cmd:", cmd)
        Sleep(5000)
void main() {
    json tbl = R"({
        "type": "table", 
        "title": "Demonstrate grouping button control", 
        "cols": ["operation"],
        "rows": []
    })"_json;

    json groupBtn = R"({
        "type": "button", 
        "name": "open positions", 
        "cmd": "open", 
        "group": [
            {"name": "orderType", "description": "下单方式|order type", "type": "selected", "defValue": "market order|pending order"},
            {"name": "tradePrice@orderType==1", "description": "交易价格|trade price", "type": "number", "defValue": 100},
            {"name": "orderAmount", "description": "委托数量|order amount", "type": "string", "defValue": 100},
            {"name": "boolean", "description": "yes/no|boolean", "type": "boolean", "defValue": true}
    ]})"_json;

    json testBtn1 = R"({"type": "button", "name": "button1", "cmd": "button1", "description": "This is the first button."})"_json;
    json testBtn2 = R"({"type": "button", "name": "button2", "cmd": "button2", "description": "This is the second button.", "input": {"name": "number of positions opened", "type": "number", "defValue": 1}})"_json;
    
    tbl["rows"].push_back({groupBtn});
    tbl["rows"].push_back({{testBtn1, testBtn2}});
    
    while(true) {
        LogStatus("`" + tbl.dump() + "`", "\n", "The grouping button control can also be set directly on the status bar in addition to being set on the status bar form:", "`" + groupBtn.dump() + "`");
        auto cmd = GetCommand();
        if(cmd != "") {
            Log("cmd:", cmd);
        }
        Sleep(5000);
    }
}

Он поддерживает группированные кнопки управления (старая структура кнопок), функционально совместимые скнопки строки состояния, поддерживающие ввод данных(установлено с помощью поля input).GetCommand()Разница в том, что с"group"Поле настройки, когда кнопка нажимается, чтобы запустить взаимодействие, диалог, который появляется на странице содержит наборгруппавводных элементов управления, установленных для одновременного ввода группы данных. Некоторые моменты, которые следует отметить о"group"поле в структуре кнопки управления строкой состояния и группы кнопок управления:

  • ВtypeВ группе, поддерживает только следующие четыре типа, иdefValueproperty - это значение по умолчанию. selected: контрольный элемент разблокируемого окна, использующий|символ для разделения каждой опции в выпадающем окне, как она установлена. number: Числовое управление входной коробкой. string: Управление строкой ввода. boolean: Контроль отметки, проверенный на (Boolean) true, не проверенный на (Boolean) false.
  • Управление настройками зависимости поддержки интерактивного ввода: Например, в следующем примере:"name": "tradePrice@orderType==1"Установка, которая делаетtradeЦенаУправление вводом доступно только приПорядок Типвыпадающий элемент управления выбран какЗаказ в ожидании.
  • Билингвальная поддержка имени управления для интерактивных входов Например, в следующем примере: description: в одном способе order type setting, use|символы для разделения содержания описания на китайском и английском языках.
  • name, descriptionв группе иname, descriptionв структуре кнопок не имеют одинаковых определений, хотя имеют одинаковые имена полей. Определениеnameв группе также отличается от определенияnameвход.
  • При запуске управления кнопкой группы, содержание взаимодействия отправляется в формате значения поля cmd кнопки и связанных с ним данных группы, таких как выходLog("cmd:", cmd)Заявление в следующем примере испытания:cmd: open:{"orderType":1,"tradePrice":99,"orderAmount":"99","boolean":true}, т.е. то, что возвращаетсяGetCommand()функция, когда происходит взаимодействие:open:{"orderType":1,"tradePrice":99,"orderAmount":"99","boolean":true}.
  • Вtypeсвойство кнопки управления поддерживает только:"button"- Да. Кнопки управления, поддерживающие ввод данных, т.е.inputнабор свойств,typeсвойство в конфигурации информацииinputполе поддерживает несколько типов элементов управления. Обратите внимание на следующие примеры:
function main() {
    // Status bar button control (set input field to implement) testBtn1 button triggered by the page in the drop-down box control using the options field to set options, using the defValue field to set the default options. This is different from the other examples in this chapter, which use defValue to set the options directly.
    var testBtn1 = {
        type: "button",
        name: "testBtn1",
        cmd: "cmdTestBtn1",
        input: {name: "testBtn1ComboBox", type: "selected", options: ["A", "B"], defValue: 1}
    }

    /* 
      Status bar button control (set input field implementation) testBtn2 button triggered by the page in the drop-down box control using the options field to set the options, options field in the options field not only supports the string,
      the use of the ```{text: "description", value: "value"}``` structure is also supported. Use the defValue field to set the default option, which can be multiple choice (multiple choice via array structure). Multiple choice requires setting the additional field multiple to a true value.
    */
    var testBtn2 = {
        type: "button", 
        name: "testBtn2",
        cmd: "cmdTestBtn2",
        input: {
            name: "testBtn2MultiComboBox", 
            type: "selected", 
            description: "Implementing dropdown box multi-selection", 
            options: [{text: "Option A", value: "A"}, {text: "Option B", value: "B"}, {text: "Option C", value: "C"}],
            defValue: ["A", "C"],
            multiple: true
        }
    }

    // Status bar grouping button control (set group field implementation) testBtn3 button triggered by the page in the drop-down box control using the options field to set options, also supports the direct use of defValue set options.
    var testBtn3 = {
        type: "button",                     
        name: "testBtn3",
        cmd: "cmdTestBtn3", 
        group: [
            {name: "comboBox1", label: "labelComboBox1", description: "Dropdown box 1", type: "selected", defValue: 1, options: ["A", "B"]}, 
            {name: "comboBox2", label: "labelComboBox2", description: "Dropdown box 2", type: "selected", defValue: "A|B"}, 
            {name: "comboBox3", label: "labelComboBox3", description: "Dropdown box 3", type: "selected", defValue: [0, 2], multiple: true, options: ["A", "B", "C"]}, 
            {
                name: "comboBox4", 
                label: "labelComboBox4", 
                description: "Dropdown box 4", 
                type: "selected", 
                defValue: ["A", "C"], 
                multiple: true, 
                options: [{text: "Option A", value: "A"}, {text: "Option B", value: "B"}, {text: "Option C", value: "C"}, {text: "Option D", value: "D"}]
            }
        ]
    }
    while (true) {
        LogStatus("`" + JSON.stringify(testBtn1) + "`\n", "`" + JSON.stringify(testBtn2) + "`\n", "`" + JSON.stringify(testBtn3) + "`\n")
        var cmd = GetCommand()
        if (cmd) {
            Log(cmd)
        }
        Sleep(5000)
    }
}
import json

def main():
    testBtn1 = {
        "type": "button",
        "name": "testBtn1",
        "cmd": "cmdTestBtn1",
        "input": {"name": "testBtn1ComboBox", "type": "selected", "options": ["A", "B"], "defValue": 1}
    }

    testBtn2 = {
        "type": "button", 
        "name": "testBtn2",
        "cmd": "cmdTestBtn2",
        "input": {
            "name": "testBtn2MultiComboBox", 
            "type": "selected", 
            "description": "Implementing dropdown box multi-selection", 
            "options": [{"text": "Option A", "value": "A"}, {"text": "Option B", "value": "B"}, {"text": "Option C", "value": "C"}],
            "defValue": ["A", "C"],
            "multiple": True
        }
    }

    testBtn3 = {
        "type": "button",                     
        "name": "testBtn3",
        "cmd": "cmdTestBtn3", 
        "group": [
            {"name": "comboBox1", "label": "labelComboBox1", "description": "Dropdown box 1", "type": "selected", "defValue": 1, "options": ["A", "B"]}, 
            {"name": "comboBox2", "label": "labelComboBox2", "description": "Dropdown box 2", "type": "selected", "defValue": "A|B"}, 
            {"name": "comboBox3", "label": "labelComboBox3", "description": "Dropdown box 3", "type": "selected", "defValue": [0, 2], "multiple": True, "options": ["A", "B", "C"]}, 
            {
                "name": "comboBox4", 
                "label": "labelComboBox4", 
                "description": "Dropdown box 4", 
                "type": "selected", 
                "defValue": ["A", "C"], 
                "multiple": True, 
                "options": [{"text": "Option A", "value": "A"}, {"text": "Option B", "value": "B"}, {"text": "Option C", "value": "C"}, {"text": "Option D", "value": "D"}]
            }
        ]
    }

    while True:
        LogStatus("`" + json.dumps(testBtn1) + "`\n", "`" + json.dumps(testBtn2) + "`\n", "`" + json.dumps(testBtn3) + "`\n")
        cmd = GetCommand()
        if cmd:
            Log(cmd)
        Sleep(5000)
void main() {
    json testBtn1 = R"({
        "type": "button",
        "name": "testBtn1",
        "cmd": "cmdTestBtn1",
        "input": {"name": "testBtn1ComboBox", "type": "selected", "options": ["A", "B"], "defValue": 1}
    })"_json;
    
    json testBtn2 = R"({
        "type": "button", 
        "name": "testBtn2",
        "cmd": "cmdTestBtn2",
        "input": {
            "name": "testBtn2MultiComboBox", 
            "type": "selected", 
            "description": "Implementing dropdown box multi-selection", 
            "options": [{"text": "Option A", "value": "A"}, {"text": "Option B", "value": "B"}, {"text": "Option C", "value": "C"}],
            "defValue": ["A", "C"],
            "multiple": true
        }
    })"_json;
    
    json testBtn3 = R"({
        "type": "button",                     
        "name": "testBtn3",
        "cmd": "cmdTestBtn3", 
        "group": [
            {"name": "comboBox1", "label": "labelComboBox1", "description": "Dropdown box 1", "type": "selected", "defValue": 1, "options": ["A", "B"]}, 
            {"name": "comboBox2", "label": "labelComboBox2", "description": "Dropdown box 2", "type": "selected", "defValue": "A|B"}, 
            {"name": "comboBox3", "label": "labelComboBox3", "description": "Dropdown box 3", "type": "selected", "defValue": [0, 2], "multiple": true, "options": ["A", "B", "C"]}, 
            {
                "name": "comboBox4", 
                "label": "labelComboBox4", 
                "description": "Dropdown box 4", 
                "type": "selected", 
                "defValue": ["A", "C"], 
                "multiple": true, 
                "options": [{"text": "Option A", "value": "A"}, {"text": "Option B", "value": "B"}, {"text": "Option C", "value": "C"}, {"text": "Option D", "value": "D"}]
            }
        ]
    })"_json;
    
    while (true) {
        LogStatus("`" + testBtn1.dump() + "`\n", "`" + testBtn2.dump() + "`\n", "`" + testBtn3.dump() + "`\n");
        auto cmd = GetCommand();
        if (cmd != "") {
            Log(cmd);
        }
        Sleep(5000);
    }
}

Когда кнопка управления группой в строке состояния (используется путем установкиgroupполе) и кнопку управления строкой состояния (используется путем установкиinputполе) нажимаются, чтобы запустить взаимодействие (старая структура кнопки), контрольный элемент выпадающего окна в диалоговом окне, который появляется на странице, также поддерживает несколько выборов.

var symbols = ["BTC_USDT.swap", "ETH_USDT.swap", "LTC_USDT.swap", "BNB_USDT.swap", "SOL_USDT.swap"]

function createBtn(tmp, group) {
    var btn = JSON.parse(JSON.stringify(tmp))

    _.each(group, function(eleByGroup) {
        btn["group"].unshift(eleByGroup)
    })

    return btn
}

function main() {
    var arrManager = []

    _.each(symbols, function(symbol) {
        arrManager.push({
            "symbol": symbol,
        })
    })

    // Btn
    var tmpBtnOpen = {
        "type": "button",
        "cmd": "open",
        "name": "Open a position and place an order",
        "group": [{
            "type": "selected",
            "name": "tradeType",
            "label": "Order type",
            "description": "Market order, limit order",
            "default": 0,
            "group": "Trading setup",
            "settings": {
                "options": ["Market order", "Limit order"],
                "required": true,
            }
        }, {
            "type": "selected",
            "name": "direction",
            "label": "Trading direction",
            "description": "Buy, sell",
            "default": "buy",
            "group": "Trading setup",
            "settings": {
                "render": "segment",
                "required": true,
                "options": [{"name": "buy", "value": "buy"}, {"name": "sell", "value": "sell"}],
            }
        }, {
            "type": "number",
            "name": "price",
            "label": "price",
            "description": "The price of the order",
            "group": "Trading setup",
            "filter": "tradeType==1",
            "settings": {
                "required": true,
            }
        }, {
            "type": "number",
            "name": "amount",
            "label": "Order quantity",
            "description": "Order quantity",
            "group": "Trading setup",
            "settings": {
                "required": true,
            }
        }],
    }

    while (true) {
        var tbl = {"type": "table", "title": "dashboard", "cols": ["symbol", "actionOpen"], "rows": []}

        _.each(arrManager, function(m) {
            var btnOpen = createBtn(tmpBtnOpen, [{"type": "string", "name": "symbol", "label": "Trading instruments", "default": m["symbol"], "settings": {"required": true}}])
            tbl["rows"].push([m["symbol"], btnOpen])
        })

        var cmd = GetCommand()
        if (cmd) {
            Log("Receive interaction:", cmd)

            // Parsing interaction messages: open:{"symbol":"LTC_USDT.swap","tradeType":0,"direction":"buy","amount":111}
            // According to the first colon: the previous instruction determines which button template triggers the message
            var arrCmd = cmd.split(":", 2)
            if (arrCmd[0] == "open") {
                var msg = JSON.parse(cmd.slice(5))
                Log("Trading instruments:", msg["symbol"], ", Trading direction:", msg["direction"], ", Order type:", msg["tradeType"] == 0 ? "Market order" : "Limit order", msg["tradeType"] == 0 ? ", Order price: current market price" : ", Order price:" + msg["price"], ", Order quantity:", msg["amount"])
            }
        }

        LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
        Sleep(1000)
    }
}
import json

symbols = ["BTC_USDT.swap", "ETH_USDT.swap", "LTC_USDT.swap", "BNB_USDT.swap", "SOL_USDT.swap"]

def createBtn(tmp, group):
    btn = json.loads(json.dumps(tmp))
    for eleByGroup in group:
        btn["group"].insert(0, eleByGroup)
    return btn

def main():
    arrManager = []

    for symbol in symbols:
        arrManager.append({"symbol": symbol})

    # Btn
    tmpBtnOpen = {
        "type": "button",
        "cmd": "open",
        "name": "Open a position and place an order",
        "group": [{
            "type": "selected",
            "name": "tradeType",
            "label": "Order type",
            "description": "Market order, limit order",
            "default": 0,
            "group": "Trading setup",
            "settings": {
                "options": ["Market order", "Limit order"],
                "required": True,
            }
        }, {
            "type": "selected",
            "name": "direction",
            "label": "Trading direction",
            "description": "Buy, sell",
            "default": "buy",
            "group": "Trading Setup",
            "settings": {
                "render": "segment",
                "required": True,
                "options": [{"name": "买入", "value": "buy"}, {"name": "卖出", "value": "sell"}],
            }
        }, {
            "type": "number",
            "name": "price",
            "label": "price",
            "description": "The price of the order",
            "group": "Trading Setup",
            "filter": "tradeType==1",
            "settings": {
                "required": True,
            }
        }, {
            "type": "number",
            "name": "amount",
            "label": "Order quantity",
            "description": "Order quantity",
            "group": "Trading Setup",
            "settings": {
                "required": True,
            }
        }],
    }

    while True:
        tbl = {"type": "table", "title": "dashboard", "cols": ["symbol", "actionOpen"], "rows": []}
        for m in arrManager:
            btnOpen = createBtn(tmpBtnOpen, [{"type": "string", "name": "symbol", "label": "交易品种", "default": m["symbol"], "settings": {"required": True}}])
            tbl["rows"].append([m["symbol"], btnOpen])

        cmd = GetCommand()

        if cmd != "" and cmd != None:
            Log("Receive interaction:", cmd) 

            # Parsing interaction messages: open:{"symbol":"LTC_USDT.swap","tradeType":0,"direction":"buy","amount":111}
            # According to the first colon: the previous instruction determines which button template triggers the message
            arrCmd = cmd.split(":")
            if arrCmd[0] == "open":
                msg = json.loads(cmd[5:])
                Log("Trading instruments:", msg["symbol"], ", Trading direction:", msg["direction"], ", Order type:", "Market order" if msg["tradeType"] == 0 else "Limit order", ", Order price: current market price" if msg["tradeType"] == 0 else ", Order price:" + str(msg["price"]), ", Order quantity:", msg["amount"])
        
        # Output status bar information
        LogStatus(_D(), "\n", "`" + json.dumps(tbl) + "`")
        Sleep(1000)
// Omit...

Используйте новейшую структуру кнопок для создания кнопок в таблице строки состояния. Дополнительная информация:Руководство пользователя - Интерактивные элементы управления в строке состояния.

function main() {
    var table = { 
        type: 'table', 
        title: 'position operation', 
        cols: ['column1', 'column2', 'Action'], 
        rows: [ 
            ['abc', 'def', {'type':'button', 'cmd': 'coverAll', 'name': 'close positions'}]
        ]
    } 
    var ticker = exchange.GetTicker()
    // Add a row of data, merge the first and second cells, and output the ticker variable in the merged cell
    table.rows.push([{body : JSON.stringify(ticker), colspan : 2}, "abc"])    
    LogStatus('`' + JSON.stringify(table) + '`')
}
import json
def main():
    table = {
        "type" : "table",
        "title" : "position operation",
        "cols" : ["column1", "column2", "Action"],
        "rows" : [
            ["abc", "def", {"type": "button", "cmd": "coverAll", "name": "close positions"}]
        ]
    }
    ticker = exchange.GetTicker()
    table["rows"].append([{"body": json.dumps(ticker), "colspan": 2}, "abc"])
    LogStatus("`" + json.dumps(table) + "`")
void main() {
    json table = R"({
        "type" : "table",
        "title" : "position operation",
        "cols" : ["column1", "column2", "Action"],
        "rows" : [
            ["abc", "def", {"type": "button", "cmd": "coverAll", "name": "close positions"}]
        ]
    })"_json;            

    auto ticker = exchange.GetTicker();
    json jsonTicker = R"({"Buy": 0, "Sell": 0, "High": 0, "Low": 0, "Volume": 0, "Last": 0, "Time": 0})"_json;
    jsonTicker["Buy"] = ticker.Buy;
    jsonTicker["Sell"] = ticker.Sell;
    jsonTicker["Last"] = ticker.Last;
    jsonTicker["Volume"] = ticker.Volume;
    jsonTicker["Time"] = ticker.Time;
    jsonTicker["High"] = ticker.High;
    jsonTicker["Low"] = ticker.Low;            

    json arr = R"([{"body": {}, "colspan": 2}, "abc"])"_json;
    arr[0]["body"] = jsonTicker;
    table["rows"].push_back(arr);
    LogStatus("`" + table.dump() + "`");
}

Горизонтальное объединение ячеек в таблице, составленнойLogStatus()Функция:

function main() {
    var table = { 
        type: 'table', 
        title: 'table demo', 
        cols: ['columnA', 'columnB', 'columnC'], 
        rows: [ 
            ['A1', 'B1', {'type':'button', 'cmd': 'coverAll', 'name': 'C1'}]
        ]
    }             

    var ticker = exchange.GetTicker()
    var name = exchange.GetName()            

    table.rows.push([{body : "A2 + B2:" + JSON.stringify(ticker), colspan : 2}, "C2"])
    table.rows.push([{body : "A3 + A4 + A5:" + name, rowspan : 3}, "B3", "C3"])
    // A3 is merged by the first cell in the previous row
    table.rows.push(["B4", "C4"])
    // A2 is merged by the first cell of the previous row
    table.rows.push(["B5", "C5"])                                            
    table.rows.push(["A6", "B6", "C6"])
    LogStatus('`' + JSON.stringify(table) + '`')
}
import json
def main():
    table = {
        "type" : "table", 
        "title" : "table demo", 
        "cols" : ["columnA", "columnB", "columnC"], 
        "rows" : [
            ["A1", "B1", {"type": "button", "cmd": "coverAll", "name": "C1"}]
        ]
    }
    
    ticker = exchange.GetTicker()
    name = exchange.GetName()
    
    table["rows"].append([{"body": "A2 + B2:" + json.dumps(ticker), "colspan": 2}, "C2"])
    table["rows"].append([{"body": "A3 + A4 + A5:" + name, "rowspan": 3}, "B3", "C3"])
    table["rows"].append(["B4", "C4"])
    table["rows"].append(["B5", "C5"])
    table["rows"].append(["A6", "B6", "C6"])
    LogStatus("`" + json.dumps(table) + "`")
void main() {
    json table = R"({
        "type" : "table", 
        "title" : "table demo", 
        "cols" : ["columnA", "columnB", "columnC"], 
        "rows" : [
            ["A1", "B1", {"type": "button", "cmd": "coverAll", "name": "C1"}]
        ]
    })"_json;
    // For testing purposes, the code is short and easy to read, and the constructed data is used here
    json jsonTicker = R"({"High": 0, "Low": 0, "Buy": 0, "Sell": 0, "Last": 0, "Time": 0, "Volume": 0})"_json;
    auto name = exchange.GetName();
    json arr1 = R"([{"body": "", "colspan": 2}, "C2"])"_json;
    arr1[0]["body"] = "A2 + B2:" + jsonTicker.dump();
    json arr2 = R"([{"body": "", "rowspan": 3}, "B3", "C3"])"_json;
    arr2[0]["body"] = "A3 + A4 + A5:" + name;
    table["rows"].push_back(arr1);
    table["rows"].push_back(arr2);
    table["rows"].push_back(R"(["B4", "C4"])"_json);
    table["rows"].push_back(R"(["B5", "C5"])"_json);
    table["rows"].push_back(R"(["A6", "B6", "C6"])"_json);
    LogStatus("`" + table.dump() + "`");
}

Вертикально слить ячейки в таблице, нарисованнойLogStatus()Функция:

function main() {
    var table1 = {type: 'table', title: 'table1', cols: ['column1', 'column2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]}
    var table2 = {type: 'table', title: 'table2', cols: ['column1', 'column2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]}
    LogStatus('`' + JSON.stringify([table1, table2]) + '`')
}
import json
def main():
    table1 = {"type": "table", "title": "table1", "cols": ["column1", "column2"], "rows": [ ["abc", "def"], ["ABC", "support color #ff0000"]]}
    table2 = {"type": "table", "title": "table2", "cols": ["column1", "column2"], "rows": [ ["abc", "def"], ["ABC", "support color #ff0000"]]}
    LogStatus("`" + json.dumps([table1, table2]) + "`")
void main() {
    json table1 = R"({"type": "table", "title": "table1", "cols": ["column1", "column2"], "rows": [ ["abc", "def"], ["ABC", "support color #ff0000"]]})"_json;
    json table2 = R"({"type": "table", "title": "table2", "cols": ["column1", "column2"], "rows": [ ["abc", "def"], ["ABC", "support color #ff0000"]]})"_json;
    json arr = R"([])"_json;
    arr.push_back(table1);
    arr.push_back(table2);
    LogStatus("`" + arr.dump() + "`");
}

Показать таблицу строки состояния:

function main(){
    var tab1 = {
        type : "table",
        title : "table1",
        cols : ["1", "2"],
        rows : []
    }
    var tab2 = {
        type : "table",
        title : "table2",
        cols : ["1", "2", "3"],
        rows : []
    }
    var tab3 = {
        type : "table",
        title : "table3",
        cols : ["A", "B", "C"],
        rows : []
    }            

    tab1.rows.push(["jack", "lucy"])
    tab2.rows.push(["A", "B", "C"])
    tab3.rows.push(["A", "B", "C"])            

    LogStatus('`' + JSON.stringify(tab1) + '`\n' + 
        '`' + JSON.stringify(tab2) + '`\n' +
        '`' + JSON.stringify(tab3) + '`')
  
    Log("exit")
}
import json
def main():
    tab1 = {
        "type": "table", 
        "title": "table1", 
        "cols": ["1", "2"], 
        "rows": []
    }
    tab2 = {
        "type": "table", 
        "title": "table2", 
        "cols": ["1", "2", "3"], 
        "rows": []
    }
    tab3 = {
        "type": "table", 
        "title": "table3", 
        "cols": ["A", "B", "C"], 
        "rows": []
    }            

    tab1["rows"].append(["jack", "lucy"])
    tab2["rows"].append(["A", "B", "C"])
    tab3["rows"].append(["A", "B", "C"])
    LogStatus("`" + json.dumps(tab1) + "`\n" + 
        "`" + json.dumps(tab2) + "`\n" + 
        "`" + json.dumps(tab3) + "`")
void main() {
    json tab1 = R"({
        "type": "table", 
        "title": "table1", 
        "cols": ["1", "2"], 
        "rows": []
    })"_json;
    json tab2 = R"({
        "type": "table", 
        "title": "table2", 
        "cols": ["1", "2", "3"], 
        "rows": []
    })"_json;
    json tab3 = R"({
        "type": "table", 
        "title": "table3", 
        "cols": ["A", "B", "C"], 
        "rows": []
    })"_json;
    tab1["rows"].push_back(R"(["jack", "lucy"])"_json);
    tab2["rows"].push_back(R"(["A", "B", "C"])"_json);
    tab3["rows"].push_back(R"(["A", "B", "C"])"_json);
    LogStatus("`" + tab1.dump() + "`\n" + 
        "`" + tab2.dump() + "`\n" +
        "`" + tab3.dump() + "`");
}

В дополнение к отображению таблиц на страницах, несколько таблиц также могут отображаться в порядке сверху вниз:

function main() {
    var tbl = {
        type : "table",
        title : "test scroll",
        scroll : "auto",
        cols : ["col 0", "col 1", "col 2", "col 3", "col 4", "col 5", "col 6", "col 7", "col 8", "col 9", "col 10", 
            "col 11", "col 12", "col 13", "col 14", "col 15", "col 16", "col 17", "col 18", "col 19", "col 20"],
        rows : []
    }

    for (var i = 1 ; i < 100 ; i++) {
        tbl.rows.push([i, "1," + i, "2," + i, "3," + i, "4," + i, "5," + i, "6," + i, "7," + i, "8," + i, "9," + i, "10," + i, 
            "11," + i, "12," + i, "13," + i, "14," + i, "15," + i, "16," + i, "17," + i, "18," + i, "19," + i, "20," + i])
    }
    
    LogStatus("`" + JSON.stringify(tbl) + "`")
}
import json

def main():
    tbl = {
        "type" : "table",
        "title" : "test scroll",
        "scroll" : "auto",
        "cols" : ["col 0", "col 1", "col 2", "col 3", "col 4", "col 5", "col 6", "col 7", "col 8", "col 9", "col 10", 
            "col 11", "col 12", "col 13", "col 14", "col 15", "col 16", "col 17", "col 18", "col 19", "col 20"],
        "rows" : []
    }

    for index in range(1, 100):
        i = str(index)
        tbl["rows"].append([i, "1," + i, "2," + i, "3," + i, "4," + i, "5," + i, "6," + i, "7," + i, "8," + i, "9," + i, "10," + i, 
            "11," + i, "12," + i, "13," + i, "14," + i, "15," + i, "16," + i, "17," + i, "18," + i, "19," + i, "20," + i])
    
    LogStatus("`" + json.dumps(tbl) + "`")
void main() {
    json table = R"({
        "type" : "table",
        "title" : "test scroll",
        "scroll" : "auto",
        "cols" : ["col 0", "col 1", "col 2", "col 3", "col 4", "col 5", "col 6", "col 7", "col 8", "col 9", "col 10", 
            "col 11", "col 12", "col 13", "col 14", "col 15", "col 16", "col 17", "col 18", "col 19", "col 20"],
        "rows" : []
    })"_json;

    for (int index = 1; index < 100; ++index) {
        std::string i = std::to_string(index);
        table["rows"].push_back({i, "1," + i, "2," + i, "3," + i, "4," + i, "5," + i, "6," + i, "7," + i, "8," + i, "9," + i, "10," + i,
            "11," + i, "12," + i, "13," + i, "14," + i, "15," + i, "16," + i, "17," + i, "18," + i, "19," + i, "20," + i});
    }

    LogStatus("`" + table.dump() + "`");
}

Поддержка установки горизонтального и вертикального режима прокрутки таблицы строки состояния.scrollатрибут к"auto", когда число вертикальных строк таблицы полосы состояния превышает 20 строк, содержимое будет прокручиваться.scrollатрибут может быть использован для устранения проблемы задержки записи большого количества данных в строку состояния во время торговли в режиме реального времени.

Выпуск информации изLogStatus()Функция, когда ведется прямая торговля, не сохраняется в базе данных прямых торгов, но обновляет только содержимое текущей строки состояния прямых торгов. ВLogStatus()функция поддерживает печатьbase64кодированные изображения, начиная с`и заканчивается`Например:LogStatus("`data:image/png;base64,AAAA`")- Да. ВLogStatus()Функция поддерживает прохождениеmatplotlib.pyplotобъекты прямо вPython, пока объект содержитsavefigметод, он может быть передан в качестве параметра кLogStatus()функция, например:

import matplotlib.pyplot as plt 
def main():
    plt.plot([3,6,2,4,7,1])
    LogStatus(plt) 

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

{@fun/Global/GetCommand GetCommand} - Что ты делаешь?

EnableLog

Включить или отключить регистрацию информации о заказах.

EnableLog (включен)

Еслиenableпараметр установлен на ложное значение, напримерfalse, журнал заказов (т.е. журнал, генерируемый такими функциями, какexchange.Buy()) не печатается и не записывается в базу данных торгов в режиме реального времени. позволить Истинно Буль

function main() {
    EnableLog(false)
}
def main():
    EnableLog(False)
void main() {
    EnableLog(false);
}

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

Диаграмма

Настроить функцию рисования диаграммы.

Объект с графиком. объект

Диаграмма (варианты)

ВoptionsПараметр - это конфигурация диаграммы.Chart()параметр функцииoptionsявляетсяJSONсериализируемыйHighStocksпараметр дляHighcharts.StockChartДополнительный__isStockатрибут добавляется над нативным параметром, и если__isStock:falseЕсли вы указываете, то он отображается как обычный график.__isStockатрибут установлен на ложное значение, напримерfalse, т.е. используемая диаграммаHighchartsЕсли__isStockатрибут установлен на истинное значение, напримерtrue, т.е. используемая диаграммаHighstocksГрафик (по умолчанию)__isStockЭто правда, например.trueВы можете запроситьБиблиотека графиков HighStocks- Да. варианты неправда объект, массив объектов

function main() {
    var cfgA = {
        extension: {
            layout: 'single', // No grouping, display separately, default to group 'group'
            height: 300, // Specify the height
        },
        title: {
            text: 'handicap chart'
        },
        xAxis: {
            type: 'datetime'
        },
        series: [{
            name: 'buy one',
            data: [],
        }, {
            name: 'sell one',
            data: [],
        }]
    }
    var cfgB = {
        title: {
            text: 'spread chart'
        },
        xAxis: {
            type: 'datetime'
        },
        series: [{
            name: 'spread',
            type: 'column',
            data: [],
        }]
    }            

    var cfgC = {
        __isStock: false,
        title: {
            text: 'pie chart'
        },
        series: [{
            type: 'pie',
            name: 'one',
            data: [
                ["A", 25],
                ["B", 25],
                ["C", 25],
                ["D", 25],
            ]  // Instead of updating the initial data with the add function, the sequence can be updated by changing the chart configuration directly.
        }]
    };
    var cfgD = {
        extension: {
            layout: 'single',
            col: 8, // Specify the cell value for the width, the total value is 12
            height: '300px',
        },
        title: {
            text: 'handicap chart'
        },
        xAxis: {
            type: 'datetime'
        },
        series: [{
            name: 'buy one',
            data: [],
        }, {
            name: 'sell one',
            data: [],
        }]
    }
    var cfgE = {
        __isStock: false,
        extension: {
            layout: 'single',
            col: 4,
            height: '300px',
        },
        title: {
            text: 'pie chart2'
        },
        series: [{
            type: 'pie',
            name: 'one',
            data: [
                ["A", 25],
                ["B", 25],
                ["C", 25],
                ["D", 25],
            ]
        }]
    };            

    var chart = Chart([cfgA, cfgB, cfgC, cfgD, cfgE]);
    chart.reset()
        // Add a number of points to the pie chart, add can only update the data points added by add, built-in data points cannot be updated later.
    chart.add(3, {
        name: "ZZ",
        y: Math.random() * 100
    });
    while (true) {
        Sleep(1000)
        var ticker = exchange.GetTicker()
        if (!ticker) {
            continue;
        }
        var diff = ticker.Sell - ticker.Buy
        cfgA.subtitle = {
            text: 'buy one ' + ticker.Buy + ', sell one ' + ticker.Sell,
        };
        cfgB.subtitle = {
            text: 'spread ' + diff,
        };            

        chart.add([0, [new Date().getTime(), ticker.Buy]]);
        chart.add([1, [new Date().getTime(), ticker.Sell]]);
        // Equivalent to updating the first data series of the second chart
        chart.add([2, [new Date().getTime(), diff]]);
        chart.add(4, [new Date().getTime(), ticker.Buy]);
        chart.add(5, [new Date().getTime(), ticker.Buy]);
        cfgC.series[0].data[0][1] = Math.random() * 100;
        cfgE.series[0].data[0][1] = Math.random() * 100;
        // update is actually the same as resetting the chart's configuration
        chart.update([cfgA, cfgB, cfgC, cfgD, cfgE]);
    }
}            
import random
import time
def main():
    cfgA = {
        "extension" : {
            "layout" : "single", 
            "height" : 300,
            "col" : 8
        }, 
        "title" : {
            "text" : "handicap chart"
        },
        "xAxis" : {
            "type" : "datetime" 
        }, 
        "series" : [{
            "name" : "buy one",
            "data" : []
        }, {
            "name" : "sell one", 
            "data" : []
        }]
    }                

    cfgB = {
        "title" : {
            "text" : "spread chart"
        }, 
        "xAxis" : {
            "type" : "datetime",
        }, 
        "series" : [{
            "name" : "spread", 
            "type" : "column", 
            "data" : []
        }]
    }                

    cfgC = {
        "__isStock" : False,
        "title" : {
            "text" : "pie chart"
        }, 
        "series" : [{
            "type" : "pie", 
            "name" : "one", 
            "data" : [
                ["A", 25],
                ["B", 25],
                ["C", 25],
                ["D", 25],
            ]
        }]
    }                

    cfgD = {
        "extension" : {
            "layout" : "single",
            "col" : 8,
            "height" : "300px"
        }, 
        "title" : {
            "text" : "handicap chart"
        }, 
        "series" : [{
            "name" : "buy one", 
            "data" : []
        }, {
            "name" : "sell one",
            "data" : []
        }]
    }                

    cfgE = {
        "__isStock" : False, 
        "extension" : {
            "layout" : "single", 
            "col" : 4,
            "height" : "300px"
        }, 
        "title" : {
            "text" : "pie chart2"
        },
        "series" : [{
            "type" : "pie",
            "name" : "one", 
            "data" : [
                ["A", 25], 
                ["B", 25], 
                ["C", 25], 
                ["D", 25]
            ]
        }]
    }
    
    chart = Chart([cfgA, cfgB, cfgC, cfgD, cfgE])
    chart.reset()
    chart.add(3, {
        "name" : "ZZ",
        "y" : random.random() * 100
    })
    
    while True:
        Sleep(1000)
        ticker = exchange.GetTicker()
        if not ticker :
            continue
        diff = ticker["Sell"] - ticker["Buy"]
        cfgA["subtitle"] = {
            "text" : "buy one" + str(ticker["Buy"]) + "sell one" + str(ticker["Sell"])
        }
        cfgB["subtitle"] = {
            "text" : "spread " + str(diff)
        }
        
        chart.add(0, [time.time() * 1000, ticker["Buy"]])
        chart.add(1, [time.time() * 1000, ticker["Sell"]])
        chart.add(2, [time.time() * 1000, diff])
        chart.add(4, [time.time() * 1000, ticker["Buy"]])
        chart.add(5, [time.time() * 1000, ticker["Buy"]])
        cfgC["series"][0]["data"][0][1] = random.random() * 100
        cfgE["series"][0]["data"][0][1] = random.random() * 100
void main() {
    json cfgA = R"({
        "extension" : {
            "layout" : "single", 
            "height" : 300,
            "col" : 8
        }, 
        "title" : {
            "text" : "handicap chart"
        },
        "xAxis" : {
            "type" : "datetime" 
        }, 
        "series" : [{
            "name" : "buy one",
            "data" : []
        }, {
            "name" : "sell one", 
            "data" : []
        }]
    })"_json;                

    json cfgB = R"({
        "title" : {
            "text" : "spread chart"
        }, 
        "xAxis" : {
            "type" : "datetime"
        }, 
        "series" : [{
            "name" : "spread", 
            "type" : "column", 
            "data" : []
        }]
    })"_json;    
    
    json cfgC = R"({
        "__isStock" : false,
        "title" : {
            "text" : "pie chart"
        }, 
        "series" : [{
            "type" : "pie", 
            "name" : "one", 
            "data" : [
                ["A", 25],
                ["B", 25],
                ["C", 25],
                ["D", 25]
            ]
        }]
    })"_json;    
    
    json cfgD = R"({
        "extension" : {
            "layout" : "single",
            "col" : 8,
            "height" : "300px"
        }, 
        "title" : {
            "text" : "handicap chart"
        }, 
        "series" : [{
            "name" : "buy one", 
            "data" : []
        }, {
            "name" : "sell one",
            "data" : []
        }]
    })"_json;    
    
    json cfgE = R"({
        "__isStock" : false, 
        "extension" : {
            "layout" : "single", 
            "col" : 4,
            "height" : "300px"
        }, 
        "title" : {
            "text" : "pie chart2"
        },
        "series" : [{
            "type" : "pie",
            "name" : "one", 
            "data" : [
                ["A", 25], 
                ["B", 25], 
                ["C", 25], 
                ["D", 25]
            ]
        }]
    })"_json;            

    auto chart = Chart({cfgA, cfgB, cfgC, cfgD, cfgE});
    chart.reset();
    json zz = R"({
        "name" : "ZZ", 
        "y" : 0
    })"_json;
    zz["y"] = rand() % 100;
    chart.add(3, zz);
    
    while(true) {
        Sleep(1000);
        auto ticker = exchange.GetTicker();
        if(!ticker.Valid) {
            continue;
        }
        auto diff = ticker.Sell - ticker.Buy;
        json cfgASubTitle = R"({"text" : ""})"_json;
        cfgASubTitle["text"] = format("buy one %f , sell one %f", ticker.Buy, ticker.Sell);
        cfgA["subtitle"] = cfgASubTitle;
        
        json cfgBSubTitle = R"({"text" : ""})"_json;
        cfgBSubTitle["text"] = format("spread %f", diff);
        cfgB["subtitle"] = cfgBSubTitle;            

        chart.add(0, {Unix() * 1000, ticker.Buy});
        chart.add(1, {Unix() * 1000, ticker.Sell});
        chart.add(2, {Unix() * 1000, diff});
        chart.add(4, {Unix() * 1000, ticker.Buy});
        chart.add(5, {Unix() * 1000, ticker.Buy});
        cfgC["series"][0]["data"][0][1] = rand() % 100;
        cfgE["series"][0]["data"][0][1] = rand() % 100;
        chart.update({cfgA, cfgB, cfgC, cfgD, cfgE});
    }
}

Конфигурация чертежа с несколькими диаграммами:

  • extension.layoutатрибут Если атрибут установлен с значением single, графики не будут накладываться (не отображаются в виде вкладок), а будут отображаться отдельно (нанесены плитками).
  • extension.heightатрибут Атрибут используется для настройки высоты диаграммы, либо в виде числового значения, либо в виде 300px.
  • extension.colатрибут Атрибут используется для установки ширины диаграммы, ширина страницы делится на 12 ячеек, набор 8, то есть диаграмма занимает 8 ячеек ширины.
// This chart is an object in the JavaScript language, and before using the Chart function, we need to declare an object variable chart to configure the chart. var chart = {                                           
    // This field marks whether the chart is a general chart or not, if you are interested, you can change it to false and run it.
    __isStock: true,                                    
    // Scaling tool
    tooltip: {xDateFormat: '%Y-%m-%d %H:%M:%S, %A'},    
    // title
    title : { text : 'spread analysis chart'},                       
    // selection range
    rangeSelector: {                                    
        buttons:  [{type: 'hour',count: 1, text: '1h'}, {type: 'hour',count: 3, text: '3h'}, {type: 'hour', count: 8, text: '8h'}, {type: 'all',text: 'All'}],
        selected: 0,
        inputEnabled: false
    },
    // Coordinate axis horizontal axis that is: x-axis, the current setting type is: time
    xAxis: { type: 'datetime'},                         
    // Coordinate axis vertical axis that is: y-axis, default value adjusted with the size of the data
    yAxis : {                                           
        // title
        title: {text: 'spread'},                           
        // Whether to enable the right vertical axis
        opposite: false                                 
    },
    // Data series, this sttribute holds the individual data series (lines, K-charts, labels, etc...)
    series : [                                          
        // The index is 0, and the data array holds the data of the index series
        {name : "line1", id : "line1,buy1Price", data : []},                          
        // Index is 1, set dashStyle:'shortdash' i.e.: set the dashed line
        {name : "line2", id : "line2,lastPrice", dashStyle : 'shortdash', data : []}  
    ]
} function main(){
    // Call the Chart function to initialize the chart
    var ObjChart = Chart(chart)         
    // Clear out
    ObjChart.reset()                      
    while(true){
        // Gets the timestamp of this poll, i.e. a millisecond timestamp. It's used to determine the position of the X-axis written to the chart.
        var nowTime = new Date().getTime()
        // Get the ticker data
        var ticker = _C(exchange.GetTicker)
        // Get buy one price from the return value of the ticker data
        var buy1Price = ticker.Buy    
        // To obtain the final transaction price, we add 1 in order not to overlap the 2 lines
        var lastPrice = ticker.Last + 1
        // Data sequence with timestamp as X-value and buy one price as Y-value passed into index 0
        ObjChart.add(0, [nowTime, buy1Price])
        // ditto
        ObjChart.add(1, [nowTime, lastPrice])
        Sleep(2000)
    }
}```
```python
import time
chart = {
    "__isStock" : True,
    "tooltip" : {"xDateFormat" : "%Y-%m-%d %H:%M:%S, %A"},  
    "title" : {"text" : "spread analysis chart"}, 
    "rangeSelector" : {
        "buttons" : [{"type": "count", "count": 1, "text": "1h"}, {"type": "hour", "count": 3, "text": "3h"}, {"type": "hour", "count": 8, "text": "8h"}, {"type": "all", "text": "All"}], 
        "selected": 0,
        "inputEnabled": False 
    }, 
    "xAxis": {"type": "datetime"}, 
    "yAxis": {
        "title": {"text": "spread"},
        "opposite": False
    },
    "series": [{
        "name": "line1", "id": "line1,buy1Price", "data": []
    }, {
        "name": "line2", "id": "line2,lastPrice", "dashStyle": "shortdash", "data": []
    }]
}
def main():
    ObjChart = Chart(chart)
    ObjChart.reset()
    while True:
        nowTime = time.time() * 1000
        ticker = exchange.GetTicker()
        buy1Price = ticker["Buy"]
        lastPrice = ticker["Last"] + 1
        ObjChart.add(0, [nowTime, buy1Price])
        ObjChart.add(1, [nowTime, lastPrice])
        Sleep(2000)
void main() {
    // When writing strategies in C++, try not to declare global variables that are not of the base type, so the chart configuration object is declared inside the main function.
    json chart = R"({
        "__isStock" : true,
        "tooltip" : {"xDateFormat" : "%Y-%m-%d %H:%M:%S, %A"},  
        "title" : {"text" : "spread analysis chart"}, 
        "rangeSelector" : {
            "buttons" : [{"type": "count", "count": 1, "text": "1h"}, {"type": "hour", "count": 3, "text": "3h"}, {"type": "hour", "count": 8, "text": "8h"}, {"type": "all", "text": "All"}], 
            "selected": 0,
            "inputEnabled": false 
        }, 
        "xAxis": {"type": "datetime"}, 
        "yAxis": {
            "title": {"text": "spread"},
            "opposite": false
        },
        "series": [{
            "name": "line1", "id": "line1,buy1Price", "data": []
        }, {
            "name": "line2", "id": "line2,lastPrice", "dashStyle": "shortdash", "data": []
        }]
    })"_json;
    auto ObjChart = Chart(chart);
    ObjChart.reset();
    while(true) {
        auto nowTime = Unix() * 1000;
        auto ticker = exchange.GetTicker();
        auto buy1Price = ticker.Buy;
        auto lastPrice = ticker.Last + 1.0;
        ObjChart.add(0, {nowTime, buy1Price});
        ObjChart.add(1, {nowTime, lastPrice});
        Sleep(2000);
    }
}

Пример простого рисунка:

// Objects used to initialize the chart
var chart = {                                   
    // Chart title
    title: {text: "line value triggers the plotLines value"},   
    // Y-axis related settings
    yAxis: {                                    
        // A horizontal line perpendicular to the Y-axis, used as a trigger line, is a structural array that can set multiple trigger lines
        plotLines: [{                           
            // The value of the trigger line, how much it set, this line will be displayed in the corresponding value position
            value: 0,                           
            // Set the color of the trigger line
            color: 'red',                       
            // Width
            width: 2,                           
            // Displaying labels
            label: {                            
                // Label text
                text: 'Trigger value',                  
                // Centered label position
                align: 'center'                 
            }
        }]
    },
    // X-axis related settings, here the setting type is time axis
    xAxis: {type: "datetime"},                  
    series: [
        {name: "sin", type: "spline", data: []},
        // This is an important data series, you can set multiple data series, according to the array index control
        {name: "cos", type: "spline", data: []}
    ]  
}
function main(){
    // Circumference
    var pi = 3.1415926535897
    // Variables for recording timestamps
    var time = 0                   
    // Angle
    var angle = 0                        
    // Coordinate y values for receiving sine and cosine values
    var y = 0          
    // Call the API interface to initialize the chart with the chart object
    var objChart = Chart(chart)        
    // Initially, clear the chart
    objChart.reset()
    // Set the value of the trigger line to 1
    chart.yAxis.plotLines[0].value = 1
    // Loop
    while(true){                          
        // Get the timestamp of the current moment
        time = new Date().getTime() 
        // Angle increases by 5 degrees every 500ms and calculates the sine value
        y = Math.sin(angle * 2 * pi / 360)
        // Write the calculated y value to the data series of the corresponding index of the chart, the first parameter of the add function is the specified data series index
        objChart.add(0, [time, y])
        // Calculate the cosine value
        y = Math.cos(angle * 2 * pi / 360)
        objChart.add(1, [time, y])
        // Increase by 5 degrees
        angle += 5
        // Pause for 5 seconds to avoid drawing too often and growing data too fast
        Sleep(5000)     
    }
}
import math
import time
chart = {
    "title": {"text": "line value triggers the plotLines value"}, 
    "yAxis": {
        "plotLines": [{
            "value": 0,
            "color": "red",
            "width": 2,
            "label": {
                "text": "trigger value", 
                "align": "center"
            }
        }]
    },
    "xAxis": {"type": "datetime"},
    "series": [{"name": "sin", "type": "spline", "data": []},
               {"name": "cos", "type": "spline", "data": []}]
}
def main():
    pi = 3.1415926535897
    ts = 0
    angle = 0
    y = 0
    objChart = Chart(chart)
    objChart.reset()
    chart["yAxis"]["plotLines"][0]["value"] = 1
    while True:
        ts = time.time() * 1000
        y = math.sin(angle * 2 * pi / 360)
        objChart.add(0, [ts, y])
        y = math.cos(angle * 2 * pi / 360)
        objChart.add(1, [ts, y])
        angle += 5
        Sleep(5000)
void main() {
    json chart = R"({
        "title": {"text": "line value triggers the plotLines value"}, 
        "yAxis": {
            "plotLines": [{
                "value": 0,
                "color": "red",
                "width": 2,
                "label": {
                    "text": "trigger value", 
                    "align": "center"
                }
            }]
        },
        "xAxis": {"type": "datetime"},
        "series": [{"name": "sin", "type": "spline", "data": []},
                   {"name": "cos", "type": "spline", "data": []}]     
    })"_json;            

    auto pi = 3.1415926535897;
    auto ts = 0;
    auto angle = 0.0;
    auto y = 0.0;
    auto objChart = Chart(chart);
    objChart.reset();
    chart["yAxis"]["plotLines"][0]["value"] = 1;
    while(true) {
        ts = Unix() * 1000;
        y = sin(angle * 2 * pi / 360);
        objChart.add(0, {ts, y});
        y = cos(angle * 2 * pi / 360);
        objChart.add(1, {ts, y});
        angle += 5;
        Sleep(5000);
    }
}

Пример рисунка тригонометрической кривой:

/*backtest
start: 2020-03-11 00:00:00
end: 2020-04-09 23:59:00
period: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/            

var chartCfg = {
    subtitle: {
        text: "subtitle",
    },
    yAxis: [{
        height: "40%",
        lineWidth: 2,
        title: {
            text: 'PnL',
        },
        tickPixelInterval: 20,
        minorGridLineWidth: 1,
        minorTickWidth: 0,
        opposite: true,
        labels: {
            align: "right",
            x: -3,
        }
    }, {
        title: {
            text: 'Profit',
        },
        top: "42%",
        height: "18%",
        offset: 0,
        lineWidth: 2
    }, {
        title: {
            text: 'Vol',
        },
        top: '62%',
        height: '18%',
        offset: 0,
        lineWidth: 2
    }, {
        title: {
            text: 'Asset',
        },
        top: '82%',
        height: '18%',
        offset: 0,
        lineWidth: 2
    }],
    series: [{
        name: 'PnL',
        data: [],
        id: 'primary',
        tooltip: {
            xDateFormat: '%Y-%m-%d %H:%M:%S'
        },
        yAxis: 0
    }, {
        type: 'column',
        lineWidth: 2,
        name: 'Profit',
        data: [],
        yAxis: 1,
    }, {
        type: 'column',
        name: 'Trade',
        data: [],
        yAxis: 2
    }, {
        type: 'area',
        step: true,
        lineWidth: 0,
        name: 'Long',
        data: [],
        yAxis: 2
    }, {
        type: 'area',
        step: true,
        lineWidth: 0,
        name: 'Short',
        data: [],
        yAxis: 2
    }, {
        type: 'line',
        step: true,
        color: '#5b4b00',
        name: 'Asset',
        data: [],
        yAxis: 3
    }, {
        type: 'pie',
        innerSize: '70%',
        name: 'Random',
        data: [],
        center: ['3%', '6%'],
        size: '15%',
        dataLabels: {
            enabled: false
        },
        startAngle: -90,
        endAngle: 90,
    }],
};            

function main() {
    let c = Chart(chartCfg);
    let preTicker = null;
    while (true) {
        let t = exchange.GetTicker();
        
        c.add(0, [t.Time, t.Last]); // PnL
        c.add(1, [t.Time, preTicker ? t.Last - preTicker.Last : 0]); // profit
        let r = Math.random();
        var pos = parseInt(t.Time/86400);
        c.add(2, [t.Time, pos/2]); // Vol
        c.add(3, [t.Time, r > 0.8 ? pos : null]); // Long
        c.add(4, [t.Time, r < 0.8 ? -pos : null]); // Short
        c.add(5, [t.Time, Math.random() * 100]); // Asset
        // update pie
        chartCfg.series[chartCfg.series.length-1].data = [
            ["A", Math.random()*100],
            ["B", Math.random()*100],
         ];
        c.update(chartCfg)
        preTicker = t;
    }
}
'''backtest
start: 2020-03-11 00:00:00
end: 2020-04-09 23:59:00
period: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
'''            

import random            

chartCfg = {
    "subtitle": {
        "text": "subtitle"
    },
    "yAxis": [{
        "height": "40%",
        "lineWidth": 2,
        "title": {
            "text": 'PnL'
        },
        "tickPixelInterval": 20,
        "minorGridLineWidth": 1,
        "minorTickWidth": 0,
        "opposite": True,
        "labels": {
            "align": "right",
            "x": -3
        }
    }, {
        "title": {
            "text": 'Profit'
        },
        "top": "42%",
        "height": "18%",
        "offset": 0,
        "lineWidth": 2
    }, {
        "title": {
            "text": 'Vol'
        },
        "top": '62%',
        "height": '18%',
        "offset": 0,
        "lineWidth": 2
    }, {
        "title": {
            "text": 'Asset'
        },
        "top": '82%',
        "height": '18%',
        "offset": 0,
        "lineWidth": 2
    }],
    "series": [{
        "name": 'PnL',
        "data": [],
        "id": 'primary',
        "tooltip": {
            "xDateFormat": '%Y-%m-%d %H:%M:%S'
        },
        "yAxis": 0
    }, {
        "type": 'column',
        "lineWidth": 2,
        "name": 'Profit',
        "data": [],
        "yAxis": 1
    }, {
        "type": 'column',
        "name": 'Trade',
        "data": [],
        "yAxis": 2
    }, {
        "type": 'area',
        "step": True,
        "lineWidth": 0,
        "name": 'Long',
        "data": [],
        "yAxis": 2
    }, {
        "type": 'area',
        "step": True,
        "lineWidth": 0,
        "name": 'Short',
        "data": [],
        "yAxis": 2
    }, {
        "type": 'line',
        "step": True,
        "color": '#5b4b00',
        "name": 'Asset',
        "data": [],
        "yAxis": 3
    }, {
        "type": 'pie',
        "innerSize": '70%',
        "name": 'Random',
        "data": [],
        "center": ['3%', '6%'],
        "size": '15%',
        "dataLabels": {
            "enabled": False
        },
        "startAngle": -90,
        "endAngle": 90
    }]
}            

def main():
    c = Chart(chartCfg)
    preTicker = None
    while True:
        t = exchange.GetTicker()
        c.add(0, [t["Time"], t["Last"]])
        profit = t["Last"] - preTicker["Last"] if preTicker else 0
        c.add(1, [t["Time"], profit])
        r = random.random()
        pos = t["Time"] / 86400
        c.add(2, [t["Time"], pos / 2])
        long = pos if r > 0.8 else None
        c.add(3, [t["Time"], long])
        short = -pos if r < 0.8 else None
        c.add(4, [t["Time"], short])
        c.add(5, [t["Time"], random.random() * 100])            

        # update pie
        chartCfg["series"][len(chartCfg["series"]) - 1]["data"] = [
            ["A", random.random() * 100], 
            ["B", random.random() * 100]
        ]
        c.update(chartCfg)
        preTicker = t
/*backtest
start: 2020-03-11 00:00:00
end: 2020-04-09 23:59:00
period: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/            

void main() {
    json chartCfg = R"({
        "subtitle": {
            "text": "subtitle"
        },
        "yAxis": [{
            "height": "40%",
            "lineWidth": 2,
            "title": {
                "text": "PnL"
            },
            "tickPixelInterval": 20,
            "minorGridLineWidth": 1,
            "minorTickWidth": 0,
            "opposite": true,
            "labels": {
                "align": "right",
                "x": -3
            }
        }, {
            "title": {
                "text": "Profit"
            },
            "top": "42%",
            "height": "18%",
            "offset": 0,
            "lineWidth": 2
        }, {
            "title": {
                "text": "Vol"
            },
            "top": "62%",
            "height": "18%",
            "offset": 0,
            "lineWidth": 2
        }, {
            "title": {
                "text": "Asset"
            },
            "top": "82%",
            "height": "18%",
            "offset": 0,
            "lineWidth": 2
        }],
        "series": [{
            "name": "PnL",
            "data": [],
            "id": "primary",
            "tooltip": {
                "xDateFormat": "%Y-%m-%d %H:%M:%S"
            },
            "yAxis": 0
        }, {
            "type": "column",
            "lineWidth": 2,
            "name": "Profit",
            "data": [],
            "yAxis": 1
        }, {
            "type": "column",
            "name": "Trade",
            "data": [],
            "yAxis": 2
        }, {
            "type": "area",
            "step": true,
            "lineWidth": 0,
            "name": "Long",
            "data": [],
            "yAxis": 2
        }, {
            "type": "area",
            "step": true,
            "lineWidth": 0,
            "name": "Short",
            "data": [],
            "yAxis": 2
        }, {
            "type": "line",
            "step": true,
            "color": "#5b4b00",
            "name": "Asset",
            "data": [],
            "yAxis": 3
        }, {
            "type": "pie",
            "innerSize": "70%",
            "name": "Random",
            "data": [],
            "center": ["3%", "6%"],
            "size": "15%",
            "dataLabels": {
                "enabled": false
            },
            "startAngle": -90,
            "endAngle": 90
        }]
    })"_json;
    
    Chart c = Chart(chartCfg);
    Ticker preTicker;
    while(true) {
        auto t = exchange.GetTicker();
        c.add(0, {t.Time, t.Last});
        auto profit = preTicker.Valid ? t.Last - preTicker.Last : 0;
        c.add(1, {t.Time, profit});    
        auto r = rand() % 100;
        auto pos = t.Time / 86400.0;
        c.add(2, {t.Time, pos / 2.0});
        auto longPos = r > 0.8 ? pos : NULL;
        c.add(3, {t.Time, longPos});
        auto shortPos = r < 0.8 ? -pos : NULL;
        c.add(4, {t.Time, shortPos});
        c.add(5, {t.Time, rand() % 100});
        
        // update pie 
        json pie = R"([["A", 0], ["B", 0]])"_json;
        pie[0][1] = rand() % 100;
        pie[1][1] = rand() % 100;
        chartCfg["series"][chartCfg["series"].size() - 1]["data"] = pie;
        
        c.update(chartCfg);
        preTicker = t;
    }
}            

Сложные примеры использования гибридных диаграмм:

// update pie
chartCfg.series[chartCfg.series.length-1].data = [
    ["A", Math.random()*100],
    ["B", Math.random()*100],
];
c.update(chartCfg)
# update pie
chartCfg["series"][len(chartCfg["series"]) - 1]["data"] = [
    ["A", random.random() * 100], 
    ["B", random.random() * 100]
]
c.update(chartCfg)
// update pie 
json pie = R"([["A", 0], ["B", 0]])"_json;
pie[0][1] = rand() % 100;
pie[1][1] = rand() % 100;
chartCfg["series"][chartCfg["series"].size() - 1]["data"] = pie;
c.update(chartCfg);

Типовые схемыpieНапример, код в приведенном выше примере обновляет график, используяc.update(chartCfg)после обновления данных следующим образом:

ВChart()функция возвращает объект диаграмма, который имеет 4 метода:add(), reset(), update(), del().

    1. Вupdate()Метод: Вupdate()Параметр этого метода - объект конфигурации диаграммы (JSON).
    1. Вdel()Метод: Вdel()Метод может удалить серию данных указанного индекса на основе параметра прошедшей серии.
    1. Вadd()Метод: Вadd()Метод может записывать данные на графике, с следующими параметрами в порядке:
    • series: используется для установки индекса серии данных, который является целым числом.
    • data: используется для настройки конкретных данных для записи, это массив.
    • index(необязательно): используется для настройки индекса данных, это целое число. Укажите конкретное положение индекса измененных данных, и он поддерживает отрицательные числа, настройка-1относится к последним данным набора данных. Например, при рисовании линии изменять данные в последней точке линии:chart.add(0, [1574993606000, 13.5], -1), т.е. изменить данные на предпоследней первой точке диаграммыseries[0].data- Да. Вindexпараметр не установлен, что означает, что данные добавляются в последнюю точку текущей серии данных.
    1. Вreset()Метод: Вreset()Метод используется для опустошения данных диаграммы.reset()Метод может принимать параметрremainчтобы указать количество записей, которые нужно сохранить.remainпропускается для очистки всех данных.

{@fun/Log/KLineChart KLineChart} Я не знаю.

KLineChart

Функция используется для пользовательского рисования в время выполнения стратегии с использованием метода рисования, аналогичногоPine language.

Объект диаграммы.KLineChart()функция возвращает объект диаграмма с несколькими методами, среди которых вам нужно обратить внимание наbegin()иclose(). Операция чертежа должна начинаться сbegin()вызов функции и конец сclose()вызов функции при пересечении данных KLine для выполнения операции чертежа. объект

KLineChart ((возможности)

ВoptionsПараметр - это конфигурация диаграммы. варианты неправда объект, массив объектов

function main() {
    // Call the KLineChart function to create a chart control object c
    let c = KLineChart({
        overlay: true
    })            

    // Use the Spot Exchange object test to get K-line data. If you use the futures exchange object test, you need to set up the contract first.
    let bars = exchange.GetRecords()
    if (!bars) {
        return
    }            
    
    // Execute the drawing operation by traversing over the K-line data. The drawing operation must start with the ```c.begin(bar)``` function call and end with the ```c.close()``` function call.
    bars.forEach(function(bar, index) {
        c.begin(bar)
        c.barcolor(bar.Close > bar.Open ? 'rgba(255, 0, 0, 0.2)' : 'rgba(0, 0, 0, 0.2)')
        if (bar.Close > bar.Open) {
            c.bgcolor('rgba(0, 255, 0, 0.5)')
        }
        let h = c.plot(bar.High, 'high')
        let l = c.plot(bar.Low, 'low')            

        c.fill(h, l, {
            color: bar.Close > bar.Open ? 'rgba(255, 0, 0, 0.2)' : 'rgba(255, 0, 0, 0.2)'
        })
        c.hline(bar.High)
        c.plotarrow(bar.Close - bar.Open)
        c.plotshape(bar.Low, {
            style: 'diamond'
        })
        c.plotchar(bar.Close, {
            char: 'X'
        })
        c.plotcandle(bar.Open*0.9, bar.High*0.9, bar.Low*0.9, bar.Close*0.9)
        if (bar.Close > bar.Open) {
            // long/short/closelong/closeshort
            c.signal("long", bar.High, 1.5)
        } else if (bar.Close < bar.Open) {
            c.signal("closelong", bar.Low, 1.5)
        }
        c.close()
    })
}
def main():
    # Call the KLineChart function to create a chart control object c
    c = KLineChart({
        "overlay": True
    })            

    # Use the Spot Exchange object test to get K-line data. If you use the futures exchange object test, you need to set up the contract first.
    bars = exchange.GetRecords()
    if not bars:
        return            

    for bar in bars:
        c.begin(bar)
        c.barcolor('rgba(255, 0, 0, 0.2)' if bar.Close > bar.Open else 'rgba(0, 0, 0, 0.2)')
        if bar.Close > bar.Open:
            c.bgcolor('rgba(0, 255, 0, 0.5)')            

        h = c.plot(bar.High, 'high')
        l = c.plot(bar.Low, 'low')            

        c.fill(h, l, 'rgba(255, 0, 0, 0.2)' if bar.Close > bar.Open else 'rgba(255, 0, 0, 0.2)')
        c.hline(bar.High)
        c.plotarrow(bar.Close - bar.Open)        
        c.plotshape(bar.Low, style = 'diamond')
        c.plotchar(bar.Close, char = 'X')
        c.plotcandle(bar.Open*0.9, bar.High*0.9, bar.Low*0.9, bar.Close*0.9)
        if bar.Close > bar.Open:
            # long/short/closelong/closeshort
            c.signal("long", bar.High, 1.5)
        elif bar.Close < bar.Open:
            c.signal("closelong", bar.Low, 1.5)            

        c.close()
// Not supported for now

Если объект управления графиком необходим для рисования в зоне рисования стратегии, используйтеKLineChart()Параметр к объектуKLineChart()функция - это структура конфигурации диаграммы, используемая в коде ссылки проста:{overlay: true}. Эта структура конфигурации диаграмма устанавливает только содержание рисунка, которое должно выводиться на основной диаграмме.overlayустанавливается на значение false, напримерfalse, содержание на графике выводится на вторичном графике. Если вам нужно указать чертежную функцию, чтобы нарисовать на главном графике, вы также можете указать параметрoverlayкак истинное значение в конкретном вызове функции, например:true.

c.barcolor(bar.Close > bar.Open ? 'rgba(255, 0, 0, 0.2)' : 'rgba(0, 0, 0, 0.2)')   // Use the example illustrated in the reference code in this example, without further ado
c.barcolor('rgba(255, 0, 0, 0.2)' if bar.Close > bar.Open else 'rgba(0, 0, 0, 0.2)')
//  Not supported for now

Функции интерфейса чертежаPineязык, поддерживаемый в операции черчения:barcolor, который устанавливает цвет линии К.

barcolor ((цвет, смещение, редактируемые, show_last, заголовок, отображение) параметры отображения необязательны: ни один, все

c.bgcolor('rgba(0, 255, 0, 0.5)')
c.bgcolor('rgba(0, 255, 0, 0.5)')
// Not supported for now

bgcolor, заполняет фон линии K указанным цветом.

bgcolor ((цвет, смещение, редактируемые, show_last, заголовок, отображение, наложение) параметры отображения необязательны: ни один, все

c.plot(bar.High, 'high')
c.plot(bar.Open < bar.Close ? NaN : bar.Close, "Close", {style: "linebr"})  // Support for drawing discontinuous data lines
h = c.plot(bar.High, 'high')
h = c.plot(None if bar.Open < bar.Close else bar.Close, "Close", style = "linebr")  # Support for drawing discontinuous data lines
// Not supported for now

plot, изображает ряд данных на графике.

plot ((серия, заголовок, цвет, ширина строки, стиль, цена отслеживания, histbase, смещение, присоединение, редактируемое, показать_последний, отображение) параметры стиля необязательны: stepline_diamond, stepline, cross, areabr, area, circles, columns, histogram, linebr, line параметры отображения необязательны: ни один, все

let h = c.plot(bar.High, 'high')
let l = c.plot(bar.Low, 'low')

c.fill(h, l, {color: bar.Close > bar.Open ? 'rgba(255, 0, 0, 0.2)' : 'rgba(255, 0, 0, 0.2)'})
h = c.plot(bar.High, 'high')
l = c.plot(bar.Low, 'low')

c.fill(h, l, color = 'rgba(255, 0, 0, 0.2)' if bar.Close > bar.Open else 'rgba(255, 0, 0, 0.2)'})
// Not supported for now

fill, заполнить фон между двумя участками илиhlineс предоставленными цветами.

заполнить ((линия1, линия2, цвет, заголовок, редактируемый, заполнить пробелы, отобразить) параметры отображения необязательны: ни один, все

С тех порJavaScriptязык не может указать входящие параметры на основе названий функций формальных параметров, чтобы решить эту проблему, вы можете использовать{key: value}структура для указания параметров, которые должны быть переданы определенному формальному названию параметра. Например, в коде ссылки используется{color: bar.Close > bar.Open ? 'rgba(255, 0, 0, 0, 0.2)' : 'rgba(255, 0, 0, 0, 0.2)'}УказываетcolorпараметрfillФункция. Если вам нужно указать несколько параметров с последовательными названиями форм параметров, вы можете использовать{key1: value1, key2: value2, key3: value3}- Да. Например, в этом примере дополнительныйtitleпараметр указан:{color: bar.Close > bar.Open ? 'rgba(255, 0, 0, 0, 0.2)' : 'rgba(255, 0, 0, 0, 0.2)', title: 'fill'}- Да. Для цветного значения, вы можете установить его с'rgba(255, 0, 0, 0, 0.2)'или с'#FF0000'.

c.hline(bar.High)
c.hline(bar.High)
// Not supported for now

hline, горизонтальная линия представлена на заданном фиксированном ценовом уровне.

hline ((цена, название, цвет, стиль строки, ширина строки, редактируемый, отображаемый) параметры стиля строки необязательны: полосатый, точечный, твердый параметры отображения необязательны: ни один, все

c.plotarrow(bar.Close - bar.Open)
c.plotarrow(bar.Close - bar.Open)
// Not supported for now

plotarrow, изображайте стрелки вверх и вниз на диаграмме.

Plotarrow ((серия, заголовок, цветовая разборка, цветовой снижение, смещение, мини-высота, максимальная высота, редактируемые, show_last, отображение) параметры отображения необязательны: ни один, все

c.plotshape(bar.Low, {style: 'diamond'})
c.plotshape(bar.Low, style = 'diamond')
// Not supported for now

plotshape, нарисуйте на графике визуальные формы.

Plotshape (серия, заголовок, стиль, местоположение, цвет, смещение, текст, textcolor, редактируемый, размер, show_last, отображение) параметры стиля необязательны: diamond, square, label_down, label_up, arrow_down, arrow_up, circle, flag, triangle_down, triangle_up, cross, xcross параметры расположения необязательны: верхняя полоса, нижняя полоса, верхняя, нижняя, абсолютная параметры размера необязательны: 10px, 14px, 20px, 40px, 80px, сравнивая size.tiny, size.small, size.normal, size.large, size.huge на языке Пайн.size.autoЭто размер. параметры отображения необязательны: ни один, все

c.plotchar(bar.Close, {char: 'X'})
c.plotchar(bar.Close, char = 'X')
// Not supported for now

plotchar, нарисуйте визуальные формы на графике с использованием любого определенного символа Unicode.

plotchar ((серия, заголовок, char, местоположение, цвет, смещение, текст, textcolor, редактируемый, размер, show_last, отображение) параметры расположения необязательны: верхняя полоса, нижняя полоса, верхняя, нижняя, абсолютная параметры размера необязательны: 10px, 14px, 20px, 40px, 80px, сравнивая size.tiny, size.small, size.normal, size.large, size.huge на языке Пайн.size.autoЭто размер. параметры отображения необязательны: ни один, все

c.plotcandle(bar.Open*0.9, bar.High*0.9, bar.Low*0.9, bar.Close*0.9)
c.plotcandle(bar.Open*0.9, bar.High*0.9, bar.Low*0.9, bar.Close*0.9)
// Not supported for now

plotcandle, изобразить K-линейный график на графике.

plotcandle ((открыть, высоко, низко, близко, название, цвет, wickcolor, редактируемый, show_last, bordercolor, display) параметры отображения необязательны: ни один, все

c.signal("long", bar.High, 1.5)
c.signal("long", bar.High, 1.5)
// Not supported for now

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

сигнал ((направление, цена, qty, id) Параметр long передается для указания направления транзакции, вы можете выбрать long, closelong, short, closeshort.bar.Highэто положение маркерного сигнала по оси Y. Переданный параметр 1.5 указывает количество транзакций сигнала. Четвертый параметр может быть передан для замены выведенного текстового содержания по умолчанию, а текст выведенного сигнала - направление транзакции, например closelong.

c.reset()
c.reset()
// Not supported for now

reset, функция, недоступная на языке Pine, используется для опустошения данных диаграммы.

Перезагрузить (остаться) Вreset()метод может принимать один параметр,remain, чтобы указать количество данных, которые необходимо хранить.remainозначает очистку всех данных.

Стратегия пользовательский рисунок может использовать только один из способовKLineChart()функции илиChart()Для некоторых цветовых и стилевых настроек, используемых вKLineChart()Функция вызов, пожалуйста, обратитесь кИспользуйте функцию KLineChart, чтобы упростить проектирование чертежей стратегии.

{@fun/Log/Chart Chart} (Смеется)

Снова загрузить

Очистите бревно.

LogReset ((остаться)

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

function main() {
    // Keep the last 10 logs and clear the rest
    LogReset(10)     
}
def main():
    LogReset(10)
void main() {
    LogReset(10);
}

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

{@fun/Log Log}, {@fun/Log/LogVacuum LogVacuum}, {@fun/Log Log}, {@fun/Log/LogVacuum LogVacuum}, {@fun/Log/LogVacuum}, {@fun/Log/LogVacuum LogVacuum}, {@fun/Log/LogVacuum}, {@fun/Log/LogVacuum LogVacuum}, {@fun/LogVacuum}, {@fun/Log/LogVacuum}, {@fun/LogVacuum}, {@fun/LogVacuum},

Логвакуум

Используется для восстановления места хранения, занятогоSQLiteпри удалении данных после вызоваLogReset()Функция очистки журнала.

Логавакуум ((()

function main() {
    LogReset()
    LogVacuum()
}
def main():
    LogReset()
    LogVacuum()
void main() {
    LogReset()
    LogVacuum()
}

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

{@fun/Log/LogReset LogReset} - Я не знаю.

console.log

Он используется для вывода информации о отлаживании в столбце debug information на странице торговли в режиме реального времени.123456,console.logфункция выводит информацию о отлаживании на живой странице торговли, и в то же время, создать файл журнала с расширением.logи написать информацию отладки в/logs/storage/123456/в каталоге докера, к которому принадлежит прямая торговля, с префиксом файлового имениstdout_.

консоль.log ((...msgs)

Параметрmsgявляется содержанием вывода, и параметрmsgможет пройти более одного. СМС ложное string, number, bool, object, array, null и другие типы, поддерживаемые системой.

function main() {
    console.log("test console.log")
}
# Not supported
// Not supported
  • ТолькоJavaScriptязык поддерживает эту функцию.
  • Эта функция поддерживается только в режиме реального времени, но не в Debugging Tools или Backtesting System.
  • Вывод объекта преобразуется в строку[object Object], так что постарайтесь вывести как можно больше читаемой информации.

{@fun/Log/console.error консоль.error}

console.error

Используется для вывода ошибок в поле Debug message на странице реального времени.123456,console.errorфункция создает файл журнала с расширением.logв/logs/storage/123456/каталог докера, где живая торговля принадлежит, и пишет выход ошибки с префиксомstderr_.

консоль.ошибка...

Параметрmsgявляется содержанием вывода, и параметрmsgможет пройти более одного. СМС ложное string, number, bool, object, array, null и другие типы, поддерживаемые системой.

function main() {
    console.error("test console.error")
}
# Not supported
// Not supported
  • ТолькоJavaScriptязык поддерживает эту функцию.
  • Эта функция поддерживается только в режиме реального времени, но не в Debugging Tools или Backtesting System.
  • Вывод объекта преобразуется в строку[object Object], так что постарайтесь вывести как можно больше читаемой информации.

{@fun/Log/console.log консоль.log}

Рынок

exchange.GetTicker

Получить структуру {@struct/Ticker Ticker} спота или контракта, соответствующую в настоящее время установленной торговой паре, код контракта, т.е. данные тикера.GetTicker ()функция является членом функции обмена объекта {@var/EXCHANGE exchange}, использованиеexchangeфункции (методы) элемента объекта, относящиеся только кexchange, и это не будет повторяться в документе.

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

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

Параметрsymbolиспользуется для указания конкретной торговой пары и кода контракта, соответствующего запрашиваемым данным {@struct/Ticker Ticker}. При звонкеexchange.GetTicker(symbol)функция,exchangeЕсли вам нужно запросить рыночные данные с номинальной валютой в USDT и валютой торговли в BTC, параметрsymbolявляется:"BTC_USDT", а формат - формат торговой пары, определенный платформой FMZ. При звонкеexchange.GetTicker(symbol)функция,exchangeЕсли вам нужно запросить рыночные данные BTC U-стандартного вечного контракта, параметрsymbolявляется:"BTC_USDT.swap", а формат представляет собой сочетаниеторговые парыикод контрактаопределяется платформой FMZ, разделенной символом .. При звонкеexchange.GetTicker(symbol)функция,exchangeЕсли вам нужно запросить рыночные данные о U-стандартном опционном контракте BTC, параметрsymbolявляется:"BTC_USDT.BTC-240108-40000-C"(в качестве примера Binance Option BTC-240108-40000-C), формат представляет собой комбинациюторговые парыопределены платформой FMZ и конкретным кодом контракта опциона, определенным биржей, разделенным символом ..

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

function main(){
    // If it is a futures exchange object, set the contract code first, e.g. set it as a perpetual contract
    // exchange.SetContractType("swap")

    var ticker = exchange.GetTicker()
    /*
        The exchange interface may not be accessible due to network reasons (even if the docker program's device can open the exchange website, the API interface may not be accessible).
        At this point, the ticker is null, and it will cause an error when accessing ticker.High, so when testing this code, make sure that the exchange interface can be accessed.
    */
    Log("Symbol:", ticker.Symbol, "High:", ticker.High, "Low:", ticker.Low, "Sell:", ticker.Sell, "Buy:", ticker.Buy, "Last:", ticker.Last, "Open:", ticker.Open, "Volume:", ticker.Volume)
}
def main():
    ticker = exchange.GetTicker()
    Log("Symbol:", ticker["Symbol"], "High:", ticker["High"], "Low:", ticker["Low"], "Sell:", ticker["Sell"], "Buy:", ticker["Buy"], "Last:", ticker["Last"], "Open:", ticker.Open, "Volume:", ticker["Volume"])
void main() {
    auto ticker = exchange.GetTicker();
    Log("Symbol:", ticker.Symbol, "High:", ticker.High, "Low:", ticker.Low, "Sell:", ticker.Sell, "Buy:", ticker.Buy, "Last:", ticker.Last, "Open:", ticker.Open, "Volume:", ticker.Volume);
}

Для фьючерсных обменных объектов (т.е.exchangeилиexchanges[0]), необходимо установить код контракта с помощьюexchange.SetContractType()функция перед вызовом функции тикера, которая не будет повторяться.

function main() {
    var ticker = exchange.GetTicker("BTC_USDT")
    Log(ticker)
}
def main():
    ticker = exchange.GetTicker("BTC_USDT")
    Log(ticker)
void main() {
    auto ticker = exchange.GetTicker("BTC_USDT");
    Log(ticker);
}

Используйтеsymbolпараметр для запроса рыночных данных для определенного символа (символ спота).

ВTickerДанные, возвращенныеexchange.GetTicker()В случае, когдаHighиLowЭто симулируемые ценности, взятые из продажи и покупки на рынке в тот момент.TickerДанные, возвращенныеexchange.GetTicker()В то время, какHighиLowзначения основаны на данных, возвращенных обменом в капсулахTickинтерфейс, который включает в себя самые высокие и самые низкие цены в течение определенного периода (обычно в течение 24 часов). Обмены, которые не поддерживаютexchange.GetTicker()Функция:

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

{@fun/Market/exchange.GetDepth exchange.GetDepth}, {@fun/Market/exchange.GetTrades exchange.GetTrades}, {@fun/Market/exchange.GetRecords exchange.GetRecords}, {@fun/Market/exchange.GetTickers exchange.GetTickers}, {@fun/Market/exchange.GetTickers exchange.GetTickers}, {@fun/Market/exchange.GetTickers exchange.GetTickers}, {@fun/Market/exchange.GetTickers exchange.GetTickers}, {@fun/Market/exchange.GetTickers exchange.GetTickers}, {@fun/Market/exchange.GetTickers exchange.GetTickers}, {@fun/Market/exchange.GetTickers exchange.GetTickers}, {@fun/Market/exchange.GetTickers exchange.GetTickers exchange.GetTickers}, {@fun/Market/exchange

exchange.GetDepth

Получить структуру {@struct/Depth Depth} спота или контракта, соответствующую в настоящее время установленной торговой паре, код контракта, т.е. данные книги ордеров.

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

Обмен.ПолучитьГлубину() Обмен.Символ GetDepth (()

Параметрsymbolиспользуется для указания конкретной торговой пары и кода контракта, соответствующих запрошенным данным {@struct/Depth Depth}. Если этот параметр не будет передан, данные книги ордеров текущей установленной торговой пары и код контракта будут запрошены по умолчанию.exchange.GetDepth(symbol)функция,exchangeЕсли вам нужно запросить получение данных ордерной книги с номинальной валютой в USDT и валютой транзакции в BTC, параметрsymbolявляется:"BTC_USDT", а формат - формат торговой пары, определенный платформой FMZ.exchange.GetDepth(symbol)функция,exchangeЕсли вам нужно запросить данные ордерной книги BTC U-стандартного вечного контракта, параметрsymbolявляется:"BTC_USDT.swap", а формат представляет собой сочетаниеторговые парыикод контрактаопределяется платформой FMZ, разделенной символом ..exchange.GetDepth(symbol)функция,exchangeЕсли вам нужно запросить данные ордерной книги U-стандартного опционного контракта BTC, параметрsymbolявляется:"BTC_USDT.BTC-240108-40000-C"(в качестве примера Binance Option BTC-240108-40000-C), формат представляет собой комбинациюторговые парыопределены платформой FMZ и конкретным кодом контракта опциона, определенным биржей, разделенным символом .. символ ложное строка

function main(){
    var depth = exchange.GetDepth()
    /*
        The exchange interface may not be accessible due to network reasons (even if the docker program's device can open the exchange website, the API interface may not be accessible).
        At this point, the depth is null, which will cause an error when accessing depth.Asks[1].Price, so make sure you can access the exchange interface when testing the code.
    */
    var price = depth.Asks[1].Price
    Log("Sell 2 price is:", price)
}
def main():
    depth = exchange.GetDepth()
    price = depth["Asks"][1]["Price"]
    Log("Sell 2 price is:", price)
void main() {
    auto depth = exchange.GetDepth();
    auto price = depth.Asks[1].Price;
    Log("Sell 2 price is:", price);
}

Испытаниеexchange.GetDepth()Функция:

function main() {
    // BTC U-based perpetual contract
    var depth = exchange.GetDepth("BTC_USDT.swap")
    Log(depth)
}
def main():
    depth = exchange.GetDepth("BTC_USDT.swap")
    Log(depth)
void main() {
    auto depth = exchange.GetDepth("BTC_USDT.swap");
    Log(depth);
}

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

В системе обратного тестирования данные для каждого класса возвращаютсяexchange.GetDepth()Функция при использованииСимуляция клещаВ системе обратного тестирования данные, возвращаемыеexchange.GetDepth()Функция при использованииНастоящий ТикОбратное тестирование - это глубокий снимок второго уровня.

{@fun/Market/exchange.GetTicker exchange.GetTicker}, {@fun/Market/exchange.GetTrades exchange.GetTrades}, {@fun/Market/exchange.GetRecords exchange.GetRecords}

exchange.GetTrades

Получить массив структуры {@struct/Trade Trade} спота или контракта, соответствующий в настоящее время установленной торговой паре, код контракта, т.е. данные о рыночных сделках.

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

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

Параметрsymbolиспользуется для указания конкретной торговой пары и кода контракта, соответствующего запрошенным данным массива {@struct/Trade Trade}. Если этот параметр не будет передан, по умолчанию будут запрошены последние данные записи транзакции текущей установленной торговой пары и кода контракта.exchange.GetTrades(symbol)функция,exchangeЕсли вам нужно запросить получение данных ордерной книги с валютой, деноминированной в USDT, и валютой торговли в BTC, параметрsymbolявляется:"BTC_USDT", а формат - формат торговой пары, определенный платформой FMZ.exchange.GetTrades(symbol)функция,exchangeЕсли вам нужно запросить данные ордерной книги BTC U-стандартного вечного контракта, параметрsymbolявляется:"BTC_USDT.swap", а формат представляет собой сочетаниеторговые парыикод контрактаопределяется платформой FMZ, разделенной символом ..exchange.GetTrades(symbol)функция,exchangeЕсли вам нужно запросить данные ордерной книги BTC U-стандартного опционного контракта, параметрsymbolявляется:"BTC_USDT.BTC-240108-40000-C"(в качестве примера Binance Option BTC-240108-40000-C), формат представляет собой комбинациюторговые парыопределены платформой FMZ и конкретным кодом контракта опциона, определенным биржей, разделенным символом .. символ ложное строка

function main(){
    var trades = exchange.GetTrades()
    /*
        The exchange interface may not be accessible due to network reasons (even if the docker program's device can open the exchange website, the API interface may not be accessible).
        At this point, trade is null. When accessing trade[0].Id, it will cause an error. Therefore, when testing this code, ensure that you can access the exchange interface.
    */
    Log("id:", trades[0].Id, "time:", trades[0].Time, "Price:", trades[0].Price, "Amount:", trades[0].Amount, "type:", trades[0].Type)
}
def main():
    trades = exchange.GetTrades()
    Log("id:", trades[0]["Id"], "time:", trades[0]["Time"], "Price:", trades[0]["Price"], "Amount:", trades[0]["Amount"], "type:", trades[0]["Type"])
void main() {
    auto trades = exchange.GetTrades();
    Log("id:", trades[0].Id, "time:", trades[0].Time, "Price:", trades[0].Price, "Amount:", trades[0].Amount, "type:", trades[0].Type);
}

Проверитьexchange.GetTrades()Функция:

function main() {
    // BTC's U-based perpetual contract
    var trades = exchange.GetTrades("BTC_USDT.swap")
    Log(trades)
}
def main():
    trades = exchange.GetTrades("BTC_USDT.swap")
    Log(trades)
void main() {
    auto trades = exchange.GetTrades("BTC_USDT.swap");
    Log(trades);
}

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

exchange.GetTrades()Функция для получения текущих торговых пар, истории транзакций рынка (не их собственной), соответствующей контрактам. Некоторые биржи не поддерживают эту функцию, и конкретные данные, возвращенные, показывают, насколько диапазон записей транзакций зависит от биржи и должен обрабатываться в соответствии с конкретной ситуацией.exchange.GetRecords ()функция возвращает тот же порядок данных, то есть последний элемент массива является данными, ближайшими к текущему времени. Вexchange.GetTrades()функция возвращает пустой массив при использованииСимуляция клещаДанные, возвращаемыеexchange.GetTrades()функция при использованииНастоящий ТикBacktesting в системе backtesting - это данные о потоке заказов, т.е. массив {@struct/Trade Trade}. Обмены, которые не поддерживаютexchange.GetTrades()Функция:

Имя функции Не поддерживаемые спотовые обмены Фьючерсные биржи без поддержки
GetTrades Фьючерсы_BitMart / Фьючерсы_Bibox

{@fun/Market/exchange.GetTicker exchange.GetTicker}, {@fun/Market/exchange.GetDepth exchange.GetDepth}, {@fun/Market/exchange.GetRecords exchange.GetRecords}

exchange.GetRecords

Получить массив структуры {@struct/Record Record} спота или контракта, соответствующий в настоящее время установленной торговой паре, код контракта, т.е. данные K-линии.

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

Обмен.GetRecords ((() Обмен.GetRecords (символ) exchange.GetRecords (символ, точка) exchange.GetRecords ((символ, период, предел) Обмен.GetRecords (промежуток) Обмен.GetRecords ((период, лимит)

Параметрsymbolиспользуется для указания конкретной торговой пары и кода контракта, соответствующих запрошенным данным массива {@struct/Record Record}. Если этот параметр не будет передан, по умолчанию будут запрошены данные K-линии текущей установленной торговой пары и кода контракта.exchange.GetRecords(symbol)функция,exchangeЕсли вам нужно запросить получение данных с деноминированной валютой в USDT и валютой транзакции в BTC, параметрsymbolявляется:"BTC_USDT", а формат - формат торговой пары, определенный платформой FMZ.exchange.GetRecords(symbol)функция,exchangeЕсли вам нужно запросить данные ордерной книги BTC U-стандартного вечного контракта, параметрsymbolявляется:"BTC_USDT.swap", а формат представляет собой сочетаниеторговые парыикод контрактаопределяется платформой FMZ, разделенной символом ..exchange.GetRecords(symbol)функция,exchangeЕсли вам нужно запросить данные ордерной книги BTC U-стандартного опционного контракта, параметрsymbolявляется:"BTC_USDT.BTC-240108-40000-C"(в качестве примера Binance Option BTC-240108-40000-C), формат представляет собой комбинациюторговые парыопределены платформой FMZ и конкретным кодом контракта опциона, определенным биржей, разделенным символом .. символ ложное строка Параметрperiodуказывает период запрошенных данных K-линии, например: {@var/PERIOD/PERIOD_M1 PERIOD_M1}, {@var/PERIOD/PERIOD_M5 PERIOD_M5}, {@var/PERIOD/PERIOD_M15 PERIOD_M15} и т. д. Значение параметраperiodЕсли этот параметр не выполняется, период запрошенных по умолчанию данных K-линии является по умолчанию периодом K-линии текущей конфигурации стратегии реального времени / обратного теста. Период ложное Номер Параметрlimitиспользуется для указания длины запрашиваемых данных K-линии. Если этот параметр не передан, длина запроса по умолчанию - это максимальное количество строк K-линии, запрашиваемых в момент обмена интерфейсом K-линии. Этот параметр может привести к поиску данных K-линии обмена, и время потребления вызова функции увеличится во время поискового запроса. предел ложное Номер

function main() {
    // Print K-line data with a K-line period of 120 seconds (2 minutes)
    Log(exchange.GetRecords(60 * 2))         
    // Print K-line data with a K-line period of 5 minutes
    Log(exchange.GetRecords(PERIOD_M5))      
}
def main():
    Log(exchange.GetRecords(60 * 2))
    Log(exchange.GetRecords(PERIOD_M5))
void main() {
    Log(exchange.GetRecords(60 * 2)[0]);
    Log(exchange.GetRecords(PERIOD_M5)[0]);
}

Получите данные по К-линии для индивидуального периода.

function main() {
    var records = exchange.GetRecords(PERIOD_H1)
    /*
        The exchange interface may not be accessible due to network reasons (even if the docker program's device can open the exchange website, the API interface may not be accessible).
        At this point, records is null. When accessing records[0].Time, it will cause an error. Therefore, when testing this code, ensure that you can access the exchange interface.
    */
    Log("The first k-line data is Time:", records[0].Time, "Open:", records[0].Open, "High:", records[0].High)
    Log("The second k-line data is Time:", records[1].Time ,"Close:", records[1].Close)
    Log("Current K-line (latest)", records[records.length-1], "Previous K-line", records[records.length-2])
}
def main():
    records = exchange.GetRecords(PERIOD_H1)
    Log("The first k-line data is Time:", records[0]["Time"], "Open:", records[0]["Open"], "High:", records[0]["High"])
    Log("The second k-line data Time:", records[1]["Time"], "Close:", records[1]["Close"])
    Log("Current K-line (latest)", records[-1], "Previous K-line", records[-2])
void main() {
    auto records = exchange.GetRecords(PERIOD_H1);
    Log("The first k-line data is Time:", records[0].Time, "Open:", records[0].Open, "High:", records[0].High);
    Log("The second k-line data Time:", records[1].Time, "Close:", records[1].Close);
    Log("Current K-line (latest)", records[records.size() - 1], "Previous K-line", records[records.size() - 2]);
}

Выходные K-линейные строки:

function main() {
    var records = exchange.GetRecords("BTC_USDT.swap", 60, 100)
    Log(records)
}
def main():
    records = exchange.GetRecords("BTC_USDT.swap", 60, 100)
    Log(records)
void main() {
    auto records = exchange.GetRecords("BTC_USDT.swap", 60, 100);
    Log(records);
}

Когда конфигурацияexchangeОбъект является объектом фьючерсного обмена, используйтеsymbol, period, иlimitпараметры для запроса данных K-линии конкретного продукта (будущий продукт).

По умолчанию K-линейный период может быть установлен на страницах backtest и реального трейдинга.exchange.GetRecords()Если при вызове функции не указан параметр, соответствующие данные K-линии возвращаются в соответствии с периодом K-линии, установленным в обратном тесте и реальных параметрах рынка. Возвращаемое значение - массивRecordВ случае, если вы хотите, чтобы использовать эти структуры, возвращенные K-линейные данные будут накапливаться с течением времени, верхний предел накопленных K-линейных баров влияет наexchange.SetMaxBarLen()Ограничение по умолчанию составляет 5000 баров, когда оно не установлено. Когда данные K-линии достигают ограничения накопления K-линейной строки, они обновляются путем добавления K-линейной строки и удаления самой ранней K-линейной строки (например, очереди в / из).Tradeструктурированный массив) в реальном времени для генерации K-линий. Если интерфейс K-линии обмена поддерживает поиск страниц, несколько запросов API будут выполнены при вызовеexchange.SetMaxBarLen()Функция для установки большей длины K-линии. Когдаexchange.GetRecords()Если функция называется изначально, количество полученных K-линейных баров различается между обратным тестированием и реальной торговлей: - Система обратного тестирования будет получать определенное количество K-линейных баров до начала временного диапазона обратного тестирования заранее (по умолчанию 5000, настройки системы обратного тестирования и количество данных повлияют на окончательное количество возвращенных данных), как первоначальные K-линейные данные. - Количество K-линейных баров, полученных во время фактической торговли, основано на максимальном количестве данных, которые могут быть получены из интерфейса K-линии биржи. Вperiodпараметр установлен на 5, что является запросом на получение данных K-линии с периодом 5 секунд.periodПараметр не делится на 60 (т. е. представленный период не делится на минуты).exchange.GetTrades()Для получения данных записи транзакций и синтеза необходимых данных K-линии.periodпараметр делится на 60, то требуемые K-линейные данные синтезируются с использованием минимум 1-минутных K-линейных данных (если возможно, требуемые K-линейные данные синтезируются с использованием большего периода). Симулируемое обратное тестирование уровня в системе обратного тестирования требует установки базового периода K-линии (когда система обратного тестирования имитирует обратное тестирование уровня, соответствующие данные K-линии используются для генерации данных Tick в соответствии с установленным базовым периодом K-линии). Следует отметить, что период данных K-линии, полученных в стратегии, не должен быть меньше базового периода K-линии. ВC++язык имеет следующий пример кода, если вам нужно построить свои собственные данные K-линии:

#include <sstream>
void main() { 
    Records r;
    r.Valid = true;
    for (auto i = 0; i < 10; i++) {
        Record ele;
        ele.Time = i * 100000;
        ele.High = i * 10000;
        ele.Low = i * 1000;
        ele.Close = i * 100;
        ele.Open = i * 10;
        ele.Volume = i * 1;
        r.push_back(ele);
    }
    // Output display: Records[10]
    Log(r);                      
    auto ma = TA.MA(r,10);       
    // Output display: [nan,nan,nan,nan,nan,nan,nan,nan,nan,450]
    Log(ma);                     
}

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

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

{@fun/Market/exchange.GetTicker exchange.GetTicker}, {@fun/Market/exchange.GetDepth exchange.GetDepth}, {@fun/Market/exchange.GetTrades exchange.GetTrades}, {@fun/Market/exchange.SetMaxBarLen exchange.SetMaxBarLen}

exchange.GetPeriod

Получите период K-линии, установленный на странице веб-сайта платформы FMZ Quant Trading при обратном тестировании и выполнении стратегии в режиме реального времени, т.е. период K-линии по умолчанию, используемый при вызовеexchange.GetRecords()Функция без передачи параметров.

Период K-линии в секундах, целое число в секундах. Номер

Обмен.GetPeriod ((()

function main() {
    // For example, the K-line period set on the website page of the FMZ Quant Trading platform during backtesting and live trading is 1 hour.
    var period = exchange.GetPeriod()
    Log("K-line period:", period / (60 * 60), "hours")
}
def main():
    period = exchange.GetPeriod()
    Log("K-line period:", period / (60 * 60), "hours")
void main() {
    auto period = exchange.GetPeriod();
    Log("K-line period:", period / (60 * 60.0), "hours");
}

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

exchange.SetMaxBarLen

Установите максимальную длину линии К.

Обмен.SetMaxBarLen ((n)

Параметрnиспользуется для указания максимальной длины линии K. n неправда Номер

function main() {
    exchange.SetMaxBarLen(50)
    var records = exchange.GetRecords()
    Log(records.length, records)
}
def main():
    exchange.SetMaxBarLen(50)
    r = exchange.GetRecords()
    Log(len(r), r)
void main() {
    exchange.SetMaxBarLen(50);
    auto r = exchange.GetRecords();
    Log(r.size(), r[0]);
}

Вexchange.SetMaxBarLen()функция влияет на два аспекта для криптовалютной стратегии время выполнения:

  • Влияет на количество K-линейных баров (Bars), которые получаются при первом вызове.
  • Влияет на максимальное количество K-линейных баров (Bars).

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

exchange.GetRawJSON

Получить оригинальный контент возвращается к последнемуrestзапрос на текущий объект обмена ({@var/EXCHANGE exchange}, {@var/EXCHANGE/exchanges exchanges}).

Данные ответа дляrestПросьба. строка

Обмен.GetRawJSON ((()

function main(){
    exchange.GetAccount(); 
    var obj = JSON.parse(exchange.GetRawJSON());
    Log(obj);
}
import json
def main():
    exchange.GetAccount()
    obj = json.loads(exchange.GetRawJSON())
    Log(obj)
void main() {
    auto obj = exchange.GetAccount();
    // C++ does not support the GetRawJSON function
    Log(obj);
}

Вexchange.GetRawJSON()Функция поддерживается только для реальной торговли.C++ language.

{@var/EXCHANGE обмен}

exchange.GetRate

Получить обменный курс, установленный для обменного объекта.

Текущая стоимость обменного курса объекта обмена. Номер

Обмен.GetRate ((()

function main(){
    Log(exchange.GetTicker())
    // Set up exchange rate conversion
    exchange.SetRate(7)
    Log(exchange.GetTicker())
    Log("Current exchange rate:", exchange.GetRate())
}
def main():
    Log(exchange.GetTicker())
    exchange.SetRate(7)
    Log(exchange.GetTicker())
    Log("Current exchange rate:", exchange.GetRate())
void main() {
    Log(exchange.GetTicker());
    exchange.SetRate(7);
    Log(exchange.GetTicker());
    Log("Current exchange rate:", exchange.GetRate());
}

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

{@fun/Trade/exchange.SetRate exchange.SetRate} (Секретный обмен)

exchange.SetData

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

Длина строки после параметраvalueКодировка JSON. Номер

exchange.SetData ((ключ, значение)

Название сбора данных. ключ неправда строка Данные, которые должны быть загруженыexchange.SetData()Функция имеет структуру данных массива.exchange.GetData()функция при запросе внешних данных, т.е.:"schema": ["time", "data"]- Да. стоимость неправда массив

/*backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
function main() {
    var data = [
        [1579536000000, "abc"],
        [1579622400000, 123],
        [1579708800000, {"price": 123}],
        [1579795200000, ["abc", 123, {"price": 123}]]
    ]
    exchange.SetData("test", data)
    while(true) {
        Log(exchange.GetData("test"))
        Sleep(1000)
    }
}
'''backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
'''              

def main():
    data = [
        [1579536000000, "abc"],
        [1579622400000, 123],
        [1579708800000, {"price": 123}],
        [1579795200000, ["abc", 123, {"price": 123}]]
    ]
    exchange.SetData("test", data)
    while True:
        Log(exchange.GetData("test"))
        Sleep(1000)
/*backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/              

void main() {
    json data = R"([
        [1579536000000, "abc"],
        [1579622400000, 123],
        [1579708800000, {"price": 123}],
        [1579795200000, ["abc", 123, {"price": 123}]]
    ])"_json;
    
    exchange.SetData("test", data);
    while(true) {
        Log(exchange.GetData("test"));
        Sleep(1000);
    }
}

Это требует, чтобы данные для параметраvalueбыть в том же формате, что иdataВы можете видеть, что временная метка1579622400000соответствует времени2020-01-22 00:00:00, и что когда программа стратегии выполняется после этого времени, вызватьexchange.GetData()Функция для получения данных до следующей временной отметки данных1579708800000, то есть, время2020-01-23 00:00:00Что ты получишь[1579622400000, 123]В следующем примере, во время выполнения (обратное тестирование или живая торговля), текущий момент достигает или превышает временную отметку1579795200000,exchange.GetData()функция вызвана и возвращается значение:{"Time":1579795200000,"Data":["abc", 123,{"price":123}]}. "Time":1579795200000соответствует1579795200000в данных[1579795200000, ["abc", 123, {"price": 123}]]. "Data":["abc", 123, {"price": 123}]соответствует данным["abc", 123, {"price": 123}]]в[1579795200000, ["abc", 123, {"price": 123}]].

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

{@fun/Market/exchange.GetData exchange.GetData} (См. также:

exchange.GetData

Вexchange.GetData()Функция используется для загрузки данныхexchange.SetData()функция или предоставляется внешней ссылкой.

Записи в сборе данных. объект

Обмен.GetData ((ключ) Обмен.GetData ((ключ, время)

Название сбора данных. Ключ Истинно строка Используется для настройки времени выхода кэша в миллисекундах. Тайм-аут ложное Номер

/*backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
function main() {
    exchange.SetData("test", [[1579536000000, _D(1579536000000)], [1579622400000, _D(1579622400000)], [1579708800000, _D(1579708800000)]])
    while(true) {
        Log(exchange.GetData("test"))
        Sleep(1000 * 60 * 60 * 24)
    }
}
'''backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
'''  
def main():
    exchange.SetData("test", [[1579536000000, _D(1579536000000/1000)], [1579622400000, _D(1579622400000/1000)], [1579708800000, _D(1579708800000/1000)]])
    while True:
        Log(exchange.GetData("test"))
        Sleep(1000 * 60 * 60 * 24)
/*backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/    
void main() {
    json arr = R"([[1579536000000, ""], [1579622400000, ""], [1579708800000, ""]])"_json;
    arr[0][1] = _D(1579536000000);
    arr[1][1] = _D(1579622400000);
    arr[2][1] = _D(1579708800000);
    exchange.SetData("test", arr);
    while(true) {
        Log(exchange.GetData("test"));
        Sleep(1000 * 60 * 60 * 24);
    }
}

Звонок, чтобы записать данные непосредственно.

/*backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
function main() {
    while(true) {
        Log(exchange.GetData("http://xxx.xx.x.xx:9090/data"))
        Sleep(1000)
    }
}
'''backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
'''              

def main():
    while True:
        Log(exchange.GetData("http://xxx.xx.x.xx:9090/data"))
        Sleep(1000)
/*backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/              

void main() {
    while(true) {
        Log(exchange.GetData("http://xxx.xx.x.xx:9090/data"));
        Sleep(1000);
    }
}

Он поддерживает запрос данных через внешние ссылки, формат запрашиваемых данных для:

{
    "schema":["time","data"],
    "data":[
        [1579536000000, "abc"],
        [1579622400000, 123],
        [1579708800000, {"price": 123}],
        [1579795200000, ["abc", 123, {"price": 123}]]
    ]
}

Где?schemaФормат данных для каждой записи в теле загруженных данных, установленный на["time", "data"]соответствующий формату данных по вводу вdataатрибут. Что хранится вdataатрибут - это тело данных, причем каждая запись состоит из временной отметки на уровне миллисекунд и содержимого данных (которые могут быть любыми данными, кодируемыми JSON). Сервисная программа для тестирования, написанная на Go:

package main
import (
    "fmt"
    "net/http"
    "encoding/json"
)                

func Handle (w http.ResponseWriter, r *http.Request) {
    defer func() {
        fmt.Println("req:", *r)
        ret := map[string]interface{}{
            "schema": []string{"time","data"},
            "data": []interface{}{
                []interface{}{1579536000000, "abc"},
                []interface{}{1579622400000, 123},
                []interface{}{1579708800000, map[string]interface{}{"price":123}},
                []interface{}{1579795200000, []interface{}{"abc", 123, map[string]interface{}{"price":123}}},
            },
        }
        b, _ := json.Marshal(ret)
        w.Write(b)
    }()
}                

func main () {
    fmt.Println("listen http://localhost:9090")
    http.HandleFunc("/data", Handle)
    http.ListenAndServe(":9090", nil)
}

Данные ответа программы при получении запроса:

{
    "schema":["time","data"],
    "data":[
        [1579536000000, "abc"],
        [1579622400000, 123],
        [1579708800000, {"price": 123}],
        [1579795200000, ["abc", 123, {"price": 123}]]
    ]
}

Код стратегии испытания:

function main() {
    Log(exchange.GetData("http://xxx.xx.x.xx:9090/data"))
    Log(exchange.GetData("https://www.fmz.com/upload/asset/32bf73a69fc12d36e76.json"))
}
def main():
    Log(exchange.GetData("http://xxx.xx.x.xx:9090/data"))
    Log(exchange.GetData("https://www.fmz.com/upload/asset/32bf73a69fc12d36e76.json"))
void main() {
    Log(exchange.GetData("http://xxx.xx.x.xx:9090/data"));
    Log(exchange.GetData("https://www.fmz.com/upload/asset/32bf73a69fc12d36e76.json"));
}

Способ вызова для получения данных внешней ссылки.

function main() {
    Log(exchange.GetData("https://www.datadata.com/api/v1/query/xxx/data"))   // The xxx part of the link is the code of the query data, here xxx is an example.
}
def main():
    Log(exchange.GetData("https://www.datadata.com/api/v1/query/xxx/data"))
void main() {
    Log(exchange.GetData("https://www.datadata.com/api/v1/query/xxx/data"));
}

Запрос данных для запроса, созданного на платформеданные, требуя, чтобы формат данных ответа был (должен содержать время, поля данных, описанные в схеме):

{
    "data": [],
    "schema": ["time", "data"]
}

Поле data является требуемым содержанием данных, и данные в поле data должны быть такими же, как те, которые согласованы в схеме.exchange.GetData()призвана функция, возвращается объект JSON, например:{"Time":1579795200000, "Data":"..."}.

Получить данные сразу для обратного тестирования и кэширования одной минуты данных для торговли в режиме реального времени.from(с указанием времени в секундах),to(время в секундах) к запросу, параметры, такие какperiod(подлежащий период K-линии, установленный в миллисекундах) используются для определения временных рамок, в течение которых должны быть получены данные.

{@fun/Market/exchange.SetData exchange.SetData} - что это такое?

exchange.GetMarkets

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

Словарь, содержащий структуру {@struct/Market Market}. объект

Обмен.GetMarkets ((()

function main() {
    var markets = exchange.GetMarkets()
    var currency = exchange.GetCurrency()

    // Get the current contract code can also use exchange.GetContractType() function
    var ct = "swap"

    var key = currency + "." + ct
    Log(key, ":", markets[key])
}
def main():
    markets = exchange.GetMarkets()
    currency = exchange.GetCurrency()
    ct = "swap"

    key = currency + "." + ct
    Log(key, ":", markets[key])
void main() {
    auto markets = exchange.GetMarkets();
    auto currency = exchange.GetCurrency();

    auto ct = "swap";
    auto key = currency + "." + ct;
    Log(key, ":", markets[key]);
}

Пример вызова на объект биржи фьючерсов:

/*backtest
start: 2023-05-10 00:00:00
end: 2023-05-20 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

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

    var tbl1 = {
        type: "table",
        title: "markets1",
        cols: ["key", "Symbol", "BaseAsset", "QuoteAsset", "TickSize", "AmountSize", "PricePrecision", "AmountPrecision", "MinQty", "MaxQty", "MinNotional", "MaxNotional", "CtVal"],
        rows: []
    }

    var markets1 = exchange.GetMarkets()
    for (var key in markets1) {
        var market = markets1[key]
        tbl1.rows.push([key, market.Symbol, market.BaseAsset, market.QuoteAsset, market.TickSize, market.AmountSize, market.PricePrecision, market.AmountPrecision, market.MinQty, market.MaxQty, market.MinNotional, market.MaxNotional, market.CtVal])
    }

    for (var symbol of arrSymbol) {
        exchange.GetTicker(symbol)
    }

    var tbl2 = {
        type: "table",
        title: "markets2",
        cols: ["key", "Symbol", "BaseAsset", "QuoteAsset", "TickSize", "AmountSize", "PricePrecision", "AmountPrecision", "MinQty", "MaxQty", "MinNotional", "MaxNotional", "CtVal"],
        rows: []
    }

    var markets2 = exchange.GetMarkets()
    for (var key in markets2) {
        var market = markets2[key]
        tbl2.rows.push([key, market.Symbol, market.BaseAsset, market.QuoteAsset, market.TickSize, market.AmountSize, market.PricePrecision, market.AmountPrecision, market.MinQty, market.MaxQty, market.MinNotional, market.MaxNotional, market.CtVal])
    }

    LogStatus("`" + JSON.stringify([tbl1, tbl2]) + "`")
}
'''backtest
start: 2023-05-10 00:00:00
end: 2023-05-20 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
'''

import json

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

    tbl1 = {
        "type": "table",
        "title": "markets1",
        "cols": ["key", "Symbol", "BaseAsset", "QuoteAsset", "TickSize", "AmountSize", "PricePrecision", "AmountPrecision", "MinQty", "MaxQty", "MinNotional", "MaxNotional", "CtVal"],
        "rows": []
    }

    markets1 = exchange.GetMarkets()
    for key in markets1:
        market = markets1[key]
        tbl1["rows"].append([key, market["Symbol"], market["BaseAsset"], market["QuoteAsset"], market["TickSize"], market["AmountSize"], market["PricePrecision"], market["AmountPrecision"], market["MinQty"], market["MaxQty"], market["MinNotional"], market["MaxNotional"], market["CtVal"]])

    for symbol in arrSymbol:
        exchange.GetTicker(symbol)

    tbl2 = {
        "type": "table",
        "title": "markets2",
        "cols": ["key", "Symbol", "BaseAsset", "QuoteAsset", "TickSize", "AmountSize", "PricePrecision", "AmountPrecision", "MinQty", "MaxQty", "MinNotional", "MaxNotional", "CtVal"],
        "rows": []
    }

    markets2 = exchange.GetMarkets()
    for key in markets2:
        market = markets2[key]
        tbl2["rows"].append([key, market["Symbol"], market["BaseAsset"], market["QuoteAsset"], market["TickSize"], market["AmountSize"], market["PricePrecision"], market["AmountPrecision"], market["MinQty"], market["MaxQty"], market["MinNotional"], market["MaxNotional"], market["CtVal"]])

    LogStatus("`" + json.dumps([tbl1, tbl2]) + "`")
/*backtest
start: 2023-05-10 00:00:00
end: 2023-05-20 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

void main() {
    auto arrSymbol = {"SOL_USDT.swap", "BTC_USDT.quarter", "ETH_USDT.swap", "ETH_USDT.quarter"};

    json tbl1 = R"({
        "type": "table",
        "title": "markets1",
        "cols": ["key", "Symbol", "BaseAsset", "QuoteAsset", "TickSize", "AmountSize", "PricePrecision", "AmountPrecision", "MinQty", "MaxQty", "MinNotional", "MaxNotional", "CtVal"],
        "rows": []
    })"_json;

    auto markets1 = exchange.GetMarkets();
    for (auto& [key, market] : markets1.items()) {
        json arrJson = {key, market["Symbol"], market["BaseAsset"], market["QuoteAsset"], market["TickSize"], market["AmountSize"], market["PricePrecision"], market["AmountPrecision"], market["MinQty"], market["MaxQty"], market["MinNotional"], market["MaxNotional"], market["CtVal"]};
        tbl1["rows"].push_back(arrJson);
    }

    for (const auto& symbol : arrSymbol) {
        exchange.GetTicker(symbol);
    }

    json tbl2 = R"({
        "type": "table",
        "title": "markets2",
        "cols": ["key", "Symbol", "BaseAsset", "QuoteAsset", "TickSize", "AmountSize", "PricePrecision", "AmountPrecision", "MinQty", "MaxQty", "MinNotional", "MaxNotional", "CtVal"],
        "rows": []
    })"_json;

    auto markets2 = exchange.GetMarkets();
    for (auto& [key, market] : markets2.items()) {
        json arrJson = {key, market["Symbol"], market["BaseAsset"], market["QuoteAsset"], market["TickSize"], market["AmountSize"], market["PricePrecision"], market["AmountPrecision"], market["MinQty"], market["MaxQty"], market["MinNotional"], market["MaxNotional"], market["CtVal"]};
        tbl2["rows"].push_back(arrJson);
    }

    json tbls = R"([])"_json;
    tbls.push_back(tbl1);
    tbls.push_back(tbl2);
    LogStatus("`" + tbls.dump() + "`");
}

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

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

{
    "BTC_USDT" : {...},  // The key value is the Market structure
    "LTC_USDT" : {...},  
    ...
}

Для бирж фьючерсных контрактов, поскольку может существовать несколько контрактов для одного сорта, например:BTC_USDTТорговые пары, есть постоянные контракты, квартальные контракты и так далее.exchange.GetMarkets()функция возвращает словарь с именем ключа пары в сочетании с кодом контракта, например:

{
    "BTC_USDT.swap" : {...},     // The key value is the Market structure
    "BTC_USDT.quarter" : {...}, 
    "LTC_USDT.swap" : {...},
    ...
}
  • Вexchange.GetMarkets()Функция поддерживает прямую торговлю, систему обратного тестирования.
  • Вexchange.GetMarkets()Функция возвращает информацию о рынке только для сортов, которые торгуются онлайн на бирже.
  • Вexchange.GetMarkets()функция не поддерживает опционные контракты.

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

Имя функции Не поддерживаемые спотовые обмены Фьючерсные биржи без поддержки
GetMarkets Coincheck / Bithumb / BitFlyer

{@struct/Market Market} (Рыночный рынок)

exchange.GetTickers

Вexchange.GetTickers()Функция используется для получения обменных агрегированных данных тикеров (массив структуры {@struct/Ticker Ticker}).exchangeвозвращает данные тикеров для всех торговых пар, когда речь идет об объекте спотового обмена;exchangeвозвращает данные тикера для всех контрактов, когда речь идет об обмене фьючерсами.

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

Обмен.GetTickers ((()

function main() {
    var tickers = exchange.GetTickers()
    if (tickers && tickers.length > 0) {
        Log("Number of tradable items on the exchange:", tickers.length)
    }
}
def main():
    tickers = exchange.GetTickers()
    if tickers and len(tickers) > 0:
        Log("Number of tradable items on the exchange:", len(tickers))
void main() {
    auto tickers = exchange.GetTickers();
    if (tickers.Valid && tickers.size() > 0) {
        Log("Number of tradable items on the exchange:", tickers.size());
    }
}

Позвониexchange.GetTickers()функция получения агрегированных рыночных данных.

/*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 = ["ADA_USDT", "LTC_USDT", "ETH_USDT", "SOL_USDT"]
    
    // Before requesting other trading pair market data, call Get Tickers
    var tickers1 = exchange.GetTickers()
    var tbl1 = {type: "table", title: "tickers1", cols: ["Symbol", "High", "Open", "Low", "Last", "Buy", "Sell", "Time", "Volume"], rows: []}
    for (var ticker of tickers1) {
        tbl1.rows.push([ticker.Symbol, ticker.High, ticker.Open, ticker.Low, ticker.Last, ticker.Buy, ticker.Sell, ticker.Time, ticker.Volume])
    }
    
    // Request market data for other trading pairs
    for (var symbol of arrSymbol) {
        exchange.GetTicker(symbol)
    }

    // Call GetTickers again
    var tickers2 = exchange.GetTickers()
    var tbl2 = {type: "table", title: "tickers2", cols: ["Symbol", "High", "Open", "Low", "Last", "Buy", "Sell", "Time", "Volume"], rows: []}
    for (var ticker of tickers2) {
        tbl2.rows.push([ticker.Symbol, ticker.High, ticker.Open, ticker.Low, ticker.Last, ticker.Buy, ticker.Sell, ticker.Time, ticker.Volume])
    }

    LogStatus("`" + JSON.stringify([tbl1, tbl2]) +  "`")
}
'''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 = ["ADA_USDT", "LTC_USDT", "ETH_USDT", "SOL_USDT"]
        
    tickers1 = exchange.GetTickers()
    tbl1 = {"type": "table", "title": "tickers1", "cols": ["Symbol", "High", "Open", "Low", "Last", "Buy", "Sell", "Time", "Volume"], "rows": []}
    for ticker in tickers1:
        tbl1["rows"].append([ticker["Symbol"], ticker["High"], ticker["Open"], ticker["Low"], ticker["Last"], ticker["Buy"], ticker["Sell"], ticker["Time"], ticker["Volume"]])
    
    for symbol in arrSymbol:
        exchange.GetTicker(symbol)
    
    tickers2 = exchange.GetTickers()
    tbl2 = {"type": "table", "title": "tickers2", "cols": ["Symbol", "High", "Open", "Low", "Last", "Buy", "Sell", "Time", "Volume"], "rows": []}
    for ticker in tickers2:
        tbl2["rows"].append([ticker["Symbol"], ticker["High"], ticker["Open"], ticker["Low"], ticker["Last"], ticker["Buy"], ticker["Sell"], ticker["Time"], ticker["Volume"]])
    
    LogStatus("`" + json.dumps([tbl1, tbl2]) +  "`")
/*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"}]
*/

json tickerToJson(const Ticker& ticker) {
    json arrJson;

    arrJson.push_back(ticker.Symbol);
    arrJson.push_back(ticker.High);
    arrJson.push_back(ticker.Open);
    arrJson.push_back(ticker.Low);
    arrJson.push_back(ticker.Last);
    arrJson.push_back(ticker.Buy);
    arrJson.push_back(ticker.Sell);
    arrJson.push_back(ticker.Time);
    arrJson.push_back(ticker.Volume);

    return arrJson;
}

void main() {
    std::string arrSymbol[] = {"ADA_USDT", "LTC_USDT", "ETH_USDT", "SOL_USDT"};
    
    auto tickers1 = exchange.GetTickers();
    json tbl1 = R"({
        "type": "table", 
        "cols": ["Symbol", "High", "Open", "Low", "Last", "Buy", "Sell", "Time", "Volume"],
        "rows": []
    })"_json;
    tbl1["title"] = "tickers1";
    
    for (const auto& ticker : tickers1) {
        json arrJson = tickerToJson(ticker);
        tbl1["rows"].push_back(arrJson);
    }
    
    for (const std::string& symbol : arrSymbol) {
        exchange.GetTicker(symbol);
    }
    
    auto tickers2 = exchange.GetTickers();
    json tbl2 = R"({
        "type": "table", 
        "cols": ["Symbol", "High", "Open", "Low", "Last", "Buy", "Sell", "Time", "Volume"],
        "rows": []
    })"_json;
    tbl2["title"] = "tickers2";
    
    for (const auto& ticker : tickers2) {
        json arrJson = tickerToJson(ticker);
        tbl2["rows"].push_back(arrJson);
    }
    
    json tbls = R"([])"_json;
    tbls.push_back(tbl1);
    tbls.push_back(tbl2);
    LogStatus("`" + tbls.dump() + "`");
}

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

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

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

Имя функции Не поддерживаемые спотовые обмены Фьючерсные биржи без поддержки
GetTickers Zaif / WOO / Gemini / Coincheck / BitFlyer / Bibox Фьючерсы_WOO / Фьючерсы_dYdX / Фьючерсы_Deribit / Фьючерсы_Bibox / Фьючерсы_Aevo

{@struct/TickerTicker}, {@fun/Market/exchange.GetTicker exchange.GetTicker}, {@fun/Market/exchange.GetTicker exchange.GetTicker}, {@fun/Market/exchange.GetTicker exchange.GetTicker}, {@fun/Market/exchange.GetTicker exchange.GetTicker}, {@fun/Market/exchange.GetTicker exchange.GetTicker}, {@fun/Market/exchange.GetTicker exchange.GetTicker}, {@fun/Market/exchange.GetTicker exchange.GetTicker}

Торговля

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}

Счет

exchange.GetAccount

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

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

Обмен.GetAccount ((()

function main(){
    // Switching trading pairs
    exchange.IO("currency", "BTC_USDT")     
    // Take OKX futures as an example, set the contract as the current week's contract, the current trading pair is BTC_USDT, so the current contract is BTC's U-nominal current week contract
    exchange.SetContractType("this_week")   
    // Get current account asset data
    var account = exchange.GetAccount()
    // Available balance of USDT as margin
    Log(account.Balance)
    // USDT freeze amount as margin
    Log(account.FrozenBalance)
    // Current asset equity
    Log(account.Equity)
    // The unrealized profit and loss of all positions held with the current asset as margin
    Log(account.UPnL)
}
def main():
    exchange.IO("currency", "BTC_USDT")
    exchange.SetContractType("this_week")    
    account = exchange.GetAccount()
    Log(account["Balance"])
    Log(account["FrozenBalance"])
    Log(account["Equity"])
    Log(account["UPnL"])
void main() {
    exchange.IO("currency", "BTC_USDT");
    exchange.SetContractType("this_week");    
    auto account = exchange.GetAccount();
    Log(account.Balance);
    Log(account.FrozenBalance);
    Log(account["Equity"])
    Log(account["UPnL"])
}

Настройте торговые пары, коды контрактов, и получите информацию о текущем счете.

Если объект обмена установлен на обмен фьючерсных контрактов криптовалют, и переключен на контракт сUSDTкак маржа (см. {@fun/Account/exchange.SetCurrency exchange.SetCurrency}, {@fun/Futures/exchange.SetContractType exchange.SetContractType} функции для того, как переключиться).USDTв качестве маржи, которая фиксируется вBalance, FrozenBalanceатрибуты структуры {@struct/Account Account}. Если объект обмена установлен на биржу фьючерсных контрактов на криптовалюту и переведен на валютный контракт, актив представляется в валюте в качестве маржи и регистрируется вStocks, FrozenStocksатрибуты структуры {@struct/Account Account}. При использовании унифицированного счета Binance Futures, при вызовеexchange.GetAccount()Функция запроса информации о счете, объединенные данные - это сумма всех активов, конвертированных вДоллар США. Он отображается вBalanceЕсли вам нужно рассчитать сумму конвертации других активов, вы можете использовать сумму конвертации в долларах США, разделенную на цену индекса (актива, который должен быть конвертирован), а затем разделенную на ставку залога (актива, который должен быть конвертирован), чтобы рассчитать ее.

{@struct/Account Account}, {@fun/Account/exchange.SetCurrency exchange.SetCurrency}, {@fun/Futures/exchange.SetContractType exchange.SetContractType}, {@struct/Account Account}, {@fun/Account/exchange.SetCurrency exchange.SetCurrency}, {@fun/Futures/exchange.SetContractType exchange.SetContractType}

exchange.GetAssets

Вexchange.GetAssetsфункция используется для запроса информации об активах биржевого счета.

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

Обмен.GetAssets ((()

function main() {
    // exchange.SetCurrency("BTC_USDT")  // You can set up trading pairs
    // exchange.SetContractType("swap")  // You can set up contracts
    var assets = exchange.GetAssets()
    Log(assets)
}
def main():
    # exchange.SetCurrency("BTC_USDT")  # You can set up trading pairs
    # exchange.SetContractType("swap")  # You can set up contracts
    assets = exchange.GetAssets()
    Log(assets)
void main() {
    // exchange.SetCurrency("BTC_USDT");  // You can set up trading pairs
    // exchange.SetContractType("swap");  // You can set up contracts
    auto assets = exchange.GetAssets();
    Log(assets);
}

Получить информацию о активах обменного счета,exchange.GetAssets()возвращает массив с элементами структуры активов.

ВGetAssets()Функция объекта Futures Exchange возвращает маржинальные активы по текущей торговой паре (на основе валюты, на основе USDT, на основе USDC и т.д.).

{@struct/Asset Asset}

exchange.GetName

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

Вexchange.GetName()функция возвращает название биржи, определенной платформой FMZ Quant Trading. строка

exchange.GetName ((()

function main() {
    Log("The exchange object exchange is judged to be Binance spot, and the result is judged to be:", exchange.GetName() == "Binance")
}
def main():
    Log("The exchange object exchange is judged to be Binance spot, and the result is judged to be:", exchange.GetName() == "Binance")
void main() {
    Log("The exchange object exchange is judged to be Binance spot, and the result is judged to be:", exchange.GetName() == "Binance");
}

Вexchange.GetName()Функция обычно используется для идентификации обменных объектов, таких какexchangeилиexchanges[1], exchanges[2]В коде стратегии названия криптовалютных фьючерсных контрактов имеют фиксированный префиксFutures_.

{@fun/Account/exchange.GetLabel exchange.GetLabel} - Я не знаю.

exchange.GetLabel

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

Вexchange.GetLabel()функция возвращает пользовательскую этикетку, которая была установлена при настройке объекта обмена. строка

Обмен.GetLabel ((()

function main() {
    Log("exchange label:", exchange.GetLabel())
}
def main():
    Log("exchange label:", exchange.GetLabel())
void main() {
    Log("exchange label:", exchange.GetLabel());
}

Объекты обмена, такие какexchangeилиexchanges[1], exchanges[2]в коде стратегии обозначаются тегом "set tag".

{@var/EXCHANGE обмен}

exchange.GetCurrency

Вexchange.GetCurrency()Функция используется для получения текущей установленной торговой пары.

Вexchange.GetCurrency()функция возвращает торговую пару, установленную текущим объектом {@var/EXCHANGE exchange}. строка

Обмен.GetCurrency ((()

function main() {
    Log("the current trading pair of exchange is:", exchange.GetCurrency())
}
def main():
    Log("the current trading pair of exchange is:", exchange.GetCurrency())
void main() {
    Log("the current trading pair of exchange is:", exchange.GetCurrency());
}

Формат торговой пары имеет однородное большое значение, используя подчеркивания для разделенияbaseCurrencyиquoteCurrency, например:BTC_USDT.

{@fun/Account/exchange.SetCurrency exchange.SetCurrency} (Ссылка на ссылку на ссылку на ссылку)

exchange.SetCurrency

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

exchange.SetCurrency ((валюта)

ВcurrencyПараметр используется для установки торговой пары, которая должна быть переключена.baseCurrencyотquoteCurrency, например:BTC_USDT- Да. Валюта неправда строка

function main() {
    var ticker = exchange.GetTicker() 
    Log(ticker)
    Log(exchange.GetAccount())    
    // Switching trading pairs, pay attention to the changes of ticker data and account information after switching
    exchange.SetCurrency("LTC_USDT")
    Log("Switch to LTC_USDT")
    ticker = exchange.GetTicker()
    Log(ticker)
    Log(exchange.GetAccount())
}
def main():
    ticker = exchange.GetTicker()
    Log(ticker)
    Log(exchange.GetAccount())
    exchange.SetCurrency("LTC_USDT")
    Log("Switch to LTC_USDT")
    ticker = exchange.GetTicker()
    Log(ticker)
    Log(exchange.GetAccount())
void main() {
    auto ticker = exchange.GetTicker();
    Log(ticker);
    Log(exchange.GetAccount());
    exchange.SetCurrency("LTC_USDT");
    Log("Switch to LTC_USDT");
    ticker = exchange.GetTicker();
    Log(ticker);
    Log(exchange.GetAccount());
}
  1. Совместима сexchange.IO("currency", "BTC_USDT")метод переключения, пожалуйста, см. {@funexcahnge.IO}.
  2. Поддержка переключения торговых пар в системе обратного тестирования, название деноминированной валюты не может быть изменено при переключении торговых пар в системе обратного тестирования.BTC_USDTможет быть переключена наLTC_USDT, не кLTC_BTC.
  3. Количество торговых валют равняется 0 после переключения на торговую пару, изначально установленную на странице nonbacktest.BTC_USDT, количествоBTCравняется 3, числоUSDTВ это время переключается наLTC_USDTНемедленно после переключения количество торговых валют равняется нулю, т.е. количествоLTC_USDTв счете равен 0, то есть количествоLTCна счете 0, и переключенная торговая пара разделяет количествоUSDT, что составляет 10 000.

{@fun/Account/exchange.GetCurrency exchange.GetCurrency} (Версия на английском языке)

exchange.GetQuoteCurrency

Вexchange.GetQuoteCurrency()Функция используется для получения названия деноминированной валюты текущей торговой пары, т.е.quoteCurrency.

Вexchange.GetQuoteCurrency()Функция возвращает название валюты текущей торговой пары. строка

Обмен.GetQuoteCurrency ((()

function main() {
    exchange.SetCurrency("BTC_USDT")
    Log("BTC_USDT denominated currency name:", exchange.GetQuoteCurrency())
    // exchange.SetCurrency("ETH_BTC")
    // Log("ETH_BTC denominated currency name:", exchange.GetQuoteCurrency())
}
def main():
    exchange.SetCurrency("BTC_USDT")
    Log("BTC_USDT denominated currency name:", exchange.GetQuoteCurrency())
    # exchange.SetCurrency("ETH_BTC")
    # Log("ETH_BTC denominated currency name:", exchange.GetQuoteCurrency())
void main() {
    exchange.SetCurrency("BTC_USDT");
    Log("BTC_USDT denominated currency name:", exchange.GetQuoteCurrency());
    // exchange.SetCurrency("ETH_BTC")
    // Log("ETH_BTC denominated currency name:", exchange.GetQuoteCurrency())
}

Например: {@var/EXCHANGE exchange} exchange objects текущая пара транзакцийBTC_USDT,exchange.GetQuoteCurrency()функция возвращаетUSDT. Если текущая торговая параETH_BTC,exchange.GetQuoteCurrency()функция возвращаетBTC.

{@fun/Account/exchange.GetCurrency exchange.GetCurrency}, {@fun/Account/exchange.SetCurrency exchange.SetCurrency}

Фьючерсы

exchange.GetPositions

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

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

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

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

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

/*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) {
        exchange.CreateOrder(symbol, "buy", -1, 1)
        exchange.CreateOrder(symbol, "sell", -1, 1)
    }

    var defaultPositions = exchange.GetPositions()
    var swapPositions = exchange.GetPositions("USDT.swap")
    var futuresPositions = exchange.GetPositions("USDT.futures")
    var btcUsdtSwapPositions = exchange.GetPositions("BTC_USDT.swap")

    var tbls = []
    var arr = [defaultPositions, swapPositions, futuresPositions, btcUsdtSwapPositions]
    var tblDesc = ["defaultPositions", "swapPositions", "futuresPositions", "btcUsdtSwapPositions"]
    for (var index in arr) {
        var positions = arr[index]
        var tbl = {type: "table", title: tblDesc[index], cols: ["Symbol", "MarginLevel", "Amount", "FrozenAmount", "Price", "Profit", "Type", "ContractType", "Margin"], rows: [] }
        for (var pos of positions) {
            tbl.rows.push([pos.Symbol, pos.MarginLevel, pos.Amount, pos.FrozenAmount, pos.Price, pos.Profit, pos.Type, pos.ContractType, pos.Margin])
        }
        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:
        exchange.CreateOrder(symbol, "buy", -1, 1)
        exchange.CreateOrder(symbol, "sell", -1, 1)

    defaultPositions = exchange.GetPositions()
    swapPositions = exchange.GetPositions("USDT.swap")
    futuresPositions = exchange.GetPositions("USDT.futures")
    btcUsdtSwapPositions = exchange.GetPositions("BTC_USDT.swap")

    tbls = []
    arr = [defaultPositions, swapPositions, futuresPositions, btcUsdtSwapPositions]
    tblDesc = ["defaultPositions", "swapPositions", "futuresPositions", "btcUsdtSwapPositions"]
    for index in range(len(arr)):
        positions = arr[index]
        tbl = {"type": "table", "title": tblDesc[index], "cols": ["Symbol", "MarginLevel", "Amount", "FrozenAmount", "Price", "Profit", "Type", "ContractType", "Margin"], "rows": []}
        for pos in positions:
            tbl["rows"].append([pos["Symbol"], pos["MarginLevel"], pos["Amount"], pos["FrozenAmount"], pos["Price"], pos["Profit"], pos["Type"], pos["ContractType"], pos["Margin"]])

        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) {
        exchange.CreateOrder(symbol, "buy", -1, 1);
        exchange.CreateOrder(symbol, "sell", -1, 1);
    }
    
    auto defaultPositions = exchange.GetPositions();
    auto swapPositions = exchange.GetPositions("USDT.swap");
    auto futuresPositions = exchange.GetPositions("USDT.futures");
    auto btcUsdtSwapPositions = exchange.GetPositions("BTC_USDT.swap");
    
    json tbls = R"([])"_json;
    std::vector<std::vector<Position>> arr = {defaultPositions, swapPositions, futuresPositions, btcUsdtSwapPositions};
    std::string tblDesc[] = {"defaultPositions", "swapPositions", "futuresPositions", "btcUsdtSwapPositions"};
    for (int index = 0; index < arr.size(); index++) {
        auto positions = arr[index];
        json tbl = R"({
            "type": "table", 
            "cols": ["Symbol", "MarginLevel", "Amount", "FrozenAmount", "Price", "Profit", "Type", "ContractType", "Margin"],
            "rows": []
        })"_json;
        tbl["title"] = tblDesc[index];
    
        for (const auto& pos : positions) {
            json arrJson = R"([])"_json;
    
            arrJson.push_back(pos.Symbol);
            arrJson.push_back(pos.MarginLevel);
            arrJson.push_back(pos.Amount);
            arrJson.push_back(pos.FrozenAmount);
            arrJson.push_back(pos.Price);
            arrJson.push_back(pos.Profit);
            arrJson.push_back(pos.Type);
            arrJson.push_back(pos.ContractType);
            arrJson.push_back(pos.Margin);
    
            tbl["rows"].push_back(arrJson);
        }
    
        tbls.push_back(tbl);
    }
    
    LogStatus(_D(), "\n", "`" + tbls.dump() + "`");
    
    return; 
}

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

Фьючерсные контракты на криптовалюты отличаются от спотовых контрактов на криптовалюты, которые имеют только логическую концепцию позиции.торговые пары, код контрактаПожалуйста, обратитесь к {@fun/Account/exchange.SetCurrency exchange.SetCurrency}, {@fun/Futures/exchange.SetContractType exchange.SetContractType} функциям. ВGetPositionsфункция, сценарии использования параметра символа обобщены следующим образом:

Классификация обмена символ Параметры Объем запроса Примечание
Фьючерсы Не передавать параметр символа Запрос всех торговых продуктов в пределах текущего диапазона размеров торговой пары и кода контракта Если текущая торговая пара BTC_USDT и код контракта swap, все постоянные контракты на основе USDT будут запрошены.GetPositions("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 -

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

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

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

USDT.futures. USDT-основанный диапазон контрактов на доставку.

∙ ∙ ∙ USD.swap ∙ ∙ ∙ Сфера постоянного обмена на основе валюты Контракты.

USD.futures. Обхват доставки на основе валюты Контракты.

Оптимизация USDT.Опция USDT.Опционный контракт на основе USDT.

Оптиции в долларах США. Оптиции в валютах.

  • |

∙ ∙ USDT.futures_combo ∙ Ряд комбинаций CFD. ∙ Фьючерс_Дерибит Биржа

Ограничения контрактов на поставку смешанной маржи. Фьючерс_Кракен Биржа.

USD.swap_pf. Смешанный маржинальный диапазон постоянного контракта. Фьючерс_Кракен Биржа.

Совместима сexchange.GetPosition()звонить,GetPositionто же самое, чтоGetPositions.

Когда счет, представленный обменным объектомexchangeне занимает никаких позиций вдиапазон запросаиликонкретные торговые инструменты,exchange.GetPositions()функция возвращает пустой массив, например:[].

{@struct/Position Position}, {@fun/Account/exchange.SetCurrency exchange.SetCurrency}, {@fun/Futures/exchange.SetContractType exchange.SetContractType}

exchange.SetMarginLevel

Вexchange.SetMarginLevel()Функция используется для установления стоимости рычага в торговой паре или контракте, указанной вsymbolПараметр. Совместим только с прохождением параметраmarginLevelдля установления стоимости кредитного плеча текущей торговой пары или контракта обменного объекта {@var/EXCHANGE exchange}.

exchange.SetMarginLevel ((символ, уровень маржи) Exchange.SetMarginLevel ((MarginLevel) - Установьте уровень маржи

ВsymbolПараметр используется для указания торговой пары или контракта, для которого необходимо скорректировать значение кредитного плеча.symbolпараметрSetMarginLevel()Функция соответствует форматуsymbolпараметрGetTicker()Функция. символ ложное строка ВmarginLevelпараметр используется для установки значения рычага, который обычно является целым числом для бирж, и он также поддерживает настройки значения рычага плавающей точки для некоторых бирж. Маржинальный уровень Истинно Номер

function main() {
    exchange.SetMarginLevel(10)
    // Set the leverage of BTC’s USDT-margined perpetual contract to 15
    exchange.SetMarginLevel("BTC_USDT.swap", 15)
}
def main():
    exchange.SetMarginLevel(10)
    exchange.SetMarginLevel("BTC_USDT.swap", 15)
void main() {
    exchange.SetMarginLevel(10);
    exchange.SetMarginLevel("BTC_USDT.swap", 15); 
}

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

Имя функции Не поддерживаемые спотовые обмены Фьючерсные биржи без поддержки
Установка уровня границы Фьючерсы_dYdX / Фьючерсы_Deribit

{@var/EXCHANGE обмен}

exchange.SetDirection

Вexchange.SetDirection()функция используется для настройки направления заказа функции {@fun/Trade/exchange.Buy exchange.Buy}, функции {@fun/Trade/exchange.Sell exchange.Sell} при размещении заказов на фьючерсные контракты.

Обмен.Установка направления (направление)

Вdirectionпараметр используется для установки направления фьючерсного контракта при размещении ордера."buy", "closesell", "sell", "closebuy"- Да. направление неправда строка

function main(){
    // For example, set to OKX futures contract of this week
    exchange.SetContractType("this_week")    
    // Set leverage to 5 times
    exchange.SetMarginLevel(5)
    // Set the order type to long
    exchange.SetDirection("buy")
    // Place an order for 2 contracts at 10,000
    exchange.Buy(10000, 2)              
    exchange.SetMarginLevel(5)
    exchange.SetDirection("closebuy")
    exchange.Sell(1000, 2)
}
def main():
    exchange.SetContractType("this_week")
    exchange.SetMarginLevel(5)
    exchange.SetDirection("buy")
    exchange.Buy(10000, 2)
    exchange.SetMarginLevel(5)
    exchange.SetDirection("closebuy")
    exchange.Sell(1000, 2)
void main() {
    exchange.SetContractType("this_week");
    exchange.SetMarginLevel(5);
    exchange.SetDirection("buy");
    exchange.Buy(10000, 2);
    exchange.SetMarginLevel(5);
    exchange.SetDirection("closebuy");
    exchange.Sell(1000, 2);
}

Вexchange.SetDirection()функция устанавливает соответствие между направлением сделки фьючерсного контракта и функцией размещения ордера:

Функции размещения заказов Направление, установленное параметрами функции SetDirection Примечания
exchange.Buy купить Купить и открыть длинные позиции
exchange.Buy заключенная продажа Купить и закрыть короткие позиции
exchange.Sell продать Продажа и открытие коротких позиций
exchange.Sell покупать Продать и закрыть длинные позиции

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

exchange.SetContractType

Вexchange.SetContractType()Функция используется для установки текущего кода контракта обмена объекта {@var/EXCHANGE exchange}.

Вexchange.SetContractType()функция возвращает структуру, которая содержит код биржевого контракта, соответствующий текущему коду контракта.quarter, и структура возвращаемой стоимости этой функции:{"InstrumentID": "BTCUSD_230630", "instrument": "BTCUSD_230630"}- Да. объект

exchange.SetContractType ((символ)

Вsymbolпараметр используется для установки кода контракта, необязательные значения:"this_week", "next_week", "quarter", "next_quarter", "swap", и т.д. Фьючерсные контракты на криптовалютыдоговор поставкикоды, если они не указаны, обычно имеют:

  • this_weekКонтракт текущей недели.
  • next_weekКонтракт на следующей неделе.
  • quarter: квартальный контракт.
  • next_quarter: следующий квартальный контракт.Постоянные контрактыкоды в фьючерсных контрактах на криптовалюты, если они не указаны, обычно имеют:
  • swap- Вечный контракт.

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

function main() {
    // Set to this week contract
    exchange.SetContractType("this_week") 
}
def main():
    exchange.SetContractType("this_week")
void main() {
    exchange.SetContractType("this_week");
}

Установите текущий контракт как контракт текущей недели:

function main() {
    // The default trading pair is BTC_USD, set the contract for this week, and the contract is a currency standard contract
    exchange.SetContractType("this_week")
    Log("ticker:", exchange.GetTicker())
    
    // Switching trading pairs, then setting up contracts, switching to USDT as margin contracts, as opposed to currency standard contracts
    exchange.IO("currency", "BTC_USDT")   
    exchange.SetContractType("swap")
    Log("ticker:", exchange.GetTicker())
}
def main():
    exchange.SetContractType("this_week")
    Log("ticker:", exchange.GetTicker())
    exchange.IO("currency", "BTC_USDT")
    exchange.SetContractType("swap")
    Log("ticker:", exchange.GetTicker())
void main() {
    exchange.SetContractType("this_week");
    Log("ticker:", exchange.GetTicker());
    exchange.IO("currency", "BTC_USDT");
    exchange.SetContractType("swap");
    Log("ticker:", exchange.GetTicker());
}

При заключении договора сUSDTв качестве маржи необходимо переключить торговую пару в коде (также можно установить торговую пару непосредственно при добавлении объекта обмена):

function main(){
    // Set the contract for this week
    var ret = exchange.SetContractType("this_week")     
    // Return information about the current week's contracts
    Log(ret)
}
def main():
    ret = exchange.SetContractType("this_week")
    Log(ret)
void main() {
    auto ret = exchange.SetContractType("this_week");
    Log(ret);
}

Печать возвращаемого значенияexchange.SetContractType()Функция:

В криптовалютной стратегии фьючерсных контрактов, возьмите пример переключения наBTC_USDTТорговая пара: при смене торговой пары с использованиемexchange.SetCurrency("BTC_USDT")илиexchange.IO("currency", "BTC_USDT")функции, после переключения, вы должны использоватьexchange.SetContractType()Система определяет, является ли новый торговый парывалютный стандартный контрактилиСтандартный контракт в USDTНапример, если торговая пара установлена наBTC_USDT, используйтеexchange.SetContractType("swap")функция настройки кода контракта наswapВ данный момент он установлен наBTCдляСтандарт USDTЕсли торговая параBTC_USD, используйтеexchange.SetContractType("swap")функция настройки кода контракта наswapВ данный момент он установлен наBTCЭто...валютный стандартВечный контракт. Подробная информация о поддерживаемых биржах фьючерсных контрактов на криптовалюты с названиями контрактов для каждой биржи:

  • Фьючерсы_OKCoin (OKX) Установлено на постоянные контракты:exchange.SetContractType("swap")На этой неделе контракт:exchange.SetContractType("this_week")Контракт на следующей неделе:exchange.SetContractType("next_week")Установлено на месячный контракт:exchange.SetContractType("month")Контракт на следующий месяц:exchange.SetContractType("next_month")Установлено на квартальные контракты:exchange.SetContractType("quarter")Контракт на следующий квартал:exchange.SetContractType("next_quarter")

    OKX имеет предварительные торговые контракты: дата поставки контракта является фиксированным временем.HMSTR-USDT-250207. Установите торговую пару наHMSTR_USDTна платформе FMZ, а затем использоватьexchange.SetContractType("HMSTR-USDT-250207")чтобы установить контракт. Для функций, поддерживающихsymbolпараметры, такие как:exchange.GetTicker(), exchange.CreateOrder(), и т. д. Вы можете указатьsymbolпараметр:HMSTR_USDT.HMSTR-USDT-250207для получения рыночных данных по данному контракту или размещения заказа.

  • Фьючерсы_HuobiDM (фьючерсы Хуоби) На этой неделе контракт:exchange.SetContractType("this_week")- Да. Контракт на следующей неделе:exchange.SetContractType("next_week")- Да. Установлено на квартальные контракты:exchange.SetContractType("quarter")- Да. Контракт на следующий квартал:exchange.SetContractType("next_quarter")- Да. Установлено на постоянные контракты:exchange.SetContractType("swap")- Да. Он поддерживает контракты сUSDTв качестве маржи, взятьBTCДоговор на примере: использованиеexchange.IO("currency", "BTC_USDT")перейти на контракт, который используетUSDTкак маржа. Или установить текущую торговую пару наBTC_USDTПосле переключения торговых пар, вы должны позвонитьexchange.SetContractType()Функция снова установить контракт.

  • Фьючерсы_BitMEX (BitMEX) Установлено на постоянные контракты:exchange.SetContractType("swap")- Да. Контракты на поставку фьючерсов на бирже BitMEX - это ежемесячные контракты с следующими кодами контрактов (с января по декабрь):

    "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
    

    Заключение договоров поставки:exchange.SetContractType("December")Например, когда торговая пара установлена наXBT_USDT,exchange.SetContractType("December")Функция вызвана для установки контракта на декабрьскую поставку в USDT на основе BTC (соответствующий фактическому коду контрактаXBTUSDTZ23).

    Фьючерсы_BitMEX Контрактная информация

    Код контракта, определенный Futures_BitMEX Соответствующая торговая пара в FMZ Соответствующий код контракта в FMZ Примечание
    DOGEUSD DOGE_USD обмен В долларах США, XBT расплачивается.
    ПОЛОЖЕНИЕ DOGE_USDT обмен В USDT деноминировано, в USDT урегулировано.
    XBTETH XBT_ETH обмен В ETH, в XBT.
    XBTEUR XBT_EUR обмен В евро, расчеты в XBT.
    USDTUSDC USDT_USDC обмен В долларах США, в XBT.
    ETHUSD_ETH ETH_USD_ETH обмен В долларах США, расчеты в ETH.
    XBTH24 XBT_USD Март Дата истечения срока действия: 24 марта, код месяца: H; номиналом в долларах США, расчет в XBT.
    ETHUSDZ23 ETH_USD Декабрь Дата истечения срока действия: 23 декабря, код месяца: Z; номиналом в долларах США, расчет в XBT.
    XBTUSDTZ23 XBT_USDT Декабрь Дата истечения срока действия: 23 декабря. Код месяца: Z; деноминированный в USDT, расчет в USDT.
    ADAZ23 ADA_XBT Декабрь Дата истечения срока действия: 23 декабря, код месяца: Z ; расчет в XBT, расчет в XBT.
    P_XBTETFX23 USDT_XXX P_XBTETFX23 Срок действия: 23/11/23; выраженный в процентах и расчитанный в USDT.
  • Фьючерсы_GateIO На этой неделе контракт:exchange.SetContractType("this_week")- Да. Контракт на следующей неделе:exchange.SetContractType("next_week")- Да. Установлено на квартальные контракты:exchange.SetContractType("quarter")- Да. Контракт на следующий квартал:exchange.SetContractType("next_quarter")- Да. Установлено на постоянные контракты:exchange.SetContractType("swap")- Да. Он поддерживает контракты сUSDTв качестве маржи, взятьBTCДоговор на примере: использованиеexchange.IO("currency", "BTC_USDT")перейти на контракт, который используетUSDTкак маржа. Или установить текущую торговую пару наBTC_USDTПосле переключения торговых пар, вы должны позвонитьexchange.SetContractType()Функция снова установить контракт.

  • Фьючерсы_Deribit Установлено на постоянные контракты:exchange.SetContractType("swap")- Да. Он поддерживает DeribitsUSDCДоговор. Контракты на поставку:"this_week", "next_week", "month", "quarter", "next_quarter", "third_quarter", "fourth_quarter"- Да. CFD (фьючерс_комбо):"this_week,swap", "next_week,swap", "next_quarter,this_week", "third_quarter,this_week", "month,next_week", есть много комбинаций. Для опционных контрактов необходимо ввести конкретный код опционного контракта, определенный биржей, см. для подробной информации на веб-сайте Deribit.

  • Фьючерсы_KuCoin Например, если торговая пара установлена наBTC_USDи код контракта установлен, это валютный контракт: Установлено на постоянные контракты:exchange.SetContractType("swap")- Да. Установлено на квартальные контракты:exchange.SetContractType("quarter")- Да. Контракт на следующий квартал:exchange.SetContractType("next_quarter").

    USDT в качестве контракта на маржу: Например, если торговая пара установлена наBTC_USDT, а затем установить код контракта, это контракт с USDT в качестве маржи. Установлено на постоянные контракты:exchange.SetContractType("swap").

  • Фьючерсы_Binance Binance Futures Exchange по умолчанию в вечном контракте текущей торговой пары, код контракта:swap- Да. Установлено на постоянные контракты:exchange.SetContractType("swap"), вечные контракты Binance имеют контракты, которые используютUSDTНапример,USDTстандартный бессрочный контрактBTCможет использоваться в качестве контракта маржи, и торговая пара установлена наBTC_USDTBinance также поддерживает вечные контракты, которые используют монеты в качестве маржи, например,BTCСтандартный вечный контракт Binance, с торговой парой, установленной наBTC_USD- Да. Установлено на квартальные контракты:exchange.SetContractType("quarter"), контракт поставки имеет валютный стандартный контракт (т.е. использует валюты в качестве маржи), например,BTCВ квартальном контракте торговая пара устанавливается на:BTC_USDи затем установить контрактexchange.SetContractType("quarter"), он настроен наBTCквартальный контракт с валютным стандартным контрактом. Контракт на следующий квартал:exchange.SetContractType("next_quarter"), например,BTCв случае, если в соответствии со стандартом валютного квартального контракта торговая пара установлена на:BTC_USD, и затем установить контрактexchange.SetContractType("next_quarter")- Да. Binance поддерживает частичнуюUSDTв качестве контракта на предоставление маржи,BTCНапример, установить торговую пару наBTC_USDT, затем установить код контракта.

    Поддержка контрактов Binance Options: Формат кода опционного контракта основан на коде опционного контракта, определенном биржей:BTC-241227-15000-C, XRP-240112-0.5-C, BTC-241227-15000-PВозьмите код контракта BinanceBTC-241227-15000-PНапример: BTC - это код валюты опциона, 241227 - дата осуществления, 15000 - цена осуществления, P - это опцион продажи, а C - это опцион покупки. Подробная информация о типе опциона, будь то европейский опцион или американский опцион, приведена в соответствующей информации в опционном контракте биржи. Биржа может ограничивать продавцов опционов и требовать от них подачи заявки на получение квалификации отдельно.

  • Фьючерсы_Бибокс Код контракта для бессрочных контрактов Bibox:swap- Да. Установлено на постоянные контракты:exchange.SetContractType("swap").

  • Фьючерсы_Bybit По умолчанию - постоянный контракт для текущей торговой пары, код контракта:swap- Да. Код контракта на этой неделе:this_week- Да. Код контракта на следующей неделе:next_week- Да. Код контракта третьей недели:third_week- Да. Месячный код контракта:month- Да. Код контракта на следующий месяц:next_month- Да. Код квартального контракта:quarter- Да. Код контракта на следующий квартал:next_quarter- Да. Код контракта третьего квартала:third_quarter.

  • Фьючерс_Кракен По умолчанию - постоянный контракт текущей торговой пары, код контракта:swap. swap- Вечный контракт.month: контракт текущего месяца.quarter: квартальный контракт.next_quarterКонтракт на следующий квартал.swap_pf: Вечный контракт с смешанной маржой.quarter_ff: квартальный контракт с смешанной маржой.month_ff: контракт на текущий месяц со смешанной маржой.next_quarter_ff: контракт на смешанную маржу на следующий квартал.

  • Фьючерсы_Bitfinex По умолчанию - постоянный контракт на текущую торговую пару, код контракта:swap.

  • Фьючерсы_Bitget По умолчанию - постоянный контракт на текущую торговую пару, код контракта:swap- Да. Торговая пара установлена наBTC_USDдля валютных стандартных контрактов, и торговая пара установлена наBTC_USDTдля договоров, заключенныхUSDT. Демонстрационные контракты могут быть установлены с торговыми парами какSBTC_USD, BTC_SUSDT.

  • Фьючерсы_dYdX Код контракта для бессрочных контрактов dYdX:swap- Да. Установлено на постоянные контракты:exchange.SetContractType("swap"), dYdX имеет только стандартные контракты в USDT.

  • Фьючерсы_MEXC Код контракта для бессрочных контрактов MEXC:swap- Да. Установлено на постоянные контракты:exchange.SetContractType("swap"). Настроить торговую пару наBTC_USD, который является валютным стандартным контрактом, и устанавливает торговую пару наBTC_USDT, то естьUSDT- Договор заключен.

  • Фьючерсы_Криптовалюта Токены на счете наcrypto.comобменные опционы могут быть конвертированы в кредиты в долларах США для использования в качестве маржи для торговли контрактами. Установлено на постоянный контракт:exchange.SetContractType("swap")Пример вызоваexchange.SetContractType("swap")функция установки бессрочного контракта на BTC, когда торговая пара установлена наBTC_USD- Да. Вcrypto.comКонтракты обменной доставки - это месячные контракты со следующими кодами контрактов (с января по декабрь):

    "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
    

    Установите контракт поставки:exchange.SetContractType("October")Например, когда торговая пара установлена наBTC_USD, вызвать функциюexchange.SetContractType("October")чтобы установить октябрьский контракт на доставку BTC. Соответствующий код контракта на данный момент:BTCUSD-231027.

  • Фьючерсы_WOO Фьючерсы_WOOUSDTоснованные контракты с кодом постоянного контрактаswapНапример, когда торговая пара установлена наBTC_USDT, функцияexchange.SetContractType("swap")Призвано установить текущий контракт на USDT основанный вечный контракт для BTC.

{@fun/Futures/exchange.GetContractType exchange.GetContractType}, {@fun/Account/exchange.SetCurrency exchange.SetCurrency}

exchange.GetContractType

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

Вexchange.GetContractType()функция возвращает код контракта, определенный платформой FMZ, например:this_week, swap, и т.д. строка

exchange.GetContractType (()

function main () {
    Log(exchange.SetContractType("this_week")) 
    Log(exchange.GetContractType())
}
def main():
    Log(exchange.SetContractType("this_week"))
    Log(exchange.GetContractType())
void main() {
    Log(exchange.SetContractType("this_week"));
    Log(exchange.GetContractType());
}

{@fun/Futures/exchange.SetContractType exchange.SetContractType} (Статьировка контракта)

exchange.GetFundings

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

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

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

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

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

/*backtest
start: 2024-10-01 00:00:00
end: 2024-10-23 00:05:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"SOL_USDC"}]
*/

function main() {
    // LPT_USDT.swap 4-hour period
    var symbols = ["SOL_USDT.swap", "ETH_USDT.swap", "LTC_USDT.swap", "SOL_USDC.swap", "ETH_USDC.swap", "BTC_USD.swap", "BTC_USDT.quarter", "LPT_USDT.swap"]
    for (var symbol of symbols) {
        exchange.GetTicker(symbol)
    }
    
    var arr = []
    var arrParams = ["no param", "LTC_USDT.swap", "USDT.swap", "USD.swap", "USDC.swap", "USDT.futures", "BTC_USDT.quarter"]
    for (p of arrParams) {
        if (p == "no param") {
            arr.push(exchange.GetFundings())
        } else {
            arr.push(exchange.GetFundings(p))
        }
    }
    
    var tbls = []
    var index = 0
    for (var fundings of arr) {
        var tbl = {
            "type": "table",
            "title": arrParams[index],
            "cols": ["Symbol", "Interval", "Time", "Rate"],
            "rows": [],
        }
    
        for (var f of fundings) {
            tbl["rows"].push([f.Symbol, f.Interval / 3600000, _D(f.Time), f.Rate * 100 + " %"])
        }
        tbls.push(tbl)
        index++
    }
    
    LogStatus(_D(), "\n Requested market types:", symbols, "\n`" + JSON.stringify(tbls) + "`")
}
'''backtest
start: 2024-10-01 00:00:00
end: 2024-10-23 00:05:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"SOL_USDC"}]
'''
    
import json
    
def main():
    # LPT_USDT.swap 4-hour period
    symbols = ["SOL_USDT.swap", "ETH_USDT.swap", "LTC_USDT.swap", "SOL_USDC.swap", "ETH_USDC.swap", "BTC_USD.swap", "BTC_USDT.quarter", "LPT_USDT.swap"]
    for symbol in symbols:
        exchange.GetTicker(symbol)
    
    arr = []
    arrParams = ["no param", "LTC_USDT.swap", "USDT.swap", "USD.swap", "USDC.swap", "USDT.futures", "BTC_USDT.quarter"]
    for p in arrParams:
        if p == "no param":
            arr.append(exchange.GetFundings())
        else:
            arr.append(exchange.GetFundings(p))
    
    tbls = []
    index = 0
    for fundings in arr:
        tbl = {
            "type": "table",
            "title": arrParams[index],
            "cols": ["Symbol", "Interval", "Time", "Rate"],
            "rows": [],
        }
    
        for f in fundings:
            tbl["rows"].append([f["Symbol"], f["Interval"] / 3600000, _D(f["Time"]), str(f["Rate"] * 100) + " %"])
    
        tbls.append(tbl)
        index += 1
    
    LogStatus(_D(), "\n Requested market types:", symbols, "\n`" + json.dumps(tbls) + "`")
/*backtest
start: 2024-10-01 00:00:00
end: 2024-10-23 00:05:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"SOL_USDC"}]
*/
    
void main() {
    // LPT_USDT.swap 4-hour period
    json arrSymbol = R"([])"_json;
    std::string symbols[] = {"SOL_USDT.swap", "ETH_USDT.swap", "LTC_USDT.swap", "SOL_USDC.swap", "ETH_USDC.swap", "BTC_USD.swap", "BTC_USDT.quarter", "LPT_USDT.swap"};
    for (const std::string& symbol : symbols) {
        exchange.GetTicker(symbol);
        arrSymbol.push_back(symbol);
    }
    
    std::vector<std::vector<Funding>> arr = {};
    std::string arrParams[] = {"no param", "LTC_USDT.swap", "USDT.swap", "USD.swap", "USDC.swap", "USDT.futures", "BTC_USDT.quarter"};
    for (const std::string& p : arrParams) {
        if (p == "no param") {
            arr.push_back(exchange.GetFundings());
        } else {
            arr.push_back(exchange.GetFundings(p));
        }
    }
    
    json tbls = R"([])"_json;
    int index = 0;
    for (int i = 0; i < arr.size(); i++) {
        auto fundings = arr[i];
    
        json tbl = R"({
            "type": "table", 
            "cols": ["Symbol", "Interval", "Time", "Rate"],
            "rows": []
        })"_json;
        tbl["title"] = arrParams[index];
    
        for (int j = 0; j < fundings.size(); j++) {
            auto f = fundings[j];
            // json arrJson = {f.Symbol, f.Interval / 3600000, _D(f.Time), string(f.Rate * 100) + " %"};
            json arrJson = {f.Symbol, f.Interval / 3600000, _D(f.Time), f.Rate};
            tbl["rows"].push_back(arrJson);
        }
        tbls.push_back(tbl);
        index++;
    }
    
    LogStatus(_D(), "\n Requested market types:", arrSymbol.dump(), "\n`" + tbls.dump() + "`");
}

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

Для фьючерсных бирж, которые не поддерживают пакетный запрос данных по ставкам финансирования, еслиsymbolпараметр указывается как диапазон запроса, например:USDT.swapилиsymbolПараметр не передан, интерфейс будет сообщать об ошибке.GetFundings()Функция, использующая этот тип фьючерсного обмена объекта, вы должны указатьsymbolпараметр как конкретный тип постоянного контракта для запроса текущих данных о ставках финансирования типа. Вexchange.GetFundings()Функция поддерживает реальные системы торговли и обратного тестирования. Биржи, которые не поддерживают пакетную покупку данных по ставкам финансирования: Futures_Bitget, Futures_OKX, Futures_MEXC, Futures_Deribit, Futures_Crypto.symbolпараметр со специфическим кодом символа, например:ETH_USDT.swap.

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

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

{@struct/Funding Финансирование}

Настройки сети

exchange.SetBase

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

Exchange.SetBase (s)

Вsпараметр используется для указания базового адреса интерфейса API обмена. с неправда строка

function main() {
    // Use default base address
    Log(exchange.GetTicker())
    // Switch to https://aws.okx.com
    exchange.SetBase("https://aws.okx.com")
    Log(exchange.GetTicker())
}
def main():
    Log(exchange.GetTicker())
    exchange.SetBase("https://aws.okx.com")
    Log(exchange.GetTicker())
void main() {
    Log(exchange.GetTicker());
    exchange.SetBase("https://aws.okx.com");
    Log(exchange.GetTicker());
}

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

{@fun/Trade/exchange.IO exchange.IO}

exchange.GetBase

Вexchange.GetBase()Функция используется для получения текущего адреса базы интерфейса API обмена.

Текущий адрес базового интерфейса API обмена. строка

Обмен.GetBase ((()

function main() {
    Log(exchange.GetBase())
}
def main():
    Log(exchange.GetBase())
void main() {
    Log(exchange.GetBase());
}

{@fun/NetSettings/exchange.SetBase exchange.SetBase} Это не так.

exchange.SetProxy

Вexchange.SetProxy()функция используется для настройки конфигурации прокси обмена {@var/EXCHANGE exchange}.

Обмен.SetProxy ((прокси)

Вproxyпараметр используется для указания конфигурации прокси. прокси неправда строка

function main() {
    exchange.SetProxy("socks5://192.168.1.10:8080")
    // If you can't access the exchange ticker interface, set up an available ss5 proxy and you can access the ticker interface
    Log(exchange.GetTicker())
}
def main():
    exchange.SetProxy("socks5://192.168.1.10:8080")
    Log(exchange.GetTicker())
void main() {
    exchange.SetProxy("socks5://192.168.1.10:8080");
    Log(exchange.GetTicker());
}

Конфигурировать объект обмена {@var/EXCHANGE exchange}socks5Прокси:

function main(){
    exchange.SetProxy("ip://10.0.3.15")
    // The requested IP address is 10.0.3.15
    exchange.GetTicker()
}
def main():
    exchange.SetProxy("ip://10.0.3.15")
    exchange.GetTicker()
void main() {
    exchange.SetProxy("ip://10.0.3.15");
    exchange.GetTicker();
}

В дополнениеглобальная спецификацияIP-адреса запроса от объекта обмена {@var/EXCHANGE exchange}, также поддерживается указание IP-адреса на основе {@var/EXCHANGE exchange}:

Если настройка прокси не работает,exchange.SetProxy()Функция вернет null при вызове.exchange.SetProxy()функция устанавливает прокси дляrestОдин прокси может быть установлен для каждого объекта обмена {@var/EXCHANGE exchange}, и доступ к интерфейсу обмена, связанному с объектом обмена {@var/EXCHANGE exchange} после установки прокси будет доступен через прокси. Поддержка настройкиsocks5прокси, принимая первый объект обмена добавлен {@var/EXCHANGE exchange} т.е.:exchanges[0]Например:

  • Установите прокси, без имени пользователя, без пароля:exchange.SetProxy("socks5://127.0.0.1:8889").
  • Установите прокси, введите имя пользователя и пароль:exchange.SetProxy("socks5://username:password@127.0.0.1:8889"). usernameэто имя пользователя иpasswordэто пароль.
  • Переключиться на нормальный режим без прокси:exchange.SetProxy("").

Поддерживает настройку IP-адреса запроса от обмена {@var/EXCHANGE exchange} объекта,глобально определенный.

{@var/EXCHANGE обмен}

exchange.SetTimeout

Вexchange.SetTimeout()Функция используется для настройки временного пребыванияrestзапрос на объект обмена {@var/EXCHANGE exchange}.

Обмен.Настроить время (Timeout)

Вtimeoutпараметр используется для указания количества миллисекунд для настройки тайм-аута. Тайм-аут Истинно Номер

function main() {
    exchange.SetTimeout(3000)
    Log(exchange.GetTicker())
}
def main():
    exchange.SetTimeout(3000)
    Log(exchange.GetTicker())
void main() {
    exchange.SetTimeout(3000);
    Log(exchange.GetTicker());
}

Параметрtimeout- это значение миллисекунды, 1000 миллисекунд равно 1 секунде.restтолько протокол, используется для установки тайм-аут наrestзапросов, он вступает в силу, устанавливая только один раз.exchange.SetTimeout(3000), устанавливаетrestЗапросить тайм-аут дляexchangeВызов функций с сетевыми запросами, такими какexchange.GetTicker()вызовы, которые не получают ответа в течение более 3 секунд, будут выходить из строя, а вызовы функций, которые выходят из строя, будут возвращать нулевые значения.SetTimeout()не является глобальной функцией, это метод обмена {@var/EXCHANGE exchange}.

{@var/EXCHANGE обмен}

Нитки

FMZ Quant Trading Platform действительно поддерживает многопоточную функциюJavaScriptязыковой стратегии с нижней части системы и реализует следующие цели:

Объекты Руководство Примечания
прокрутка Многопоточный глобальный объект Функции членов:Thread, getThread, mainThread, и т.д.
Нить Объект нитки Функции членов:peekMessage, postMessage, join, и т.д.
Закрыть Объект блокировки нитей Функции членов:acquire, releaseОни могут быть переданы в среду потока в качестве параметров функции выполнения потока.
Ведущий Объект события Функции членов:set, clear, wait, isSetОни могут быть переданы в среду потока в качестве параметра функции выполнения потока.
ThreadCondition (Условие) Объект условия Функции членов:notify, notifyAll, wait, acquire, releaseОни могут быть переданы в среду потока в качестве параметра функции выполнения потока.
ThreadDict Объект словаря Функции членов:get, setОни могут быть переданы в среду потока в качестве параметров функции выполнения потока.

прокрутка

Вthreadingobject - это глобальный инструмент управления многопотоками, который предоставляет такие функции, как создание одновременных потоков, блокировки потоков и объекты условий.threadingЭтот объект поддерживается толькоJavaScriptязыковой стратегии.

Нить

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

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

Threadобъект

Ведущий (забавный) Речь идет о... предметах.

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

Функция неправда Функция Параметрargявляется фактическим параметром, переданнымfunc(т.е. функция одновременного выполнения потока) при выполнении обратного вызова; может быть несколько параметровarg, и перечень параметровfuncдолжна соответствовать...args.

арг ложное string, number, bool, object, array, function, null value и другие типы, поддерживаемые системой Параметрitemпредставляет собой массив, содержащий ссылки на функции и их параметры, которые должны быть выполнены одновременно.itemпараметры могут быть переданы при вызовеThread function.

пункт неправда массив

function test1(a, b, c) {
    Log("test1:", a, b, c)
}

function main() {
    var t1 = threading.Thread(test1, 1, 2, 3)
    var t2 = threading.Thread(function (msg) {
        Log("msg:", msg)
    }, "Hello thread2")

    t1.join()
    t2.join()
}

Создавать одновременные потоки как для пользовательской функции, так и для анонимной функции.

function test1(msg) {
    Log("msg:", msg)
    test2("Hello test2")
}

function main() {
    var t1 = threading.Thread(
        [function(a, b, c) {Log(a, b, c)}, 1, 2, 3], 
        [test1, "Hello test1"], 
        [`function test2(msg) {Log("msg:", msg)}`])

    t1.join()
}

ИспользуйтеThread(...items)Форма для создания одновременных потоков и выполнения нескольких функций последовательно.

function testFunc1(p) {
    Log("testFunc1 p:", p)
}

function main() {
    threading.Thread(function(pfn) {
        var threadName = threading.currentThread().name()
        var threadId = threading.currentThread().id()
        pfn(`in thread threadName: ${threadName}, threadId: ${threadId}`)
    }, testFunc1).join()
}

Он поддерживает передачу параметров одновременно выполняемым функциям.

function ml(input) {
    const net = new brain.NeuralNetwork()
    net.train([
        { input: [0, 0], output: [0] },
        { input: [0, 1], output: [1] },
        { input: [1, 0], output: [1] },
        { input: [1, 1], output: [0] },
    ])
    return net.run(input)
}

function main() {
    var ret = threading.Thread([ml, [1, 0]], [HttpQuery("https://unpkg.com/brain.js")]).join()

    // ret: {"id":1,"terminated":false,"elapsed":337636000,"ret":{"0":0.9339330196380615}}
    Log(ret)
}

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

Функция ниткиfuncпрошел вThread()Функция для одновременного выполнения выполняется в изолированной среде, поэтому переменные за пределами потока не могут быть напрямую ссылаются, и компиляция не удастся при ссылке. В то же время ссылки на другие функции закрытия не поддерживаются в потоке. Все API, предоставляемые платформой, могут быть вызваны в потоке, но другие функции, определенные пользователем, не могут быть вызваны.

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

{@fun/Threads/threading/getThread getThread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/Lock Lock}, {@fun/Threads/threading/Condition Condition}, {@fun/Threads/threading/Event Event}, {@fun/Threads/threading/Dict Dict}, {@fun/Threads/threading/pending pending}, {@fun/Threads/threading/eventLoop}

getThread

ВgetThread()функция используется для получения объекта потока на основе указанного ID потока.

ВgetThread()функция возвращаетThreadОбъект с threadId, указанный параметром

Threadобъект

getThread ((ThreadId)

ПараметрthreadIdПолучить соответствующий объект потока, указав параметр.

Проводка неправда Номер

function main() {
    var t1 = threading.Thread(function () {
        Log("Hello thread1")
    })
    // The Thread object has a method: id(), which is used to get the thread ID. You can view the section of the document corresponding to the Thread object.
    var threadId = t1.id()
    var threadName = t1.name()
    Log("threadId:", threadId, ", threadName:", threadName)
    
    var t2 = threading.getThread(threadId)
    Log(`threadId == t2.id():`, threadId == t2.id(), `, threadName == t2.name():`, threadName == t2.name())
}

Получить указанный объект потока черезthreadId.

Он поддерживает систему обратного тестирования и среду торговли в реальном времени.

Если вы хотите получить нить была выполнена и выпущена, вы не можете использоватьthreading.getThread(threadId)чтобы получить предмет нитки нитки.

{@fun/Threads/threading/Thread Thread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/Lock Lock}, {@fun/Threads/threading/Condition Condition}, {@fun/Threads/threading/Event Event}, {@fun/Threads/threads/Dict Dict}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/threading/Lock Lock}, {@fun/Threads/threading/eventLoop Loop}, {@fun/Threads/threads/threading/eventLoop}, {@fun/Threads/threads/threading/eventLoop}

Главная нить

ВmainThread()Функция используется для получения объекта нитки основного нитки, то есть нитки, гдеmain()функция в стратегии расположена.

ВmainThread()Функция возвращает объект потока основного потока.

Threadобъект

ГлавныйThread ((()

function main() {
    Log("The threadId of the main thread:", threading.mainThread().id())
}

ВозьмиThreadОбъект основной нити и выходthreadIdГлавной нитью.

function test() {
    Log("Output the main thread ID in the test function:", threading.mainThread().id())
}

function main() {
    var t1 = threading.Thread(test)
    t1.join()
}

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

Он поддерживает систему обратного тестирования и среду торговли в реальном времени.

{@fun/Threads/getThread getThread}, {@fun/Threads/threading/Thread Thread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/Lock Lock}, {@fun/Threads/threading/Condition Condition}, {@fun/Threads/threading/Event Event}, {@fun/Threads/threads/threading/Dict Dict}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/threading/Lock Lock}, {@fun/Threads/threading/eventLoop Loop}, {@fun/Threads/threads/threading/eventLoop}

текущая нить

ВcurrentThread()функция используется для получения объекта потока текущей потоки.

ВcurrentThread()функция возвращает объект потока текущей потоки.

Threadобъект

текущийThread ((()

function test() {
    Log("Id of the current thread:", threading.currentThread().id())
}

function main() {
    var t1 = threading.Thread(test)
    t1.join()
}

ВозьмиThreadобъекта текущей нити и выходthreadIdтекущей нити.

Он поддерживает систему обратного тестирования и среду торговли в реальном времени.

{@fun/Threads/threading/Thread Thread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/Thread Thread}, {@fun/Threads/threading/Lock Lock}, {@fun/Threads/threading/threading/Condition Condition}, {@fun/Threads/threading/event Event}, {@fun/Threads/threading/threading/Dict Dict}, {@fun/Threads/threading/threading/pending pending}, {@fun/Threads/threading/threading/Loop eventLoop}, {@fun/Threads/threading/eventLoop}, {@fun/Threads/threading/eventLoop}, {@fun/Threads/threads/threading/eventLoop}, {@fun/Threads/threads/threads/event

Замок.

ВLock()Функция используется для создания объекта блокировки потока.

ВLock()Функция возвращает объект блокировки потока.

ThreadLockобъект

Замок ((()

function consumer(productionQuantity, dict, lock) {
    for (var i = 0; i < productionQuantity; i++) {
        lock.acquire()
        var count = dict.get("count")        
        Log("consumer:", count)
        Sleep(1000)
        lock.release()
    }
}

function producer(productionQuantity, dict, lock) {
    for (var i = 0; i < productionQuantity; i++) {
        lock.acquire()
        dict.set("count", i)
        Log("producer:", i)
        Sleep(1000)
        lock.release()
    }
}

function main() {
    var dict = threading.Dict()
    dict.set("count", -1)
    var lock = threading.Lock()
    var productionQuantity = 10
    var producerThread = threading.Thread(producer, productionQuantity, dict, lock)
    var consumerThread = threading.Thread(consumer, productionQuantity, dict, lock)

    consumerThread.join()
    producerThread.join()
}

Два параллельных потока получают доступ к общему ресурсу.

Он поддерживает систему обратного тестирования и среду торговли в реальном времени.

{@fun/Threads/threading/getThread getThread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threads/threading/ThreadThread}, {@fun/Threads/threads/threading/Condition Condition}, {@fun/Threads/threads/threading/Event Event}, {@fun/Threads/threads/threading/Dict Dict}, {@fun/Threads/threads/threading/pending pending}, {@fun/Threads/threads/threading/threading/eventLoop}

Состояние

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

ВCondition()функция возвращает aThreadCondition object.

ThreadConditionобъект

Состояние

function consumer(productionQuantity, dict, condition) {
    for (var i = 0; i < productionQuantity; i++) {
        condition.acquire()
        while (dict.get("array").length == 0) {
            condition.wait()
        }
        var arr = dict.get("array")
        var count = arr.shift()
        dict.set("array", arr)
        Log("consumer:", count, ", array:", arr)
        condition.release()
        Sleep(1000)
    }
}

function producer(productionQuantity, dict, condition) {
    for (var i = 0; i < productionQuantity; i++) {
        condition.acquire()
        var arr = dict.get("array")
        arr.push(i)
        dict.set("array", arr)
        Log("producer:", i, ", array:", arr)
        condition.notify()
        condition.release()
        Sleep(1000)
    }
}

function main() {
    var dict = threading.Dict()
    dict.set("array", [])
    var condition = threading.Condition()
    var productionQuantity = 10
    var producerThread = threading.Thread(producer, productionQuantity, dict, condition)
    var consumerThread = threading.Thread(consumer, productionQuantity, dict, condition)
    consumerThread.join()
    producerThread.join()
}

Два параллельных потока получают доступ к общему ресурсу.

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

{@fun/Threads/getThread getThread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/Lock Lock}, {@fun/Threads/threading/Thread Thread}, {@fun/Threads/threading/event Event}, {@fun/Threads/threading/Dict Dict}, {@fun/Threads/threading/pending pending}, {@fun/Threads/threading/eventLoop Loop}

Событие

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

ВEvent()функция возвращает aThreadEvent object.

ThreadEventобъект

Событие

function consumer(productionQuantity, dict, pEvent, cEvent) {
    for (var i = 0; i < productionQuantity; i++) {
        while (dict.get("array").length == 0) {
            pEvent.wait()
        }
        if (pEvent.isSet()) {
            pEvent.clear()
        }

        var arr = dict.get("array")
        var count = arr.shift()
        dict.set("array", arr)
        Log("consumer:", count, ", array:", arr)
        cEvent.set()
        Sleep(1000)
    }
}

function producer(productionQuantity, dict, pEvent, cEvent) {
    for (var i = 0; i < productionQuantity; i++) {
        while (dict.get("array").length != 0) {
            cEvent.wait()
        }
        if (cEvent.isSet()) {
            cEvent.clear()
        }

        var arr = dict.get("array")
        arr.push(i)
        dict.set("array", arr)
        Log("producer:", i, ", array:", arr)        
        pEvent.set()       
        Sleep(1000)
    }
}

function main() {    
    var dict = threading.Dict()
    dict.set("array", [])
    var pEvent = threading.Event()
    var cEvent = threading.Event()
    var productionQuantity = 10
    var producerThread = threading.Thread(producer, productionQuantity, dict, pEvent, cEvent)
    var consumerThread = threading.Thread(consumer, productionQuantity, dict, pEvent, cEvent)

    consumerThread.join()
    producerThread.join()
}

Два параллельных потока получают доступ к общему ресурсу.

Он поддерживает систему обратного тестирования и среду торговли в реальном времени.

{@fun/Threads/getThread getThread}, {@fun/Threads/threads/mainThread mainThread}, {@fun/Threads/threads/currentThread currentThread}, {@fun/Threads/threads/threading/Lock Lock}, {@fun/Threads/threads/threading/Condition Condition}, {@fun/Threads/threads/threading/Thread Thread}, {@fun/Threads/threads/threading/Dict Dict}, {@fun/Threads/threads/threading/pending pending}, {@fun/Threads/threads/threading/eventLoop}

Диктант

ВDict()Функция используется для создания объекта словаря для передачи на одновременные потоки.

ВDict()функция возвращает aThreadDict object.

ThreadDictобъект

Диктант

function threadFun1(obj) {
    obj["age"] = 100
    while (true) {
        Log("threadFun1 obj:", obj)
        Sleep(5000)
    }
}

function threadFun2(obj) {
    while (true) {
        Log("threadFun2 obj:", obj)
        Sleep(5000)
    }
}

function main() {
    var obj = {"age": 10}
    var t1 = threading.Thread(threadFun1, obj)
    var t2 = threading.Thread(threadFun2, obj)
    t1.join()
    t2.join()    
}

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

function threadFun1(threadDict) {
    threadDict.set("age", 100)
    while (true) {
        Log(`threadFun1 threadDict.get("age"):`, threadDict.get("age"))
        Sleep(5000)
    }
}

function threadFun2(threadDict) {
    while (true) {
        Log(`threadFun2 threadDict.get("age"):`, threadDict.get("age"))
        Sleep(5000)
    }
}

function main() {
    var threadDict = threading.Dict()
    threadDict.set("age", 10)
    var t1 = threading.Thread(threadFun1, threadDict)
    var t2 = threading.Thread(threadFun2, threadDict)

    t1.join()
    t2.join()    
}

ПередайThreadDictОбъект, созданныйDict()Функция выполняется одновременно с функцией выполнения потока, и проверяется, будет ли изменение значения ключа объекта приводить к изменению значения ключа объекта в других потоках.

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

Он поддерживает систему обратного тестирования и среду торговли в реальном времени.

{@fun/Threads/getThread getThread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/Lock Lock}, {@fun/Threads/threading/Condition Condition}, {@fun/Threads/threading/event Event}, {@fun/Threads/threading/threading/Thread Thread}, {@fun/Threads/threading/threading/pending pending}, {@fun/Threads/threading/eventLoop}

В ожидании

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

Вpending()функция возвращает количество одновременных потоков, которые запускает текущая стратегия программы.

Номер

В ожидании))

function threadFun1() {
    Log("threadFun1")
    Sleep(3000)
}

function threadFun2() {
    for (var i = 0; i < 3; i++) {
        LogStatus(_D(), "print from threadFun2")
        Sleep(3000)
    }
}

function main() {
    Log(`begin -- threading.pending():`, threading.pending())

    var t1 = threading.Thread(threadFun1)
    var t2 = threading.Thread(threadFun2)
    Log(`after threading.Thread -- threading.pending():`, threading.pending())

    t1.join()
    t2.join()
    Log(`after thread.join -- threading.pending():`, threading.pending())
}

Создать два одновременно работающих потока и вызватьpending()Функция в разных временных узлах.

Когда стратегияmain()Функция начинает работать, вызывая функциюpending()непосредственно вернет 1, потому что основная нить, где стратегияmain()функция находится также в ожидании нить.

Он поддерживает систему обратного тестирования и среду торговли в реальном времени.

{@fun/Threads/threading/getThread getThread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/Lock Lock}, {@fun/Threads/threading/Condition Condition}, {@fun/Threads/threading/Event Event}, {@fun/Threads/threading/Dict Dict}, {@fun/Threads/threading/Thread Thread}, {@fun/Threads/threading/eventLoop}

Нить

Threadобъекты могут быть созданы или возвращеныthreading.Thread(), threading.getThread(), threading.mainThread(), иthreading.currentThread().

PeekСообщение

ВpeekMessage()Функция используется для получения сообщения из потока.

ВpeekMessage()функция возвращает сообщение, полученное нитью, связанной с текущим объектом нитки.

string, number, bool, object, array, null value и другие типы, поддерживаемые системой

Посмотреть сообщение (() PeekMessage ((Timeout) Посмотреть сообщение

ПараметрtimeoutЕсли нет данных и время задержки превышает предел, будет возвращено значение NULL.timeoutустанавливается на 0 илиtimeoutпараметр не будет передан, это означает, что процесс будет блокировать и ждать, пока данные не будут получены из канала.timeoutЕсли значение -1, это означает, что процесс не будет блокировать и возвращать данные немедленно. Если нет данных, будет возвращено значение нуль.

Тайм-аут ложное Номер

function main() {
    var t1 = threading.Thread(function() {
        for (var i = 0; i < 10; i++) {
            Log("thread1 postMessage():", i)
            threading.mainThread().postMessage(i)
            Sleep(500)
        }        
    })

    while (true) {
        var msg = threading.currentThread().peekMessage()
        Log("main peekMessage():", msg)
        if (msg == 9) {
            break
        }
        Sleep(1000)
    }

    t1.join()
}

Отправлять сообщения в главную нить из параллельной нитки.

Когда мы пишем программы, мы должны обращать внимание на проблемы с тупиком потоков.

{@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData setData}, {@fun/Threads/Thread/id id}, {@fun/Threads/Threads/Thread/name}, {@Threads/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Threads/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}

Послание

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

mailMessage(msg)

ПараметрmsgЭто послание, которое нужно отправить.

СМС Истинно Любой тип, поддерживаемый системой, например строка, число, bool, объект, массив, функция, нулевое значение и т. д.

function main() {
    var t1 = threading.Thread(function() {
        for (var i = 0; i < 10; i++) {
            Log("thread1 postMessage():", i)
            threading.mainThread().postMessage(i)
            Sleep(500)
        }        
    })
    for (var i = 0; i < 10; i++) {
        var event = threading.mainThread().eventLoop()
        Log("main event:", event)
        Sleep(500)
    }
    t1.join()
}

Отправка сообщений в одновременных потоках и использованиеeventLoop()чтобы получать уведомления о сообщениях.

function main() {
    threading.mainThread().postMessage(function(msg) {
        Log("func from mainThread, msg:", msg)
    })
    
    threading.Thread(function() {
        var func = threading.mainThread().peekMessage()
        func("in " + threading.currentThread().name())
    }).join()
}

Он поддерживает отправку функции.

Когда функция выполнения threads вызываетpostMessage()Функция для отправки сигнала или данных, событие сообщения также генерируется.eventLoop()функция получения уведомлений о сообщениях.

{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData set}, {@fun/Threads/Thread/id id}, {@fun/Threads/Threads/Thread/name name}, {@fun/Threads/Thread/eventLoop eventLoop}, {@fun/Threads/Threads/Thread/name}, {@fun/Threads/Thread/eventLoop eventLoop}

присоединяться

Вjoin()функция используется для ожидания выхода потока и восстановления системных ресурсов.

ВThreadRetобъектсодержит данные о результате выполнения.

  • ID: ID нитки.
  • terminated: если нить вынуждена закончиться.
  • прошедшее время: время прохождения нитки в наносекундах.
  • ret: возвращаемое значение функции "thread".

ThreadRetобъект

Присоединяйтесь. Присоединяйтесь (Timeout)

ВtimeoutПараметр используется для установки временного пребывания в миллисекундах для ожидания окончания потока.timeoutпараметр установлен на 0 илиtimeoutпараметр не установлен,join()функция будет блокировать и ждать, пока нить закончит выполнение.timeoutпараметр установлен на -1,join()Функция восстановится немедленно.

Тайм-аут ложное Номер

function main() {
    var t1 = threading.Thread(function() {
        Log("Hello thread1")
        Sleep(5000)
    })

    var ret = t1.join(1000)
    Log("ret:", ret)   // ret: undefined

    ret = t1.join()
    Log("ret:", ret)   // ret: {"id":1,"terminated":false,"elapsed":5003252000}
}

Проверитьjoin()Функция timeout и вывод возвращаемого значения.

Вjoin()время выхода и возвращения функцииundefined.

{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData setData}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name}, {@fun/Threads/Threads/Thread/eventLoop eventLoop}

прекратить

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

прекратить ((()

function main() {
    var t1 = threading.Thread(function() {
        for (var i = 0; i < 10; i++) {
            Log("thread1 i:", i)
            Sleep(1000)
        }
    })

    Sleep(3000)
    t1.terminate()
    Log("after t1.terminate()")

    while (true) {
        LogStatus(_D())
        Sleep(1000)
    }
}

После принудительного прекращения действия потока не будет выхода из этого потока в журнале.

Для нитей, которые насильно заканчиваютсяterminate()Функция, мы больше не можем использоватьjoin()Функция ждать, пока они закончатся.

{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData setData}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name}, {@fun/Threads/Threads/Thread/eventLoop eventLoop}

getData

ВgetData()Данные действительны, когда нить не выполняетjoin()Функция (в ожидании успешного выхода) и не выполнилаterminate()функцию (силовое прекращение нити).

ВgetData()Функция возвращает значение ключа, соответствующееkeyпараметр в паре ключей и значений, хранящийся в текущем контексте потока.

string, number, bool, object, array, null value и другие типы, поддерживаемые системой

getData ((() getData ((ключ)

Вkeyпараметр - это название ключа для сохраненной пары ключей и значений.

ключ неправда строка

function main() {
    var t1 = threading.Thread(function() {
        for (var i = 0; i < 5; i++) {
            threading.currentThread().setData("count", i)
            Log(`setData("count"):`, i)
            Sleep(1000)
        }
    })
    for (var i = 0; i < 5; i++) {
        var count = threading.getThread(t1.id()).getData("count")
        Log(`getData("count"):`, count)
        Sleep(1000)
    }
    t1.join()
}

Запишите значение ключаcountв одновременной среде нить, а затем читать ключевое значениеcountв главной нить.

{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/setData set}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name name}, {@fun/Threads/Thread/eventLoop eventLoop}

setData

ВsetData()функция используется для хранения переменных в контексте потока.

setData ((ключ, значение)

Вkeyпараметр используется для указания названия ключа для сохраненной пары ключей и значений.

ключ неправда строка Вvalueпараметр используется для указания значения ключа для сохраненной пары ключей и значений.

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

function main() {
    var t1 = threading.Thread(function() {
        threading.currentThread().setData("data", 100)
    })
    Sleep(1000)
    Log(`t1.getData("data"):`, t1.getData("data"))
    t1.join()
}

Установите пару ключей-значений в паре параллельных нитей и прочитайте пару ключей-значений в основной нитке.

function main() {
    threading.mainThread().setData("func2", function(p) {
        Log("func2 p:", p)
    })
    
    var t1 = threading.Thread(function() {
        threading.currentThread().setData("func1", function(p) {
            Log("func1 p:", p)
        })
    
        var func2 = threading.mainThread().getData("func2")
        func2("test2")
    })
    
    Sleep(1000)
    var func1 = t1.getData("func1")
    func1("test1")
    t1.join()
}

Он поддерживает передачу ключевых значений в функции.

Данные действительны, когда нить не выполняетjoin()Функция (в ожидании успешного выхода) и не выполнилаterminate()значение параметраvalueдолжна быть сериализируемой переменной.

{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name}, {@fun/Threads/Thread/Thread/eventLoop eventLoop}

Идентификатор

Вid()Функция используется для возвращенияthreadIdтекущего многопоточного объекта.

Доходное значениеid()функция -threadId.

Номер

id()

function main() {
    var t1 = threading.Thread(function() {
        threading.currentThread().setData("data", 100)
    })
    Log(`t1.id():`, t1.id())
    t1.join()
}

Создать параллельно работающий нить и вывестиthreadIdэтой параллельной нитью в основной нить.

{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData set}, {@fun/Threads/Thread/name name}, {@fun/Threads/Threads/Thread/eventLoop eventLoop}

Имя

Вname()функция используется для возвращения имени текущего многопоточного объекта.

Вname()Функция возвращает имя параллельной нитки.

строка

Имя ((()

function main() {
    var t1 = threading.Thread(function() {
        threading.currentThread().setData("data", 100)
    })
    Log(`t1.name():`, t1.name())  // t1.name(): Thread-1
    t1.join()
}

Создать параллельную нить и вывести имя параллельной нитки в основной нить.

{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData set}, {@fun/Threads/Thread/id id}, {@fun/Threads/Threads/Thread/eventLoop eventLoop}

событиеLoop

ВeventLoop()функция используется для прослушивания событий, полученных нитью.

ВeventLoop()функция возвращает информацию о событиях, полученную текущей нитью.Информационная структура событий.

объект, нулевое значение

СобытиеLoop() EventLoop ((Timeout))

Параметрtimeout- это настройка времени в миллисекундах. Если параметрtimeoutЕсли значение будет установлено на 0, оно будет ждать, пока произойдет событие, прежде чем возвращать. Если оно больше 0, оно будет устанавливать время ожидания события. Если оно меньше 0, оно немедленно вернет последнее событие.

Тайм-аут ложное Номер

function main() {
    var t1 = threading.Thread(function() {
        while (true) {
            var eventMsg = threading.currentThread().eventLoop()     // Blocking wait
            // 2024-11-14 10:14:18 thread1 eventMsg: {"Seq":1,"Event":"thread","ThreadId":0,"Index":1,"Queue":0,"Nano":1731550458699947000}
            Log(_D(), "thread1 eventMsg:", eventMsg)
        }
    })

    var t2 = threading.Thread(function() {
        while (true) {
            var eventMsg = threading.currentThread().eventLoop(-1)   // Return immediately
            Log(_D(), "thread2 eventMsg:", eventMsg)
            Sleep(5000)
        }
    })

    var t3 = threading.Thread(function() {
        while (true) {
            var eventMsg = threading.currentThread().eventLoop(3000) // Set a 3 second timeout
            Log(_D(), "thread3 eventMsg:", eventMsg)
        }
    })

    t1.postMessage("Hello ", t1.name())
    t2.postMessage("Hello ", t2.name())
    t3.postMessage("Hello ", t3.name())
    t1.join()
    t2.join()
    t3.join()
}

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

Механизм обработкиeventLoop()функция такая же, как и глобальная функцияEventLoop().

{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Threads/setData set}, {@fun/Threads/Thread/id id}, {@fun/Threads/Threads/Thread/name name}, {@fun/Threads/name name}

Закрыть

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

приобретать

Вacquire()Функция используется для запроса блокировки нити (блокировки).

приобретать

Пожалуйста, обратитесь кthreading.Lock()Раздел для примеров.

Вacquire()Функция используется для запроса блокировки потока.acquire()Функция объекта блокировки потока, он пытается получить блокировку. Если блокировка в настоящее время не проводится другой потоком, вызовущая потока успешно приобретает блокировку и продолжает выполнение. Если блокировка уже проводится другой потоком, вызовущая потокаacquire()будет блокироваться до тех пор, пока замок не будет освобожден.

{@fun/Threads/threading/Lock Lock}, {@fun/Threads/ThreadLock/release release}

освобождение

Вrelease()Функция используется для освобождения блокировки нити (отключения).

освобождение))

function consumer(productionQuantity, dict, pLock, cLock) {
    for (var i = 0; i < productionQuantity; i++) {
        pLock.acquire()
        cLock.acquire()
        var arr = dict.get("array")
        var count = arr.shift()
        dict.set("array", arr)
        Log("consumer:", count, ", array:", arr)
        cLock.release()
        Sleep(1000)
        pLock.release()
    }
}

function producer(productionQuantity, dict, pLock, cLock) {
    for (var i = 0; i < productionQuantity; i++) {
        cLock.acquire()   // cLock.acquire() placed after pLock.acquire() will not cause deadlock
        pLock.acquire()   
        var arr = dict.get("array")
        arr.push(i)
        dict.set("array", arr)
        Log("producer:", i, ", array:", arr)
        pLock.release()
        Sleep(1000)
        cLock.release()
    }
}

function main() {
    var dict = threading.Dict()
    dict.set("array", [])
    var pLock = threading.Lock()
    var cLock = threading.Lock()
    var productionQuantity = 10
    var producerThread = threading.Thread(producer, productionQuantity, dict, pLock, cLock)
    var consumerThread = threading.Thread(consumer, productionQuantity, dict, pLock, cLock)

    consumerThread.join()
    producerThread.join()
}

Испытание сценариев тупика

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

{@fun/Threads/threading/Lock Lock}, {@fun/Threads/ThreadLock/acquire acquire}, {@fun/Threads/Threads/threading/Lock Lock}, {@fun/Threads/ThreadLock/acquire acquire}, {@fun/Threads/Threads/threading/Lock Lock}, {@fun/Threads/Threads/ThreadLock/acquire acquire}, {@fun/Threads/Threads/acquire acquire}, {@fun/Threads/Threads/acquire acquire}, {@fun/Threads/Threads/Threads/Lock Lock}, {@fun/Threads/Threads/Threads/acquire}, {@threading/LockLock}, {@fun/Threads/Threads/Threads/threads}

Ведущий

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

набор

Вset()Функция используется для уведомления о событиях (настроенные сигналы).

набор ((()

Пожалуйста, обратитесь кthreading.Event()Раздел для примеров.

Если сигнал настроен с использованиемset()Мы должны очистить сигнал и установить его снова.

{@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/wait wait}, {@fun/Threads/ThreadEvent/isSet isSet}

Прозрачно

Вclear()Функция используется для очистки сигнала.

Прозрачно.

Пожалуйста, обратитесь кthreading.Event()Раздел для примеров.

{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/wait wait}, {@fun/Threads/ThreadEvent/isSet isSet}

Подождите.

Вwait()функция используется для установки ожидания события (сигнала) и блокируется до установки события (сигнала); она поддерживает установку параметра timeout.

Вwait()Функция возвращает значение true.

Буль

Подождите. Подождите.

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

Тайм-аут ложное Номер

function main() {
    var event = threading.Event()
    var t1 = threading.Thread(function(event) {
        var ret = event.wait(100)
        Log(`event.wait(100):`, ret)
        ret = event.wait()
        Log(`event.wait():`, ret)
    }, event)

    Sleep(1000)
    event.set()
    t1.join()
}

Испытать возвращаемое значениеwait() function.

{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/isSet isSet}

isSet

ВisSet()Функция используется для определения того, было ли установлено событие (сигнал).

ВisSet()Функция возвращает значение true, если событие (сигнал) установлено.

Буль

isSet ((()

Пожалуйста, обратитесь кthreading.Event()Раздел для примеров.

{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/wait wait}

ThreadCondition (Условие)

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

Уведомить

Вnotify()Функция используется для пробуждения ожидающего потока (если таковой имеется).wait()Метод будет пробужден.

Уведомлять

function consumer(dict, condition) {
    while (true) {
        condition.acquire()
        while (dict.get("array").length == 0) {
            Log(threading.currentThread().name(), "wait()...", ", array:", dict.get("array"))
            condition.wait()
        }
        var arr = dict.get("array")
        var num = arr.shift()
        Log(threading.currentThread().name(), ", num:", num, ", array:", arr, "#FF0000")
        dict.set("array", arr)
        Sleep(1000)
        condition.release()
    }
}

function main() {
    var condition = threading.Condition()
    var dict = threading.Dict()
    dict.set("array", [])
    var t1 = threading.Thread(consumer, dict, condition)
    var t2 = threading.Thread(consumer, dict, condition)
    var t3 = threading.Thread(consumer, dict, condition)
    Sleep(1000)
    var i = 0
    while (true) {
        condition.acquire()
        var msg = ""
        var arr = dict.get("array")
        var randomNum = Math.floor(Math.random() * 5) + 1
        if (arr.length >= 3) {
            condition.notifyAll()
            msg = "notifyAll"
        } else {
            arr.push(i)
            dict.set("array", arr)
            if (randomNum > 3 && arr.length > 0) {
                condition.notify()
                msg = "notify"
            } else {
                msg = "pass"
            }
            i++
        }

        Log(_D(), "randomNum:", randomNum, ", array:", arr, ", msg:", msg)
        condition.release()
        Sleep(1000)
    }
}

Используйтеnotify()Функция пробуждает ждущую нить.

Вnotify()функция просыпается нить в очереди ожидания.

Когдаnotify()Функция пробуждает нить, нить восстановит блокировку нитки.

{@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/Threads/ThreadCondition/release release}

Уведомить всех

ВnotifyAll()Функция пробуждает все ожидающие нитки.

Уведомить все ((()

Пожалуйста, обратитесь кThreadCondition.notify()Раздел для примеров.

ВnotifyAll()Функция пробуждает все ожидающие нитки по одному, и пробужденные нитки восстанавливают блокировку нитки.

{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/Threads/ThreadCondition/release release}

Подождите.

Вwait()Функция используется, чтобы заставить нить ждать в определенных условиях.

Подождите.

Пожалуйста, обратитесь кThreadCondition.notify()Раздел для примеров.

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

{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/Threads/ThreadCondition/release release}

приобретать

Вacquire()Функция используется для запроса блокировки нити (блокировки).

приобретать

Пожалуйста, обратитесь кThreadCondition.notify()Раздел для примеров.

Перед применениемwait(), вам нужно запросить блокировку потока (блокировку) текущего объекта состояния.

{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/release release}

освобождение

Вrelease()Функция используется для освобождения блокировки нити (отключения).

освобождение))

Пожалуйста, обратитесь кThreadCondition.notify()Раздел для примеров.

После примененияwait(), мы должны освободить замок нитки (разблокировать) объекта текущего состояния.

{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquire acquire}

ThreadDict

Объект словаря, используемый для обмена данными.

Пойдем.

Вget()Функция используется для получения ключевого значения, записанного в объекте словаря.

Вget()Функция возвращает значение ключа, указанногоkey parameter.

string, number, bool, object, array, null value и другие типы, поддерживаемые системой

Get (ключ)

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

ключ неправда строка

function main() {
    var event = threading.Event()
    var dict = threading.Dict()
    dict.set("data", 100)
    
    var t1 = threading.Thread(function(dict, event) {
        Log(`thread1, dict.get("data"):`, dict.get("data"))
        
        event.set()
        event.clear()
        
        event.wait()
        Log(`after main change data, thread1 dict.get("data"):`, dict.get("data"))
    
        dict.set("data", 0)
    }, dict, event)
    
    event.wait()
    
    dict.set("data", 99)
    
    event.set()
    event.clear()
    
    t1.join()
    Log(`main thread, dict.get("data"):`, dict.get("data"))
}

Использовать объекты событий для уведомления потоков для чтения и изменения данных.

{@fun/Threads/ThreadDict/set set} - Я не знаю.

набор

Вset()функция используется для установки пары ключей-значений.

набор (ключ, значение)

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

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

стоимость Истинно string, number, bool, object, array, function, null value и другие типы, поддерживаемые системой

function main() {
    var dict1 = threading.Dict()
    dict1.set("func1", function(p) {
        Log("func1 p:", p)
    })
    
    threading.Thread(function(dict1) {
        var func1 = dict1.get("func1")
        func1("test")
    }, dict1).join()
}

Он поддерживает передачу ключевых значений в функции.

{@fun/Threads/ThreadDict/get get} - Что ты делаешь?

Веб3

exchange.IO("Аби",...)

В FMZ Quant Trading Platform, он в основном реализует различные функции, вызовы, связанные с блокчейном черезexchange.IO()В следующем документе описываетсяexchange.IO()Применение метода вызоваexchange.IO("abi", ...)функция используется для регистрации ABI.

exchange.IO(k, адрес, abiContent)

ВkПараметр используется для установки функцииexchange.IO()функция, установленная на"abi"означает, что функция используется для регистрацииABI- Да. k неправда строка Вaddressпараметр используется для указания адреса смарт-контракта. Адрес неправда строка ВabiContentПараметр используется для указанияABIумного контракта. abiСодержание неправда строка

function main() {
    // register Uniswap SwapRouter02 abi
    var routerAddress = "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45"
    var abi = `[{"inputs":[{"components":[{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"}],"internalType":"struct IV3SwapRouter.ExactOutputParams","name":"params","type":"tuple"}],"name":"exactOutput","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"payable","type":"function"}]`
    
    // Get the ```ABI``` content of the contract can be obtained with the following URL, taking the ```result``` field only, e.g:
    exchange.IO("abi", routerAddress, abi)
}

Способы вызова смарт-контракта не должны регистрироваться, если это стандартные методы ERC20. ВозьмиABIСодержание контракта можно получить по следующему адресуresultтолько поле, например:

https://api.etherscan.io/api?module=contract&action=getabi&address=0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45

exchange.IO("api", eth,...)

Способ вызоваexchange.IO("api", "eth", ...)функция используется для вызова метода Ethereum RPC.

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

exchange.IO(k, blockChain, rpcMethod)exchange.IO(k, blockChain, rpcMethod,...args)

ВkПараметр используется для установки функцииexchange.IO()функция, установленная на"api"указывает, что функция используется для расширения запроса вызова. k неправда строка ВblockChainПараметр используется для установки функцииexchange.IO()функция, установленная на"eth"указывает, что функция используется для вызовов методов RPC в сети Ethereum. блок-цепочка Истинно строка ВrpcMethodПараметр используется для установки метода RPC, который должен быть вызванexchange.IO()Функция. Метод rpc неправда строка Вargпараметр используется для указания параметров метода RPC, который должен быть вызван.argтип и количествоargпараметры зависят от метода RPC, указанногоrpcMethodПараметр. арг ложное string, number, bool, object, array, function, null и все другие типы, поддерживаемые системой

function main() {
    // "owner" needs to be replaced with the specific wallet address
    // Parameter labels for the "latest" string position: 'latest', 'earliest' or 'pending', please refrer to https://eth.wiki/json-rpc/API#the-default-block-parameter
    // The return value ethBalance is a hexadecimal string: 0x9b19ce56113070
    var ethBalance = exchange.IO("api", "eth", "eth_getBalance", "owner", "latest")              

    // ETH has a precision unit of 1e18
    var ethDecimal = 18              

    // Because of the JavaScript language precision, it is necessary to use the system underlying package function BigInt, BigDecimal to process
    // Convert ethBalance to readable amount, 0x9b19ce56113070 to 0.043656995388076145
    Log(Number((BigDecimal(BigInt(ethBalance))/BigDecimal(Math.pow(10, ethDecimal))).toString()))
}

Проверьте баланс ETH в вашем кошельке:

function mian() {
    // ETH has a precision unit of 1e18
    var ethDecimal = 18  

    // Number of transfers, readable amount e.g. 0.01 ETH
    var sendAmount = 0.01  

    // Due to the JavaScript language precision, it is necessary to use the system underlying encapsulated functions BigInt, BigDecimal to process, and to convert the readable amount to the data processed on the chain
    var toAmount = (BigDecimal(sendAmount)*BigDecimal(Math.pow(10, ethDecimal))).toFixed(0)
    
    // "toAddress" is the address of the recipient's ETH wallet at the time of the transfer, which needs to be filled in specifically, and toAmount is the number of transfers
    exchange.IO("api", "eth", "send", "toAddress", toAmount)
}

Для переводов ETH вы можете установить{gasPrice: 11, gasLimit: 111, nonce: 111}параметр, который устанавливается на последнем параметреexchange.IO()Вы можете пропуститьnonceи использовать систему по умолчанию, или оставитьgasLimit/gasPrice/nonceотключить и использовать систему по умолчанию для всех.

function toAmount(s, decimals) {
    return Number((BigDecimal(BigInt(s))/BigDecimal(Math.pow(10, decimals))).toString())
}

function main() {
    var gasPrice = exchange.IO("api", "eth", "eth_gasPrice")
    Log("gasPrice:", toAmount(gasPrice, 0))   // 5000000000 , in wei (5 gwei)
}

ЗапросgasPrice:

function toAmount(s, decimals) {
    // The toAmount function can convert hex-encoded values to decimal values
    return Number((BigDecimal(BigInt(s))/BigDecimal(Math.pow(10, decimals))).toString())
}                

function main() {
    // Coding approve (authorization) method calls
    var data = exchange.IO("encode", "0x111111111117dC0aa78b770fA6A738034120C302", "approve", "0xe592427a0aece92de3edee1f18e0157c05861564", "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")
    Log("data:", data)
    var gasPrice = exchange.IO("api", "eth", "eth_gasPrice")
    Log("gasPrice:", toAmount(gasPrice, 0))
    var obj = {
        "from" : "0x0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",   // walletAddress
        "to"  : "0x111111111117dC0aa78b770fA6A738034120C302",
        "gasPrice" : gasPrice,
        "value" : "0x0",
        "data" : "0x" + data,
    }
    
    var gasLimit = exchange.IO("api", "eth", "eth_estimateGas", obj)
    Log("gasLimit:", toAmount(gasLimit, 0))
    Log("gas fee", toAmount(gasLimit, 0) * toAmount(gasPrice, 0) / 1e18)
}

Запросeth_estimateGas:

Второй параметрexchange.IO()функция с"eth"может напрямую вызвать методы RPC, доступные серверу узла Ethereum.

# # Забавный Большой Десятиметровый # # Забавный Большой Интеллект #

exchange.IO("кодировать",...)

Вexchange.IO("encode", ...)функция вызвана для кодирования данных.

Вexchange.IO("encode", ...)функция возвращает закодированные данные. строка

exchange.IO(k, dataFormat,...args)exchange.IO(k, адрес, формат данных)exchange.IO(k, адрес, данныеФормат,...args)

ВkПараметр используется для установки функцииexchange.IO()функция, установленная на"encode"означает, что функция используется для кодирования данных. k неправда строка ВaddressПараметр используется для установки адреса смарт-контракта.exchange.IO("encode", ...)Функция, проходящая вaddressПараметр указывает на кодирование метода вызова на умный контракт.exchange.IO("encode", ...)функции, еслиaddressпараметр не передается, функция используется для кодирования указанного порядка типа и функционально эквивалентнаabi.encodeвSolidity- Да. Адрес ложное строка ВdataFormatПараметр используется для указания метода, типа и порядка кодируемых данных. DataFormat (Формат данных) Истинно строка ВargПараметр используется для указания значения конкретных данных, соответствующегоdataFormatпараметр. может быть более одногоargпараметр, а также тип и количествоargпараметров зависит отdataFormatпараметры. арг ложное строка, число, тупл, массив и все другие типы, поддерживаемые системой

function main() {
    // Main network address of ContractV3SwapRouterV2: 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45
    // Calling the unwrapWETH9 method requires registering the ABI first, which is omitted here
    // "owner" represents the wallet address, which need to fill in the specific, 1 represents the number of unpacking, unpacking a WETH into ETH
    var data = exchange.IO("encode", "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45", "unwrapWETH9(uint256,address)", 1, "owner")
    Log(data)
}

Например, вызов метода кодированияunwrapWETH9:

function main() {
    var x = 10 
    var address = "0x02a5fBb259d20A3Ad2Fdf9CCADeF86F6C1c1Ccc9"
    var str = "Hello World"
    var array = [1, 2, 3]
    var ret = exchange.IO("encode", "uint256,address,string,uint256[]", x, address, str, array)   // uint i.e. uint256 , the type length needs to be specified on FMZ
    Log("ret:", ret)
    /*
    000000000000000000000000000000000000000000000000000000000000000a    // x
    00000000000000000000000002a5fbb259d20a3ad2fdf9ccadef86f6c1c1ccc9    // address
    0000000000000000000000000000000000000000000000000000000000000080    // Offset of str
    00000000000000000000000000000000000000000000000000000000000000c0    // Offset of array
    000000000000000000000000000000000000000000000000000000000000000b    // The length of str
    48656c6c6f20576f726c64000000000000000000000000000000000000000000    // str data
    0000000000000000000000000000000000000000000000000000000000000003    // The length of the array
    0000000000000000000000000000000000000000000000000000000000000001    // array the first data
    0000000000000000000000000000000000000000000000000000000000000002    // array the second data
    0000000000000000000000000000000000000000000000000000000000000003    // array the third data
    */
}

Это эквивалентно примеру кодированияabi.encodeвSolidity:

function main() {
    var types = "tuple(a uint256,b uint8,c address),bytes"
    var ret = exchange.IO("encode", types, {
        a: 30,
        b: 20,
        c: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
    }, "0011")
    Log("encode: ", ret)
}

Он поддерживает кодирование тупла или порядка типа, содержащего тупла. Этот тип порядка состоит из:tuple, bytes, так что когда звонишьexchange.IO()для кодирования, вам нужно продолжить передачу двух параметров:

    1. Переменные, соответствующие типу тупла:
    
    {
        a: 30,
        b: 20,
        c: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
    }
    
    

    Переданные параметры также должны соответствовать структуре и типуtuple, как определено вtypesпараметр формы:tuple(a uint256,b uint8,c address).

    1. Переменные, соответствующие типуbytes:
    "0011"
    
function main() {
    var path = ["0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "0xdac17f958d2ee523a2206206994597c13d831ec7"]   // ETH address, USDT address
    var ret = exchange.IO("encode", "address[]", path)
    Log("encode: ", ret)
}

Он поддерживает последовательное кодирование массивов или типов, содержащих массивы:

Вexchange.IO()Функция включает в себяencodeметод, который может вернуть код вызова функцииhexДля конкретного использования вы можете обратиться к публично доступным платформамUniswap V3 Trade Шаблон- Да. При использовании метода кодирования для поиска смарт-контрактов, в первую очередь необходимо зарегистрировать соответствующий ABI.

exchange.IO("encodePacked",...)

Вexchange.IO("encodePacked", ...)функция называется таким образом, что используется дляencodePacked encoding.

Вexchange.IO("encodePacked", ...)функция возвращаетencodePackedзашифрованные данные. строка

exchange.IO(k, dataFormat,...args)

ВkПараметр используется для установки функцииexchange.IO()функция, установленная на"encodePacked"означает, что функция используется для данныхencodePackedкодирование. k неправда строка ВdataFormatПараметр используется для указания типа и порядкаencodePackedзашифрованные данные. DataFormat (Формат данных) неправда строка ВargПараметр используется для указания значения конкретных данных, соответствующегоdataFormatпараметр. может быть более одногоargпараметр, а также тип и количествоargпараметров зависит отdataFormatпараметры. арг Истинно строка, число, тупл, массив и все другие типы, поддерживаемые системой

function main() {
    var fee = exchange.IO("encodePacked", "uint24", 3000)
    var tokenInAddress = "0x111111111117dC0aa78b770fA6A738034120C302"
    var tokenOutAddress = "0x6b175474e89094c44da98b954eedeac495271d0f"
    var path = tokenInAddress.slice(2).toLowerCase()
    path += fee + tokenOutAddress.slice(2).toLowerCase()
    Log("path:", path)
}

При примененииUniswap V3, вы должны передать в параметрах, как обменный путь, вы должны использоватьencodePackedоперация кодирования:

exchange.IO("Декодировать",...)

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

Вexchange.IO("decode", ...)возвращает декодированные данные. возвращает строку, когда есть только один данный, указанныйdataFormatвозвращает массив, когда есть более одного данного, указанногоdataFormatПараметр. массив, строка

exchange.IO(k, dataФормат, данные)

ВkПараметр используется для установки функцииexchange.IO()Функция и настройка на"decode"означает, что функция используется для декодирования данных. k неправда строка ВdataFormatПараметр используется для определения типа и порядка декодированных данных. DataFormat (Формат данных) Истинно строка ВdataПараметр используется для настройки данных для декодирования. данные неправда строка

function main() {
    var types = "tuple(a uint256,b uint8,c address),bytes"
    var ret = exchange.IO("encode", types, {
        a: 30,
        b: 20,
        c: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
    }, "0011")
    Log("encode: ", ret)            

    var rawData = exchange.IO("decode", types, ret)
    Log("decode:", rawData)
}

Обратное действиеexchange.IO("encode", ...)Функция:

function main() {
    // register SwapRouter02 abi
    var walletAddress = "0x398a93ca23CBdd2642a07445bCD2b8435e0a373f"
    var routerAddress = "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45"
    var abi = `[{"inputs":[{"components":[{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"}],"internalType":"struct IV3SwapRouter.ExactOutputParams","name":"params","type":"tuple"}],"name":"exactOutput","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"payable","type":"function"}]`
    exchange.IO("abi", routerAddress, abi)   // abi only uses the contents of the local exactOutput method, the full abi can be searched on the Internet              

    // encode path
    var fee = exchange.IO("encodePacked", "uint24", 3000)
    var tokenInAddress = "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
    var tokenOutAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7"
    var path = tokenInAddress.slice(2).toLowerCase()
    path += fee + tokenOutAddress.slice(2).toLowerCase()
    Log("path:", path)              

    var dataTuple = {
        "path" : path, 
        "recipient" : walletAddress, 
        "amountOut" : 1000, 
        "amountInMaximum" : 1, 
    }
    // encode SwapRouter02 exactOutput 
    var rawData = exchange.IO("encode", routerAddress, "exactOutput", dataTuple)
    Log("method hash:", rawData.slice(0, 8))   // 09b81346
    Log("params hash:", rawData.slice(8))              

    // decode exactOutput params
    var decodeRaw = exchange.IO("decode", "tuple(path bytes,recipient address,amountOut uint256,amountInMaximum uint256)", rawData.slice(8))
    Log("decodeRaw:", decodeRaw)
}

В следующем примере сначала выполняетсяencodePackedОперация наpathобработки параметров, посколькуexactOutputвызов метода, который должен быть закодирован позже требуетpathкак параметр.encode- Да.exactOutputметод договора маршрутизации, который имеет только один параметр типаtuple. Название методаexactOutputкодируется как:0x09b81346, и с использованиемexchange.IO("decode", ...)метод расшифровки полученногоdecodeRaw, в соответствии с переменнойdataTuple.

Для обработки данныхexchange.IO()функция поддерживает не только кодирование, но и декодирование.

exchange.IO("ключ",...)

Вexchange.IO("key", ...)Функция называется таким образом, чтобы переключать частные ключи.

exchange.IO(K, ключ)

Параметрkиспользуется для настройки функцииexchange.IO()функция, установленная на"key"означает, что функция используется для переключения частного ключа. k неправда строка ВkeyПараметр используется для настройки частного ключа. ключ неправда строка

function main() {
    exchange.IO("key", "Private Key")   // "Private Key" represents the private key string, which needs to be filled in specifically
}

Вexchange.IO()Функция поддерживает переключение частных ключей и может манипулировать несколькими адресами кошельков.

exchange.IO("апи",...)

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

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

exchange.IO(k, адрес, метод)exchange.IO(k, адрес, метод,...arg)exchange.IO(k, адрес, метод, значение,...args)

ВkПараметр используется для установки функцииexchange.IO()функция, установленная на"api"указывает, что функция используется для расширения запроса вызова. k неправда строка Вaddressпараметр используется для указания адреса смарт-контракта. Адрес неправда строка Вmethodпараметр используется для указания метода, который должен быть вызван для смарт-контракта. метод Истинно строка ВvalueПараметр используется для установки количества ETH, которое будет отправлено.stateMutabilityатрибут метода смарт-контракта, который должен быть выполнен:payable, затемvalueПараметр должен быть передан."stateMutability": "payable"Атрибут может быть просмотрен из ABI.exchange.IO()Функция будет определять требуемый параметр на основеstateMutabilityатрибут в ABI, который был зарегистрирован.stateMutabilityатрибут - этоnonpayable, затемvalueПараметр не нужно передавать. стоимость ложное число, строка Вargпараметр используется для указания параметров метода смарт-контракта, который должен быть вызван.argпараметр, а также тип и количествоargпараметры зависит от метода умного контракта, который будет вызван. арг ложное строка, число, bool и все другие типы, поддерживаемые системой

function main(){
    var tokenAddress = "0x111111111117dC0aa78b770fA6A738034120C302"    // The contract address of the token, the token is 1INCH in the example
    Log(exchange.IO("api", tokenAddress, "decimals"))                  // Query, print 1INCH tokens with precision index of 18
}

ВdecimalsМетод являетсяconstantЭто позволяет использовать ERC20 без потребления газа и запросить точные данные токенов.decimalsВозвращаемое значение: данные точности токена.

function main(){
    // The contract address of the token, in the example the token is 1INCH
    var tokenAddress = "0x111111111117dC0aa78b770fA6A738034120C302"                          

    // For example, the query yields 1000000000000000000, divided by the precision unit of the token 1e18, the wallet to which the current exchange object is bound has authorized 1 1INCH to the spender address
    Log(exchange.IO("api", tokenAddress, "allowance", "owner", "spender"))   
}

ВallowanceМетод являетсяconstantВ этом случае, если вы используете ERC20, вы не будете потреблять газ и сможете запросить разрешенный объем токена для определенного контрактного адреса.allowanceМетод принимает 2 параметра, первый - адрес кошелька, а второй - авторизованный адрес.
owner: адрес кошелька, пример заменен строкой owner, фактическое использование необходимо заполнить конкретный адрес.spender: адрес уполномоченного контракта, пример заменяется строкой spender, фактическое использование необходимо заполнить конкретный адрес, например, это может бытьUniswap V3 router v1 address.

function main(){
    // The contract address of the token, the token is 1INCH in the example
    var tokenAddress = "0x111111111117dC0aa78b770fA6A738034120C302"                 

    // The hexadecimal string of the authorization amount: 0xde0b6b3a7640000 , the corresponding decimal string: 1e18 , 1e18 divided by the precision unit of the token, i.e. 1 token amount, so this refers to the authorization of one token
    Log(exchange.IO("api", tokenAddress, "approve", "spender", "0xde0b6b3a7640000"))  
}```
The ```approve``` method is a non-```constant``` method of ERC20, which generates gas consumption and is used to authorize the operation amount of a token to a contract address. The ```approve``` method takes 2 parameters, the first one is the address to be authorized and the second one is the amount to be authorized. Return value: txid.  
```spender```: the address of the authorized contract, the example is replaced by the string "spender", the actual use needs to fill in the specific address, for example, it can be ```Uniswap V3 router v1``` address. ```0xde0b6b3a7640000```: the number of authorizations, here is the hexadecimal string, the corresponding decimal value is 1e18, divided by the token precision unit in the example (i.e. 1e18). The result is that 1 token is authorized. The third parameter of the ```exchange.IO()``` function is passed to the method name ```approve```, which can also be written in the form of methodId, such as "0x571ac8b0". It is also possible to write the full standard method name, for example: "approve(address,uint256)".
```javascript
function main() {
    var ContractV3SwapRouterV2 = "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45"
    var tokenInName = "ETH"
    var amountIn = 0.01
    var options = {gasPrice: 5000000000, gasLimit: 21000, nonce: 100}   // This is an example, depending on the actual scene settings
    var data = ""                                                       // The encoded data, here is the empty string, depending on the actual scene settings
    var tx = exchange.IO("api", ContractV3SwapRouterV2, "multicall(uint256,bytes[])", (tokenInName == 'ETH' ? amountIn : 0), (new Date().getTime() / 1000) + 3600, data, options || {})
}

ВmulticallМетод не является...constantМетодUniswap V3который генерирует потребление газа и используется для выкупа токенов несколькими способами. ВmulticallМетод может иметь различные способы передачи параметров, вы можете проверить ABI, который содержит метод конкретно, вам нужно зарегистрировать ABI перед вызовом метода.

Для конкретных примеровmulticallВы можете обратиться к публично доступным платформам.Uniswap V3 Trade Шаблон

Некоторые детали описаны здесь с использованием псевдокода:


exchange.IO("api", ContractV3SwapRouterV2, "multicall(uint256,bytes[])", value, deadline, data)

ContractV3SwapRouterV2: адрес маршрутизатора v2 Uniswap V3.value: сумма ETH для перевода, установленная на 0, если токен-токен обменной операции не является ETH.deadline: deadlineявляется параметромmulticallМетод, который может быть установлен на (new Date().getTime() / 1000) + 3600, что указывает на его действие в течение одного часа.data: dataявляется параметромmulticallметод, данные о проведении операции упаковки.

Похожиеexchange.IO("api", "eth", "send", "toAddress", toAmount),gasLimit/gasPrice/nonceУстановка вызова метода может быть указана при вызовеmulticallметодом. Опять же, мы используем псевдокод для описания:


exchange.IO("api", ContractV3SwapRouterV2, "multicall(uint256,bytes[])", value, deadline, data, {gasPrice: 123456, gasLimit: 21000})

Параметр{gasPrice: 11, gasLimit: 111, nonce: 111}может устанавливаться в соответствии с конкретными потребностями, который устанавливается на последний параметрexchange.IO()Функция. Вы можете пропуститьnonceи использовать систему по умолчанию, или оставитьgasLimit/gasPrice/nonceотключить и использовать систему по умолчанию для всех.

exchange.IO("адрес")

Вexchange.IO("address")функция вызвана таким образом, чтобы получить адрес кошелька, настроенного объектом обмена {@var/EXCHANGE exchange}.

Вexchange.IO("address")функция возвращает конфигурированный адрес кошелька. строка

exchange.IO(k)

ВkПараметр используется для установки функцииexchange.IO()функция, установленная на"address"означает, что функция используется для получения настроенного адреса кошелька. k Истинно строка

function main() {
    Log(exchange.IO("address"))         // Print the wallet address of the private key configured on the exchange object
}

exchange.IO("база",...)

Вexchange.IO("base", ...)функция вызвана таким образом, чтобы установить адрес узла RPC.

exchange.IO(k, адрес)

ВkПараметр используется для установки функцииexchange.IO()функция, установленная на"base"означает, что функция используется для переключения узлов RPC. k неправда строка Вaddressпараметр используется для установки адреса узла RPC. Адрес неправда строка

function main() {
    var chainRpc = "https://bsc-dataseed.binance.org"
    e.IO("base", chainRpc)    // Switching to BSC chain
}

ТА

TA.MACD

ВTA.MACD()Функция используется для расчетаИндикатор MACD экспоненциальной сглаженной дисмимории и сходства.

Доходное значениеTA.MACD()функция представляет собой двумерный массив со структурой:[DIF, DEA, MACD]- Да. массив

TA.MACD ((inReal) TA.MACD ((inReal, optInFastPeriod, optInSlowPeriod, optInSignalPeriod) - в реальном времени, в быстром периоде, в медленном периоде, в сигнальном периоде

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInFastPeriodПараметр используется для установки быстрого периода. optInFastPeriod ложное Номер ВoptInSlowPeriodПараметр используется для установки медленного периода. optInSlowPeriod ложное Номер ВoptInSignalPeriodПараметр используется для установки периода сигнала. optВ период сигнализации ложное Номер

function main(){
    // You can fill in different k-line periods, such as PERIOD_M1,PERIOD_M30,PERIOD_H1...
    var records = exchange.GetRecords(PERIOD_M15)
    var macd = TA.MACD(records, 12, 26, 9)
    // Watching the logs, you can see that three arrays are returned, corresponding to DIF, DEA and MACD.
    Log("DIF:", macd[0], "DEA:", macd[1], "MACD:", macd[2])
}
def main():
    r = exchange.GetRecords(PERIOD_M15)
    macd = TA.MACD(r, 12, 26, 9)
    Log("DIF:", macd[0], "DEA:", macd[1], "MACD:", macd[2])
void main() {
    auto r = exchange.GetRecords(PERIOD_M15);
    auto macd = TA.MACD(r, 12, 26, 9);
    Log("DIF:", macd[0], "DEA:", macd[1], "MACD:", macd[2]);
}

ВTAбиблиотека индикаторов FMZ Quant, оптимизированная для общих алгоритмов индикаторов.JavaScript, Python, C++призывы к стратегии в области языка,открытый код библиотеки TA- Да. Значения по умолчаниюoptInFastPeriod, optInSlowPeriod, иoptInSignalPeriodпараметрыTA.MACD()Функция:12, 26, и9.

{@fun/TA/TA.KDJ TA.KDJ}, {@fun/TA/TA.RSI TA.RSI}, {@fun/TA/TA.ATR TA.ATR}, {@fun/TA/TA.OBV TA.OBV}, {@fun/TA/TA.MA},TA.MA}, {@fun/TA/TA.EMA TA.EMA}, {@fun/TA/TA.BOLL TA.BOLL}, {@fun/TA/TA.Alligator TA.Alligator}, {@fun/TA/TA.CMF TA.CMF}, {@fun/TA/TA.Highest TA.Highest}, {@fun/TA/TA.Lowest TA.Lowest}

TA.KDJ

ВTA.KDJ()Функция используется для расчетастохастические показатели.

Доходное значениеTA.KDJ()функция представляет собой двумерный массив со структурой:[K, D, J]- Да. массив

TA.KDJ ((inReal)) TA.KDJ ((inReal, период, kPeriod, dPeriod)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВperiodПараметр используется для установки периода 1. Период ложное Номер ВkPeriodПараметр используется для установки периода 2. kПериод ложное Номер ВdPeriodПараметр используется для установки периода 3. dПериод ложное Номер

function main(){
    var records = exchange.GetRecords(PERIOD_M15)
    var kdj = TA.KDJ(records, 9, 3, 3)
    Log("k:", kdj[0], "d:", kdj[1], "j:", kdj[2])
}
def main():
    r = exchange.GetRecords(PERIOD_M15)
    kdj = TA.KDJ(r, 9, 3, 3)
    Log("k:", kdj[0], "d:", kdj[1], "j:", kdj[2])
void main() {
    auto r = exchange.GetRecords();
    auto kdj = TA.KDJ(r, 9, 3, 3);
    Log("k:", kdj[0], "d:", kdj[1], "j:", kdj[2]);
}

Значения по умолчанию дляperiod, kPeriod, иdPeriodпараметрыTA.KDJ()Функция:9, 3, и3.

{@fun/TA/TA.MACD TA.MACD}, {@fun/TA/TA.RSI TA.RSI}, {@fun/TA/TA.ATR TA.ATR}, {@fun/TA/TA.OBV TA.OBV}, {@fun/TA/TA.MA},TA.MA}, {@fun/TA/TA.EMA TA.EMA}, {@fun/TA/TA.BOLL TA.BOLL}, {@fun/TA/TA.Alligator TA.Alligator}, {@fun/TA/TA.CMF TA.CMF}, {@fun/TA/TA.Highest TA.Highest}, {@fun/TA/TA.Lowest TA.Lowest}

TA.RSI

ВTA.RSI()Функция используется для расчетаИндикатор прочности.

Доходное значениеTA.RSI()функция: одномерный массив. массив

TA.RSI ((inReal) TA.RSI ((inReal, optInTimePeriod)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodПараметр используется для установки периода. optInTimeПериод ложное Номер

function main(){
    var records = exchange.GetRecords(PERIOD_M30)
    var rsi = TA.RSI(records, 14)
    Log(rsi)
}
def main():
    r = exchange.GetRecords(PERIOD_M30)
    rsi = TA.RSI(r, 14)
    Log(rsi)
void main() {
    auto r = exchange.GetRecords(PERIOD_M30);
    auto rsi = TA.RSI(r, 14);
    Log(rsi); 
}

Значение по умолчаниюoptInTimePeriodпараметрTA.RSI()Функция:14.

{@fun/TA/TA.MACD TA.MACD}, {@fun/TA/TA.KDJ TA.KDJ}, {@fun/TA/TA.ATR TA.ATR}, {@fun/TA/TA.OBV TA.OBV}, {@fun/TA/TA.MA},TA.MA}, {@fun/TA/TA.EMA TA.EMA}, {@fun/TA/TA.BOLL TA.BOLL}, {@fun/TA/TA.Alligator TA.Alligator}, {@fun/TA/TA.CMF TA.CMF}, {@fun/TA/TA.Highest TA.Highest}, {@fun/TA/TA.Lowest TA.Lowest}

TA.ATR

ВTA.ATR()Функция используется для расчетаСредний показатель истинной волатильности.

Доходное значениеTA.ATR()функция: одномерный массив. массив

TA.ATR ((inPriceHLC) TA.ATR ((в ценеHLC, optInTimePeriod)

ВinPriceHLCпараметр используется для указания данных K-линии. inPriceHLC неправда {@struct/Record Record} массив структуры ВoptInTimePeriodПараметр используется для установки периода. optInTimeПериод ложное Номер

function main(){
    var records = exchange.GetRecords(PERIOD_M30)
    var atr = TA.ATR(records, 14)
    Log(atr)
}
def main():
    r = exchange.GetRecords(PERIOD_M30)
    atr = TA.ATR(r, 14)
    Log(atr)
void main() {
    auto r = exchange.GetRecords(PERIOD_M30);
    auto atr = TA.ATR(r, 14);
    Log(atr);
}

Значение по умолчаниюoptInTimePeriodпараметрTA.ATR()Функция:14.

{@fun/TA/TA.MACD TA.MACD}, {@fun/TA/TA.KDJ TA.KDJ}, {@fun/TA/TA.RSI TA.RSI}, {@fun/TA/TA.OBV TA.OBV}, {@fun/TA/TA.MA},TA.MA}, {@fun/TA/TA.EMA TA.EMA}, {@fun/TA/TA.BOLL TA.BOLL}, {@fun/TA/TA.Alligator TA.Alligator}, {@fun/TA/TA.CMF TA.CMF}, {@fun/TA/TA.Highest TA.Highest}, {@fun/TA/TA.Lowest TA.Lowest}

TA.OBV

ВTA.OBV()Функция используется для расчетаиндикатор энергетического прилива.

Доходное значениеTA.OBV()функция: одномерный массив. массив

TA.OBV ((inReal) TA.OBV ((inReal, inPriceV)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВinPriceVпараметр используется для указания данных о сумме сделки. inPriceV ложное {@struct/Record Record} массив структуры

function main(){
    var records = exchange.GetRecords(PERIOD_M30)
    var obv = TA.OBV(records)
    Log(obv)
}
def main():
    r = exchange.GetRecords(PERIOD_M30)
    obv = TA.OBV(r)
    Log(obv)
void main() {
    auto r = exchange.GetRecords(PERIOD_M30);
    auto obv = TA.OBV(r);
    Log(obv);
}

{@fun/TA/TA.MACD TA.MACD}, {@fun/TA/TA.KDJ TA.KDJ}, {@fun/TA/TA.RSI TA.RSI}, {@fun/TA/TA.ATR TA.ATR}, {@fun/TA/TA.MA},TA.MA}, {@fun/TA/TA.EMA TA.EMA}, {@fun/TA/TA.BOLL TA.BOLL}, {@fun/TA/TA.Alligator TA.Alligator}, {@fun/TA/TA.CMF TA.CMF}, {@fun/TA/TA.Highest TA.Highest}, {@fun/TA/TA.Lowest TA.Lowest}

TA.MA

ВTA.MA()Функция используется для расчетаИндикатор MACD.

Доходное значениеTA.MA()функция: одномерный массив. массив

TA.MA(недействительный)TA.MA(inReal, optInTimePeriod)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodПараметр используется для установки периода. optInTimeПериод ложное Номер

function main(){
    var records = exchange.GetRecords(PERIOD_M30)
    var ma = TA.MA(records, 14)
    Log(ma)
}
def main():
    r = exchange.GetRecords(PERIOD_M30)
    ma = TA.MA(r, 14)
    Log(ma)
void main() {
    auto r = exchange.GetRecords(PERIOD_M30);
    auto ma = TA.MA(r, 14);
    Log(ma);
}

Значение по умолчаниюoptInTimePeriodпараметрTA.MA()Функция:9.

{@fun/TA/TA.MACD TA.MACD}, {@fun/TA/TA.KDJ TA.KDJ}, {@fun/TA/TA.RSI TA.RSI}, {@fun/TA/TA.ATR TA.ATR}, {@fun/TA/TA.OBV TA.OBV}, {@fun/TA/TA.EMA TA.EMA}, {@fun/TA/TA.BOLL TA.BOLL}, {@fun/TA/TA.Alligator TA.Alligator}, {@fun/TA/TA.CMF TA.CMF}, {@fun/TA/TA.Highest.Highest}, {@fun/TA/TA.Lowest TA.Lowest}, {@fun/TA/TA.Lowest TA.Lowest}, {@fun/TA/TA.BOLL TA.BOLL}, {@fun/TA/TA.Alligator TA.Alligator}, {@fun/TA/TA/TA.CMF TA.CMF

TA.EMA

ВTA.EMA()Функция используется для расчетапоказатель экспоненциальной средней.

Доходное значениеTA.EMA()функция: одномерный массив. массив

TA.EMA ((inReal) TA.EMA ((inReal, optInTimePeriod) - в реальном времени, в промежутке времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodПараметр используется для установки периода. optInTimeПериод ложное Номер

function main(){
    var records = exchange.GetRecords()
    // Determine if the number of K-line bars meets the calculation period of the indicator
    if (records && records.length > 9) {
        var ema = TA.EMA(records, 9)          
        Log(ema)
    }
}
def main():
    r = exchange.GetRecords()
    if r and len(r) > 9:
        ema = TA.EMA(r, 9)
        Log(ema)
void main() {
    auto r = exchange.GetRecords();
    if(r.Valid && r.size() > 9) {
        auto ema = TA.EMA(r, 9);
        Log(ema);
    }
}

Значение по умолчаниюoptInTimePeriodпараметрTA.EMA()Функция:9.

{@fun/TA/TA.MACD TA.MACD}, {@fun/TA/TA.KDJ TA.KDJ}, {@fun/TA/TA.RSI TA.RSI}, {@fun/TA/TA.ATR TA.ATR}, {@fun/TA/TA.OBV TA.OBV}, {@fun/TA/TA.MA},TA.MA}, {@fun/TA/TA.BOLL TA.BOLL}, {@fun/TA/TA.Alligator TA.Alligator}, {@fun/TA/TA.CMF TA.CMF}, {@fun/TA/TA.Highest TA.Highest}, {@fun/TA/TA.Lowest TA.Lowest}

TA.BOLL

ВTA.BOLL()Функция используется для расчетаИндикатор полосы Боллинджера.

Доходное значениеTA.BOLL()функция представляет собой двумерный массив со структурой:[upLine, midLine, downLine]- Да. массив

TA.BOLL ((inReal)) TA.BOLL ((inReal, период, множитель)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВperiodПараметр используется для установки периода. Период ложное Номер ВmultiplierПараметр используется для установки множителя. множитель ложное Номер

function main() {
    var records = exchange.GetRecords()
    if(records && records.length > 20) {
        var boll = TA.BOLL(records, 20, 2)
        var upLine = boll[0]
        var midLine = boll[1]
        var downLine = boll[2]
        Log(upLine)
        Log(midLine)
        Log(downLine)
    }
}
def main():
    r = exchange.GetRecords()
    if r and len(r) > 20:
        boll = TA.BOLL(r, 20, 2)
        upLine = boll[0]
        midLine = boll[1]
        downLine = boll[2]
        Log(upLine)
        Log(midLine)
        Log(downLine)
void main() {
    auto r = exchange.GetRecords();
    if(r.Valid && r.size() > 20) {
        auto boll = TA.BOLL(r, 20, 2);
        auto upLine = boll[0];
        auto midLine = boll[1];
        auto downLine = boll[2];
        Log(upLine);
        Log(midLine);
        Log(downLine);
    }
}

Значения по умолчанию дляperiodиmultiplierпараметрыTA.BOLL()Функция:20и2.

{@fun/TA/TA.MACD TA.MACD}, {@fun/TA/TA.KDJ TA.KDJ}, {@fun/TA/TA.RSI TA.RSI}, {@fun/TA/TA.ATR TA.ATR}, {@fun/TA/TA.OBV TA.OBV}, {@fun/TA/TA.MA},TA.MA}, {@fun/TA/TA.EMA TA.EMA}, {@fun/TA/TA.Alligator TA.Alligator}, {@fun/TA/TA.CMF TA.CMF}, {@fun/TA/TA.Highest TA.Highest}, {@fun/TA/TA.Lowest TA.Lowest}

TA.Alligator

ВTA.Alligator()Функция используется для расчетаПоказатель аллигатора.

Доходное значениеTA.Alligator()функция представляет собой двумерный массив со структурой:[jawLine, teethLine, lipsLine]- Да. массив

TA.Аллигатор ((inReal) TA.Аллигатор ((в реальности, челюсть, длина, зубы, длина, губы, длина)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВjawLengthПараметр используется для установки периода челюсти. челюстьДлина ложное Номер ВteethLengthПараметр используется для установки периода зубов. зубыДлина ложное Номер ВlipsLengthпараметр используется для установки периода верхней губы. Длина губ ложное Номер

function main(){
    var records = exchange.GetRecords()
    var alligator = TA.Alligator(records)
    Log("jawLine:", alligator[0])
    Log("teethLine:", alligator[1])
    Log("lipsLine:", alligator[2])
}
def main():
    records = exchange.GetRecords()
    alligator = TA.Alligator(records)
    Log("jawLine:", alligator[0])
    Log("teethLine:", alligator[1])
    Log("lipsLine:", alligator[2])
void main() {
    auto records = exchange.GetRecords();
    auto alligator = TA.Alligator(records);
    Log("jawLine:", alligator[0]);
    Log("teethLine:", alligator[1]);
    Log("lipsLine:", alligator[2]);
}

Значения по умолчаниюjawLength, teethLength, иlipsLengthпараметрыTA.Alligator()Функция:13, 8, и5.

{@fun/TA/TA.MACD TA.MACD}, {@fun/TA/TA.KDJ TA.KDJ}, {@fun/TA/TA.RSI TA.RSI}, {@fun/TA/TA.ATR TA.ATR}, {@fun/TA/TA.OBV TA.OBV}, {@fun/TA/TA.MA},TA.MA}, {@fun/TA/TA.EMA TA.EMA}, {@fun/TA/TA.BOLL TA.BOLL}, {@fun/TA/TA.CMF TA.CMF}, {@fun/TA/TA.Highest TA.Highest}, {@fun/TA/TA.Lowest TA.Lowest}

TA.CMF

ВTA.CMF()Функция используется для расчетаИндикатор денежных потоков Чайкина.

Доходное значениеTA.CMF()функция: одномерный массив. массив

TA.CMF ((inReal) TA.CMF ((inReal, inPriceV)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВinPriceVпараметр используется для указания данных объема. inPriceV ложное {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var cmf = TA.CMF(records)
    Log(cmf)
}
def main():
    records = exchange.GetRecords()
    cmf = TA.CMF(records)
    Log(cmf)
void main() {
    auto records = exchange.GetRecords();
    auto cmf = TA.CMF(records);
    Log(cmf);
}

{@fun/TA/TA.MACD TA.MACD}, {@fun/TA/TA.KDJ TA.KDJ}, {@fun/TA/TA.RSI TA.RSI}, {@fun/TA/TA.ATR TA.ATR}, {@fun/TA/TA.OBV TA.OBV}, {@fun/TA/TA.MA},TA.MA}, {@fun/TA/TA.EMA TA.EMA}, {@fun/TA/TA.BOLL TA.BOLL}, {@fun/TA/TA.Alligator TA.Alligator}, {@fun/TA/TA.Highest TA.Highest}, {@fun/TA/TA.Lowest TA.Lowest}

TA.Highest

ВTA.Highest()Функция используется для расчетасамая высокая цена за период.

ВTA.Highest()Функция возвращает максимальное значение атрибута за последний определенный период, за исключением текущего Bar. Номер

TA.Самый высокий ((inReal) TA.Самый высокий ((в реальном, периоде, attr)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВperiodПараметр используется для установки периода. Период ложное Номер Вattrпараметр используется для установки атрибутов, необязательно:Open, Close, Low, High, Volume, OpenInterest- Да. АТР ложное строка

function main() {
    var records = exchange.GetRecords()
    var highestForOpen = TA.Highest(records, 10, "Open")
    Log(highestForOpen)
}
def main():
    records = exchange.GetRecords()
    highestForOpen = TA.Highest(records, 10, "Open")
    Log(highestForOpen)
void main() {
    auto records = exchange.GetRecords();
    auto highestForOpen = TA.Highest(records.Open(), 10);
    Log(highestForOpen);
}

Например, еслиTA.Highest(records, 30, "High")функция называется, если параметр периодаperiodУстановлено на0, это означает, чтобы рассчитать всеBarsК-линейные данные, переданныеinRealпараметр; если параметр атрибутаattrне указано, данные K-линии, передаваемыеinRealпараметр считается обычным массивом.

{@fun/TA/TA.MACD TA.MACD}, {@fun/TA/TA.KDJ TA.KDJ}, {@fun/TA/TA.RSI TA.RSI}, {@fun/TA/TA.ATR TA.ATR}, {@fun/TA/TA.OBV TA.OBV}, {@fun/TA/TA.MA},TA.MA{@fun/TA/TA.EMA TA.EMA}, {@fun/TA/TA.BOLL TA.BOLL}, {@fun/TA/TA.Alligator TA.Alligator}, {@fun/TA/TA.CMF TA.CMF}, {@fun/TA/TA.Lowest TA.Lowest}, {@fun/TA/TA.Lowest TA.CMF}, {@fun/TA/TA.Lowest TA.Lowest}, {@fun/TA/TA.Lowest TA.Lowest}, {@fun/TA/TA.Lowest TA.Lowest}, {@fun/TA/TA.Lowest TA.Lowest}, {@fun/TA/TA.Lowest TA.Lowest}, {@fun/TA/TA.Lowest TA.Lowest}, {@fun/TA/TA.Lowest TA.Lowest}, {@fun/TA/TA.Lowest TA.Lowest}, {@fun/TA/TA/TA.

TA.Lowest

ВTA.Lowest()Функция используется для расчетанаименьшая цена за период.

ВTA.Lowest()Функция возвращает минимальное значение атрибута за последний определенный период, за исключением текущего Bar. Номер

TA.Lowest ((inReal)) TA.Lowest ((inReal, период, attr)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВperiodПараметр используется для установки периода. Период ложное Номер Вattrпараметр используется для установки атрибутов, необязательно:Open, Close, Low, High, Volume, OpenInterest- Да. АТР ложное строка

function main() {
    var records = exchange.GetRecords()
    var lowestForOpen = TA.Lowest(records, 10, "Open")
    Log(lowestForOpen)
}
def main():
    records = exchange.GetRecords()
    lowestForOpen = TA.Lowest(records, 10, "Open")
    Log(lowestForOpen)
void main() {
    auto records = exchange.GetRecords();
    auto lowestForOpen = TA.Lowest(records.Open(), 10);
    Log(lowestForOpen);
}

Например, еслиTA.Lowest(records, 30, "Low")функция называется, если параметр периодаperiodУстановлено на0, это означает, чтобы рассчитать всеBarsК-линейные данные, переданныеinRealпараметр; если параметр атрибутаattrне указано, данные K-линии, передаваемыеinRealпараметр считается обычным массивом. ИспользованиеTA.Highest()иTA.Lowest()ФункцииC++Стратегии необходимо отметить, чтоHighest()иLowest()Каждая функция имеет только 2 параметра. И первым параметром, который мы передаем, не являются данные по линии К.rполучается, когда функцияauto r = exchange.GetRecords()был вызван. Тебе нужно позвонитьrПрохождение в данных конкретного атрибута.r.Close()данные о цене закрытия.Close, High, Low, Open, Volumeкак вr.Close()метод вызова.

Пример испытанияC++языковая стратегия:

void main() { 
    Records r;
    r.Valid = true;
    for (auto i = 0; i < 10; i++) {
        Record ele;
        ele.Time = i * 100000;
        ele.High = i * 10000;
        ele.Low = i * 1000;
        ele.Close = i * 100;
        ele.Open = i * 10;
        ele.Volume = i * 1;
        r.push_back(ele);
    }            

    for(int j = 0; j < r.size(); j++){
        Log(r[j]);
    }            

    // Note: the first parameter passed is not r, you need to call r.Close()
    auto highest = TA.Highest(r.Close(), 8);   
    Log(highest);                     
}

{@fun/TA/TA.MACD TA.MACD}, {@fun/TA/TA.KDJ TA.KDJ}, {@fun/TA/TA.RSI TA.RSI}, {@fun/TA/TA.ATR TA.ATR}, {@fun/TA/TA.OBV TA.OBV}, {@fun/TA/TA.MA},TA.MA{@fun/TA/TA.EMA TA.EMA}, {@fun/TA/TA.BOLL TA.BOLL}, {@fun/TA/TA.Alligator TA.Alligator}, {@fun/TA/TA.CMF TA.CMF}, {@fun/TA/TA.Highest TA.Highest}, {@fun/TA/TA.Highest TA.Highest}, {@fun/TA/TA.Highest TA.Highest}, {@fun/TA/TA.Highest TA.Highest}, {@fun/TA/TA.Highest TA.Highest}, {@fun/TA/TA.Highest TA.Highest}, {@fun/TA/TA.Highest TA.Highest}, {@fun/TA/TA.Highest TA.Highest}, {@fun/TA/TA.Highest TA.Highest}, {@fun/TA/TA.Highest TA.Highest}, {@fun/TA/TA/TA

TA.SMA

ВTA.SMA()Функция используется для расчетапростый индикатор скользящей средней.

Доходное значениеTA.SMA()функция: одномерный массив. массив

TA.SMA ((inReal) TA.SMA ((inReal, optInTimePeriod) - в реальном времени, в промежутке времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodПараметр используется для установки периода. optInTimeПериод ложное Номер

function main(){
    var records = exchange.GetRecords(PERIOD_M30)
    var sma = TA.SMA(records, 14)
    Log(sma)
}
def main():
    r = exchange.GetRecords(PERIOD_M30)
    sma = TA.SMA(r, 14)
    Log(sma)
void main() {
    auto r = exchange.GetRecords(PERIOD_M30);
    auto sma = TA.SMA(r, 14);
    Log(sma);
}

Значение по умолчаниюoptInTimePeriodпараметрTA.SMA()Функция:9.

{@fun/TA/TA.MACD TA.MACD}, {@fun/TA/TA.KDJ TA.KDJ}, {@fun/TA/TA.RSI TA.RSI}, {@fun/TA/TA.ATR TA.ATR}, {@fun/TA/TA.OBV TA.OBV}, {@fun/TA/TA.MA},TA.MA}, {@fun/TA/TA.EMA TA.EMA}, {@fun/TA/TA.BOLL TA.BOLL}, {@fun/TA/TA.Alligator TA.Alligator}, {@fun/TA/TA.CMF TA.CMF}, {@fun/TA/TA.Highest TA.Highest}, {@fun/TA/TA.Lowest TA.Lowest}

Талиб

talib.CDL2CROWS

Вtalib.CDL2CROWS()Функция используется для расчетаДве Вороны (К-линейная диаграмма - Две Вороны).

Доходное значениеtalib.CDL2CROWS()функция - это одномерный массив. массив

Талиб.CDL2CROWS ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDL2CROWS(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDL2CROWS(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDL2CROWS(records);
    Log(ret);
}

ВCDL2CROWS()Функция описана в документации библиотеки талиб как:CDL2CROWS(Records[Open,High,Low,Close]) = Array(outInteger)Для звонков вPythonязык, параметры передачи отличаются и должны основываться на вышеуказанном описании:Records[Open,High,Low,Close].

Пример деления переменнойrecords(то есть параметрinPriceOHLC, введите {@struct/Record Record} массив структур) в:Openсписок: написанный на Python какrecords.Open. HighСписок: написано какrecords.Highв Python.Lowсписок: написанный на Python какrecords.Low. Closeсписок: написанный на Python какrecords.Close.

Вызывается в коде стратегии Python:

talib.CDL2CROWS(records.Open, records.High, records.Low, records.Close)

Другой.talibпоказатели описываются одинаково и не будут повторяться.

talib.CDL3BLACKCROWS

Вtalib.CDL3BLACKCROWS()Функция используется для расчетаТри чёрных вороны (К-линейная диаграмма - Три чёрных вороны).

Доходное значениеtalib.CDL3BLACKCROWS()функция: одномерный массив. массив

Talib.CDL3BLACKCROWS ((inPriceOHLC) (включается в ценовую систему)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDL3BLACKCROWS(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDL3BLACKCROWS(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDL3BLACKCROWS(records);
    Log(ret);
}

ВCDL3BLACKCROWS()Функция описана в документации библиотеки талиб как:CDL3BLACKCROWS(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDL3INSIDE

Вtalib.CDL3INSIDE()Функция используется для расчетаТри внутри вверх/вниз (К-линейная диаграмма: Три внутри вверх/вниз).

Доходное значениеtalib.CDL3INSIDE()функция: одномерный массив. массив

Талиб.CDL3INSIDE ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDL3INSIDE(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDL3INSIDE(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDL3INSIDE(records);
    Log(ret);
}

ВCDL3INSIDE()Функция описана в документации библиотеки талиб как:CDL3INSIDE(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDL3LINESTRIKE

Вtalib.CDL3LINESTRIKE()Функция используется для расчетаТрехлинейная забастовка (K-линейная диаграмма: Трехлинейная забастовка).

Доходное значениеtalib.CDL3LINESTRIKE()функция: одномерный массив. массив

Талиб.CDL3LINESTRIKE ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDL3LINESTRIKE(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDL3LINESTRIKE(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDL3LINESTRIKE(records);
    Log(ret);
}

ВCDL3LINESTRIKE()Функция описана в документации библиотеки талиб как:CDL3LINESTRIKE(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDL3OUTSIDE

Вtalib.CDL3OUTSIDE()Функция используется для расчетаТри снаружи вверх/вниз (К-линейная диаграмма: Три снаружи вверх/вниз).

Доходное значениеtalib.CDL3OUTSIDE()функция: одномерный массив. массив

Талиб.CDL3OUTSIDE ((inPriceOHLC)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDL3OUTSIDE(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDL3OUTSIDE(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDL3OUTSIDE(records);
    Log(ret);
}

ВCDL3OUTSIDE()Функция описана в документации библиотеки талиб как:CDL3OUTSIDE(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDL3STARSINSOUTH

Вtalib.CDL3STARSINSOUTH()Функция используется для расчетаТри звезды на юге (К-линейный график: Три звезды на юге).

Доходное значениеtalib.CDL3STARSINSOUTH()функция: одномерный массив. массив

Талиб.CDL3STARSINSOUTH ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDL3STARSINSOUTH(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDL3STARSINSOUTH(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDL3STARSINSOUTH(records);
    Log(ret);
}

ВCDL3STARSINSOUTH()Функция описана в документации библиотеки талиб как:CDL3STARSINSOUTH(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDL3WHITESOLDIERS

Вtalib.CDL3WHITESOLDIERS()Функция используется для расчетаТри белых солдата впереди (К-линейный график: Три белых солдата впереди).

Доходное значениеtalib.CDL3WHITESOLDIERS()функция: одномерный массив. массив

Талиб.CDL3БЕЛЫЕ Солдаты ((inPriceOHLC)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDL3WHITESOLDIERS(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDL3WHITESOLDIERS(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDL3WHITESOLDIERS(records);
    Log(ret);
}

ВCDL3WHITESOLDIERS()Функция описана в документации библиотеки талиб как:CDL3WHITESOLDIERS(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLABANDONEDBABY

Вtalib.CDLABANDONEDBABY()Функция используется для расчетаЗаброшенный ребенок (К-линейная диаграмма: Заброшенный ребенок).

Доходное значениеtalib.CDLABANDONEDBABY()функция: одномерный массив. массив

Талиб.CDLAБАНДОНЕДБАБИ ((inPriceOHLC) Talib.CDLABANDONEDBABY ((inPriceOHLC, optInPenetration) (включается в цену, включает в проникновение)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры ВoptInPenetrationпараметр используется для настройки проникновения, значение по умолчанию 0,3. optInPenetration ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLABANDONEDBABY(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLABANDONEDBABY(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLABANDONEDBABY(records);
    Log(ret);
}

ВCDLABANDONEDBABY()Функция описана в документации библиотеки талиб как:CDLABANDONEDBABY(Records[Open,High,Low,Close],Penetration = 0.3) = Array(outInteger)

talib.CDLADVANCEBLOCK

Вtalib.CDLADVANCEBLOCK()Функция используется для расчетаПродвижение блока (К-линейная диаграмма: Продвижение).

Доходное значениеtalib.CDLADVANCEBLOCK()функция - это одномерный массив. массив

Талиб.CDLADVANCEBLOCK ((inPriceOHLC) (включается в цену)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLADVANCEBLOCK(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLADVANCEBLOCK(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLADVANCEBLOCK(records);
    Log(ret);
}

ВCDLADVANCEBLOCK()Функция описана в документации библиотеки талиб как:CDLADVANCEBLOCK(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLBELTHOLD

Вtalib.CDLBELTHOLD()Функция используется для расчетаУдерживание пояса (карта по линии К: Удерживание пояса).

Доходное значениеtalib.CDLBELTHOLD()функция: одномерный массив. массив

Талиб.CDLBELTHOLD ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLBELTHOLD(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLBELTHOLD(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLBELTHOLD(records);
    Log(ret);
}

ВCDLBELTHOLD()Функция описана в документации библиотеки талиб как:CDLBELTHOLD(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLBREAKAWAY

Вtalib.CDLBREAKAWAY()Функция используется для расчетаОтрыв (К-линейная диаграмма: Отрыв).

Доходное значениеtalib.CDLBREAKAWAY()функция: одномерный массив. массив

Талиб.CDLBРEAKAWAY ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLBREAKAWAY(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLBREAKAWAY(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLBREAKAWAY(records);
    Log(ret);
}

CDLBREAKAWAY()Функция описана в документации библиотеки талиб как:CDLBREAKAWAY(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLCLOSINGMARUBOZU

Вtalib.CDLCLOSINGMARUBOZU()Функция используется для расчетаЗакрытие Марубозу (К-линейная диаграмма: закрытие босиком и босиком).

Доходное значениеtalib.CDLCLOSINGMARUBOZU()функция: одномерный массив. массив

Талиб.CDLCЛОСИНГ Марубозу ((inPriceOHLC)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLCLOSINGMARUBOZU(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLCLOSINGMARUBOZU(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLCLOSINGMARUBOZU(records);
    Log(ret);
}

ВCDLCLOSINGMARUBOZU()Функция описана в документации библиотеки талиб как:CDLCLOSINGMARUBOZU(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLCONCEALBABYSWALL

Вtalib.CDLCONCEALBABYSWALL()Функция используется для расчетаСкрытие детской ласточки (К-линейный график: скрытие детской ласточки).

Доходное значениеtalib.CDLCONCEALBABYSWALL()функция: одномерный массив. массив

Talib.CDLCONCEALBABYSWALL ((inPriceOHLC) (в цену) (на английском)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLCONCEALBABYSWALL(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLCONCEALBABYSWALL(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLCONCEALBABYSWALL(records);
    Log(ret);
}

ВCDLCONCEALBABYSWALL()Функция описана в документации библиотеки талиб как:CDLCONCEALBABYSWALL(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLCOUNTERATTACK

Вtalib.CDLCOUNTERATTACK()Функция используется для расчетаКонтрнаступление (К-линейный график:Контрнаступление).

Доходное значениеtalib.CDLCOUNTERATTACK()функция - это одномерный массив. массив

Талиб.CDLКОНТАРАТАКК ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLCOUNTERATTACK(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLCOUNTERATTACK(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLCOUNTERATTACK(records);
    Log(ret);
}

ВCDLCOUNTERATTACK()Функция описана в документации библиотеки талиб как:CDLCOUNTERATTACK(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLDARKCLOUDCOVER

Вtalib.CDLDARKCLOUDCOVER()Функция используется для расчетаТёмная облачность (К-линейная диаграмма: темная облачность).

Доходное значениеtalib.CDLDARKCLOUDCOVER()функция - это одномерный массив. массив

Талиб.CDDARKCLOUDCOVER ((inPriceOHLC)) Талиб.CDDARKCLOUDCOVER ((inPriceOHLC, optInPenetration) (в переводе с английского)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры ВoptInPenetrationпараметр используется для настройки проникновения, значение по умолчанию составляет 0,5. optInPenetration ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLDARKCLOUDCOVER(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLDARKCLOUDCOVER(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLDARKCLOUDCOVER(records);
    Log(ret);
}

ВCDLDARKCLOUDCOVER()Функция описана в документации библиотеки талиб как:CDLDARKCLOUDCOVER(Records[Open,High,Low,Close],Penetration = 0.5) = Array(outInteger)

talib.CDLDOJI

Вtalib.CDLDOJI()Функция используется для расчетаДодзи (К-линейная диаграмма: Додзи).

Доходное значениеtalib.CDLDOJI()функция: одномерный массив. массив

Талиб.CDLDOJI ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLDOJI(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLDOJI(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLDOJI(records);
    Log(ret);
}

ВCDLDOJI()Функция описана в документации библиотеки талиб как:CDLDOJI(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLDOJISTAR

Вtalib.CDLDOJISTAR()Функция используется для расчетаДоджи-звезда (К-линейная диаграмма: Доджи-звезда).

Доходное значениеtalib.CDLDOJISTAR()функция: одномерный массив. массив

Талиб.CDLDOJISTAR ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLDOJISTAR(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLDOJISTAR(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLDOJISTAR(records);
    Log(ret);
}

ВCDLDOJISTAR()Функция описана в документации библиотеки талиб как:CDLDOJISTAR(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLDRAGONFLYDOJI

Вtalib.CDLDRAGONFLYDOJI()Функция используется для расчетаДодзи Стрельца (К-линейная диаграмма: Додзи Стрельца).

Доходное значениеtalib.CDLDRAGONFLYDOJI()функция: одномерный массив. массив

Талиб.CDLDRAGONFLYDOJI (в цену OHLC)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLDRAGONFLYDOJI(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLDRAGONFLYDOJI(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLDRAGONFLYDOJI(records);
    Log(ret);
}

ВCDLDRAGONFLYDOJI()Функция описана в документации библиотеки талиб как:CDLDRAGONFLYDOJI(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLENGULFING

Вtalib.CDLENGULFING()Функция используется для расчетаОбразец поглощения (К-линейная диаграмма: поглощение).

Доходное значениеtalib.CDLENGULFING()функция - это одномерный массив. массив

Талиб.CDЛЕНГУЛФИНГ ((inPriceOHLC)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLENGULFING(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLENGULFING(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLENGULFING(records);
    Log(ret);
}

ВCDLENGULFING()Функция описана в документации библиотеки талиб как:CDLENGULFING(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLEVENINGDOJISTAR

Вtalib.CDLEVENINGDOJISTAR()Функция используется для расчетаВечерняя звезда Доджи (К-линейная диаграмма: Вечерняя звезда Доджи).

Доходное значениеtalib.CDLEVENINGDOJISTAR()функция: одномерный массив. массив

Талиб.CDLEVENINGDOJISTAR ((inPriceOHLC) (в цену) Talib.CDLEVENINGDOJISTAR ((inPriceOHLC, optInPenetration) - Это не так.

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры ВoptInPenetrationпараметр используется для настройки проникновения, значение по умолчанию 0,3. optInPenetration ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLEVENINGDOJISTAR(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLEVENINGDOJISTAR(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLEVENINGDOJISTAR(records);
    Log(ret);
}

ВCDLEVENINGDOJISTAR()Функция описана в документации библиотеки талиб как:CDLEVENINGDOJISTAR(Records[Open,High,Low,Close],Penetration = 0.3) = Array(outInteger)

talib.CDLEVENINGSTAR

Вtalib.CDLEVENINGSTAR()Функция используется для расчетаВечерняя звезда (К-линейная диаграмма: Вечерняя звезда).

Доходное значениеtalib.CDLEVENINGSTAR()функция: одномерный массив. массив

Talib.CDLEVENINGSTAR ((inPriceOHLC) - в центре США) Talib.CDLEVENINGSTAR ((inPriceOHLC, optInPenetration) (включает в себя все, что нужно)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры ВoptInPenetrationпараметр используется для настройки проникновения, значение по умолчанию 0,3. optInPenetration ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLEVENINGSTAR(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLEVENINGSTAR(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLEVENINGSTAR(records);
    Log(ret);
}

ВCDLEVENINGSTAR()Функция описана в документации библиотеки талиб как:CDLEVENINGSTAR(Records[Open,High,Low,Close],Penetration = 0.3) = Array(outInteger)

talib.CDLGAPSIDESIDEWHITE

Вtalib.CDLGAPSIDESIDEWHITE()Функция используется для расчетаБелые линии с разрывом вверх/вниз (К-линейная диаграмма: Белые линии с разрывом вверх/вниз).

Доходное значениеtalib.CDLGAPSIDESIDEWHITE()функция: одномерный массив. массив

Талиб.CDLGAPSIDESIDEWHITE ((inPriceOHLC) (в цены)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLGAPSIDESIDEWHITE(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLGAPSIDESIDEWHITE(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLGAPSIDESIDEWHITE(records);
    Log(ret);
}

ВCDLGAPSIDESIDEWHITE()Функция описана в документации библиотеки талиб как:CDLGAPSIDESIDEWHITE(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLGRAVESTONEDOJI

Вtalib.CDLGRAVESTONEDOJI()Функция используется для расчетаGravestone Doji (К-линейный график: Gravestone Doji).

Доходное значениеtalib.CDLGRAVESTONEDOJI()функция: одномерный массив. массив

Талиб.CDLГРАВЕСТОНЕДОДОЖИ ((inPriceOHLC)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLGRAVESTONEDOJI(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLGRAVESTONEDOJI(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLGRAVESTONEDOJI(records);
    Log(ret);
}

ВCDLGRAVESTONEDOJI()Функция описана в документации библиотеки талиб как:CDLGRAVESTONEDOJI(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLHAMMER

Вtalib.CDLHAMMER()Функция используется для расчетаМолот (К-линейная диаграмма: Молот).

Доходное значениеtalib.CDLHAMMER()функция: одномерный массив. массив

Talib.CDLHAMMER ((inPriceOHLC) (в переводе с английского)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLHAMMER(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLHAMMER(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLHAMMER(records);
    Log(ret);
}

ВCDLHAMMER()Функция описана в документации библиотеки талиб как:CDLHAMMER(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLHANGINGMAN

Вtalib.CDLHANGINGMAN()Функция используется для расчетаПовеситель (К-линейная диаграмма: Повеситель).

Доходное значениеtalib.CDLHANGINGMAN()функция - это одномерный массив. массив

Талиб.CDЛХАНГИНГМАН ((inPriceOHLC)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLHANGINGMAN(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLHANGINGMAN(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLHANGINGMAN(records);
    Log(ret);
}

ВCDLHANGINGMAN()Функция описана в документации библиотеки талиб как:CDLHANGINGMAN(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLHARAMI

Вtalib.CDLHARAMI()Функция используется для расчетаХарами-паттерн (К-линейный график: отрицательные и положительные линии).

Доходное значениеtalib.CDLHARAMI()функция - это одномерный массив. массив

Талиб.CDLHARAMI ((inPriceOHLC)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLHARAMI(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLHARAMI(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLHARAMI(records);
    Log(ret);
}

ВCDLHARAMI()Функция описана в документации библиотеки талиб как:CDLHARAMI(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLHARAMICROSS

Вtalib.CDLHARAMICROSS()Функция используется для расчетаХарами кросс-паттерн (K-линейный график: пересекающие отрицательные и положительные линии).

Доходное значениеtalib.CDLHARAMICROSS()функция: одномерный массив. массив

Talib.CDLHARAMICROSS ((inPriceOHLC) (включается в список)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLHARAMICROSS(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLHARAMICROSS(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLHARAMICROSS(records);
    Log(ret);
}

ВCDLHARAMICROSS()Функция описана в документации библиотеки талиб как:CDLHARAMICROSS(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLHIGHWAVE

Вtalib.CDLHIGHWAVE()Функция используется для расчетаВысоковолновая свеча (К-линейная диаграмма: Длинный кросс ног).

Доходное значениеtalib.CDLHIGHWAVE()функция - это одномерный массив. массив

Talib.CDLHIGHWAVE ((inPriceOHLC) (включается в список)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLHIGHWAVE(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLHIGHWAVE(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLHIGHWAVE(records);
    Log(ret);
}

ВCDLHIGHWAVE()Функция описана в документации библиотеки талиб как:CDLHIGHWAVE(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLHIKKAKE

Вtalib.CDLHIKKAKE()Функция используется для расчетаОбразец Хиккаке (К-линейная диаграмма: ловушка).

Доходное значениеtalib.CDLHIKKAKE()функция - это одномерный массив. массив

Талиб.CDLHIKKAKE ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLHIKKAKE(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLHIKKAKE(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLHIKKAKE(records);
    Log(ret);
}

ВCDLHIKKAKE()Функция описана в документации библиотеки талиб как:CDLHIKKAKE(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLHIKKAKEMOD

Вtalib.CDLHIKKAKEMOD()Функция используется для расчетаМодифицированный рисунок Хиккаке (К-линейная диаграмма: Модифицированная ловушка).

Доходное значениеtalib.CDLHIKKAKEMOD()функция: одномерный массив. массив

Талиб.CDLHIKKAKEMOD ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLHIKKAKEMOD(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLHIKKAKEMOD(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLHIKKAKEMOD(records);
    Log(ret);
}

ВCDLHIKKAKEMOD()Функция описана в документации библиотеки талиб как:CDLHIKKAKEMOD(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLHOMINGPIGEON

Вtalib.CDLHOMINGPIGEON()Функция используется для расчетаГолубь-посещающий (К-линейная диаграмма: Голубь).

Доходное значениеtalib.CDLHOMINGPIGEON()функция: одномерный массив. массив

Talib.CDLHOMINGPIGEON ((inPriceOHLC) (включая цену)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLHOMINGPIGEON(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLHOMINGPIGEON(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLHOMINGPIGEON(records);
    Log(ret);
}

ВCDLHOMINGPIGEON()Функция описана в документации библиотеки талиб как:CDLHOMINGPIGEON(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLIDENTICAL3CROWS

Вtalib.CDLIDENTICAL3CROWS()Функция используется для расчетаОдинаковые три вороны (К-линейный график: те же три вороны).

Доходное значениеtalib.CDLIDENTICAL3CROWS()функция: одномерный массив. массив

Talib.CDLIDENTICAL3CROWS ((inPriceOHLC) (включается в ценовую категорию)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLIDENTICAL3CROWS(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLIDENTICAL3CROWS(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLIDENTICAL3CROWS(records);
    Log(ret);
}

ВCDLIDENTICAL3CROWS()Функция описана в документации библиотеки талиб как:CDLIDENTICAL3CROWS(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLINNECK

Вtalib.CDLINNECK()Функция используется для расчетаУзоры в шее (К-линейная диаграмма: вырез шеи).

Доходное значениеtalib.CDLINNECK()функция: одномерный массив. массив

Talib.CDLINNECK ((inPriceOHLC) (в переводе с английского)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLINNECK(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLINNECK(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLINNECK(records);
    Log(ret);
}

ВCDLINNECK()Функция описана в документации библиотеки талиб как:CDLINNECK(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLINVERTEDHAMMER

Вtalib.CDLINVERTEDHAMMER()Функция используется для расчетаПерекрученный молот (К-линейная диаграмма: Перекрученный молот).

Доходное значениеtalib.CDLINVERTEDHAMMER()функция: одномерный массив. массив

Talib.CDLINVERTEDHAMMER ((inPriceOHLC) - в цену, которую вы покупаете)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLINVERTEDHAMMER(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLINVERTEDHAMMER(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLINVERTEDHAMMER(records);
    Log(ret);
}

ВCDLINVERTEDHAMMER()Функция описана в документации библиотеки талиб как:CDLINVERTEDHAMMER(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLKICKING

Вtalib.CDLKICKING()Функция используется для расчетаПинание (К-линейная диаграмма: пинание).

Доходное значениеtalib.CDLKICKING()функция - это одномерный массив. массив

Талиб.CDLКИККИНГ ((inPriceOHLC)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLKICKING(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLKICKING(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLKICKING(records);
    Log(ret);
}

ВCDLKICKING()Функция описана в документации библиотеки талиб как:CDLKICKING(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLKICKINGBYLENGTH

Вtalib.CDLKICKINGBYLENGTH()Функция используется для расчетаКик - бык/медведь, определяемый более длинным Марубозу (К-линейная диаграмма: Кик-бык/кик-медведь).

Доходное значениеtalib.CDLKICKINGBYLENGTH()функция: одномерный массив. массив

Talib.CDLKICKINGBYLENGTH ((inPriceOHLC) (в цены)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLKICKINGBYLENGTH(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLKICKINGBYLENGTH(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLKICKINGBYLENGTH(records);
    Log(ret);
}

ВCDLKICKINGBYLENGTH()Функция описана в документации библиотеки талиб как:CDLKICKINGBYLENGTH(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLLADDERBOTTOM

Вtalib.CDLLADDERBOTTOM()Функция используется для расчетаНижняя часть лестницы (К-линейная диаграмма: Нижняя часть лестницы).

Доходное значениеtalib.CDLLADDERBOTTOM()функция: одномерный массив. массив

Талиб.CDLLADDERBOTTOM ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLLADDERBOTTOM(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLLADDERBOTTOM(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLLADDERBOTTOM(records);
    Log(ret);
}

ВCDLLADDERBOTTOM()Функция описана в документации библиотеки талиб как:CDLLADDERBOTTOM(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLLONGLEGGEDDOJI

Вtalib.CDLLONGLEGGEDDOJI()Функция используется для расчетаДлинноногий доджи (К-линейная диаграмма: Длинноногий доджи).

Доходное значениеtalib.CDLLONGLEGGEDDOJI()функция: одномерный массив. массив

Талиб.CDLLONGLEGGEDDOJI ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLLONGLEGGEDDOJI(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLLONGLEGGEDDOJI(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLLONGLEGGEDDOJI(records);
    Log(ret);
}

ВCDLLONGLEGGEDDOJI()Функция описана в документации библиотеки талиб как:CDLLONGLEGGEDDOJI(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLLONGLINE

Вtalib.CDLLONGLINE()Функция используется для расчетаСвеча длинной линии (К-линейная диаграмма: длинная линия).

Доходное значениеtalib.CDLLONGLINE()функция: одномерный массив. массив

Талиб.CDLLONGLINE ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLLONGLINE(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLLONGLINE(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLLONGLINE(records);
    Log(ret);
}

ВCDLLONGLINE()Функция описана в документации библиотеки талиб как:CDLLONGLINE(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLMARUBOZU

Вtalib.CDLMARUBOZU()Функция используется для расчетаМарубозу (К-линейная диаграмма: голова и ноги голые).

Доходное значениеtalib.CDLMARUBOZU()функция - это одномерный массив. массив

Талиб.CDLMARUBOZU ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLMARUBOZU(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLMARUBOZU(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLMARUBOZU(records);
    Log(ret);
}

ВCDLMARUBOZU()Функция описана в документации библиотеки талиб как:CDLMARUBOZU(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLMATCHINGLOW

Вtalib.CDLMATCHINGLOW()Функция используется для расчетаСовпадение низкого уровня (К-линейный график: Совпадение низкого уровня).

Доходное значениеtalib.CDLMATCHINGLOW()функция: одномерный массив. массив

Талиб.CDLMATCHINGLOW ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLMATCHINGLOW(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLMATCHINGLOW(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLMATCHINGLOW(records);
    Log(ret);
}

ВCDLMATCHINGLOW()Функция описана в документации библиотеки талиб как:CDLMATCHINGLOW(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLMATHOLD

Вtalib.CDLMATHOLD()Функция используется для расчетаУдержание мата (карта с линиями K: Удержание мата).

Доходное значениеtalib.CDLMATHOLD()функция: одномерный массив. массив

Talib.CDLMATHOLD ((inPriceOHLC)) talib.CDLMATHOLD ((inPriceOHLC, optInPenetration) - это не так.

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры ВoptInPenetrationпараметр является необязательным и используется для указания процента ширины линии восходящего/снижающегося тренда, значение по умолчанию равняется 0,5. optInPenetration ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLMATHOLD(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLMATHOLD(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLMATHOLD(records);
    Log(ret);
}

ВCDLMATHOLD()Функция описана в документации библиотеки талиб как:CDLMATHOLD(Records[Open,High,Low,Close],Penetration = 0.5) = Array(outInteger)

talib.CDLMORNINGDOJISTAR

Вtalib.CDLMORNINGDOJISTAR()Функция используется для расчетаУтренняя звезда Додзи (К-линейный график: Утренняя звезда Додзи).

Доходное значениеtalib.CDLMORNINGDOJISTAR()функция: одномерный массив. массив

Талиб. CDLMORNINGDOJISTAR ((inPriceOHLC) (в цену) Talib.CDLMORNINGDOJISTAR ((inPriceOHLC, optInPenetration) - Это не так.

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры ВoptInPenetrationпараметр используется для указания степени перекрытия между начальной ценой проверки и твердой частью, значение по умолчанию 0,3. optInPenetration ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLMORNINGDOJISTAR(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLMORNINGDOJISTAR(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLMORNINGDOJISTAR(records);
    Log(ret);
}

ВCDLMORNINGDOJISTAR()Функция описана в документации библиотеки талиб как:CDLMORNINGDOJISTAR(Records[Open,High,Low,Close],Penetration = 0.3) = Array(outInteger)

talib.CDLMORNINGSTAR

Вtalib.CDLMORNINGSTAR()Функция используется для расчетаУтренняя звезда (К-линейная диаграмма: Утренняя звезда).

Доходное значениеtalib.CDLMORNINGSTAR()функция: одномерный массив. массив

Талиб.CDLMORNINGSTAR ((inPriceOHLC)) Талиб.CDLMORNINGSTAR ((inPriceOHLC, optInPenetration) (включает в себя все, что нужно для проникновения)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры ВoptInPenetrationпараметр представляет собой пороговый процент колебания цен, требуемый для подтверждения тренда, и принимает значение в диапазоне [0,1], при этом значение по умолчанию составляет 0,3. optInPenetration ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLMORNINGSTAR(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLMORNINGSTAR(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLMORNINGSTAR(records);
    Log(ret);
}

ВCDLMORNINGSTAR()Функция описана в документации библиотеки талиб как:CDLMORNINGSTAR(Records[Open,High,Low,Close],Penetration=0.3) = Array(outInteger)

talib.CDLONNECK

Вtalib.CDLONNECK()Функция используется для расчетаУзоры на шее (К-линейный график: Узоры на шее).

Доходное значениеtalib.CDLONNECK()функция - это одномерный массив. массив

Talib.CDLONNECK ((inPriceOHLC) (включается в список)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLONNECK(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLONNECK(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLONNECK(records);
    Log(ret);
}

ВCDLONNECK()Функция описана в документации библиотеки талиб как:CDLONNECK(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLPIERCING

Вtalib.CDLPIERCING()Функция используется для расчетаУзоры пирсинга (К-линейный график: Узоры пирсинга).

Доходное значениеtalib.CDLPIERCING()функция - это одномерный массив. массив

Талиб.CDLPIERCING ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLPIERCING(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLPIERCING(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLPIERCING(records);
    Log(ret);
}

ВCDLPIERCING()Функция описана в документации библиотеки талиб как:CDLPIERCING(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLRICKSHAWMAN

Вtalib.CDLRICKSHAWMAN()Функция используется для расчетаРикшоу-мен (К-линейная диаграмма: Рикшоу-мен).

Доходное значениеtalib.CDLRICKSHAWMAN()функция: одномерный массив. массив

Талиб.CDLRICKSHAWMAN ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLRICKSHAWMAN(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLRICKSHAWMAN(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLRICKSHAWMAN(records);
    Log(ret);
}

ВCDLRICKSHAWMAN()Функция описана в документации библиотеки талиб как:CDLRICKSHAWMAN(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLRISEFALL3METHODS

Вtalib.CDLRISEFALL3METHODS()Функция используется для расчетаТри метода повышения/снижения (К-линейный график: три метода повышения/снижения).

Доходное значениеtalib.CDLRISEFALL3METHODS()функция: одномерный массив. массив

talib.CDLRISEFALL3METHODS ((inPriceOHLC) (в цены)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLRISEFALL3METHODS(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLRISEFALL3METHODS(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLRISEFALL3METHODS(records);
    Log(ret);
}

ВCDLRISEFALL3METHODS()Функция описана в документации библиотеки талиб как:CDLRISEFALL3METHODS(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLSEPARATINGLINES

Вtalib.CDLSEPARATINGLINES()Функция используется для расчетаРазделяющие линии (К-линейная диаграмма: Разделяющие линии).

Доходное значениеtalib.CDLSEPARATINGLINES()функция - это одномерный массив. массив

Талиб.CDLSEPARATINGLINES ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLSEPARATINGLINES(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLSEPARATINGLINES(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLSEPARATINGLINES(records);
    Log(ret);
}

ВCDLSEPARATINGLINES()Функция описана в документации библиотеки талиб как:CDLSEPARATINGLINES(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLSHOOTINGSTAR

Вtalib.CDLSHOOTINGSTAR()Функция используется для расчетаСтреляющая звезда (К-линейная диаграмма: Стреляющая звезда).

Доходное значениеtalib.CDLSHOOTINGSTAR()функция - это одномерный массив. массив

Талиб.СДЛСУОТИНГСТАР ((inPriceOHLC)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLSHOOTINGSTAR(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLSHOOTINGSTAR(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLSHOOTINGSTAR(records);
    Log(ret);
}

ВCDLSHOOTINGSTAR()Функция описана в документации библиотеки талиб как:CDLSHOOTINGSTAR(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLSHORTLINE

Вtalib.CDLSHORTLINE()Функция используется для расчетаСвеча короткой линии (К-линейная диаграмма: Краткая линия).

Доходное значениеtalib.CDLSHORTLINE()функция: одномерный массив. массив

Talib.CDLSSORTLINE ((inPriceOHLC) (включая цену)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLSHORTLINE(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLSHORTLINE(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLSHORTLINE(records);
    Log(ret);
}

ВCDLSHORTLINE()Функция описана в документации библиотеки талиб как:CDLSHORTLINE(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLSPINNINGTOP

Вtalib.CDLSPINNINGTOP()Функция используется для расчетаСпиннинг Топ (К-линейная диаграмма: Спиннинг Топ).

Доходное значениеtalib.CDLSPINNINGTOP()функция: одномерный массив. массив

Талиб.CDLSPINNINGTOP ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLSPINNINGTOP(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLSPINNINGTOP(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLSPINNINGTOP(records);
    Log(ret);
}

ВCDLSPINNINGTOP()Функция описана в документации библиотеки талиб как:CDLSPINNINGTOP(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLSTALLEDPATTERN

Вtalib.CDLSTALLEDPATTERN()Функция используется для расчетаЗастойный рисунок (К-линейная диаграмма: Застойный рисунок).

Доходное значениеtalib.CDLSTALLEDPATTERN()функция: одномерный массив. массив

Талиб.CDLSTALLEDPATTERN ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLSTALLEDPATTERN(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLSTALLEDPATTERN(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLSTALLEDPATTERN(records);
    Log(ret);
}

ВCDLSTALLEDPATTERN()Функция описана в документации библиотеки талиб как:CDLSTALLEDPATTERN(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLSTICKSANDWICH

Вtalib.CDLSTICKSANDWICH()Функция используется для расчетаСтик-Сэндвич (К-линейная диаграмма: Стик-Сэндвич).

Доходное значениеtalib.CDLSTICKSANDWICH()функция - это одномерный массив. массив

Талиб.CDLСТИКССАНДВИЧ ((inPriceOHLC)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLSTICKSANDWICH(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLSTICKSANDWICH(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLSTICKSANDWICH(records);
    Log(ret);
}

ВCDLSTICKSANDWICH()Функция описана в документации библиотеки талиб как:CDLSTICKSANDWICH(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLTAKURI

Вtalib.CDLTAKURI()Функция используется для расчетаТакури (додзи с очень длинной нижней линией тени) (К-линейная диаграмма: Такури).

Доходное значениеtalib.CDLTAKURI()функция - это одномерный массив. массив

Talib.CDLTAKURI ((inPriceOHLC) (в переводе с английского)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLTAKURI(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLTAKURI(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLTAKURI(records);
    Log(ret);
}

ВCDLTAKURI()Функция описана в документации библиотеки талиб как:CDLTAKURI(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLTASUKIGAP

Вtalib.CDLTASUKIGAP()Функция используется для расчетаРазрыв Тасуки (К-линейная диаграмма: Разрыв Тасуки).

Доходное значениеtalib.CDLTASUKIGAP()функция - это одномерный массив. массив

Talib.CDLTASUKIGAP ((inPriceOHLC) (в переводе с английского)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLTASUKIGAP(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLTASUKIGAP(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLTASUKIGAP(records);
    Log(ret);
}

ВCDLTASUKIGAP()Функция описана в документации библиотеки талиб как:CDLTASUKIGAP(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLTHRUSTING

Вtalib.CDLTHRUSTING()Функция используется для расчетаУстройство толкания (К-линейная диаграмма: Устройство толкания).

Доходное значениеtalib.CDLTHRUSTING()функция: одномерный массив. массив

Талиб.CDLTHRUSTING ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLTHRUSTING(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLTHRUSTING(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLTHRUSTING(records);
    Log(ret);
}

ВCDLTHRUSTING()Функция описана в документации библиотеки талиб как:CDLTHRUSTING(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLTRISTAR

Вtalib.CDLTRISTAR()Функция используется для расчетаТристарный рисунок (K-линейный график: Тристарный рисунок).

Доходное значениеtalib.CDLTRISTAR()функция: одномерный массив. массив

Талиб.CDLTRISTAR ((inPriceOHLC)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLTRISTAR(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLTRISTAR(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLTRISTAR(records);
    Log(ret);
}

ВCDLTRISTAR()Функция описана в документации библиотеки талиб как:CDLTRISTAR(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLUNIQUE3RIVER

Вtalib.CDLUNIQUE3RIVER()Функция используется для расчетаУникальная 3 река (К-линейная диаграмма: Уникальная 3 река).

Доходное значениеtalib.CDLUNIQUE3RIVER()функция: одномерный массив. массив

Талиб.CDLUNIQUE3RIVER ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLUNIQUE3RIVER(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLUNIQUE3RIVER(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLUNIQUE3RIVER(records);
    Log(ret);
}

ВCDLUNIQUE3RIVER()Функция описана в документации библиотеки талиб как:CDLUNIQUE3RIVER(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLUPSIDEGAP2CROWS

Вtalib.CDLUPSIDEGAP2CROWS()Функция используется для расчетаВверх два ворона (К-линейный график: Вверх два ворона).

Доходное значениеtalib.CDLUPSIDEGAP2CROWS()функция: одномерный массив. массив

Talib.CDLUPSIDEGAP2CROWS ((inPriceOHLC) (включается в список)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLUPSIDEGAP2CROWS(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLUPSIDEGAP2CROWS(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLUPSIDEGAP2CROWS(records);
    Log(ret);
}

ВCDLUPSIDEGAP2CROWS()Функция описана в документации библиотеки талиб как:CDLUPSIDEGAP2CROWS(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLXSIDEGAP3METHODS

Вtalib.CDLXSIDEGAP3METHODS()Функция используется для расчетаТрех методов расхождения вверх/вниз (К-линейная диаграмма: три метода расхождения вверх/вниз).

Доходное значениеtalib.CDLXSIDEGAP3METHODS()функция: одномерный массив. массив

talib.CDLXSIDEGAP3METHODS ((inPriceOHLC) (в цены)

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CDLXSIDEGAP3METHODS(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CDLXSIDEGAP3METHODS(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CDLXSIDEGAP3METHODS(records);
    Log(ret);
}

ВCDLXSIDEGAP3METHODS()Функция описана в документации библиотеки талиб как:CDLXSIDEGAP3METHODS(Records[Open,High,Low,Close]) = Array(outInteger)

talib.AD

Вtalib.AD()Функция используется для расчетаЛиния Chaikin A/D (линейный стохастический индикатор).

Доходное значениеtalib.AD()функция: одномерный массив. массив

talib.AD(inPriceHLCV)

ВinPriceHLCVпараметр используется для указания данных K-линии. inPriceHLCV неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.AD(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.AD(records.High, records.Low, records.Close, records.Volume)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.AD(records);
    Log(ret);
}

ВAD()Функция описана в документации библиотеки талиб как:AD(Records[High,Low,Close,Volume]) = Array(outReal)

talib.ADOSC

Вtalib.ADOSC()Функция используется для расчетаЧаикинский осциллятор A/D (Чаикинский осциллятор).

Доходное значениеtalib.ADOSC()функция - это одномерный массив. массив

Talib.ADOSC ((inPriceHLCV)) talib.ADOSC ((inPriceHLCV, optInFastPeriod, optInSlowPeriod) (включает в себя:

ВinPriceHLCVпараметр используется для указания данных K-линии. inPriceHLCV неправда {@struct/Record Record} массив структуры ВoptInFastPeriodПараметр используется для установки быстрого периода. optInFastPeriod ложное Номер ВoptInSlowPeriodПараметр используется для установки медленного периода. optInSlowPeriod ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.ADOSC(records, 3, 10)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.ADOSC(records.High, records.Low, records.Close, records.Volume, 3, 10)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.ADOSC(records, 3, 10);
    Log(ret);
}

ВADOSC()Функция описана в документации библиотеки талиб как:ADOSC(Records[High,Low,Close,Volume],Fast Period = 3,Slow Period = 10) = Array(outReal)

talib.OBV

Вtalib.OBV()Функция используется для расчетаНа балансовом объеме (энергетический прилив).

Доходное значениеtalib.OBV()функция - это одномерный массив. массив

Talib.OBV ((inReal)) Talib.OBV ((inReal, inPriceV))

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВinPriceVпараметр используется для указания данных K-линии. inPriceV ложное {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.OBV(records, records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.OBV(records.Close, records.Volume)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.OBV(records);
    Log(ret);
}

ВOBV()Функция описана в документации библиотеки талиб как:OBV(Records[Close],Records[Volume]) = Array(outReal)

talib.ACOS

Вtalib.ACOS()Функция используется для расчетаВекторный тригонометрический ACos (инверсивная функция косинуса).

Доходное значениеtalib.ACOS()функция - это одномерный массив. массив

Талиб.АКОС ((inReal)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы

function main() {
    var data = [-1, 0, 1]
    var ret = talib.ACOS(data)
    Log(ret)
}
import talib
import numpy as np
def main():
    data = [-1.0, 0, 1.0]
    ret = talib.ACOS(np.array(data))
    Log(ret)
void main() {
    std::vector<double> data = {-1, 0, 1};
    auto ret = talib.ACOS(data);
    Log(ret);
}

ВACOS()Функция описана в документации библиотеки талиб как:ACOS(Records[Close]) = Array(outReal)

talib.ASIN

Вtalib.ASIN()Функция используется для расчетаВекторный тригонометрический ASin (инверсивная синусная функция).

Доходное значениеtalib.ASIN()функция - это одномерный массив. массив

Талиб.АСИН ((inReal)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы

function main() {
    var data = [-1, 0, 1]
    var ret = talib.ASIN(data)
    Log(ret)
}
import talib
import numpy as np
def main():
    data = [-1.0, 0, 1.0]
    ret = talib.ASIN(np.array(data))
    Log(ret)
void main() {
    std::vector<double> data = {-1, 0, 1};
    auto ret = talib.ASIN(data);
    Log(ret);
}

ВASIN()Функция описана в документации библиотеки талиб как:ASIN(Records[Close]) = Array(outReal)

talib.ATAN

Вtalib.ATAN()Функция используется для расчетаВекторная тригонометрическая функция ATan (в обратном порядке).

Доходное значениеtalib.ATAN()функция: одномерный массив. массив

Talib.ATAN ((inReal))

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы

function main() {
    var data = [-3.14/2, 0, 3.14/2]
    var ret = talib.ATAN(data)
    Log(ret)
}
import talib
import numpy as np
def main():
    data = [-3.14/2, 0, 3.14/2]
    ret = talib.ATAN(np.array(data))
    Log(ret)
void main() {
    std::vector<double> data = {-3.14/2, 0, 3.14/2};
    auto ret = talib.ATAN(data);
    Log(ret);
}

ВATAN()Функция описана в документации библиотеки талиб как:ATAN(Records[Close]) = Array(outReal)

talib.CEIL

Вtalib.CEIL()Функция используется для расчетаВекторный потолок (функция округления).

Доходное значениеtalib.CEIL()функция - это одномерный массив. массив

Talib.CEIL ((inReal))

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CEIL(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CEIL(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CEIL(records);
    Log(ret);
}

ВCEIL()Функция описана в документации библиотеки талиб как:CEIL(Records[Close]) = Array(outReal)

talib.COS

Вtalib.COS()Функция используется для расчетаВекторные тригонометрические Кос (функция косинуса).

Доходное значениеtalib.COS()функция: одномерный массив. массив

Талиб.COS ((inReal)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы

function main() {
    var data = [-3.14, 0, 3.14]
    var ret = talib.COS(data)
    Log(ret)
}
import talib
import numpy as np
def main():
    data = [-3.14, 0, 3.14]
    ret = talib.COS(np.array(data))
    Log(ret)
void main() {
    std::vector<double> data = {-3.14, 0, 3.14};
    auto ret = talib.COS(data);
    Log(ret);
}

ВCOS()Функция описана в документации библиотеки талиб как:COS(Records[Close]) = Array(outReal)

talib.COSH

Вtalib.COSH()Функция используется для расчетаВектор тригонометрический Кош (гиперболическое значение косинуса).

Доходное значениеtalib.COSH()функция - это одномерный массив. массив

Talib.COSH ((inReal))

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы

function main() {
    var data = [-1, 0, 1]
    var ret = talib.COSH(data)
    Log(ret)
}
import talib
import numpy as np
def main():
    data = [-1.0, 0, 1.0]
    ret = talib.COSH(np.array(data))
    Log(ret)
void main() {
    std::vector<double> data = {-1, 0, 1};
    auto ret = talib.COSH(data);
    Log(ret);
}

ВCOSH()Функция описана в документации библиотеки талиб как:COSH(Records[Close]) = Array(outReal)

talib.EXP

Вtalib.EXP()Функция используется для расчетаВекторная арифметика Exp (экспоненциальная функция).

Доходное значениеtalib.EXP()функция: одномерный массив. массив

Talib.EXP ((inReal))

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы

function main() {
    var data = [0, 1, 2]
    var ret = talib.EXP(data)    // e^0, e^1, e^2
    Log(ret)
}
import talib
import numpy as np
def main():
    data = [0, 1.0, 2.0]
    ret = talib.EXP(np.array(data))
    Log(ret)
void main() {
    std::vector<double> data = {0, 1.0, 2.0};
    auto ret = talib.EXP(data);
    Log(ret);
}

ВEXP()Функция описана в документации библиотеки талиб как:EXP(Records[Close]) = Array(outReal)

talib.FLOOR

Вtalib.FLOOR()Функция используется для расчетаВекторный пол (закругленный вниз).

Доходное значениеtalib.FLOOR()функция - это одномерный массив. массив

Талиб.ФОЛОР ((inReal))

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы

function main() {
    var records = exchange.GetRecords()
    var ret = talib.FLOOR(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.FLOOR(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.FLOOR(records);
    Log(ret);
}

ВFLOOR()Функция описана в документации библиотеки талиб как:FLOOR(Records[Close]) = Array(outReal)

talib.LN

Вtalib.LN()Функция используется для расчетаВектор Log Natural (естественный логарифм).

Доходное значениеtalib.LN()функция - это одномерный массив. массив

Талиб.ЛН ((inReal)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы

function main() {
    var data = [1, 2, 3]
    var ret = talib.LN(data)
    Log(ret)
}
import talib
import numpy as np
def main():
    data = [1.0, 2.0, 3.0]
    ret = talib.LN(np.array(data))
    Log(ret)
void main() {
    std::vector<double> data = {1, 2, 3};
    auto ret = talib.LN(data);
    Log(ret);
}

ВLN()Функция описана в документации библиотеки талиб как:LN(Records[Close]) = Array(outReal)

talib.LOG10

Вtalib.LOG10()Функция используется для расчетаВектор Log10 (логарифмическая функция).

Доходное значениеtalib.LOG10()функция - это одномерный массив. массив

Talib.LOG10 ((inReal)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы

function main() {
    var data = [10, 100, 1000]
    var ret = talib.LOG10(data)
    Log(ret)
}
import talib
import numpy as np
def main():
    data = [10.0, 100.0, 1000.0]
    ret = talib.LOG10(np.array(data))
    Log(ret)
void main() {
    std::vector<double> data = {10, 100, 1000};
    auto ret = talib.LOG10(data);
    Log(ret);
}

ВLOG10()Функция описана в документации библиотеки талиб как:LOG10(Records[Close]) = Array(outReal)

talib.SIN

Вtalib.SIN()Функция используется для расчетаВектор тригонометрический Sin (синус).

Доходное значениеtalib.SIN()функция - это одномерный массив. массив

Талиб.СИН ((inReal)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы

function main() {
    var data = [-3.14/2, 0, 3.14/2]
    var ret = talib.SIN(data)
    Log(ret)
}
import talib
import numpy as np
def main():
    data = [-3.14/2, 0, 3.14/2]
    ret = talib.SIN(np.array(data))
    Log(ret)
void main() {
    std::vector<double> data = {-3.14/2, 0, 3.14/2};
    auto ret = talib.SIN(data);
    Log(ret);
}

ВSIN()Функция описана в документации библиотеки талиб как:SIN(Records[Close]) = Array(outReal)

talib.SINH

Вtalib.SINH()Функция используется для расчетаВектор тригонометрический Синх (гиперболическая синусная функция).

Доходное значениеtalib.SINH()функция: одномерный массив. массив

Талиб.СИНХ ((inReal)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы

function main() {
    var data = [-1, 0, 1]
    var ret = talib.SINH(data)
    Log(ret)
}
import talib
import numpy as np
def main():
    data = [-1.0, 0, 1.0]
    ret = talib.SINH(np.array(data))
    Log(ret)
void main() {
    std::vector<double> data = {-1, 0, 1};
    auto ret = talib.SINH(data);
    Log(ret);
}

ВSINH()Функция описана в документации библиотеки талиб как:SINH(Records[Close]) = Array(outReal)

talib.SQRT

Вtalib.SQRT()Функция используется для расчетаВектор квадратный корень (квадратный корень).

Доходное значениеtalib.SQRT()функция: одномерный массив. массив

Talib.SQRT ((inReal))

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы

function main() {
    var data = [4, 64, 100]
    var ret = talib.SQRT(data)
    Log(ret)
}
import talib
import numpy as np
def main():
    data = [4.0, 64.0, 100.0]
    ret = talib.SQRT(np.array(data))
    Log(ret)
void main() {
    std::vector<double> data = {4, 64, 100};
    auto ret = talib.SQRT(data);
    Log(ret);
}

ВSQRT()Функция описана в документации библиотеки талиб как:SQRT(Records[Close]) = Array(outReal)

talib.TAN

Вtalib.TAN()Функция используется для расчетаВектор тригонометрический Тан (тангенс).

Доходное значениеtalib.TAN()функция - это одномерный массив. массив

Талиб.ТАН ((inReal)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы

function main() {
    var data = [-1, 0, 1]
    var ret = talib.TAN(data)
    Log(ret)
}
import talib
import numpy as np
def main():
    data = [-1.0, 0, 1.0]
    ret = talib.TAN(np.array(data))
    Log(ret)
void main() {
    std::vector<double> data = {-1, 0, 1};
    auto ret = talib.TAN(data);
    Log(ret);
}

ВTAN()Функция описана в документации библиотеки талиб как:TAN(Records[Close]) = Array(outReal)

talib.TANH

Вtalib.TANH()Функция используется для расчетаВекторный тригонометрический Танх (функция гиперболической тангенсы).

Доходное значениеtalib.TANH()функция: одномерный массив. массив

Талиб.ТАНХ ((inReal)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы

function main() {
    var data = [-1, 0, 1]
    var ret = talib.TANH(data)
    Log(ret)
}
import talib
import numpy as np
def main():
    data = [-1.0, 0, 1.0]
    ret = talib.TANH(np.array(data))
    Log(ret)
void main() {
    std::vector<double> data = {-1, 0, 1};
    auto ret = talib.TANH(data);
    Log(ret);
}

ВTANH()Функция описана в документации библиотеки талиб как:TANH(Records[Close]) = Array(outReal)

talib.MAX

Вtalib.MAX()Функция используется для расчета максимального значения дляконкретный период.

Доходное значениеtalib.MAX()функция: одномерный массив. массив

Талиб.MAX ((inReal) Талиб.MAX ((inReal, optInTimePeriod)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 30. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.MAX(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.MAX(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.MAX(records);
    Log(ret);
}

ВMAX()Функция описана в документации библиотеки талиб как:MAX(Records[Close],Time Period = 30) = Array(outReal)

talib.MAXINDEX

Вtalib.MAXINDEX()Функция используется для расчетаиндекс наивысшего значения за указанный период (максимальный индекс).

Доходное значениеtalib.MAXINDEX()функция: одномерный массив. массив

Талиб.MAXINDEX ((inReal) talib.MAXINDEX ((inReal, optInTimePeriod) - в реальном времени

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 30. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.MAXINDEX(records, 5)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.MAXINDEX(records.Close, 5)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.MAXINDEX(records, 5);
    Log(ret);
}

ВMAXINDEX()Функция описана в документации библиотеки талиб как:MAXINDEX(Records[Close],Time Period = 30) = Array(outInteger)

talib.MIN

Вtalib.MIN()Функция используется для расчета наименьшего значения (минимального значения)** за указанный период.

Доходное значениеtalib.MIN()функция: одномерный массив. массив

Талиб.MIN ((inReal) talib.MIN ((inReal, optInTimePeriod) (в реальном времени, в промежутке времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 30. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.MIN(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.MIN(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.MIN(records);
    Log(ret);
}

ВMIN()Функция описана в документации библиотеки талиб как:MIN(Records[Close],Time Period = 30) = Array(outReal)

talib.MININDEX

Вtalib.MININDEX()Функция используется для расчетаИндекс наименьшего значения (индекс минимального значения)на указанный период.

Доходное значениеtalib.MININDEX()функция: одномерный массив. массив

Talib.MININDEX ((inReal) talib.MININDEX ((inReal, optInTimePeriod) (в реальном времени, в промежутке времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 30. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.MININDEX(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.MININDEX(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.MININDEX(records);
    Log(ret);
}

ВMININDEX()Функция описана в документации библиотеки талиб как:MININDEX(Records[Close],Time Period = 30) = Array(outInteger)

talib.MINMAX

Вtalib.MINMAX()Функция используется для расчетаминимальные и максимальные значения за указанный период.

Доходное значениеtalib.MINMAX()Первый элемент этого двумерного массива - массив минимальных значений, а второй элемент - массив максимальных значений. массив

Талиб.MINMAX ((inReal) talib.MINMAX ((inReal, optInTimePeriod) (в реальном времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 30. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.MINMAX(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.MINMAX(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.MINMAX(records);
    Log(ret);
}

ВMINMAX()Функция описана в документации библиотеки талиб как:MINMAX(Records[Close],Time Period = 30) = [Array(outMin),Array(outMax)]

talib.MINMAXINDEX

Вtalib.MINMAXINDEX()Функция используется для расчетаиндекс наименьших и наивысших значений (минимальный и максимальный индекс) за указанный период.

Доходное значениеtalib.MINMAXINDEX()Первый элемент этого двумерного массива - минимальный индексированный массив, а второй элемент - максимальный индексированный массив. массив

Talib.MINMAXINDEX ((inReal)) talib.MINMAXINDEX ((inReal, optInTimePeriod) (в реальном времени, в промежутке времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 30. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.MINMAXINDEX(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.MINMAXINDEX(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.MINMAXINDEX(records);
    Log(ret);
}

ВMINMAXINDEX()Функция описана в документации библиотеки талиб как:MINMAXINDEX(Records[Close],Time Period = 30) = [Array(outMinIdx),Array(outMaxIdx)]

talib.SUM

Вtalib.SUM()Функция используется для расчетаПодведение итогов.

Доходное значениеtalib.SUM()функция: одномерный массив. массив

Talib.SUM ((inReal)) talib.SUM ((inReal, optInTimePeriod) - в реальном времени

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 30. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.SUM(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.SUM(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.SUM(records);
    Log(ret);
}

ВSUM()Функция описана в документации библиотеки талиб как:SUM(Records[Close],Time Period = 30) = Array(outReal)

talib.HT_DCPERIOD

Вtalib.HT_DCPERIOD()Функция используется для расчетаТрансформация Хилберта - доминирующий период цикла (трансформация Хилберта, доминирующий период).

Доходное значениеtalib.HT_DCPERIOD()функция: одномерный массив. массив

Talib.HT_DCPERIOD ((inReal))

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы

function main() {
    var records = exchange.GetRecords()
    var ret = talib.HT_DCPERIOD(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.HT_DCPERIOD(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.HT_DCPERIOD(records);
    Log(ret);
}

ВHT_DCPERIOD()Функция описана в документации библиотеки талиб как:HT_DCPERIOD(Records[Close]) = Array(outReal)

talib.HT_DCPHASE

Вtalib.HT_DCPHASE()Функция используется для расчетаТрансформация Гилберта - доминирующая фаза цикла (трансформация Гилберта, доминирующая фаза цикла).

Доходное значениеtalib.HT_DCPHASE()функция: одномерный массив. массив

Талиб.HT_DCPHASE ((inReal)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы

function main() {
    var records = exchange.GetRecords()
    var ret = talib.HT_DCPHASE(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.HT_DCPHASE(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.HT_DCPHASE(records);
    Log(ret);
}

ВHT_DCPHASE()Функция описана в документации библиотеки талиб как:HT_DCPHASE(Records[Close]) = Array(outReal)

talib.HT_PHASOR

Вtalib.HT_PHASOR()Функция используется для расчетаТрансформация Хильберта - Фазовые компоненты (трансформация Хильберта, фазовые компоненты).

Доходное значениеtalib.HT_PHASOR()Функция представляет собой двумерный массив. массив

Талиб.HT_PHASOR ((inReal)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы

function main() {
    var records = exchange.GetRecords()
    var ret = talib.HT_PHASOR(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.HT_PHASOR(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.HT_PHASOR(records);
    Log(ret);
}

ВHT_PHASOR()Функция описана в документации библиотеки талиб как:HT_PHASOR(Records[Close]) = [Array(outInPhase),Array(outQuadrature)]

talib.HT_SINE

Вtalib.HT_SINE()Функция используется для расчетаТрансформация Хильберта - Синусная волна.

Доходное значениеtalib.HT_SINE()функция: двумерный массив. массив

Talib.HT_SINE ((inReal))

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы

function main() {
    var records = exchange.GetRecords()
    var ret = talib.HT_SINE(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.HT_SINE(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.HT_SINE(records);
    Log(ret);
}

ВHT_SINE()Функция описана в документации библиотеки талиб как:HT_SINE(Records[Close]) = [Array(outSine),Array(outLeadSine)]

talib.HT_TRENDMODE

Вtalib.HT_TRENDMODE()Функция используется для расчетаТрансформа Гилберта - тренд и режим цикла.

Доходное значениеtalib.HT_TRENDMODE()функция: одномерный массив. массив

Talib.HT_TRENDMODE ((inReal))

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы

function main() {
    var records = exchange.GetRecords()
    var ret = talib.HT_TRENDMODE(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.HT_TRENDMODE(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.HT_TRENDMODE(records);
    Log(ret);
}

ВHT_TRENDMODE()Функция описана в документации библиотеки талиб как:HT_TRENDMODE(Records[Close]) = Array(outInteger)

talib.ATR

Вtalib.ATR()Функция используется для расчетаСредний истинный диапазон.

Доходное значениеtalib.ATR()функция - это одномерный массив. массив

Talib.ATR ((inPriceHLC)) talib.ATR ((inPriceHLC, optInTimePeriod) (в цене, в сроке)

ВinPriceHLCпараметр используется для указания данных K-линии. inPriceHLC неправда {@struct/Record Record} массив структуры ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.ATR(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.ATR(records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.ATR(records);
    Log(ret);
}

ВATR()Функция описана в документации библиотеки талиб как:ATR(Records[High,Low,Close],Time Period = 14) = Array(outReal)

talib.NATR

Вtalib.NATR()Функция используется для расчетаНормированный средний истинный диапазон.

Доходное значениеtalib.NATR()функция - это одномерный массив. массив

Talib.NATR ((inPriceHLC)) talib.NATR ((inPriceHLC, optInTimePeriod) - в цене, в времени, в периоде)

ВinPriceHLCпараметр используется для указания данных K-линии. inPriceHLC неправда {@struct/Record Record} массив структуры ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.NATR(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.NATR(records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.NATR(records);
    Log(ret);
}

ВNATR()Функция описана в документации библиотеки талиб как:NATR(Records[High,Low,Close],Time Period = 14) = Array(outReal)

talib.TRANGE

Вtalib.TRANGE()Функция используется для расчетаИстинный диапазон.

Доходное значениеtalib.TRANGE()функция: одномерный массив. массив

Talib.TRANGE (в цене)

ВinPriceHLCпараметр используется для указания данных K-линии. inPriceHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.TRANGE(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.TRANGE(records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.TRANGE(records);
    Log(ret);
}

ВTRANGE()Функция описана в документации библиотеки талиб как:TRANGE(Records[High,Low,Close]) = Array(outReal)

talib.BBANDS

Вtalib.BBANDS()Функция используется для расчетаБоллингерские полосы.

Доходное значениеtalib.BBANDS()Массив содержит три элемента: массив верхней линии, массив средней линии и массив нижней линии. массив

Талиб.ББАНДС ((inReal) Talib.BBANDS ((inReal, optInTimePeriod) (в реальном времени, в промежутке времени) talib.BBANDS ((inReal, optInTimePeriod, optInNbDevUp) (в режиме реального времени) talib.BBANDS ((inReal, optInTimePeriod, optInNbDevUp, optInNbDevDn) (в режиме реального времени) talib.BBANDS ((inReal, optInTimePeriod, optInNbDevUp, optInNbDevDn, optInMAType)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 5. optInTimeПериод ложное Номер ВoptInNbDevUpпараметр используется для установки множителя вверх по линии, значение по умолчанию 2. Оптимизировать ложное Номер ВoptInNbDevDnПараметр используется для установки множителя нижней строки, значение по умолчанию - 2. Оптимизация ложное Номер ВoptInMATypeпараметр используется для установки среднего типа, значение по умолчанию 0. Оптимизация ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.BBANDS(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.BBANDS(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.BBANDS(records);
    Log(ret);
}

ВBBANDS()Функция описана в документации библиотеки талиб как:BBANDS(Records[Close],Time Period = 5,Deviations up = 2,Deviations down = 2,MA Type = 0) = [Array(outRealUpperBand),Array(outRealMiddleBand),Array(outRealLowerBand)]

talib.DEMA

Вtalib.DEMA()Функция используется для расчетаДвойная экспоненциальная скользящая средняя.

Доходное значениеtalib.DEMA()функция - это одномерный массив. массив

Талиб.DEMA ((inReal) Талиб.ДЕМА (в реальном времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 30. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.DEMA(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.DEMA(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.DEMA(records);
    Log(ret);
}

ВDEMA()Функция описана в документации библиотеки талиб как:DEMA(Records[Close],Time Period = 30) = Array(outReal)

talib.EMA

Вtalib.EMA()Функция используется для расчетаЭкспоненциальная скользящая средняя.

Доходное значениеtalib.EMA()функция - это одномерный массив. массив

Талиб.EMA ((inReal) Талиб.EMA ((inReal, optInTimePeriod)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 30. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.EMA(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.EMA(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.EMA(records);
    Log(ret);
}

ВEMA()Функция описана в документации библиотеки талиб как:EMA(Records[Close],Time Period = 30) = Array(outReal)

talib.HT_TRENDLINE

Вtalib.HT_TRENDLINE()Функция используется для расчетаТрансформация Хильберта - мгновенная линия тренда.

Доходное значениеtalib.HT_TRENDLINE()функция: одномерный массив. массив

Talib.HT_TRENDLINE ((inReal))

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы

function main() {
    var records = exchange.GetRecords()
    var ret = talib.HT_TRENDLINE(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.HT_TRENDLINE(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.HT_TRENDLINE(records);
    Log(ret);
}

ВHT_TRENDLINE()Функция описана в документации библиотеки талиб как:HT_TRENDLINE(Records[Close]) = Array(outReal)

talib.KAMA

Вtalib.KAMA()Функция используется для расчетаКауфманская адаптивная скользящая средняя.

Доходное значениеtalib.KAMA()функция: одномерный массив. массив

Талиб.Кама ((inReal) Талиб.Кама (в реальном времени, optInTimePeriod)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 30. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.KAMA(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.KAMA(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.KAMA(records);
    Log(ret);
}

ВKAMA()Функция описана в документации библиотеки талиб как:KAMA(Records[Close],Time Period = 30) = Array(outReal)

talib.MA

Вtalib.MA()Функция используется для расчетаДвижущаяся средняя.

Доходное значениеtalib.MA()функция: одномерный массив. массив

talib.MA(недействительный)talib.MA(inReal, optInTimePeriod)talib.MA(inReal, optInTimePeriod, optInMAType)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 30. optInTimeПериод ложное Номер ВoptInMATypeпараметр используется для установки среднего типа, значение по умолчанию 0. Оптимизация ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.MA(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.MA(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.MA(records);
    Log(ret);
}

ВMA()Функция описана в документации библиотеки талиб как:MA(Records[Close],Time Period = 30,MA Type = 0) = Array(outReal)

talib.MAMA

Вtalib.MAMA()Функция используется для расчетаMESA адаптивная скользящая средняя.

Доходное значениеtalib.MAMA()функция: двумерный массив. массив

Талиб.Мама ((inReal) Талиб.Мама ((InReal, optInFastLimit) Талиб.Мама ((inReal, optInFastLimit, optInSlowLimit)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInFastLimitпараметр используется для установки быстрого лимита, значение по умолчанию составляет 0,5. optInFastLimit ложное Номер ВoptInSlowLimitпараметр используется для установки ограничения медленности, значение по умолчанию составляет 0,05. optInSlowLimit ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.MAMA(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.MAMA(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.MAMA(records);
    Log(ret);
}

ВMAMA()Функция описана в документации библиотеки талиб как:MAMA(Records[Close],Fast Limit = 0.5,Slow Limit = 0.05) = [Array(outMAMA),Array(outFAMA)]

talib.MIDPOINT

Вtalib.MIDPOINT()Функция используется для расчетаСредняя точка за период (средняя точка).

Доходное значениеtalib.MIDPOINT()функция - это одномерный массив. массив

Талиб.МИДПОИНТ ((inReal) Talib.MIDPOINT ((inReal, optInTimePeriod) (в реальном времени, в промежутке времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.MIDPOINT(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.MIDPOINT(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.MIDPOINT(records);
    Log(ret);
}

ВMIDPOINT()Функция описана в документации библиотеки талиб как:MIDPOINT(Records[Close],Time Period = 14) = Array(outReal)

talib.MIDPRICE

Вtalib.MIDPRICE()Функция используется для расчетаЦены средней точки за период (цены средней точки).

Доходное значениеtalib.MIDPRICE()функция - это одномерный массив. массив

talib.MIDPRICE ((inPriceHL)) talib.MIDPRICE ((inPriceHL, optInTimePeriod) - средняя цена (в цене)

ВinPriceHLпараметр используется для указания данных K-линии. inPriceHL неправда {@struct/Record Record} массив структуры ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.MIDPRICE(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.MIDPRICE(records.High, records.Low)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.MIDPRICE(records);
    Log(ret);
}

ВMIDPRICE()Функция описана в документации библиотеки талиб как:MIDPRICE(Records[High,Low],Time Period = 14) = Array(outReal)

talib.SAR

Вtalib.SAR()Функция используется для расчетаПараболический SAR.

Доходное значениеtalib.SAR()функция: одномерный массив. массив

talib.SAR ((inPriceHL)) Talib.SAR ((inPriceHL, optInAcceleration) - это не так. Talib.SAR ((inPriceHL, optInAcceleration, optInMaximum) (включает в себя:

ВinPriceHLпараметр используется для указания данных K-линии. inPriceHL неправда {@struct/Record Record} массив структуры ВoptInAccelerationпараметр используется для установки фактора ускорения, значение по умолчанию 0,02. Оптимизировать ускорение ложное Номер ВoptInMaximumпараметр используется для настройки максимального AF, значение по умолчанию равняется 0,2. optInMaximum ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.SAR(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.SAR(records.High, records.Low)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.SAR(records);
    Log(ret);
}

ВSAR()Функция описана в документации библиотеки талиб как:SAR(Records[High,Low],Acceleration Factor = 0.02,AF Maximum = 0.2) = Array(outReal)

talib.SAREXT

Вtalib.SAREXT()Функция используется для расчетаПараболический SAR - расширенный (улучшенное параболическое рулевое управление).

Доходное значениеtalib.SAREXT()функция - это одномерный массив. массив

talib.SAREXT ((inPriceHL)) talib.SAREXT ((inPriceHL, optInStartValue) (включите значение) talib.SAREXT ((inPriceHL, optInStartValue, optInOffsetOnReverse) (включает в себя: talib.SAREXT ((inPriceHL, optInStartValue, optInOffsetOnReverse, optInAccelerationInitLong) (включает в себя: talib.SAREXT ((inPriceHL, optInStartValue, optInOffsetOnReverse, optInAccelerationInitLong, optInAccelerationLong) talib.SAREXT ((inPriceHL, optInStartValue, optInOffsetOnReverse, optInAccelerationInitLong, optInAccelerationLong, optInAccelerationMaxLong) (включает в себя: talib.SAREXT ((inPriceHL, optInStartValue, optInOffsetOnReverse, optInAccelerationInitLong, optInAccelerationLong, optInAccelerationMaxLong, optInAccelerationInitShort) (включает в себя: talib.SAREXT ((inPriceHL, optInStartValue, optInOffsetOnReverse, optInAccelerationInitLong, optInAccelerationLong, optInAccelerationMaxLong, optInAccelerationInitShort, optInAccelerationShort) (включает в себя: talib.SAREXT ((inPriceHL, optInStartValue, optInOffsetOnReverse, optInAccelerationInitLong, optInAccelerationLong, optInAccelerationMaxLong, optInAccelerationInitShort, optInAccelerationShort, optInAccelerationMaxShort)

ВinPriceHLпараметр используется для указания данных K-линии. inPriceHL неправда {@struct/Record Record} массив структуры ВoptInStartValueпараметр используется для установки Start Value, значение по умолчанию 0. optInStartValue ложное Номер ВoptInOffsetOnReverseпараметр используется для установки Оффсета на обратном направлении, значение по умолчанию равняется 0. ОптимизироватьInOffsetOnReverse ложное Номер ВoptInAccelerationInitLongпараметр используется для настройки AF Init Long, значение по умолчанию 0,02. Оптимизировать ускорение ложное Номер ВoptInAccelerationLongпараметр используется для настройки AF Long, значение по умолчанию 0,02. Оптимизировать ускорение ложное Номер ВoptInAccelerationMaxLongпараметр используется для настройки AF Max Long, значение по умолчанию 0,2. Оптимизировать ускорение MaxLong ложное Номер ВoptInAccelerationInitShortпараметр используется для настройки AF Init Short, значение по умолчанию 0,02. Оптимизируйте ускорение. ложное Номер ВoptInAccelerationShortпараметр используется для настройки AF Short, значение по умолчанию 0.02. Оптимизировать ускорение ложное Номер ВoptInAccelerationMaxShortпараметр используется для настройки AF Max Short, значение по умолчанию 0.2. Оптимизировать ускорение MaxShort ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.SAREXT(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.SAREXT(records.High, records.Low)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.SAREXT(records);
    Log(ret);
}

ВSAREXT()Функция описана в документации библиотеки талиб как:SAREXT(Records[High,Low],Start Value = 0,Offset on Reverse = 0,AF Init Long = 0.02,AF Long = 0.02,AF Max Long = 0.2,AF Init Short = 0.02,AF Short = 0.02,AF Max Short = 0.2) = Array(outReal)

talib.SMA

Вtalib.SMA()Функция используется для расчетаПростая скользящая средняя.

Доходное значениеtalib.SMA()функция: одномерный массив. массив

Талиб.СМА ((inReal) Талиб.СМА ((inReal, optInTimePeriod)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 30. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.SMA(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.SMA(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.SMA(records);
    Log(ret);
}

ВSMA()Функция описана в документации библиотеки талиб как:SMA(Records[Close],Time Period = 30) = Array(outReal)

talib.T3

Вtalib.T3()Функция используется для расчетаТрехэкспоненциальная скользящая средняя (T3) (трехэкспоненциальная скользящая средняя).

Доходное значениеtalib.T3()функция - это одномерный массив. массив

Талиб.Т3 ((inReal) talib.T3 ((inReal, optInTimePeriod) (в реальном времени, выбор в периоде времени) talib.T3 ((inReal, optInTimePeriod, optInVFactor) (в режиме реального времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 5. optInTimeПериод ложное Номер ВoptInVFactorпараметр используется для установки фактора объема, значение по умолчанию 0,7. optInVFactor ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.T3(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.T3(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.T3(records);
    Log(ret);
}

ВT3()Функция описана в документации библиотеки талиб как:T3(Records[Close],Time Period = 5,Volume Factor = 0.7) = Array(outReal)

talib.TEMA

Вtalib.TEMA()Функция используется для расчетаТройная экспоненциальная скользящая средняя.

Доходное значениеtalib.TEMA()функция - это одномерный массив. массив

Талиб.ТЕМА ((inReal) Talib.TEMA ((inReal, optInTimePeriod) (в реальном времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 30. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.TEMA(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.TEMA(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.TEMA(records);
    Log(ret);
}

ВTEMA()Функция описана в документации библиотеки талиб как:TEMA(Records[Close],Time Period = 30) = Array(outReal)

talib.TRIMA

Вtalib.TRIMA()Функция используется для расчетаТреугольная скользящая средняя (триэкспоненциальная скользящая средняя).

Доходное значениеtalib.TRIMA()функция - это одномерный массив. массив

Талиб.ТРИМА ((inReal) Талиб.ТРИМА ((inReal, optInTimePeriod)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 30. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.TRIMA(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.TRIMA(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.TRIMA(records);
    Log(ret);
}

ВTRIMA()Функция описана в документации библиотеки талиб как:TRIMA(Records[Close],Time Period = 30) = Array(outReal)

talib.WMA

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

Доходное значениеtalib.WMA()функция - это одномерный массив. массив

Talib.WMA ((inReal) Talib.WMA ((inReal, optInTimePeriod) (в реальном времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 30. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.WMA(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.WMA(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.WMA(records);
    Log(ret);
}

ВWMA()Функция описана в документации библиотеки талиб как:WMA(Records[Close],Time Period = 30) = Array(outReal)

talib.LINEARREG

Вtalib.LINEARREG()Функция используется для расчетаЛинейная регрессия.

Доходное значениеtalib.LINEARREG()функция - это одномерный массив. массив

Talib.LINEARREG ((inReal)) talib.LINEARREG ((inReal, optInTimePeriod) - в реальном времени, в промежутке времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.LINEARREG(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.LINEARREG(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.LINEARREG(records);
    Log(ret);
}

ВLINEARREG()Функция описана в документации библиотеки талиб как:LINEARREG(Records[Close],Time Period = 14) = Array(outReal)

talib.LINEARREG_ANGLE

Вtalib.LINEARREG_ANGLE()Функция используется для расчетаУгол линейной регрессии.

Доходное значениеtalib.LINEARREG_ANGLE()функция: одномерный массив. массив

Talib.LINEARREG_ANGLE ((inReal)) talib.LINEARREG_ANGLE ((inReal, optInTimePeriod) - в реальном времени, в промежутке времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.LINEARREG_ANGLE(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.LINEARREG_ANGLE(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.LINEARREG_ANGLE(records);
    Log(ret);
}

ВLINEARREG_ANGLE()Функция описана в документации библиотеки талиб как:LINEARREG_ANGLE(Records[Close],Time Period = 14) = Array(outReal)

talib.LINEARREG_INTERCEPT

Вtalib.LINEARREG_INTERCEPT()Функция используется для расчетаПерехват линейной регрессии.

Доходное значениеtalib.LINEARREG_INTERCEPT()функция: одномерный массив. массив

Talib.LINEARREG_INTERCEPT ((inReal) - это действительно так. talib.LINEARREG_INTERCEPT ((inReal, optInTimePeriod) (в реальном времени, выбираем в промежутке времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.LINEARREG_INTERCEPT(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.LINEARREG_INTERCEPT(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.LINEARREG_INTERCEPT(records);
    Log(ret);
}

ВLINEARREG_INTERCEPT()Функция описана в документации библиотеки талиб как:LINEARREG_INTERCEPT(Records[Close],Time Period = 14) = Array(outReal)

talib.LINEARREG_SLOPE

Вtalib.LINEARREG_SLOPE()Функция используется для расчетаСклон линейной регрессии.

Доходное значениеtalib.LINEARREG_SLOPE()функция: одномерный массив. массив

Talib.LINEARREG_SLOPE ((inReal) - в реальности) talib.LINEARREG_SLOPE ((inReal, optInTimePeriod) (в реальном времени, выберите в периоде времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.LINEARREG_SLOPE(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.LINEARREG_SLOPE(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.LINEARREG_SLOPE(records);
    Log(ret);
}

ВLINEARREG_SLOPE()Функция описана в документации библиотеки талиб как:LINEARREG_SLOPE(Records[Close],Time Period = 14) = Array(outReal)

talib.STDDEV

Вtalib.STDDEV()Функция используется для расчетаСтандартное отклонение.

Доходное значениеtalib.STDDEV()функция: одномерный массив. массив

Талиб.СТДДЕВ ((inReal) Talib.STDDEV ((inReal, optInTimePeriod) (в реальном времени) Talib.STDDEV ((inReal, optInTimePeriod, optInNbDev) (в режиме реального времени, в режиме реального времени, в режиме реального времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 5. optInTimeПериод ложное Номер ВoptInNbDevпараметр используется для установки отклонений, значение по умолчанию составляет 1. Оптимизировать ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.STDDEV(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.STDDEV(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.STDDEV(records);
    Log(ret);
}

ВSTDDEV()Функция описана в документации библиотеки талиб как:STDDEV(Records[Close],Time Period = 5,Deviations = 1) = Array(outReal)

talib.TSF

Вtalib.TSF()Функция используется для расчетаПрогноз по временным сериям.

Доходное значениеtalib.TSF()функция - это одномерный массив. массив

Talib.TSF ((inReal)) Talib.TSF ((inReal, optInTimePeriod) (в реальном времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.TSF(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.TSF(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.TSF(records);
    Log(ret);
}

ВTSF()Функция описана в документации библиотеки талиб как:TSF(Records[Close],Time Period = 14) = Array(outReal)

talib.VAR

Вtalib.VAR()Функция используется для расчетаРазница.

Доходное значениеtalib.VAR()функция: одномерный массив. массив

Талиб.ВАР ((inReal) talib.VAR ((inReal, optInTimePeriod) (в реальном времени, выбираем в промежутке времени) talib.VAR ((inReal, optInTimePeriod, optInNbDev) (в режиме реального времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 5. optInTimeПериод ложное Номер ВoptInNbDevпараметр используется для установки отклонений, значение по умолчанию составляет 1. Оптимизировать ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.VAR(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.VAR(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.VAR(records);
    Log(ret);
}

ВVAR()Функция описана в документации библиотеки талиб как:VAR(Records[Close],Time Period = 5,Deviations = 1) = Array(outReal)

talib.ADX

Вtalib.ADX()Функция используется для расчетаСредний индекс направленного движения.

Доходное значениеtalib.ADX()функция - это одномерный массив. массив

Talib.ADX ((inPriceHLC) talib.ADX ((inPriceHLC, optInTimePeriod) (в цену, в время)

ВinPriceHLCпараметр используется для указания данных K-линии. inPriceHLC неправда {@struct/Record Record} массив структуры ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.ADX(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.ADX(records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.ADX(records);
    Log(ret);
}

ВADX()Функция описана в документации библиотеки талиб как:ADX(Records[High,Low,Close],Time Period = 14) = Array(outReal)

talib.ADXR

Вtalib.ADXR()Функция используется для расчетаСредний индекс направленного движения (индекс оценки).

Доходное значениеtalib.ADXR()функция - это одномерный массив. массив

Talib.ADXR ((inPriceHLC) talib.ADXR ((inPriceHLC, optInTimePeriod) (в цену, в время)

ВinPriceHLCпараметр используется для указания данных K-линии. inPriceHLC неправда {@struct/Record Record} массив структуры ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.ADXR(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.ADXR(records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.ADXR(records);
    Log(ret);
}

ВADXR()Функция описана в документации библиотеки талиб как:ADXR(Records[High,Low,Close],Time Period = 14) = Array(outReal)

talib.APO

Вtalib.APO()Функция используется для расчетаАбсолютный ценовой осциллятор.

Доходное значениеtalib.APO()функция: одномерный массив. массив

Талиб.APO ((inReal) Talib.APO ((inReal, optInFastPeriod) (в реальном времени, в быстром времени) talib.APO ((inReal, optInFastPeriod, optInSlowPeriod) (в реальном времени, в быстром периоде, в медленном периоде) talib.APO ((inReal, optInFastPeriod, optInSlowPeriod, optInMAType)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInFastPeriodпараметр используется для установки быстрого периода, значение по умолчанию составляет 12. optInFastPeriod ложное Номер ВoptInSlowPeriodпараметр используется для установки медленного периода, значение по умолчанию составляет 26. optInSlowPeriod ложное Номер ВoptInMATypeпараметр используется для установки среднего типа, значение по умолчанию 0. Оптимизация ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.APO(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.APO(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.APO(records);
    Log(ret);
}

ВAPO()Функция описана в документации библиотеки талиб как:APO(Records[Close],Fast Period = 12,Slow Period = 26,MA Type = 0) = Array(outReal)

talib.AROON

Вtalib.AROON()Функция используется для расчетаAroon (показатель Aroon).

Доходное значениеtalib.AROON()Функция представляет собой двумерный массив. массив

Талиб.АРУОН ((inPriceHL)) Талиб.Арон ((в цене, optInTimePeriod)

ВinPriceHLпараметр используется для указания данных K-линии. inPriceHL неправда {@struct/Record Record} массив структуры ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.AROON(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.AROON(records.High, records.Low)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.AROON(records);
    Log(ret);
}

ВAROON()Функция описана в документации библиотеки талиб как:AROON(Records[High,Low],Time Period = 14) = [Array(outAroonDown),Array(outAroonUp)]

talib.AROONOSC

Вtalib.AROONOSC()Функция используется для расчетаОсиллятор Аруна.

Доходное значениеtalib.AROONOSC()функция: одномерный массив. массив

Talib.AROONOSC ((inPriceHL)) Talib.AROONOSC ((inPriceHL, optInTimePeriod) - в цене, в времени, в периоде)

ВinPriceHLпараметр используется для указания данных K-линии. inPriceHL неправда {@struct/Record Record} массив структуры ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.AROONOSC(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.AROONOSC(records.High, records.Low)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.AROONOSC(records);
    Log(ret);
}

ВAROONOSC()Функция описана в документации библиотеки талиб как:AROONOSC(Records[High,Low],Time Period = 14) = Array(outReal)

talib.BOP

Вtalib.BOP()Функция используется для расчетаРавновесие сил.

Доходное значениеtalib.BOP()функция - это одномерный массив. массив

Talib.BOP ((inPriceOHLC))

ВinPriceOHLCпараметр используется для указания данных K-линии. inPriceOHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.BOP(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.BOP(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.BOP(records);
    Log(ret);
}

ВBOP()Функция описана в документации библиотеки талиб как:BOP(Records[Open,High,Low,Close]) = Array(outReal)

talib.CCI

Вtalib.CCI()Функция используется для расчетаИндекс товарных каналов (гомеопатический показатель).

Доходное значениеtalib.CCI()функция - это одномерный массив. массив

Талиб.CCI ((inPriceHLC) talib.CCI ((inPriceHLC, optInTimePeriod) (в цену, в срок)

ВinPriceHLCпараметр используется для указания данных K-линии. inPriceHLC неправда {@struct/Record Record} массив структуры ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CCI(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CCI(records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CCI(records);
    Log(ret);
}

ВCCI()Функция описана в документации библиотеки талиб как:CCI(Records[High,Low,Close],Time Period = 14) = Array(outReal)

talib.CMO

Вtalib.CMO()Функция используется для расчетаОсиллятор импульса Chande (CMO).

Доходное значениеtalib.CMO()функция: одномерный массив. массив

Талиб. Главный операционный директор (inReal) Talib.CMO ((inReal, optInTimePeriod) (в реальном времени, в промежутке времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.CMO(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.CMO(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.CMO(records);
    Log(ret);
}

ВCMO()Функция описана в документации библиотеки талиб как:CMO(Records[Close],Time Period = 14) = Array(outReal)

talib.DX

Вtalib.DX()Функция используется для расчетаИндекс направленного движения.

Доходное значениеtalib.DX()функция: одномерный массив. массив

Talib.DX ((inPriceHLC) talib.DX ((inPriceHLC, optInTimePeriod) (включительно для пользователей)

ВinPriceHLCпараметр используется для указания данных K-линии. inPriceHLC неправда {@struct/Record Record} массив структуры ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.DX(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.DX(records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.DX(records);
    Log(ret);
}

ВDX()Функция описана в документации библиотеки талиб как:DX(Records[High,Low,Close],Time Period = 14) = Array(outReal)

talib.MACD

Вtalib.MACD()Функция используется для расчетаКрутящаяся средняя конвергенция/дивергенция (экспоненциально сглаженная скользящая средняя).

Доходное значениеtalib.MACD()функция: двумерный массив. массив

Талиб.МАКД ((inReal) Talib.MACD ((inReal, optInFastPeriod) (в реальном времени) talib.MACD ((inReal, optInFastPeriod, optInSlowPeriod) (в реальном времени, в быстром периоде, в медленном периоде) talib.MACD ((inReal, optInFastPeriod, optInSlowPeriod, optInSignalPeriod) - в реальном времени, в быстром периоде, в медленном периоде, в сигнальном периоде

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInFastPeriodпараметр используется для установки быстрого периода, значение по умолчанию составляет 12. optInFastPeriod ложное Номер ВoptInSlowPeriodпараметр используется для установки медленного периода, значение по умолчанию составляет 26. optInSlowPeriod ложное Номер ВoptInSignalPeriodпараметр используется для установки периода сигнала, значение по умолчанию 9. optВ период сигнализации ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.MACD(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.MACD(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.MACD(records);
    Log(ret);
}

ВMACD()Функция описана в документации библиотеки талиб как:MACD(Records[Close],Fast Period = 12,Slow Period = 26,Signal Period = 9) = [Array(outMACD),Array(outMACDSignal),Array(outMACDHist)]

talib.MACDEXT

Вtalib.MACDEXT()Функция используется для расчетаMACD с управляемым типом MA.

Доходное значениеtalib.MACDEXT()Функция представляет собой двумерный массив. массив

Талиб.Макдекс. Talib.MACDEXT ((inReal, optInFastPeriod) (в режиме реального времени) talib.MACDEXT ((inReal, optInFastPeriod, optInFastMAType) talib.MACDEXT ((inReal, optInFastPeriod, optInFastMAType, optInSlowPeriod) (включает в себя: talib.MACDEXT ((inReal, optInFastPeriod, optInFastMAType, optInSlowPeriod, optInSlowMAType) talib.MACDEXT ((inReal, optInFastPeriod, optInFastMAType, optInSlowPeriod, optInSlowMAType, optInSignalPeriod) (недоступная ссылка) talib.MACDEXT ((inReal, optInFastPeriod, optInFastMAType, optInSlowPeriod, optInSlowMAType, optInSignalPeriod, optInSignalMAType)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInFastPeriodпараметр используется для установки быстрого периода, значение по умолчанию составляет 12. optInFastPeriod ложное Номер ВoptInFastMATypeпараметр используется для установки типа быстрого среднего, значение по умолчанию равняется 0. Оптимизация ложное Номер ВoptInSlowPeriodпараметр используется для установки медленного периода, значение по умолчанию составляет 26. optInSlowPeriod ложное Номер ВoptInSlowMATypeпараметр используется для установки типа медленного среднего значения, значение по умолчанию равняется 0. optInSlowMAType ложное Номер ВoptInSignalPeriodпараметр используется для установки периода сигнала, значение по умолчанию 9. optВ период сигнализации ложное Номер ВoptInSignalMATypeпараметр используется для настройки типа среднего значения сигнала, значение по умолчанию равняется 0. Оптимизация ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.MACDEXT(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.MACDEXT(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.MACDEXT(records);
    Log(ret);
}

ВMACDEXT()Функция описана в документации библиотеки талиб как:MACDEXT(Records[Close],Fast Period = 12,Fast MA = 0,Slow Period = 26,Slow MA = 0,Signal Period = 9,Signal MA = 0) = [Array(outMACD),Array(outMACDSignal),Array(outMACDHist)]

talib.MACDFIX

Вtalib.MACDFIX()Функция используется для расчетаУстановка скользящей средней конвергенции/дивергенции 12/26.

Доходное значениеtalib.MACDFIX()Функция представляет собой двумерный массив. массив

Talib.MACDFIX ((inReal) talib.MACDFIX ((inReal, optInSignalPeriod) - в реальном времени

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInSignalPeriodпараметр используется для установки периода сигнала, значение по умолчанию 9. optВ период сигнализации ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.MACDFIX(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.MACDFIX(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.MACDFIX(records);
    Log(ret);
}

ВMACDFIX()Функция описана в документации библиотеки талиб как:MACDFIX(Records[Close],Signal Period = 9) = [Array(outMACD),Array(outMACDSignal),Array(outMACDHist)]

talib.MFI

Вtalib.MFI()Функция используется для расчетаИндекс денежных потоков.

Доходное значениеtalib.MFI()функция - это одномерный массив. массив

talib.MFI ((inPriceHLCV) talib.MFI ((inPriceHLCV, optInTimePeriod) - в цене, в течение периода времени)

ВinPriceHLCVпараметр используется для указания данных K-линии. inPriceHLCV неправда {@struct/Record Record} массив структуры ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.MFI(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.MFI(records.High, records.Low, records.Close, records.Volume)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.MFI(records);
    Log(ret);
}

ВMFI()Функция описана в документации библиотеки талиб как:MFI(Records[High,Low,Close,Volume],Time Period = 14) = Array(outReal)

talib.MINUS_DI

Вtalib.MINUS_DI()Функция используется для расчетаМинус направленный показатель (отрицательный показатель).

Доходное значениеtalib.MINUS_DI()функция - это одномерный массив. массив

talib.MINUS_DI ((inPriceHLC) talib.MINUS_DI ((inPriceHLC, optInTimePeriod) - в расчете на время)

ВinPriceHLCпараметр используется для указания данных K-линии. inPriceHLC неправда {@struct/Record Record} массив структуры ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.MINUS_DI(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.MINUS_DI(records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.MINUS_DI(records);
    Log(ret);
}

ВMINUS_DI()Функция описана в документации библиотеки талиб как:MINUS_DI(Records[High,Low,Close],Time Period = 14) = Array(outReal)

talib.MINUS_DM

Вtalib.MINUS_DM()Функция используется для расчетаМинус направленное движение (отрицательное движение).

Доходное значениеtalib.MINUS_DM()функция - это одномерный массив. массив

talib.MINUS_DM ((inPriceHL)) talib.MINUS_DM ((inPriceHL, optInTimePeriod) - в расчете на время)

ВinPriceHLпараметр используется для указания данных K-линии. inPriceHL неправда {@struct/Record Record} массив структуры ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.MINUS_DM(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.MINUS_DM(records.High, records.Low)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.MINUS_DM(records);
    Log(ret);
}

ВMINUS_DM()Функция описана в документации библиотеки талиб как:MINUS_DM(Records[High,Low],Time Period = 14) = Array(outReal)

talib.MOM

Вtalib.MOM()Функция используется для расчетаИмпульс.

Доходное значениеtalib.MOM()функция - это одномерный массив. массив

Талиб.Мама ((inReal) Талиб.Мама ((inReal, optInTimePeriod)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 10. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.MOM(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.MOM(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.MOM(records);
    Log(ret);
}

ВMOM()Функция описана в документации библиотеки талиб как:MOM(Records[Close],Time Period = 10) = Array(outReal)

talib.PLUS_DI

Вtalib.PLUS_DI()Функция используется для расчетаПлюс указатель направления.

Доходное значениеtalib.PLUS_DI()функция: одномерный массив. массив

talib.PLUS_DI ((inPriceHLC) talib.PLUS_DI ((inPriceHLC, optInTimePeriod) - в расчете на время)

ВinPriceHLCпараметр используется для указания данных K-линии. inPriceHLC неправда {@struct/Record Record} массив структуры ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.PLUS_DI(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.PLUS_DI(records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.PLUS_DI(records);
    Log(ret);
}

ВPLUS_DI()Функция описана в документации библиотеки талиб как:PLUS_DI(Records[High,Low,Close],Time Period = 14) = Array(outReal)

talib.PLUS_DM

Вtalib.PLUS_DM()Функция используется для расчетаПлюс направленное движение.

Доходное значениеtalib.PLUS_DM()функция - это одномерный массив. массив

talib.PLUS_DM ((inPriceHL) talib.PLUS_DM ((inPriceHL, optInTimePeriod) - в цене, в периоде времени)

ВinPriceHLпараметр используется для указания данных K-линии. inPriceHL неправда {@struct/Record Record} массив структуры ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.PLUS_DM(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.PLUS_DM(records.High, records.Low)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.PLUS_DM(records);
    Log(ret);
}

ВPLUS_DM()Функция описана в документации библиотеки талиб как:PLUS_DM(Records[High,Low],Time Period = 14) = Array(outReal)

talib.PPO

Вtalib.PPO()Функция используется для расчетаПроцентный осциллятор цен.

Доходное значениеtalib.PPO()функция - это одномерный массив. массив

Талиб.PPO ((inReal) Talib.PPO ((inReal, optInFastPeriod) (в реальном времени, в быстром времени) talib.PPO ((inReal, optInFastPeriod, optInSlowPeriod) (в реальном времени, в быстром периоде, в медленном периоде) talib.PPO ((inReal, optInFastPeriod, optInSlowPeriod, optInMAType)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInFastPeriodпараметр используется для установки быстрого периода, значение по умолчанию составляет 12. optInFastPeriod ложное Номер ВoptInSlowPeriodпараметр используется для установки медленного периода, значение по умолчанию составляет 26. optInSlowPeriod ложное Номер ВoptInMATypeпараметр используется для установки среднего типа, значение по умолчанию 0. Оптимизация ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.PPO(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.PPO(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.PPO(records);
    Log(ret);
}

ВPPO()Функция описана в документации библиотеки талиб как:PPO(Records[Close],Fast Period = 12,Slow Period = 26,MA Type = 0) = Array(outReal)

talib.ROC

Вtalib.ROC()Функция используется для расчетаКоэффициент изменения: ((цена/предыдущаяЦена) -1) *100 (показатель коэффициента изменения).

Доходное значениеtalib.ROC()функция - это одномерный массив. массив

Talib.ROC ((inReal)) talib.ROC ((inReal, optInTimePeriod) (в реальном времени, выбор в периоде времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 10. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.ROC(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.ROC(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.ROC(records);
    Log(ret);
}

ВROC()Функция описана в документации библиотеки талиб как:ROC(Records[Close],Time Period = 10) = Array(outReal)

talib.ROCP

Вtalib.ROCP()Функция используется для расчетаКоэффициент изменения Процент: (цена-предупреждение) /предупреждение (коэффициент изменения цен).

Доходное значениеtalib.ROCP()функция: одномерный массив. массив

Talib.ROCP ((inReal)) talib.ROCP ((inReal, optInTimePeriod) (в реальном времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 10. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.ROCP(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.ROCP(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.ROCP(records);
    Log(ret);
}

ВROCP()Функция описана в документации библиотеки талиб как:ROCP(Records[Close],Time Period = 10) = Array(outReal)

talib.ROCR

Вtalib.ROCR()Функция используется для расчетаКоэффициент изменения цены: (цена/предыдущая цена) (коэффициент изменения цен).

Доходное значениеtalib.ROCR()функция - это одномерный массив. массив

Талиб.ROCR ((inReal) Talib.ROCR ((inReal, optInTimePeriod) (в реальном времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 10. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.ROCR(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.ROCR(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.ROCR(records);
    Log(ret);
}

ВROCR()Функция описана в документации библиотеки талиб как:ROCR(Records[Close],Time Period = 10) = Array(outReal)

talib.ROCR100

Вtalib.ROCR100()Функция используется для расчетаКоэффициент изменения 100 шкала: (цена/предыдущая цена) *100 (коэффициент изменения цен).

Доходное значениеtalib.ROCR100()функция: одномерный массив. массив

Talib.ROCR100 ((inReal) Talib.ROCR100 ((inReal, optInTimePeriod) (в реальном времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 10. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.ROCR100(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.ROCR100(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.ROCR100(records);
    Log(ret);
}

ВROCR100()Функция описана в документации библиотеки талиб как:ROCR100(Records[Close],Time Period = 10) = Array(outReal)

talib.RSI

Вtalib.RSI()Функция используется для расчетаИндекс относительной силы.

Доходное значениеtalib.RSI()функция - это одномерный массив. массив

Talib.RSI ((inReal) talib.RSI ((inReal, optInTimePeriod) (в реальном времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.RSI(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.RSI(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.RSI(records);
    Log(ret);
}

ВRSI()Функция описана в документации библиотеки талиб как:RSI(Records[Close],Time Period = 14) = Array(outReal)

talib.STOCH

Вtalib.STOCH()Функция используется для расчетаСтохастический показатель (индикатор STOCH).

Доходное значениеtalib.STOCH()Функция представляет собой двумерный массив. массив

Talib.STOCH ((inPriceHLC)) talib.STOCH ((inPriceHLC, optInFastK_Period) (встроенная цена) talib.STOCH ((inPriceHLC, optInFastK_Period, optInSlowK_Period) talib.STOCH ((inPriceHLC, optInFastK_Period, optInSlowK_Period, optInSlowK_MAType) talib.STOCH ((inPriceHLC, optInFastK_Period, optInSlowK_Period, optInSlowK_MAType, optInSlowD_Period) talib.STOCH ((inPriceHLC, optInFastK_Period, optInSlowK_Period, optInSlowK_MAType, optInSlowD_Period, optInSlowD_MAType)

ВinPriceHLCпараметр используется для указания данных K-линии. inPriceHLC неправда {@struct/Record Record} массив структуры ВoptInFastK_Periodпараметр используется для установки периода Fast-K, значение по умолчанию 5. optInFastK_Period ложное Номер ВoptInSlowK_Periodпараметр используется для установки периода Slow-K, значение по умолчанию - 3. optInSlowK_Period ложное Номер ВoptInSlowK_MATypeпараметр используется для установки среднего типа Slow-K, значение по умолчанию 0. Оптимизация ложное Номер ВoptInSlowD_Periodпараметр используется для установки периода Slow-D, значение по умолчанию - 3. optInSlowD_Period ложное Номер ВoptInSlowD_MATypeпараметр используется для установки среднего типа Slow-D, значение по умолчанию равняется 0. Оптимизация ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.STOCH(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.STOCH(records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.STOCH(records);
    Log(ret);
}

ВSTOCH()Функция описана в документации библиотеки талиб как:STOCH(Records[High,Low,Close],Fast-K Period = 5,Slow-K Period = 3,Slow-K MA = 0,Slow-D Period = 3,Slow-D MA = 0) = [Array(outSlowK),Array(outSlowD)]

talib.STOCHF

Вtalib.STOCHF()Функция используется для расчетаСтохастический быстрый (быстрый индикатор STOCH).

Доходное значениеtalib.STOCHF()Функция представляет собой двумерный массив. массив

Talib.STOCHF ((inPriceHLC)) talib.STOCHF ((inPriceHLC, optInFastK_Period) - в течение всего периода) talib.STOCHF ((inPriceHLC, optInFastK_Period, optInFastD_Period) talib.STOCHF ((inPriceHLC, optInFastK_Period, optInFastD_Period, optInFastD_MAType)

ВinPriceHLCпараметр используется для указания данных K-линии. inPriceHLC неправда {@struct/Record Record} массив структуры ВoptInFastK_Periodпараметр используется для установки периода Fast-K, значение по умолчанию 5. optInFastK_Period ложное Номер ВoptInFastD_Periodпараметр используется для установки периода Fast-D, значение по умолчанию - 3. optInFastD_Period ложное Номер ВoptInFastD_MATypeпараметр используется для установки среднего типа Fast-D, значение по умолчанию равняется 0. optInFastD_MAType ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.STOCHF(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.STOCHF(records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.STOCHF(records);
    Log(ret);
}

ВSTOCHF()Функция описана в документации библиотеки талиб как:STOCHF(Records[High,Low,Close],Fast-K Period = 5,Fast-D Period = 3,Fast-D MA = 0) = [Array(outFastK),Array(outFastD)]

talib.STOCHRSI

Вtalib.STOCHRSI()Функция используется для расчетаИндекс относительной силы.

Доходное значениеtalib.STOCHRSI()функция: двумерный массив. массив

Талиб.СТОЧРСИ ((inReal) Talib.STOCHRSI ((inReal, optInTimePeriod) (в реальном времени, выбор в периоде времени) talib.STOCHRSI ((inReal, optInTimePeriod, optInFastK_Period) (в режиме реального времени, в режиме быстрого времени, в режиме быстрого времени) talib.STOCHRSI ((inReal, optInTimePeriod, optInFastK_Period, optInFastD_Period) talib.STOCHRSI ((inReal, optInTimePeriod, optInFastK_Period, optInFastD_Period, optInFastD_MAType)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер ВoptInFastK_Periodпараметр используется для установки периода Fast-K, значение по умолчанию 5. optInFastK_Period ложное Номер ВoptInFastD_Periodпараметр используется для установки периода Fast-D, значение по умолчанию - 3. optInFastD_Period ложное Номер ВoptInFastD_MATypeпараметр используется для установки среднего типа Fast-D, значение по умолчанию равняется 0. optInFastD_MAType ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.STOCHRSI(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.STOCHRSI(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.STOCHRSI(records);
    Log(ret);
}

ВSTOCHRSI()Функция описана в документации библиотеки талиб как:STOCHRSI(Records[Close],Time Period = 14,Fast-K Period = 5,Fast-D Period = 3,Fast-D MA = 0) = [Array(outFastK),Array(outFastD)]

talib.TRIX

Вtalib.TRIX()Функция используется для расчета1-дневный коэффициент изменения (ROC) тройной плавной EMA.

Доходное значениеtalib.TRIX()функция: одномерный массив. массив

Талиб.ТРИКС ((inReal) Talib.TRIX ((inReal, optInTimePeriod) (в реальном времени)

ВinRealпараметр используется для указания данных K-линии. вРеальном Истинно {@struct/Record Record} структурные массивы, числовые массивы ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 30. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.TRIX(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.TRIX(records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.TRIX(records);
    Log(ret);
}

ВTRIX()Функция описана в документации библиотеки талиб как:TRIX(Records[Close],Time Period = 30) = Array(outReal)

talib.ULTOSC

Вtalib.ULTOSC()Функция используется для расчетаОкончательный осциллятор.

Доходное значениеtalib.ULTOSC()функция - это одномерный массив. массив

Talib.ULTOSC ((inPriceHLC)) talib.ULTOSC ((inPriceHLC, optInTimePeriod1)) talib.ULTOSC ((inPriceHLC, optInTimePeriod1, optInTimePeriod2)) (обязательно, но не обязательно) talib.ULTOSC ((inPriceHLC, optInTimePeriod1, optInTimePeriod2, optInTimePeriod3)

ВinPriceHLCпараметр используется для указания данных K-линии. inPriceHLC неправда {@struct/Record Record} массив структуры ВoptInTimePeriod1параметр используется для установки первого периода, значение по умолчанию 7. optInTimePeriod1 ложное Номер ВoptInTimePeriod2параметр используется для установки второго периода, значение по умолчанию 14. optInTimePeriod2 ложное Номер ВoptInTimePeriod3параметр используется для установки третьего периода, значение по умолчанию составляет 28. optInTimePeriod3 ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.ULTOSC(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.ULTOSC(records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.ULTOSC(records);
    Log(ret);
}

ВULTOSC()Функция описана в документации библиотеки талиб как:ULTOSC(Records[High,Low,Close],First Period = 7,Second Period = 14,Third Period = 28) = Array(outReal)

talib.WILLR

Вtalib.WILLR()Функция используется для расчетаУильямс %R.

Доходное значениеtalib.WILLR()функция: одномерный массив. массив

Talib.WILLR ((inPriceHLC)) Talib.WILLR ((inPriceHLC, optInTimePeriod) (в цены, в сроке)

ВinPriceHLCпараметр используется для указания данных K-линии. inPriceHLC неправда {@struct/Record Record} массив структуры ВoptInTimePeriodпараметр используется для установки периода, значение по умолчанию 14. optInTimeПериод ложное Номер

function main() {
    var records = exchange.GetRecords()
    var ret = talib.WILLR(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.WILLR(records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.WILLR(records);
    Log(ret);
}```

The ```WILLR()``` function is described in the talib library documentation as: ```WILLR(Records[High,Low,Close],Time Period = 14) = Array(outReal)```

### talib.AVGPRICE

The ```talib.AVGPRICE()``` function is used to calculate **Average Price**.

The return value of the ```talib.AVGPRICE()``` function is a one-dimensional array.
array

talib.AVGPRICE(inPriceOHLC)

The ```inPriceOHLC``` parameter is used to specify the K-line data.
inPriceOHLC
true
{@struct/Record Record} structure array

```javascript
function main() {
    var records = exchange.GetRecords()
    var ret = talib.AVGPRICE(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.AVGPRICE(records.Open, records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.AVGPRICE(records);
    Log(ret);
}

ВAVGPRICE()Функция описана в документации библиотеки талиб как:AVGPRICE(Records[Open,High,Low,Close]) = Array(outReal)

talib.MEDPRICE

Вtalib.MEDPRICE()Функция используется для расчетаСредняя цена.

Доходное значениеtalib.MEDPRICE()функция - это одномерный массив. массив

talib.MEDPRICE ((inPriceHL))

ВinPriceHLпараметр используется для указания данных K-линии. inPriceHL неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.MEDPRICE(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.MEDPRICE(records.High, records.Low)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.MEDPRICE(records);
    Log(ret);
}

ВMEDPRICE()Функция описана в документации библиотеки талиб как:MEDPRICE(Records[High,Low]) = Array(outReal)

talib.TYPPRICE

Вtalib.TYPPRICE()Функция используется для расчетаТипичная цена.

Доходное значениеtalib.TYPPRICE()функция - это одномерный массив. массив

Talib.TYPPRICE ((inPriceHLC) - в цене в цене в цене в цене в цене)

ВinPriceHLCпараметр используется для указания данных K-линии. inPriceHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.TYPPRICE(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.TYPPRICE(records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.TYPPRICE(records);
    Log(ret);
}

ВTYPPRICE()Функция описана в документации библиотеки талиб как:TYPPRICE(Records[High,Low,Close]) = Array(outReal)

talib.WCLPRICE

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

Доходное значениеtalib.WCLPRICE()функция - это одномерный массив. массив

Talib.WCLPRICE ((inPriceHLC))

ВinPriceHLCпараметр используется для указания данных K-линии. inPriceHLC неправда {@struct/Record Record} массив структуры

function main() {
    var records = exchange.GetRecords()
    var ret = talib.WCLPRICE(records)
    Log(ret)
}
import talib
def main():
    records = exchange.GetRecords()
    ret = talib.WCLPRICE(records.High, records.Low, records.Close)
    Log(ret)
void main() {
    auto records = exchange.GetRecords();
    auto ret = talib.WCLPRICE(records);
    Log(ret);
}

ВWCLPRICE()Функция описана в документации библиотеки талиб как:WCLPRICE(Records[High,Low,Close]) = Array(outReal)

Структуры