Tài nguyên đang được tải lên... tải...

Các chức năng tích hợp

Toàn cầu

Phiên bản

Trả về số phiên bản hiện tại của hệ thống.

Số phiên bản hệ thống hiện tại, chẳng hạn như:3.6. chuỗi

Phiên bản

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

Số phiên bản hệ thống là số phiên bản của chương trình docker.

Ngủ đi

Chức năng ngủ, khiến chương trình dừng lại trong một khoảng thời gian.

Giấc ngủ ((millisecond)

Cácmillisecondtham số được sử dụng để thiết lập thời gian ngủ và số milliseconds. millisecond đúng số

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

Ví dụ, khi thực hiệnSleep(1000)Nó hỗ trợ các hoạt động với thời gian ngủ dưới 1 millisecond, ví dụ như cài đặtSleep(0.1)Nó hỗ trợ một tham số tối thiểu của0.000001, tức là ngủ đông nanosecond, nơi 1 nanosecond bằng với1e-6hàng triệu giây. Khi viết các chiến lược trongPythonngôn ngữ,Sleep(millisecond)không được khuyến cáo sử dụng cáctime.sleep(second)chức năng củaPythonỪ.timeĐây là bởi vì sử dụng cáctime.sleep(second)chức năng trong một chiến lược làm cho chương trình chiến lược chờ đợi trong một khoảng thời gian thực sự khi backtesting (không bỏ qua các chuỗi thời gian của hệ thống backtesting), vì vậy nó làm cho chiến lược để backtest rất chậm.

IsVirtual

Xác định xem môi trường chạy của chiến lược có phải là một hệ thống backtesting không.

Chiến lược trả về một giá trị thực, ví dụ:truekhi chạy trong môi trường hệ thống backtesting. Chiến lược trả về một giá trị sai, ví dụ:falsekhi chạy trong môi trường giao dịch trực tiếp. bool

IsVirtual ((()

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.");
    }
}

Xác định xem môi trường chạy hiện tại là một hệ thống backtesting, được sử dụng để tương thích với sự khác biệt giữa backtesting và giao dịch trực tiếp.

Bưu điện

Gửi email.

Một giao hàng email thành công trả về một giá trị thực sự, ví dụ:true, và một giao hàng thất bại trả về một giá trị sai, ví dụ:false. bool

Mail ((smtpServer, smtpUsername, smtpPassword, mailTo, tiêu đề, phần thân)

Sử dụng để xác địnhSMTPđịa chỉ dịch vụ của người gửi email. SMTPServer đúng chuỗi Được sử dụng để chỉ định địa chỉ email của người gửi email. smtpUsername đúng chuỗi CácSMTPmật khẩu cho hộp thư của người gửi email. smtpPassword đúng chuỗi Sử dụng để chỉ định địa chỉ email của người nhận email. mailTo đúng chuỗi Tên email. tiêu đề đúng chuỗi Thư điện tử. cơ thể đúng chuỗi

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

CácsmtpPasswordtham số thiết lập mật khẩu choSMTPdịch vụ, không phải mật khẩu hộp thư. Khi thiết lậpsmtpServertham số, nếu bạn cần thay đổi cổng, bạn có thể thêm số cổng trực tiếp trong tham sốsmtpServerVí dụ: QQ mailsmtp.qq.com:587, có sẵn để thử nghiệm. Nếu báo cáo lỗi:unencryped connection, bạn cần phải sửa đổismtpServercủaMailđịnh dạng tham số là:ssl://xxx.com:xxx, ví dụ:sslphương phápSMTPđối với thư từ QQ:ssl://smtp.qq.com:465hoặcsmtp://xxx.com:xxx. Nó không hoạt động trong hệ thống backtesting.

{@fun/Global/Mail_Go Mail_Go}

Mail_Go

Phiên bản không đồng bộ củaMail function.

CácMail_Gohàm trả về một đối tượng đồng thời ngay lập tức, và bạn có thể sử dụngwaitMột giao hàng thư thành công trả về một giá trị thực, ví dụ,true, và một giao hàng thất bại trả về một giá trị sai, ví dụ:false. đối tượng

Mail_Go ((smtpServer, smtpUsername, smtpPassword, mailTo, tiêu đề, phần thân)

Nó được sử dụng để xác địnhSMTPđịa chỉ dịch vụ của người gửi email. SMTPServer đúng chuỗi Nó được sử dụng để chỉ định địa chỉ email của người gửi email. smtpUsername đúng chuỗi CácSMTPmật khẩu cho hộp thư của người gửi email. smtpPassword đúng chuỗi Nó được sử dụng để chỉ định địa chỉ email của người nhận email. mailTo đúng chuỗi Tên email. tiêu đề đúng chuỗi Thư điện tử. cơ thể đúng chuỗi

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.

Nó không hoạt động trong hệ thống backtesting.

{@fun/Global/Mail Mail}

SetErrorFilter

Lưu trữ lỗi lọc.

SetErrorFilter ((filter)

Dòng biểu thức thông thường. bộ lọc đúng chuỗi

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

lọc các lỗi phổ biến.

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

lọc thông báo lỗi giao diện.

Các nhật ký lỗi phù hợp với biểu thức thường này sẽ không được tải lên hệ thống nhật ký. Bạn có thể gọi nó nhiều lần (không giới hạn số lần) để đặt nhiều điều kiện lọc. Các biểu thức thường được đặt nhiều lần sẽ được tích lũy và có hiệu lực cùng một lúc. Bạn có thể đặt một chuỗi trống để đặt lại biểu thức thường được sử dụng để lọc nhật ký lỗi:SetErrorFilter(""). Các nhật ký được lọc không còn được ghi vào tệp cơ sở dữ liệu tương ứng với ID giao dịch trực tiếp trong thư mục docker để ngăn chặn báo cáo lỗi thường xuyên từ việc phồng lên tệp cơ sở dữ liệu.

GetPid

Nhận ID giao dịch trực tiếp.

Trả lại ID quá trình giao dịch trực tiếp. chuỗi

GetPid ((()

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

GetLastError

Nhận được thông báo lỗi cuối cùng.

Thông báo lỗi cuối cùng. chuỗi

GetLastError()

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

Nó không hoạt động trong hệ thống backtesting.

GetCommand

Nhận lệnh tương tác chiến lược.

Định dạng của lệnh trả về làControlName:Data. ControlNamelà tên của kiểm soát, vàDatalà dữ liệu được nhập vào điều khiển. Nếu điều khiển tương tác không có hộp đầu vào, hộp thả xuống và các thành phần khác (ví dụ như một điều khiển nút không có hộp đầu vào) thì định dạng lệnh được trả về làControlName, chỉ trả về tên điều khiển. chuỗi

GetCommand()

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

Khám phá lệnh tương tác và sử dụngLogchức năng để xuất lệnh tương tác khi nó được phát hiện.

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

Ví dụ, điều khiển tương tác chiến lược thêm một điều khiển mà không có hộp đầu vào, điều khiển tương tác được đặt tên là:buy, thông tin mô tả kiểm soát là:buy, đó là một điều khiển nút. Tiếp tục bằng cách thêm một điều khiển với một hộp đầu vào. Điều khiển tương tác được đặt tên là:sellvà thông báo mô tả kiểm soát là:sell, đó là một điều khiển tương tác là sự kết hợp của một nút và một hộp đầu vào. Mã tương tác được thiết kế trong chiến lược để đáp ứng các điều khiển tương tác khác nhau:

Nó không hoạt động trong hệ thống backtesting.

GetMeta

Nhận giá trị của Meta được viết khi tạo mã đăng ký chiến lược.

Metadữ liệu. chuỗi

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

Ví dụ kịch bản ứng dụng: Sử dụngMetađể hạn chế số lượng tài sản được điều hành bởi chiến lược.

kịch bản ứng dụng: cần phải làm vốn giới hạn cho các nhà thuê chiến lược khác nhau.MetaGiá trị được đặt khi tạo mã đăng ký không thể vượt quá 190 ký tự vàGetMeta()Nếu không có siêu dữ liệu (Meta) được đặt khi tạo mã đăng ký chiến lược,GetMeta()hàm trả về null. Nó không hoạt động trong hệ thống backtesting.

Nhập

Đối với nguyên thủySockettiếp cận, hỗ trợtcp, udp, tls, unixHỗ trợ 4 giao thức truyền thông phổ biến:mqtt, nats, amqp, kafka. Hỗ trợ kết nối với cơ sở dữ liệu:sqlite3, mysql, postgres, clickhouse.

CácDial()hàm trả về null nếu nó hết thời gian. Một cuộc gọi bình thường trả về một đối tượng kết nối có ba phương thức:read, writeclose.readphương pháp được sử dụng để đọc dữ liệu,writephương pháp được sử dụng để gửi dữ liệu vàclosephương pháp được sử dụng để đóng kết nối. Cácreadphương pháp hỗ trợ các thông số sau:

  • Khi không có tham số nào được truyền, nó chặn cho đến khi một thông báo có sẵn và trả về, chẳng hạn nhưws.read().
  • Khi được truyền vào như một tham số, đơn vị là milliseconds, xác định thời gian chờ tin nhắn. Ví dụ:ws.read(2000)chỉ định thời gian nghỉ là hai giây (2000 millisecond).
  • Hai tham số sau đây chỉ có giá trị cho WebSocket: Chuyển parameter-1có nghĩa là chức năng trả về ngay lập tức, bất kể có hoặc không có tin nhắn, ví dụ:ws.read(-1). Chuyển parameter-2có nghĩa là hàm trả về ngay lập tức với hoặc không có tin nhắn, nhưng chỉ có tin nhắn mới nhất được trả về, và tin nhắn đệm được loại bỏ. Ví dụ:ws.read(-2).

read()Mô tả bộ đệm chức năng: Dữ liệu đến được đẩy bởi giao thức WebSocket có thể gây tích lũy dữ liệu nếu khoảng thời gian giữa chiến lượcread()Dữ liệu này được lưu trữ trong bộ đệm, có cấu trúc dữ liệu của một hàng đợi với tối đa 2000.

Kịch bản Không có tham số Parameter: -1 Parameter: -2 Parameter: 2000, trong millisecond
Dữ liệu đã ở trong bộ đệm Trả lại dữ liệu cũ nhất ngay lập tức Trả lại dữ liệu cũ nhất ngay lập tức Trả lại dữ liệu mới nhất ngay lập tức Trả lại dữ liệu cũ nhất ngay lập tức
Không có dữ liệu trong bộ đệm Trở lại khi bị chặn dữ liệu Trả về null ngay lập tức Trả về null ngay lập tức Chờ 2000 ms, trả về null nếu không có dữ liệu, trả về null nếu có dữ liệu
Kết nối WebSocket bị ngắt kết nối hoặc kết nối lại bởi cơ sở Read () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () ()

đối tượng

Nhập số (địa chỉ) Nhập (địa chỉ, thời gian)

Địa chỉ yêu cầu. địa chỉ đúng chuỗi giây thời gian nghỉ, thời gian nghỉ sai số

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

Ví dụ về một cuộc gọi hàm 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();
}

Để truy cập giao diện WebSocket ticker của 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");
}

Truy cập vào giao diện ticker WebSocket OKX:

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

Truy cập vào giao diện ticker WebSocket của Huobi:

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

Để truy cập giao diện xác thực 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

Đối tượng kết nối được trả về bởi hàm Dial khi kết nối với cơ sở dữ liệu có hai hàm phương thức độc đáo cho nó:

  • exec(sqlString): Được sử dụng để thực thi lệnh SQL theo cách tương tự nhưDBExec() function.
  • fd(): Cácfd()hàm trả về một xử lý (ví dụ, biến xử lý là xử lý) để được sử dụng bởi các luồng khác để kết nối lại (ngay cả khi đối tượng được tạo bởi Dial đã được đóng bởi việc thực hiệnclose()chức năng để đóng kết nối) bằng cách đi tay cầm vàoDial()chức năng, ví dụ,Dial(handle)Kết nối tái sử dụng. Sau đây là một ví dụ về chức năng Dial kết nối với mộtsqlite3 database.

Thông tin chi tiếtaddresstham số, tách biệt với|ký hiệu sau địa chỉ thông thường:wss://ws.okx.com:8443/ws/v5/publicNếu có.|ký tự trong chuỗi tham số, sau đó||Phần sau đó là một số cài đặt tham số chức năng, và mỗi tham số được kết nối với&Ví dụ, cácss5Các thông số thay thế và nén có thể được đặt cùng nhau như sau:Dial("wss://ws.okx.com:8443/ws/v5/public|proxy=socks5://xxx:9999&compress=gzip_raw&mode=recv")

Các chức năng được hỗ trợ bởi tham số địa chỉ của chức năng Dial Mô tả tham số
Các tham số liên quan đến nén dữ liệu giao thức WebSocket: compress=parameter value compress là phương pháp nén, các tùy chọn tham số nén là: gzip_raw, gzip, vv Nếu phương pháp gzip không phải là gzip tiêu chuẩn, bạn có thể sử dụng phương pháp mở rộng: gzip_raw
Các tham số liên quan đến nén dữ liệu giao thức WebSocket: mode=parameter value chế độ là chế độ nén, tham số chế độ có thể là kép, gửi, recv. kép là nén hai chiều, gửi dữ liệu nén, nhận dữ liệu nén. gửi là gửi dữ liệu nén. recv là nhận dữ liệu nén, giải nén cục bộ.
Giao thức WebSocket thiết lập các thông số liên quan đến tự động kết nối: reconnect=parameter value reconnect là đặt reconnect, reconnect=true là bật reconnect. mặc định là không reconnect khi tham số này không được đặt.
Giao thức WebSocket thiết lập các thông số liên quan đến tự động kết nối: interval=parameter value interval là khoảng thời gian thử lại, trong milliseconds, interval=10000 là khoảng thời gian thử lại 10 giây, mặc định là 1 giây khi nó không được thiết lập, tức là interval=1000.
Giao thức WebSocket thiết lập các thông số liên quan đến tự động kết nối: payload=parameter value payload là thông báo đăng ký cần được gửi khi WebSocket được kết nối lại, ví dụ: payload=okokok.
Các tham số liên quan đến vớ5 proxy: proxy=giá trị tham số proxy là cài đặt proxy ss5, định dạng giá trị tham số: socks5://name:pwd@192.168.0.1:1080, tên là tên người dùng máy chủ ss5, pwd là mật khẩu đăng nhập máy chủ ss5, 1080 là cổng dịch vụ ss5.

CácDial()chức năng chỉ được hỗ trợ cho giao dịch trực tiếp. Khi kết nối với cơ sở dữ liệu bằng chức năng Dial, chuỗi kết nối được viết với tham chiếu đến dự án trình điều khiển ngôn ngữ go cho mỗi cơ sở dữ liệu.

Cơ sở dữ liệu được hỗ trợ Các dự án thúc đẩy Dây kết nối Nhận xét
sqlite3 github.com/mattn/go-sqlite3 sqlite3://file:test.db?cache=shared&mode=memory Cácsqlite3://tiền tố chỉ ra rằng một cơ sở dữ liệu sqlite3 đang được sử dụng, ví dụ gọi:Dial("sqlite3://test1.db")
MySQL github.com/go-sql-driver/mysql mysql://username:yourpassword@tcp(localhost:3306) / cơ sở dữ liệu của bạn?charset=utf8mb4
sau github.com/lib/pq postgres://user=postgres dbname=yourdatabase sslmode=disable password=yourpassword host=localhost port=5432
clickhouse github.com/ClickHouse/clickhouse-go clickhouse://tcp://host:9000?username=username&password=yourpassword&database=youdatabase

Xin lưu ý rằng khipayloadnội dung được đặt trongaddresstham số chứa ký tự=hoặc các ký tự đặc biệt khác, nó có thể ảnh hưởng đến việc phân tích củaaddresstham số củaDialchức năng, chẳng hạn như ví dụ sau.

ví dụ gọi backPack Exchange websocket giao diện riêng:

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

Các cuộc gọi sau trong mã hoạt động tốt:

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

Nếu bạn viết nó trực tiếp vàopayload, nó sẽ không hoạt động đúng cách, ví dụ:

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

Hiện tại, chỉ có JavaScript hỗ trợ việc sử dụngmqtt, nats, amqp, vàkafkaMã chiến lược ngôn ngữ JavaScript được sử dụng như một ví dụ để hiển thị việc sử dụng bốn giao thức:mqtt, nats, amqp, và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")
    }
}

Tài liệu chi tiết:Khám phá FMZ: Thực hành giao thức giao tiếp giữa các chiến lược giao dịch trực tiếp

HttpQuery

Gửi yêu cầu HTTP.

Trả về dữ liệu phản hồi của yêu cầu.JSONstring, nó có thể được phân tích bởi cácJSON.parse()chức năng trongJavaScriptchiến lược ngôn ngữ,json::parse()chức năng trongC++Nếu debug được đặt thành true trong cấu trúc tùy chọn, giá trị trả về là một đối tượng (JSON); nếu debug được đặt thành false, giá trị trả về là một chuỗi. chuỗi, đối tượng

HttpQuery ((url) HttpQuery ((url, tùy chọn)

URL yêu cầu HTTP. url đúng chuỗi Ví dụ, cài đặt liên quan đến yêu cầu HTTP có thể được cấu trúc như sau:

{
    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
}
  • profile: Được sử dụng để mô phỏng trình duyệttlsdấu vân tay. Các cài đặt được hỗ trợ bao gồm các tùy chọn sau: chrome_:"chrome_103", "chrome_104", "chrome_105", "chrome_106", "chrome_107", "chrome_108", "chrome_109", "chrome_110", "chrome_111", "chrome_112", "chrome_117" Safari_:"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_:"opera_89", "opera_90", "opera_91" Zalando:"zalando_android_mobile", "zalando_ios_mobile" Nike_:"nike_ios_mobile", "nike_android_mobile" nhà chọc mây:"cloudscraper" mms_:"mms_ios" mesh_:"mesh_ios", "mesh_ios_1", "mesh_ios_2", "mesh_android", "mesh_android_1", "mesh_android_2" xác nhận:"confirmed_ios", "confirmed_android" Được rồi."okhttp4_android_7", "okhttp4_android_8", "okhttp4_android_9", "okhttp4_android_10", "okhttp4_android_11", "okhttp4_android_12", "okhttp4_android_13",
  • debug: Khi nó được thiết lập thànhtrue, cácHttpQueryfunction call trả về toàn bộ tin nhắn trả lời.false, chỉ có dữ liệu trongBodycủa tin nhắn trả lời được trả về.
  • Thời gian dừng: cài đặt thời gian dừng, đặt 1000 có nghĩa là thời gian dừng 1 giây.
  • Charset: Nó hỗ trợ chuyển mã dữ liệu phản hồi được yêu cầu, chẳng hạn như GB18030. Tất cả các trường trong cấu trúc này là tùy chọn, ví dụ:profiletrường có thể bị bỏ qua.

các lựa chọn sai đối tượng

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

Một ví dụ về việc truy cập giao diện API ticker công khai 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/");
}

Chức năng HttpQuery sử dụng cài đặt proxy.

CácHttpQuery()chỉ hỗ trợ chức năngJavaScript, C++ngôn ngữ,Pythonngôn ngữ có thểurllibthư viện để gửi các yêu cầu HTTP trực tiếp.HttpQuery()chủ yếu được sử dụng để truy cập các giao diện của sàn giao dịch không yêu cầu chữ ký, chẳng hạn như giao diện công khai như thông tin ticker.HttpQuery()có thể được sử dụng trong hệ thống backtesting để gửi yêu cầu (chỉGETCác yêu cầu được hỗ trợ) để thu thập dữ liệu.URLs, vàHttpQuery()khi cùng mộtURLđược truy cập lần thứ hai,HttpQuery()chức năng trả về dữ liệu được lưu trong bộ nhớ cache và không có yêu cầu mạng thực tế nào xảy ra.

{@fun/Global/HttpQuery_Go HttpQuery_Go}

HttpQuery_Go

Gửi một yêu cầu HTTP, một phiên bản không đồng bộ củaHttpQuery function.

CácHttpQuery_Go()hàm ngay lập tức trả về một đối tượng đồng thời có thể được sử dụng để có được kết quả của một yêu cầu HTTP sử dụngwaitphương pháp củaJSON.parse()chức năng có thể được sử dụng để phân tích cácJSON.parse()chức năng trongJavaScriptchiến lược ngôn ngữ
đối tượng

HttpQuery_Go ((url) HttpQuery_Go ((url, tùy chọn)

URL yêu cầu HTTP. url đúng chuỗi Ví dụ, cài đặt liên quan đến yêu cầu HTTP có thể được cấu trúc như sau:

{
    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
}
  • profile: Được sử dụng để mô phỏng trình duyệttls fingerprints.
  • debug: Khi nó được thiết lập thànhtrue, cái nàyHttpQuery_Gofunction call trả về toàn bộ tin nhắn trả lời.false, chỉ có dữ liệu trongBodycủa tin nhắn trả lời được trả về.
  • Thời gian dừng: cài đặt thời gian dừng, đặt 1000 có nghĩa là thời gian dừng 1 giây. Tất cả các trường trong cấu trúc này là tùy chọn, ví dụ:profiletrường có thể bị bỏ qua.

các lựa chọn sai đối tượng

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

Truy cập không đồng bộ vào giao diện công khai của sàn giao dịch cho dữ liệu ticker tổng hợp.

CácHttpQuery_Go()chỉ hỗ trợ chức năngJavaScript, cácPythonngôn ngữ có thể được sử dụng vớiurllibthư viện để gửi các yêu cầu HTTP trực tiếp.HttpQuery_Go()chủ yếu được sử dụng để truy cập các giao diện không yêu cầu chữ ký trên sàn giao dịch, chẳng hạn như giao diện công khai như thông tin ticker.HttpQuery_Gokhông được hỗ trợ trong hệ thống backtesting.

{@fun/Global/HttpQuery HttpQuery}

Mã hóa

Chức năng này mã hóa dữ liệu theo các thông số được truyền vào.

CácEncodechức năng trả về dữ liệu sau khi mã hóa và mã hóa. chuỗi

Mã hóa ((algo, inputFormat, outputFormat, data) Mã hóa ((algo, inputFormat, outputFormat, data, keyFormat, key)

Các thông sốalgolà thuật toán được sử dụng trong tính toán mã hóa.raw(không sử dụng thuật toán), "dấu hiệu", 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, emdrip160, blake2b.256, 2b.512, blake2s.128, blake2s.256 Các thông số.algocũng hỗ trợ: text.encoder.utf8, text.decoder.utf8, text.encoder.gbk, text.decoder.gbk, mã hóa và giải mã chuỗi.algocũng hỗ trợ: thuật toán ed25519. Hỗ trợ sử dụng các thuật toán băm khác nhau, ví dụ như tham sốalgocó thể được viết như ed25519.md5, ed25519.sha512, v.v. Nó hỗ trợed25519.seedtính toán. algo đúng chuỗi Sử dụng để xác định định dạng dữ liệu củadatacác tham số.inputFormattham số có thể được thiết lập như một trong những điều sau:raw, hex, base64, string. raw nghĩa là dữ liệu là dữ liệu thô, hex nghĩa là dữ liệu làhexđược mã hóa, base64 có nghĩa là dữ liệu làbase64được mã hóa, và string có nghĩa là dữ liệu là một chuỗi. inputFormat đúng chuỗi Sử dụng để xác định định dạng dữ liệu của đầu ra.outputFormattham số có thể được thiết lập như một trong những điều sau:raw, hex, base64, string. raw nghĩa là dữ liệu là dữ liệu thô, hex nghĩa là dữ liệu làhexđược mã hóa, base64 có nghĩa là dữ liệu làbase64được mã hóa, và string có nghĩa là dữ liệu là một chuỗi. outputFormat đúng chuỗi Các thông sốdatalà dữ liệu được xử lý. dữ liệu đúng chuỗi Sử dụng để xác định định dạng dữ liệu củakeycác tham số.keytham số có thể được thiết lập như một trong những điều sau:raw, hex, base64, string. raw nghĩa là dữ liệu là dữ liệu thô, hex nghĩa là dữ liệu làhexđược mã hóa, base64 có nghĩa là dữ liệu làbase64được mã hóa, và string có nghĩa là dữ liệu là một chuỗi. keyFormat sai chuỗi Các thông sốkeylà khóa bí mật được sử dụng choHMACmã hóa.keyđược yêu cầu khi tham sốalgođược thiết lập thànhsignhoặcsignTx.keytham số không được sử dụng choHMACmã hóa khialgotham số được đặt thành raw (vì thuật toán phải được chỉ định cho mã hóa HMAC). chìa khóa sai chuỗi

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
}

Ví dụ về gọi hàm mã hóa.

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

Các thông sốalgocũng hỗ trợ: text.encoder.utf8, text.decoder.utf8, text.encoder.gbk, text.decoder.gbk để mã hóa và giải mã chuỗi.

CácEncode()chức năng chỉ được hỗ trợ cho giao dịch trực tiếp.keykeyFormatcác thông số không được vượt qua, sau đókeymã hóa không được sử dụng.

UnixNano

Hãy lấy dấu thời gian nanosecond của khoảnh khắc hiện tại.

CácUnixNano()hàm trả về dấu thời gian nanosecond. số

UnixNano ((()

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

Nếu bạn cần lấy dấu thời gian millisecond, bạn có thể sử dụng mã sau:

{@fun/Global/Unix Unix}

Unix

Nhận thời gian của khoảnh khắc hiện tại ở tầng hai.

Trả lại dấu thời gian cấp hai. số

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

Nhận thông tin hệ thống của thiết bị nơi docker nằm.

Thông tin hệ thống. chuỗi

GetOS()

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

Ví dụ, một cuộc gọi đếnGetOS()chức năng cho một docker chạy trênMac OShệ điều hành có thể trả về:darwin/amd64Bởi vì máy tính Apple có nhiều kiến trúc phần cứng.darwinlà tên củaMac OS system.

MD5

Tính toán MD5 hash của tham sốdata.

Giá trị hash của MD5. chuỗi

MD5 (dữ liệu)

Dữ liệu đòi hỏi tính toán MD5. dữ liệu đúng chuỗi

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

Gọi choMD5("hello world")hàm, giá trị trả về là:5eb63bbbe01eeed093cb22bb8f5acdc3.

{@fun/Global/Encode Encode}

DBExec

Các chức năng giao diện cơ sở dữ liệu.

Một đối tượng chứa kết quả của việc thực hiện mộtsqltuyên bố, ví dụ:


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

đối tượng

DBExec ((sql)

sqlchuỗi lệnh. sql đúng chuỗi

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

Hỗ trợ cơ sở dữ liệu trong bộ nhớDBExecCác thông số chức năng, nếusqltuyên bố bắt đầu với:Nó phù hợp với các hoạt động cơ sở dữ liệu không yêu cầu lưu liên tục, ví dụ:

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

Tạo một cái bàn.

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

Thêm, xóa, kiểm tra và thay đổi các bản ghi trong bảng.

Chức năngDBExec()có thể vận hành cơ sở dữ liệu giao dịch trực tiếp (SQLite cơ sở dữ liệu) bằng cách đi qua các tham số.SQLiteHệ thống lưu trữ bảng trong cơ sở dữ liệu giao dịch trực tiếp:kvdb, cfg, log, profit, chart, không được sử dụng trên những bàn này.Giao dịchkhông được hỗ trợ và không nên thực hiện các hoạt động như vậy, có thể gây ra xung đột trong hệ thống.DBExec()chức năng chỉ được hỗ trợ cho giao dịch trực tiếp.

{@fun/Global/_G _G}

UUID

Tạo một UUID.

32 bit UUID. chuỗi

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

CácUUID()chức năng chỉ hỗ trợ giao dịch trực tiếp.

EventLoop

Nghe cho các sự kiện, nó trở lại khi có bất kỳWebSocketdữ liệu có thể đọc hoặc các nhiệm vụ đồng thời, chẳng hạn như:exchange.Go(), HttpQuery_Go(), v.v. được hoàn thành.

Nếu đối tượng được trả về không phải là giá trị null,Eventchứa trong nội dung trả về là loại kích hoạt sự kiện. Ví dụ: cấu trúc giá trị trả về sau:

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

đối tượng

EventLoop ((() EventLoop ((timeout)

Các thông sốtimeoutlà thiết lập timeout, trong milliseconds.timeoutchờ cho một sự kiện xảy ra trước khi trả về nếu nó được thiết lập là 0. Nếu nó lớn hơn 0, nó đặt sự kiện để chờ đợi thời gian hết, và trả về sự kiện gần đây nhất ngay lập tức nếu nó nhỏ hơn 0. thời gian nghỉ sai số

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

Cuộc gọi đầu tiên đếnEventLoop()chức năng trong mã khởi tạo cơ chế cho sự kiện nghe, và nếu đầu tiênEventLoop()gọi bắt đầu sau khi callback sự kiện, nó sẽ bỏ lỡ các sự kiện trước đó. Hệ thống cơ bản gói một cấu trúc hàng đợi lưu trữ tối đa 500 callback sự kiện.EventLoop()chức năng không được gọi trong thời gian để lấy chúng ra trong quá trình thực thi chương trình, sau đó callback sự kiện bên ngoài bộ nhớ cache 500 sẽ bị mất.EventLoop()chức năng không ảnh hưởng đến hàng đợi bộ nhớ cache của hệ thống WebSocket cơ bản hoặc bộ nhớ cache của các chức năng đồng thời nhưexchange.Go()Đối với các bộ nhớ cache này, vẫn cần phải sử dụng các phương pháp tương ứng để lấy dữ liệu.EventLoop()chức năng cho dữ liệu đã được truy xuất trước khiEventLoop()Mục đích chính củaEventLoop()Các hoạt động của hệ thống mạng được xác định bởi các sự kiện.EventLoop()function trả về một sự kiện, chỉ đi qua tất cả các nguồn dữ liệu. ví dụ, kết nối WebSocket, đối tượng được tạo ra bởiexchange.Go()cố gắng lấy dữ liệu.EventLoop()chức năng chỉ hỗ trợ giao dịch trực tiếp. Nghe cho các sự kiện trong chủ đề chủ đề khi được gọi từ chức năng chínhmain()Trong các chiến lược được viết trongJavaScriptngôn ngữ,threading.Thread()function tạo ra một thread, mà cũng có thể được gọi trong hàm thực thi threads, để nghe các sự kiện trong thread hiện tại.

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

__Hãy phục vụ

Các__Servechức năng được sử dụng để tạo dịch vụ HTTP, dịch vụ TCP và dịch vụ Websocket (dựa trên giao thức HTTP).

Trả về một chuỗi ghi lại địa chỉ IP và cổng của dịch vụ được tạo. Ví dụ:127.0.0.1:8088, [::]:8089.

chuỗi

__Serve ((serveURI, xử lý) __Serve ((serveURI, xử lý,...args)

CácserveURItham số được sử dụng để cấu hình giao thức, địa chỉ IP, cổng và các thiết lập khác của việc ràng buộc dịch vụ, chẳng hạn nhưhttp://0.0.0.0:8088?gzip=true, nghĩa là,http://:8088?gzip=true.

  • Giao thức TCPserveURIthiết lập tham số, chẳng hạn nhưtcp://127.0.0.1:6666?tls=true; bạn có thể thêm chứng chỉ và khóa riêng, chẳng hạn nhưtls=true&cert_pem=xxxx&cert_key_pem=xxxx.
  • Giao thức HTTPserveURIcài đặt tham số, chẳng hạn nhưhttp://127.0.0.1:6666?gzip=true; bạn có thể thiết lập cài đặt nén:gzip=true. CácserveURItham số được sử dụng cho HTTP, chẳng hạn nhưhttps://127.0.0.1:6666?tls=true&gzip=true; bạn có thể thêmcert_pemcert_key_pemcác tham số để tải giấy chứng nhận.

serveURI đúng chuỗi Cáchandlertham số được sử dụng để truyền trong chức năng xử lý định tuyến (protocol HTTP), chức năng xử lý tin nhắn (protocol TCP), và chức năng xử lý luồng (Websocket). Chức năng gọi lại được chuyển vào bởi tham sốhandlercó thể xác định nhiều tham số, tham số đầu tiên là đối tượng ctx ( đối tượng ngữ cảnh).

người xử lý đúng chức năng Các tham số thực tế của hàm gọi lại được truyền như các tham sốhandlerCó thể có nhiều thông sốargVí dụ:

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

Các thông số1, 2, 3qua khi gọi cho__Serve()chức năng tương ứng với các thông sốa, b, cđược thông qua trong chức năng gọi lại.

arg sai chuỗi, số, bool, đối tượng, mảng, hàm, giá trị null và các loại khác được hỗ trợ bởi hệ thống

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
  • Chức năng này chỉ hỗ trợ các chiến lược ngôn ngữ JavaScript.
  • Các chủ đề dịch vụ được cô lập khỏi phạm vi toàn cầu, vì vậy nó không hỗ trợ đóng hoặc tham chiếu đến các biến bên ngoài, các hàm tùy chỉnh, v.v.; tuy nhiên, nó có thể gọi tất cả các hàm API nền tảng.
  • CácWebsocketDịch vụ được thực hiện dựa trên giao thức HTTP. Bạn có thể thiết lập một nhánh định tuyến trong đường dẫn và thiết kế mã thực hiện choWebsocketBạn có thể tham khảo mẫu mã trong phần này.

Chức năng gọi lại được truyền vào bởi tham sốhandlernhận được mộtctxcác tham số.ctxtham số là một đối tượng ngữ cảnh được sử dụng để lấy và ghi dữ liệu, với các phương pháp sau:

  • ctx.proto ((() Được áp dụng cho giao thức Http/TCP, trả về tên giao thức khi được gọi. Ví dụ:HTTP/1.1, tcp.
  • ctx.host() Được áp dụng cho giao thức HTTP, nó trả về thông tin máy chủ khi gọi địa chỉ IP và cổng.
  • ctx.path ((() Được áp dụng cho giao thức HTTP, trả về đường dẫn yêu cầu khi được gọi.
  • ctx.query ((key)) Được áp dụng cho giao thức HTTP, trả về giá trị tương ứng với khóa trong truy vấn trong yêu cầu khi được gọi. Ví dụ, yêu cầu được gửi là:http://127.0.0.1:8088?num=123, và chức năng xử lý gọi lại được truyền vào bởi các thông sốhandlertrả lại"123"khi nàoctx.query("num")được gọi là.
  • ctx.rawQuery() Được áp dụng cho giao thức Http, khi được gọi, trả về truy vấn ban đầu trong yêu cầu (quy vấn của yêu cầu Http).
  • ctx.headers ((() Áp dụng cho giao thức HTTP, và trả về thông tin tiêu đề yêu cầu trong yêu cầu khi được gọi.
  • ctx.header ((key)) Áp dụng giao thức HTTP, nó trả về giá trị của một khóa trong tiêu đề yêu cầu được chỉ định khi được gọi.User-Agenttrong tiêu đề của yêu cầu hiện tại:ctx.header("User-Agent").
  • ctx.method (() Áp dụng cho giao thức HTTP, trả về phương thức yêu cầu khi được gọi, chẳng hạn nhưGET, POST, vv
  • ctx.body ((() Áp dụng để yêu cầu POST của giao thức HTTP, và trả về cơ thể của yêu cầu khi được gọi.
  • ctx.setHeader ((key, value) Áp dụng giao thức HTTP để thiết lập thông tin tiêu đề yêu cầu của tin nhắn phản hồi.
  • ctx.setStatus (định mã) Được áp dụng cho giao thức Http, đặt mã trạng thái tin nhắn Http. Thông thường, mã trạng thái Http được đặt ở cuối nhánh định tuyến. Giá trị mặc định là 200.
  • ctx.remoteAddr ((() Được áp dụng cho giao thức Http / TCP, trả về địa chỉ khách hàng từ xa và cổng trong yêu cầu khi được gọi.
  • ctx.localAddr() Được áp dụng cho giao thức Http / TCP, trả về địa chỉ địa phương và cổng của dịch vụ khi được gọi.
  • ctx.upgrade ((websocket) Áp dụng để thực hiện giao thức Websocket dựa trên giao thức HTTP, chuyển đổictxđối tượng ngữ cảnh đến giao thức Websocket; trả về giá trị Boolean (true) nếu chuyển đổi thành công, và giá trị Boolean (false) nếu nó thất bại.
  • ctx.read ((timeout_ms) Áp dụng để thực hiện giao thức Websocket / giao thức TCP dựa trên giao thức HTTP, đọc dữ liệu của kết nối Websocket và kết nối TCP.readPhương pháp này không được hỗ trợ trong giao thức HTTP thông thường. Bạn có thể chỉ định tham số timeouttimeout_mstrong vài mili giây.
  • ctx.write ((s) Được áp dụng cho giao thức HTTP/TCP, được sử dụng để viết dữ liệu chuỗi.JSON.stringify()để mã hóa đối tượng JSON vào một chuỗi và sau đó viết nó.WebSocketgiao thức, bạn có thể sử dụng phương pháp này để truyền chuỗi mã hóa cho khách hàng.

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

_G

Tiếp tục lưu dữ liệu, chức năng thực hiện một chức năng từ điển toàn cầu có thể được lưu.

Dữ liệu giá trị khóa được lưu liên tục trongk-vcác cặp giá trị khóa. chuỗi, số, bool, đối tượng, mảng, giá trị không

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

Các thông sốklà tên của khóa trong cặp khóa-giá trị được lưu, và không nhạy cảm với chữ cái lớn. k sai chuỗi, giá trị không Các thông sốvlà giá trị khóa trong cặp giá trị khóa được lưu, có thể là bất kỳ dữ liệu nào có thể đượcJSONđược phân phối. v sai chuỗi, số, bool, đối tượng, mảng, giá trị không

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

Một cơ sở dữ liệu riêng biệt cho mỗi giao dịch trực tiếp, dữ liệu được lưu trữ bởi_G()chức năng sẽ luôn luôn ở đó nếu chiến lược được khởi động lại hoặc docker ngừng chạy. Nếu backtesting được hoàn thành, dữ liệu được lưu trong hệ thống backtesting bởi_G()Khi sử dụng các_G()chức năng để duy trì dữ liệu được lưu, nó nên được sử dụng hợp lý theo bộ nhớ và không gian đĩa cứng của thiết bị phần cứng, và không nên bị lạm dụng. Khi gọi cho_G()chức năng trong một giao dịch trực tiếp và không có thông số được vượt qua,_G()hàm trả vềIdcủa giao dịch trực tiếp hiện tại_G()chức năng, tham sốvđược thông qua như là không để chỉ ra việc xóak-vKhi gọi các_G()chức năng, chỉ các thông sốkđược truyền trong chuỗi, và_G()hàm trả về giá trị khóa tương ứng với tham số được lưukKhi gọi điện cho_G()chức năng, chỉ các thông sốkđược truyền trong một giá trị null, cho thấy rằng tất cả các bản ghi củak-vkhi các cặp key-value được xóa.k-vCác cặp key-value đã được lưu liên tục,_G()chức năng được gọi một lần nữa, đi qua trong tên của khóa đã được lưu liên tục như là tham sốk. Đưa vào giá trị khóa mới như một tham sốvsẽ cập nhật rằngk-vcặp giá trị khóa.

{@fun/Global/DBExec DBExec}

_D

Chuyển đổi dấu thời gian millisecond hoặcDateđối tượng với chuỗi thời gian.

Dây thời gian. chuỗi

_D() _D (đánh dấu thời gian) _D ((đũa thời gian, fmt)

Dấu thời gian millisecondDateđối tượng. dấu thời gian sai Số, mục đích Định dạng chuỗi,JavaScriptĐịnh dạng ngôn ngữ mặc định:yyyy-MM-dd hh:mm:ss; PythonĐịnh dạng ngôn ngữ mặc định:%Y-%m-%d %H:%M:%S; C++Định dạng ngôn ngữ mặc định:%Y-%m-%d %H:%M:%S. fmt sai chuỗi

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

Nhận và in chuỗi thời gian hiện tại:

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

Mẫu thời gian là 1574993606000, sử dụng chuyển đổi mã:

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
}

Định dạng bằng tham sốfmtlà khác nhau choJavaScript, Python, vàC++ngôn ngữ, như được thể hiện trong các ví dụ sau:

Trả về chuỗi thời gian hiện tại mà không cần thông qua bất kỳ thông số._D()chức năng trongPythonchiến lược, bạn cần phải nhận thức được rằng các tham số được truyền là dấu thời gian cấp hai (các dấu thời gian cấp millisecond trong các chiến lược JavaScript và C ++, nơi 1 giây bằng 1000 milliseconds)._D()chức năng để phân tích một chuỗi thời gian với một dấu thời gian có thể đọc trong giao dịch trực tiếp, bạn cần phải chú ý đến múi giờ và thiết lập thời gian của hệ điều hành nơi chương trình docker nằm._D()hàm phân tích dấu thời gian thành một chuỗi thời gian có thể đọc tùy thuộc vào thời gian của hệ thống dockers.

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

_N

Định dạng một số dấu phẩy động.

Số dấu phẩy động được định dạng theo cài đặt chính xác. số

_N() _N(num) _N ((num, chính xác)

Số dấu phẩy động cần phải được định dạng. số đúng số Cài đặt độ chính xác cho định dạng, tham sốprecisionlà một số nguyên, và các tham sốprecisionmặc định là 4. độ chính xác sai số

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

Ví dụ,_N(3.1415, 2)sẽ xóa giá trị sau3.1415hai vị trí thập phân và hàm trả về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ếu bạn cần thay đổi tất cả các chữ số N bên trái của dấu thập phân thành 0, bạn có thể viết nó như thế này:

Các thông sốprecisioncó thể là một số nguyên dương, số nguyên âm.

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

_C

Thử lại chức năng cho dung nạp lỗi giao diện.

Giá trị trả về của hàm callback khi nó được thực hiện. Tất cả các loại được hỗ trợ bởi hệ thống ngoại trừgiá trị sai logicgiá trị null.

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

Các thông sốpfnlà một tham chiếu chức năng, đó là mộtChức năng gọi lại. pfn đúng chức năng Các thông số đếnChức năng gọi lại, có thể có nhiều hơn một tham sốargLoại và số lượng các thông sốargphụ thuộc vào các thông số củaChức năng gọi lại. arg sai chuỗi, số, bool, đối tượng, mảng, hàm, tất cả các loại được hỗ trợ bởi hệ thống, chẳng hạn như giá trị null

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

Đối với các hàm dung nạp lỗi không có tham số:

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

Đối với các hàm có tham số chịu lỗi:

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

Nó cũng có thể được sử dụng cho khả năng chịu lỗi của các chức năng tùy chỉnh:

Các_C()function sẽ tiếp tục gọi hàm được chỉ định cho đến khi nó trả về thành công (chức năng được tham chiếu bởi tham sốpfntrả lạikhônghoặcsaikhi được gọi sẽ thử gọi lạipfnVí dụ:_C(exchange.GetTicker). Khoảng thời gian thử lại mặc định là 3 giây, bạn có thể gọi_CDelay()chức năng để thiết lập khoảng thời gian thử lại._CDelay(1000)có nghĩa là để thay đổi khoảng thời gian thử lại của_C()chức năng 1 giây. Sự dung nạp lỗi có thể được thực hiện cho, nhưng không giới hạn ở, các chức năng sau:

  • exchange.GetTicker()
  • exchange.GetDepth()
  • exchange.GetTrades()
  • exchange.GetRecords()
  • exchange.GetAccount()
  • exchange.GetOrders()
  • exchange.GetOrder()
  • exchange.GetPositions()Tất cả có thể được gọi bởi các_C()chức năng cho dung nạp lỗi._C()chức năng không giới hạn trong chức năng được liệt kê ở trên dung nạp lỗi, tham sốpfnlà một tham chiếu hàm hơn là một cuộc gọi hàm. Lưu ý rằng nó_C(exchange.GetTicker), không_C(exchange.GetTicker()).

_ Chữ thập

Trả về số lần giao nhau của mảngarr1và mảngarr2.

Số lần chéo của mảngarr1và mảngarr2. số

_Cross ((arr1, arr2)

Các phần tử là mảng kiểunumber. arr1 đúng mảng Các phần tử là mảng kiểunumber. arr2 đúng mảng

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

Một bộ dữ liệu có thể được mô phỏng để kiểm tra hàm _Cross ((Arr1, Arr2):

Nếu giá trị trả về của_Cross()hàm là một con số dương tính, nó chỉ ra thời gian thâm nhập tăng, nếu nó là một con số âm tính, nó chỉ ra thời gian thâm nhập giảm, 0 có nghĩa là tương tự như giá hiện tại.Phân tích và hướng dẫn sử dụng về chức năng tích hợp.

JSONParse

Chức năngJSONParse()được sử dụng để phân tíchJSON strings.

JSONđối tượng. đối tượng

JSONParse (s)

JSONdây. s đúng chuỗi

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

Các chuỗi JSON với các giá trị lớn có thể được phân tích chính xác, và nó sẽ phân tích các giá trị lớn như các loại chuỗi.JSONParse()chức năng không được hỗ trợ trong hệ thống backtest.

Ký hiệu

Ký hiệu

Lịch xuất.

Log ((...msgs)

Các thông sốmsglà nội dung của đầu ra, và tham sốmsgcó thể được vượt qua nhiều hơn một. msg sai chuỗi, số, bool, đối tượng, mảng, bất kỳ loại nào được hỗ trợ bởi hệ thống như null.

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

Nhiềumsgcác thông số có thể được truyền:

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@");
}

Nó hỗ trợ thiết lập màu sắc của thông báo đầu ra, nếu chúng ta sử dụng thiết lập màu sắc và đẩy cùng một lúc, chúng ta cần thiết lập màu sắc đầu tiên và sử dụng@Nhân vật để đặt đẩy cuối cùng.

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

CácLog()chức năng hỗ trợ inbase64hình ảnh được mã hóa, bắt đầu với`và kết thúc với`Ví dụ:

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

CácLog()hỗ trợ in trực tiếpPythonỪ.matplotlib.pyplotĐối tượng. Miễn là đối tượng chứasavefigphương pháp, nó có thể được in trực tiếp bằng cách sử dụngLogchức năng, ví dụ:

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

CácLog()chức năng hỗ trợ chuyển đổi ngôn ngữ.Log()chức năng đầu ra văn bản sẽ chuyển sang ngôn ngữ tương ứng tự động dựa trên cài đặt ngôn ngữ trên trang nền tảng, ví dụ:

CácLog()chức năng đầu ra một thông báo nhật ký trong khu vực nhật ký của giao dịch trực tiếp hoặc hệ thống backtesting, và nhật ký được lưu trong cơ sở dữ liệu giao dịch trực tiếp khi giao dịch trực tiếp đang chạy.Log()hàm xuất ra một thông báo nhật ký kết thúc với@Đẩy đến địa chỉ email, địa chỉ WebHook, vv cấu hình trongBấm cài đặtcủa tài khoản hiện tại FMZ Quant Trading Platform.Công cụ gỡ lỗi, hệ thống backtesting. Có một giới hạn tần số để đẩy tin nhắn. Các quy tắc hạn chế cụ thể là như sau: trong vòng 20 giây của một giao dịch trực tiếp, chỉ có tin nhắn đẩy cuối cùng sẽ được giữ lại và đẩy, và các tin nhắn khác sẽ được lọc và không được đẩy (sản xuất nhật ký đẩy bởi chức năng Log sẽ được in và hiển thị bình thường trong khu vực nhật ký). Đối vớiWebHookđẩy, bạn có thể sử dụng chương trình dịch vụ được viết bởiGolang:

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

ĐặtWebHooktrongBấm cài đặt: http://XXX.XX.XXX.XX:9090/data?data=Hello_FMZ. Sau khi chạy các văn bảnGolangchương trình dịch vụ, chúng tôi bắt đầu chạy chiến lược giao dịch trực tiếp, sau đây là chiến lược được viết trongJavaScriptngôn ngữ, chiến lược chạy bằng cách thực hiệnLog()chức năng và đẩy thông điệp:

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

Một chương trình dịch vụ được viết trongGolangngôn ngữ nhận được đẩy và chương trình dịch vụ in thông điệp:

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}

LogProfit

Ghi lại giá trị P&L, in giá trị P&L và vẽ đường cong lợi nhuận dựa trên giá trị P&L.

LogProfit (lợi nhuận) LogProfit ((lợi nhuận,... args)

Các thông sốprofitlà dữ liệu doanh thu, được cung cấp bởi thuật toán thiết kế và tính toán trong chiến lược. Lợi nhuận đúng số Parameter mở rộng để xuất thông tin ngẫu nhiên vào nhật ký doanh thu,argCác thông số có thể được truyền qua nhiều hơn một. arg sai chuỗi, số, bool, đối tượng, mảng, bất kỳ loại nào được hỗ trợ bởi hệ thống như 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);
    }
}

CácLogProfitchức năng, nếu nó kết thúc với ký tự&, chỉ vẽ biểu đồ thu nhập và không in nhật ký thu nhập.

{@fun/Log/LogProfitReset LogProfitReset}

LogProfitReset

Dọn sạch tất cả nhật ký thu nhập, biểu đồ thu nhập.

LogProfitReset (() LogProfitReset ((remain)

Cácremaintham số được sử dụng để xác định số lượng ghi nhật ký (giá trị số nguyên) để giữ. ở lại sai số

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

Thông tin đầu ra trong thanh trạng thái của hệ thống backtesting hoặc trang giao dịch trực tiếp.

LogStatus ((...msgs)

Các thông sốmsglà nội dung của đầu ra, và tham sốmsgcó thể được vượt qua nhiều hơn một. msg sai chuỗi, số, bool, đối tượng, mảng, bất kỳ loại nào được hỗ trợ bởi hệ thống như 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");
}

Nó hỗ trợ thiết lập màu của nội dung đầu ra:

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

Ví dụ về đầu ra dữ liệu trong thanh trạng thái:

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

Nó hỗ trợ để thiết kế các điều khiển nút trong thanh trạng thái (cấu trúc nút cũ):

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

Thiết lập vô hiệu hóa, chức năng mô tả của nút thanh trạng thái (cấu trúc nút cũ):

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

Kết hợp vớiGetCommand()chức năng, xây dựng chức năng tương tác nút thanh trạng thái (cấu trúc nút cũ):

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

Dữ liệu đầu vào cũng được hỗ trợ khi xây dựng các nút thanh trạng thái để tương tác, và các lệnh tương tác được thu thập bởiGetCommand()Chắc chắn sẽ có một chức năng.inputcác mục (cấu trúc nút cũ) đến cấu trúc dữ liệu của điều khiển nút trong thanh trạng thái, ví dụ: thêm"input": {"name": "number of open positions", "type": "number", "defValue": 1}đến{"type": "button", "cmd": "open", "name": "open position"}sẽ gây ra một cửa sổ bật lên với một điều khiển hộp đầu vào xuất hiện khi nút được nhấp chuột (giá mặc định trong hộp đầu vào là 1, đó là dữ liệu được thiết lập bởidefValueBạn có thể nhập dữ liệu để gửi cùng với lệnh nút. Ví dụ: khi mã thử nghiệm sau chạy, sau khi nhấp vào nút "open position", một cửa sổ bật lên với hộp đầu vào sẽ bật lên. Nhập 111 trong hộp đầu vào và nhấp vào OK.GetCommand()chức năng sau đó sẽ bắt được thông báo: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);
    }
}

Nó hỗ trợ cho các điều khiển nút nhóm (cấu trúc nút cũ), chức năng phù hợp vớinút thanh trạng thái hỗ trợ nhập dữ liệu(được thiết lập bằng cách sử dụng trường input).GetCommand()Sự khác biệt là với"group"thiết lập trường, khi nút được nhấp để kích hoạt tương tác, hộp thoại bật lên trên trang chứa một bộnhómcủa các điều khiển đầu vào được thiết lập để nhập một nhóm dữ liệu cùng một lúc. Một vài điểm cần lưu ý về"group"trường trong cấu trúc điều khiển nút thanh trạng thái và điều khiển nút nhóm:

  • Cáctypetài sản trong nhóm chỉ hỗ trợ bốn loại sau đây, vàdefValueproperty là giá trị mặc định. selected: Một điều khiển hộp thả xuống sử dụng|biểu tượng để tách mỗi tùy chọn trong một hộp thả xuống khi nó được đặt. số : Điều khiển hộp đầu vào số. string: Kiểm soát hộp đầu vào chuỗi. boolean: Kiểm soát hộp kiểm, kiểm tra cho (Boolean) true, không kiểm tra cho (Boolean) false.
  • Điều khiển các thiết lập phụ thuộc hỗ trợ đầu vào tương tác: Ví dụ, trong ví dụ sau:"name": "tradePrice@orderType==1"thiết lập, mà làm choTrade Giákiểm soát đầu vào chỉ có sẵn khiorderLoạiđiều khiển thả xuống được chọn như mộtĐề xuất chờ xử lý.
  • Bilingual control name support for interactive inputs Hỗ trợ tên điều khiển song ngữ cho đầu vào tương tác For example, in the following example: description : theo một cách khác order type setting, use|các ký hiệu để tách nội dung của mô tả bằng tiếng Trung và tiếng Anh.
  • name, descriptiontrong nhóm vàname, descriptiontrong cấu trúc nút không có cùng một định nghĩa mặc dù chúng có cùng một tên trường. Định nghĩa củanametrong nhóm cũng khác với định nghĩa củanametrong đầu vào.
  • Khi điều khiển nút nhóm được kích hoạt, nội dung tương tác được gửi theo định dạng giá trị trường cmd của nút và dữ liệu liên quan đến trường nhóm, chẳng hạn như đầu ra củaLog("cmd:", cmd)tuyên bố trong thử nghiệm ví dụ sau:cmd: open:{"orderType":1,"tradePrice":99,"orderAmount":"99","boolean":true}, tức là, những gì được trả về bởiGetCommand()chức năng khi một tương tác xảy ra:open:{"orderType":1,"tradePrice":99,"orderAmount":"99","boolean":true}.
  • Cáctypethuộc tính của nút điều khiển chỉ hỗ trợ:"button". Các điều khiển nút hỗ trợ dữ liệu đầu vào, tức là các điều khiển vớiinputtập hợp thuộc tính,typetài sản trong thông tin cấu hình củainputtrường hỗ trợ nhiều loại điều khiển. Xem các ví dụ sau:
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);
    }
}

Khi nút điều khiển nhóm thanh trạng thái (được thực hiện bằng cách thiết lậpgrouptrường) và nút điều khiển thanh trạng thái (được thực hiện bằng cách thiết lậpinputfield) được nhấp để kích hoạt tương tác (cấu trúc nút cũ), điều khiển hộp thả xuống trong hộp thoại bật lên trên trang cũng hỗ trợ nhiều lựa chọn. Ví dụ sau đây cho thấy cách thiết kế điều khiển hộp thả xuống với nhiều tùy chọn lựa chọn:

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

Sử dụng cấu trúc nút mới nhất để xây dựng các nút trong bảng thanh trạng thái. Khi nhấp vào nút để kích hoạt tương tác, một cửa sổ bật lên đa điều khiển sẽ bật lên. Để biết thêm chi tiết, vui lòng tham khảo:Hướng dẫn người dùng - Điều khiển tương tác trong thanh trạng thái.

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

Kết hợp theo chiều ngang của các ô trong bảng được vẽ bởiLogStatus()chức năng:

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

Tích hợp theo chiều dọc các ô trong bảng được vẽ bởiLogStatus()chức năng:

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

Hiển thị bảng bảng trạng thái:

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

Ngoài việc hiển thị bảng trong các trang, nhiều bảng cũng có thể được hiển thị theo thứ tự từ trên xuống:

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

Hỗ trợ để thiết lập chế độ cuộn ngang và dọc của bảng thanh trạng thái.scrollthuộc tính của"auto", khi số hàng dọc của bảng thanh trạng thái vượt quá 20 hàng, nội dung sẽ được cuộn.scrollattribute có thể được sử dụng để giảm bớt vấn đề chậm ghi một lượng lớn dữ liệu trong thanh trạng thái trong khi giao dịch trực tiếp.

Các thông tin xuất ra từLogStatus()chức năng khi giao dịch trực tiếp đang chạy không được lưu trong cơ sở dữ liệu giao dịch trực tiếp, nhưng nó chỉ cập nhật nội dung thanh trạng thái giao dịch trực tiếp hiện tại. CácLogStatus()chức năng hỗ trợ inbase64hình ảnh được mã hóa, bắt đầu với`và kết thúc với`Ví dụ:LogStatus("`data:image/png;base64,AAAA`"). CácLogStatus()chức năng hỗ trợ đi quamatplotlib.pyplotđối tượng trực tiếp vàoPython, miễn là đối tượng chứasavefigphương pháp, nó có thể được truyền như một tham số đểLogStatus()chức năng, ví dụ:

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

Khi chiến lược đang chạy giao dịch trực tiếp, nếu bạn đi qua lịch sử trên trang giao dịch trực tiếp, thanh trạng thái sẽ ngủ và ngừng cập nhật. Chỉ dữ liệu thanh trạng thái sẽ được làm mới khi nhật ký trên trang đầu tiên. Nó hỗ trợ đầu rabase64hình ảnh được mã hóa trong thanh trạng thái, và nó cũng hỗ trợ đầu rabase64hình ảnh được mã hóa trong bảng hiển thị trong thanh trạng thái. Vì dữ liệu chuỗi của hình ảnh được mã hóa thường rất dài, mã mẫu không được hiển thị.

{@fun/Global/GetCommand GetCommand}

EnableLog

Khởi động hoặc tắt việc ghi lại thông tin đơn đặt hàng.

EnableLog (được kích hoạt)

Nếuenabletham số được đặt thành một giá trị sai, ví dụ:false, nhật ký đơn đặt hàng (tức là nhật ký được tạo ra bởi các hàm nhưexchange.Buy()) không được in và không được ghi vào cơ sở dữ liệu giao dịch trực tiếp. cho phép đúng bool

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}

Biểu đồ

Tùy chỉnh chức năng vẽ biểu đồ.

Đối tượng biểu đồ. đối tượng

Biểu đồ (lựa chọn)

Cácoptionstham số là cấu hình biểu đồ.Chart()tham số chức năngoptionslà mộtJSONcó thể phân loạiHighStockstham số choHighcharts.StockChart. Một bổ sung__isStockthuộc tính được thêm vào trên các tham số gốc, và nếu__isStock:falseđược chỉ định, nó được hiển thị như một biểu đồ bình thường.__isStockthuộc tính được đặt thành một giá trị sai e.g.false, tức là biểu đồ được sử dụng là mộtHighchartsNếu các__isStockthuộc tính được đặt thành một giá trị thực ví dụ:true, tức là biểu đồ được sử dụng là mộtHighstocksbiểu đồ (bằng mặc định)__isStocklà đúng ví dụ:true) Bạn có thể truy vấnThư viện biểu đồ HighStocks. các lựa chọn đúng đối tượng, mảng đối tượng

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

Cấu hình vẽ đa biểu đồ:

  • extension.layoutthuộc tính Nếu thuộc tính được thiết lập với giá trị single, các biểu đồ sẽ không được xếp chồng lên nhau (không hiển thị dưới dạng tab), nhưng sẽ được hiển thị riêng biệt (tiled).
  • extension.heightthuộc tính Thuộc tính được sử dụng để đặt chiều cao của biểu đồ, hoặc là một giá trị số, hoặc là 300px.
  • extension.colthuộc tính Các thuộc tính được sử dụng để thiết lập chiều rộng của biểu đồ, chiều rộng trang được chia thành 12 ô, đặt 8, tức là biểu đồ chiếm 8 ô chiều rộng.
// 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);
    }
}

Ví dụ về một bản vẽ đơn giản:

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

Ví dụ về vẽ đường cong tam giác:

/*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;
    }
}            

Ví dụ phức tạp về sử dụng biểu đồ lai:

// 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);

Biểu đồ kiểupielà biểu đồ không có dòng thời gian, và bạn cần phải cập nhật cấu hình biểu đồ trực tiếp khi cập nhật dữ liệu. Ví dụ, mã trong ví dụ trên cập nhật biểu đồ bằng cách sử dụngc.update(chartCfg)sau khi cập nhật dữ liệu như sau:

CácChart()hàm trả về một đối tượng biểu đồ có 4 phương thức:add(), reset(), update(), del().

    1. Cácupdate()phương pháp: Cácupdate()Phương pháp này có thể cập nhật thông tin cấu hình biểu đồ.
    1. Cácdel()phương pháp: Cácdel()Phương pháp này có thể xóa các chuỗi dữ liệu của chỉ số được chỉ định dựa trên tham số chuỗi đã vượt qua.
    1. Cácadd()phương pháp: Cácadd()phương pháp có thể ghi dữ liệu vào biểu đồ, với các thông số sau đây theo thứ tự:
    • series: được sử dụng để thiết lập chỉ số chuỗi dữ liệu, đó là một số nguyên.
    • data: được sử dụng để thiết lập các dữ liệu cụ thể để được viết, nó là một mảng.
    • index(tùy chọn): được sử dụng để thiết lập chỉ số dữ liệu, nó là một số nguyên. Xác định vị trí chỉ số cụ thể của dữ liệu được sửa đổi và nó hỗ trợ các số âm, cài đặt là-1đề cập đến dữ liệu cuối cùng trong bộ dữ liệu. Ví dụ, khi vẽ một đường thẳng, sửa đổi dữ liệu ở điểm cuối cùng của đường thẳng:chart.add(0, [1574993606000, 13.5], -1), nghĩa là thay đổi dữ liệu trên điểm trước cuối cùng của biểu đồseries[0].data. Cácindextham số không được đặt, có nghĩa là dữ liệu được thêm vào điểm cuối cùng của chuỗi dữ liệu hiện tại.
    1. Cácreset()phương pháp: Cácreset()phương pháp được sử dụng để làm trống dữ liệu biểu đồ.reset()phương thức có thể lấy một tham sốremainđể xác định số lượng các mục nhập để giữ. Không tham sốremainđược thông qua để xóa tất cả dữ liệu.

{@fun/Log/KLineChart KLineChart}

KLineChart

Chức năng này được sử dụng để vẽ tùy chỉnh tại thời gian chạy chiến lược bằng cách sử dụng một phương pháp vẽ tương tự nhưPine language.

Đối tượng biểu đồ.KLineChart()hàm trả về một đối tượng biểu đồ với một số phương pháp, trong đó bạn cần phải chú ý đếnbegin()close(). Hoạt động vẽ phải bắt đầu với mộtbegin()gọi chức năng và kết thúc với mộtclose()gọi hàm khi đi qua dữ liệu KLine để thực hiện hoạt động vẽ. đối tượng

KLineChart (các tùy chọn)

Cácoptionstham số là cấu hình biểu đồ. các lựa chọn đúng đối tượng, mảng đối tượng

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

Nếu một đối tượng điều khiển biểu đồ là cần thiết để vẽ trong khu vực vẽ tùy chỉnh chiến lược, sử dụngKLineChart()Các tham số để cácKLineChart()hàm là một cấu trúc cấu hình biểu đồ, được sử dụng trong mã tham chiếu là đơn giản:{overlay: true}. Cấu trúc cấu hình biểu đồ này chỉ thiết lập nội dung vẽ để xuất trên biểu đồ chính.overlayđược đặt thành một giá trị sai, ví dụ:false, nội dung trên biểu đồ được đầu ra trên biểu đồ thứ cấp. Nếu bạn cần phải chỉ định một chức năng vẽ để vẽ trên biểu đồ chính, bạn cũng có thể chỉ định các tham sốoverlaynhư một giá trị thực trong cuộc gọi hàm cụ thể, ví dụ: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

Các chức năng giao diện vẽ củaPinengôn ngữ được hỗ trợ trong hoạt động vẽ là:barcolor, thiết lập màu K-line.

barcolor ((color, offset, có thể chỉnh sửa, show_last, title, display) Các tham số hiển thị là tùy chọn: không có, tất cả

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

bgcolor, lấp đầy nền của đường K với màu sắc được chỉ định.

bgcolor ((color, offset, có thể chỉnh sửa, show_last, title, display, overlay) Các tham số hiển thị là tùy chọn: không có, tất cả

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, vẽ một chuỗi dữ liệu trên biểu đồ.

plot ((series, title, color, linewidth, style, trackprice, histbase, offset, join, editable, show_last, display) Các tham số kiểu là tùy chọn: stepline_diamond, stepline, cross, areabr, area, circles, columns, histogram, linebr, line Các tham số hiển thị là tùy chọn: không có, tất cả

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, lấp đầy nền giữa hai mảng hoặchlinevới màu sắc được cung cấp.

fill ((hline1, hline2, color, title, editable, fillgaps, display) Các tham số hiển thị là tùy chọn: không có, tất cả

Kể từ khiJavaScriptngôn ngữ không thể chỉ định các tham số đến dựa trên tên của các tham số chức năng chính thức, để giải quyết vấn đề này, bạn có thể sử dụng một{key: value}cấu trúc để xác định các tham số được truyền đến một tên tham số chính thức nhất định. Ví dụ, mã tham chiếu sử dụng{color: bar.Close > bar.Open ? 'rgba(255, 0, 0, 0, 0.2)' : 'rgba(255, 0, 0, 0, 0.2)'}xác địnhcolortham số củafillchức năng. Nếu bạn cần phải chỉ định nhiều tham số với các tên tham số hình thức liên tiếp, bạn có thể sử dụng{key1: value1, key2: value2, key3: value3}. Ví dụ, trong ví dụ này, một bổ sungtitletham số được chỉ định:{color: bar.Close > bar.Open ? 'rgba(255, 0, 0, 0, 0.2)' : 'rgba(255, 0, 0, 0, 0.2)', title: 'fill'}. Đối với giá trị màu sắc, bạn có thể thiết lập nó với'rgba(255, 0, 0, 0, 0.2)'hoặc với'#FF0000'.

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

hline, đường ngang được trình bày ở mức giá cố định nhất định.

hline ((giá, tiêu đề, màu sắc, kiểu dòng, chiều rộng dòng, có thể chỉnh sửa, hiển thị) Các thông số phong cách đường dây là tùy chọn: dashed, dotted, solid Các tham số hiển thị là tùy chọn: không có, tất cả

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

plotarrow, vẽ mũi tên lên và xuống trên biểu đồ.

Plotarrow ((series, title, colorup, colorordown, offset, minheight, maxheight, có thể chỉnh sửa, show_last, display) Các tham số hiển thị là tùy chọn: không có, tất cả

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

plotshape, vẽ hình dạng trực quan trên biểu đồ.

plotshape ((series, title, style, location, color, offset, text, textcolor, editable, size, show_last, display) Các thông số phong cách là tùy chọn: diamond, square, label_down, label_up, arrow_down, arrow_up, circle, flag, triangle_down, triangle_up, cross, xcross Các tham số vị trí là tùy chọn: abovebar, belowbar, top, bottom, absolute Các tham số kích thước là tùy chọn: 10px, 14px, 20px, 40px, 80px, so sánh size.tiny, size.small, size.normal, size.large, size.huge trong ngôn ngữ Pine.size.autolà kích thước nhỏ. Các tham số hiển thị là tùy chọn: không có, tất cả

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

plotchar, vẽ hình dạng trực quan trên biểu đồ bằng cách sử dụng bất kỳ ký tự Unicode nào.

plotchar ((series, title, char, location, color, offset, text, textcolor, editable, size, show_last, display) Các tham số vị trí là tùy chọn: abovebar, belowbar, top, bottom, absolute Các tham số kích thước là tùy chọn: 10px, 14px, 20px, 40px, 80px, so sánh size.tiny, size.small, size.normal, size.large, size.huge trong ngôn ngữ Pine.size.autolà kích thước nhỏ. Các tham số hiển thị là tùy chọn: không có, tất cả

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, vẽ biểu đồ đường K trên biểu đồ.

plotcandle ((mở, cao, thấp, đóng, tiêu đề, màu sắc, wickcolor, có thể chỉnh sửa, show_last, bordercolor, display) Các tham số hiển thị là tùy chọn: không có, tất cả

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

signal, một hàm không có sẵn trên ngôn ngữ Pine, được sử dụng để vẽ tín hiệu mua và bán ở đây.

tín hiệu ((hướng, giá, lượng, id) Các tham số long được truyền vào để chỉ ra hướng giao dịch, bạn có thể chọn long, closelong, short, closeshort.bar.Highlà vị trí trục Y của tín hiệu đánh dấu. Các thông số được thông qua 1.5 chỉ ra số lượng giao dịch của tín hiệu. Các thông số thứ tư có thể được thông qua để thay thế các nội dung văn bản mặc định được vẽ, và các văn bản mặc định của các dấu hiệu tín hiệu được vẽ là hướng của giao dịch, ví dụ như closelong.

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

reset, một hàm không có sẵn trên ngôn ngữ Pine, được sử dụng để làm trống dữ liệu biểu đồ.

Reset (tạm dịch: đặt lại) Cácreset()phương pháp có thể có một tham số,remain, để xác định số lượng dữ liệu để giữ.remaincó nghĩa là xóa tất cả dữ liệu.

Chiến lược vẽ tùy chỉnh chỉ có thể sử dụng một trong những cách củaKLineChart()chức năng hoặcChart()cho một số màu sắc và thiết lập phong cách được sử dụng trongKLineChart()gọi chức năng, xin vui lòng tham khảoSử dụng chức năng KLineChart để làm cho thiết kế vẽ chiến lược dễ dàng hơn.

{@fun/Log/Chart Chart}

LogReset

Dọn sạch sổ.

LogReset ((remain)

Cácremaintham số được sử dụng để thiết lập số lượng ghi nhật ký gần đây để giữ. ở lại sai số

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

Lịch khởi động cho mỗi lần bắt đầu chiến lược giao dịch trực tiếp được tính là một, vì vậy nếu không có tham số nào được truyền vào và không có đầu ra nhật ký vào lúc bắt đầu chiến lược, không có nhật ký nào sẽ được hiển thị, chờ đợi nhật ký docker được trả về (không phải là ngoại lệ).

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

LogVacuum

Sử dụng để phục hồi không gian lưu trữ chiếm bởiSQLitekhi xóa dữ liệu sau khi gọiLogReset()chức năng để xóa nhật ký.

LogVacuum ((()

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

Lý do làSQLitekhông lấy lại không gian chiếm đóng khi xóa dữ liệu, và nó cần thực hiệnVACUUMđể làm sạch bảng và giải phóng không gian. hoạt động di chuyển tệp xảy ra khi gọi chức năng này, và sự chậm trễ là lớn, vì vậy nó được khuyến cáo để gọi trong một khoảng thời gian thích hợp.

{@fun/Log/LogReset LogReset}

console.log

Nó được sử dụng để xuất thông tin gỡ lỗi trong cột thông tin gỡ lỗi trong trang giao dịch trực tiếp.123456, cácconsole.loghàm đầu ra thông tin gỡ lỗi trên trang giao dịch trực tiếp, và cùng một lúc, tạo một tập tin nhật ký với phần mở rộng.logvà viết thông tin gỡ lỗi trong/logs/storage/123456/trong thư mục docker mà giao dịch trực tiếp thuộc về, với tiền tố tên tập tinstdout_.

console.log ((...msgs)

Các thông sốmsglà nội dung của đầu ra, và tham sốmsgcó thể được vượt qua nhiều hơn một. msg sai chuỗi, số, bool, đối tượng, mảng, null và các loại khác được hỗ trợ bởi hệ thống.

function main() {
    console.log("test console.log")
}
# Not supported
// Not supported
  • Chỉ làJavaScriptngôn ngữ hỗ trợ chức năng này.
  • Chức năng này chỉ được hỗ trợ bởi giao dịch trực tiếp, nhưng không phải bởi Debugging Tools hoặc Backtesting System.
  • Phát ra một đối tượng được chuyển đổi thành chuỗi[object Object], vì vậy cố gắng để xuất càng nhiều thông tin dễ đọc càng tốt.

{@fun/Log/console.errorconsole.error}

console.error

Được sử dụng để phát ra lỗi trong trường Debug message trên trang giao dịch trực tiếp.123456, cácconsole.errorfunction tạo một tập tin nhật ký với phần mở rộng.logtrong/logs/storage/123456/thư mục của docker nơi giao dịch trực tiếp thuộc về, và viết lỗi đầu ra với tiền tốstderr_.

console.error ((...msgs)

Các thông sốmsglà nội dung của đầu ra, và tham sốmsgcó thể được vượt qua nhiều hơn một. msg sai chuỗi, số, bool, đối tượng, mảng, null và các loại khác được hỗ trợ bởi hệ thống.

function main() {
    console.error("test console.error")
}
# Not supported
// Not supported
  • Chỉ làJavaScriptngôn ngữ hỗ trợ chức năng này.
  • Chức năng này chỉ được hỗ trợ bởi giao dịch trực tiếp, nhưng không phải bởi Debugging Tools hoặc Backtesting System.
  • Phát ra một đối tượng được chuyển đổi thành chuỗi[object Object], vì vậy cố gắng để xuất càng nhiều thông tin dễ đọc càng tốt.

{@fun/Log/console.log console.log}

Thị trường

exchange.GetTicker

Nhận cấu trúc {@struct/Ticker Ticker} của giao dịch hoặc hợp đồng tương ứng với cặp giao dịch được đặt hiện tại, mã hợp đồng, tức là dữ liệu ticker.GetTicker ()hàm là một hàm thành viên của đối tượng trao đổi {@var/EXCHANGE exchange}, việc sử dụngexchangeCác chức năng thành viên đối tượng (các phương pháp) chỉ liên quan đếnexchange, và nó sẽ không được lặp lại trong tài liệu.

Cácexchange.GetTicker()hàm trả về cấu trúc {@struct/Ticker Ticker} khi yêu cầu dữ liệu thành công, và trả về giá trị null khi yêu cầu dữ liệu thất bại. {@struct/Ticker Ticker}, giá trị không

đổi.GetTicker() trao đổi.GetTicker (bản biểu tượng)

Các thông sốsymbolđược sử dụng để chỉ định cặp giao dịch cụ thể và mã hợp đồng tương ứng với dữ liệu {@struct/Ticker Ticker} được yêu cầu. Nếu tham số này không được truyền, dữ liệu thị trường của cặp giao dịch và mã hợp đồng được đặt hiện tại sẽ được yêu cầu theo mặc định. Khi gọi choexchange.GetTicker(symbol)chức năng,exchangelà đối tượng trao đổi tại chỗ. Nếu bạn cần yêu cầu dữ liệu thị trường với đồng tiền mệnh giá là USDT và đồng tiền giao dịch là BTC, tham sốsymbollà:"BTC_USDT", và định dạng là định dạng cặp giao dịch được xác định bởi nền tảng FMZ. Khi gọi choexchange.GetTicker(symbol)chức năng,exchangelà đối tượng trao đổi tương lai. Nếu bạn cần yêu cầu dữ liệu thị trường của hợp đồng vĩnh cửu tiêu chuẩn U của BTC, tham sốsymbollà:"BTC_USDT.swap", và định dạng là một sự kết hợp củacặp giao dịchmã hợp đồngđược xác định bởi nền tảng FMZ, được tách bởi ký tự .. Khi gọi choexchange.GetTicker(symbol)chức năng,exchangelà đối tượng trao đổi tương lai. Nếu bạn cần yêu cầu dữ liệu thị trường của hợp đồng tùy chọn tiêu chuẩn U của BTC, tham sốsymbollà:"BTC_USDT.BTC-240108-40000-C"(lấy Binance Option BTC-240108-40000-C làm ví dụ), định dạng là sự kết hợp củacặp giao dịchđược xác định bởi nền tảng FMZ và mã hợp đồng tùy chọn cụ thể được xác định bởi sàn giao dịch, được tách bằng ký tự ..

biểu tượng sai chuỗi

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

Đối với các đối tượng giao dịch tương lai (tức làexchangehoặcexchanges[0]), bạn cần thiết lập mã hợp đồng bằng cách sử dụngexchange.SetContractType()chức năng trước khi gọi chức năng ticker, mà sẽ không được lặp lại.

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

Sử dụngsymboltham số để yêu cầu dữ liệu thị trường cho một biểu tượng cụ thể (bản tượng điểm).

CácTickerdữ liệu được trả về bởiexchange.GetTicker()trong hệ thống backtesting.HighLowlà các giá trị mô phỏng, lấy từ một bán và mua một của thị trường tại thời điểm đó.Tickerdữ liệu được trả về bởiexchange.GetTicker()trong thị trường thực tế.HighLowCác giá trị dựa trên dữ liệu được trả về bởi trao đổi đóng góiTickgiao diện, bao gồm giá cao nhất và thấp nhất trong một khoảng thời gian nhất định (thường là một khoảng thời gian 24 giờ). Các sàn giao dịch không hỗ trợexchange.GetTicker()chức năng:

Tên chức năng Không hỗ trợ trao đổi tại chỗ Giao dịch tương lai không được hỗ trợ
GetTicker Tiền tương lai_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}

exchange.GetDepth

Nhận cấu trúc {@struct/Depth Depth} của giao dịch hoặc hợp đồng tương ứng với cặp giao dịch được đặt hiện tại, mã hợp đồng, tức là dữ liệu sổ lệnh.

Cácexchange.GetDepth()hàm trả về cấu trúc {@struct/Depth Depth} nếu yêu cầu dữ liệu thành công, và nó trả về null nếu yêu cầu dữ liệu thất bại. {@struct/Depth Depth}, giá trị không

đổi.GetDepth() đổi.GetDepth (( biểu tượng)

Các thông sốsymbolđược sử dụng để chỉ định cặp giao dịch cụ thể và mã hợp đồng tương ứng với dữ liệu {@struct/Depth Depth} được yêu cầu. Nếu tham số này không được truyền, dữ liệu sổ lệnh của cặp giao dịch và mã hợp đồng được đặt hiện tại sẽ được yêu cầu theo mặc định. Khi gọi mã giao dịchexchange.GetDepth(symbol)chức năng,exchangelà đối tượng trao đổi tại chỗ. Nếu bạn cần yêu cầu để có được dữ liệu sổ lệnh với tiền tệ theo mệnh giá là USDT và tiền tệ giao dịch là BTC, tham sốsymbollà:"BTC_USDT", và định dạng là định dạng cặp giao dịch được xác định bởi nền tảng FMZ.exchange.GetDepth(symbol)chức năng,exchangelà đối tượng trao đổi tương lai. Nếu bạn cần yêu cầu dữ liệu sổ lệnh của hợp đồng vĩnh viễn tiêu chuẩn U của BTC, tham sốsymbollà:"BTC_USDT.swap", và định dạng là một sự kết hợp củacặp giao dịchmã hợp đồngđược xác định bởi nền tảng FMZ, được tách bởi ký tự ..exchange.GetDepth(symbol)chức năng,exchangelà đối tượng trao đổi tương lai. Nếu bạn cần yêu cầu dữ liệu sổ lệnh của hợp đồng tùy chọn tiêu chuẩn U của BTC, tham sốsymbollà:"BTC_USDT.BTC-240108-40000-C"(lấy Binance Option BTC-240108-40000-C làm ví dụ), định dạng là sự kết hợp củacặp giao dịchđược xác định bởi nền tảng FMZ và mã hợp đồng tùy chọn cụ thể được xác định bởi sàn giao dịch, được tách bằng ký tự .. biểu tượng sai chuỗi

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

Kiểm traexchange.GetDepth()chức năng:

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

Khi cấu hìnhexchangeđối tượng là một đối tượng giao dịch tương lai, sử dụngsymboltham số để yêu cầu dữ liệu sổ lệnh của một biểu tượng cụ thể (bản biểu tương lai).

Trong hệ thống backtesting, dữ liệu cho mỗi lớp được trả về bởiexchange.GetDepth()chức năngMô phỏng Ticktrong hệ thống backtesting, dữ liệu được trả về bởi cácexchange.GetDepth()chức năngTick thật sựbacktesting là một bức ảnh sâu cấp hai.

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

exchange.GetTrades

Nhận mảng cấu trúc {@struct/Trade Trade} của giao dịch hoặc hợp đồng tương ứng với cặp giao dịch được thiết lập hiện tại, mã hợp đồng, tức là dữ liệu giao dịch thị trường.

Cácexchange.GetTrades()hàm trả về một mảng cấu trúc {@struct/Trade Trade} nếu yêu cầu dữ liệu thành công, và nó trả về giá trị không nếu yêu cầu dữ liệu thất bại. {@struct/Trade Trade} mảng, giá trị không

giao dịch.GetTrades ((() giao dịch.GetTrades (định hiệu)

Các thông sốsymbolđược sử dụng để chỉ định cặp giao dịch cụ thể và mã hợp đồng tương ứng với dữ liệu mảng {@struct/Trade Trade} được yêu cầu. Nếu tham số này không được vượt qua, dữ liệu hồ sơ giao dịch mới nhất của cặp giao dịch và mã hợp đồng được thiết lập hiện tại sẽ được yêu cầu theo mặc định.exchange.GetTrades(symbol)chức năng,exchangelà đối tượng trao đổi tại chỗ. Nếu bạn cần yêu cầu để có được dữ liệu sổ lệnh với tiền tệ theo mệnh giá là USDT và tiền tệ giao dịch là BTC, tham sốsymbollà:"BTC_USDT", và định dạng là định dạng cặp giao dịch được xác định bởi nền tảng FMZ.exchange.GetTrades(symbol)chức năng,exchangelà đối tượng trao đổi tương lai. Nếu bạn cần yêu cầu dữ liệu sổ lệnh của hợp đồng vĩnh viễn tiêu chuẩn U của BTC, tham sốsymbollà:"BTC_USDT.swap", và định dạng là một sự kết hợp củacặp giao dịchmã hợp đồngđược xác định bởi nền tảng FMZ, được tách bởi ký tự ..exchange.GetTrades(symbol)chức năng,exchangelà đối tượng trao đổi tương lai. Nếu bạn cần yêu cầu dữ liệu sổ lệnh của hợp đồng tùy chọn tiêu chuẩn U của BTC, tham sốsymbollà:"BTC_USDT.BTC-240108-40000-C"(lấy Binance Option BTC-240108-40000-C làm ví dụ), định dạng là sự kết hợp củacặp giao dịchđược xác định bởi nền tảng FMZ và mã hợp đồng tùy chọn cụ thể được xác định bởi sàn giao dịch, được tách bằng ký tự .. biểu tượng sai chuỗi

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

Kiểm traexchange.GetTrades()chức năng:

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

Khi cấu hìnhexchangeđối tượng là một đối tượng giao dịch tương lai, sử dụngsymboltham số để yêu cầu dữ liệu hồ sơ giao dịch thị trường cho một biểu tượng cụ thể (biểu tượng tương lai).

exchange.GetTrades()chức năng để có được các cặp giao dịch hiện tại, lịch sử giao dịch của thị trường (không phải của riêng họ) tương ứng với hợp đồng. Một số sàn giao dịch không hỗ trợ chức năng này, và dữ liệu cụ thể được trả về là bao nhiêu trong phạm vi các hồ sơ giao dịch phụ thuộc vào sàn giao dịch và cần được xử lý theo tình huống cụ thể. Dữ liệu trả về là một mảng, nơi mỗi yếu tố của thứ tự thời gian vàexchange.GetRecords ()hàm trả về cùng một thứ tự dữ liệu, tức là, phần tử cuối cùng của mảng là dữ liệu gần nhất với thời gian hiện tại. Cácexchange.GetTrades()hàm trả về một mảng trống khi sử dụngMô phỏng TickCác dữ liệu được trả về bởiexchange.GetTrades()chức năng khi sử dụngTick thật sựbacktesting trong hệ thống backtesting là dữ liệu chụp tức thời dòng lệnh, tức là mảng cấu trúc {@struct/Trade Trade}. Các sàn giao dịch không hỗ trợexchange.GetTrades()chức năng:

Tên chức năng Không hỗ trợ trao đổi tại chỗ Giao dịch tương lai không được hỗ trợ
GetTrades Tiền tương lai_BitMart / Tiền tương lai_Bibox

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

exchange.GetRecords

Nhận được mảng cấu trúc {@struct/Record Record} của giao dịch hoặc hợp đồng tương ứng với cặp giao dịch được đặt hiện tại, mã hợp đồng, tức là dữ liệu đường K.

Cácexchange.GetRecords()hàm trả về một mảng cấu trúc {@struct/Record Record} khi yêu cầu dữ liệu thành công, và nó trả về giá trị không khi yêu cầu dữ liệu thất bại. {@struct/Record Record} mảng, giá trị không

trao đổi.GetRecords() trao đổi.GetRecords (tượng hiệu) exchange.GetRecords (thông hiệu, chấm) exchange.GetRecords ((thượng hiệu, thời gian, giới hạn) trao đổi.GetRecords (thời gian) exchange.GetRecords (thời gian, giới hạn)

Các thông sốsymbolđược sử dụng để xác định cặp giao dịch cụ thể và mã hợp đồng tương ứng với dữ liệu mảng {@struct/Record Record} được yêu cầu. Nếu tham số này không được truyền, dữ liệu K-line của cặp giao dịch và mã hợp đồng được đặt hiện tại sẽ được yêu cầu theo mặc định. Khi gọi mã giao dịchexchange.GetRecords(symbol)chức năng,exchangelà đối tượng trao đổi tại chỗ. Nếu bạn cần yêu cầu để có được dữ liệu với các đồng tiền mệnh giá là USDT và các đồng tiền giao dịch là BTC, các tham sốsymbollà:"BTC_USDT", và định dạng là định dạng cặp giao dịch được xác định bởi nền tảng FMZ.exchange.GetRecords(symbol)chức năng,exchangelà đối tượng trao đổi tương lai. Nếu bạn cần yêu cầu dữ liệu sổ lệnh của hợp đồng vĩnh viễn tiêu chuẩn U của BTC, tham sốsymbollà:"BTC_USDT.swap", và định dạng là một sự kết hợp củacặp giao dịchmã hợp đồngđược xác định bởi nền tảng FMZ, được tách bởi ký tự ..exchange.GetRecords(symbol)chức năng,exchangelà đối tượng trao đổi tương lai. Nếu bạn cần yêu cầu dữ liệu sổ lệnh của hợp đồng tùy chọn tiêu chuẩn U của BTC, tham sốsymbollà:"BTC_USDT.BTC-240108-40000-C"(lấy Binance Option BTC-240108-40000-C làm ví dụ), định dạng là sự kết hợp củacặp giao dịchđược xác định bởi nền tảng FMZ và mã hợp đồng tùy chọn cụ thể được xác định bởi sàn giao dịch, được tách bằng ký tự .. biểu tượng sai chuỗi Các thông sốperiodchỉ định thời gian của dữ liệu đường K được yêu cầu, ví dụ: {@var/PERIOD/PERIOD_M1 PERIOD_M1}, {@var/PERIOD/PERIOD_M5 PERIOD_M5}, {@var/PERIOD/PERIOD_M15 PERIOD_M15}, v.v. Giá trị của tham sốperiodkhông chỉ có thể vượt qua khoảng thời gian tiêu chuẩn được xác định, mà còn có thể vượt qua các giá trị nguyên trong giây. Nếu tham số này không được vượt qua, khoảng thời gian của dữ liệu đường K được yêu cầu theo mặc định là khoảng thời gian đường K mặc định của cấu hình chiến lược thời gian thực / backtest hiện tại. thời gian sai số Các thông sốlimitđược sử dụng để xác định chiều dài của dữ liệu K-line được yêu cầu. Nếu tham số này không được truyền, chiều dài yêu cầu mặc định là số lượng tối đa các thanh K-line được yêu cầu tại một thời điểm của giao diện K-line trao đổi. giới hạn sai số

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

Nhận dữ liệu đường K cho một khoảng thời gian tùy chỉnh.

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

Dữ liệu thanh đường K đầu ra:

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

Khi cấu hìnhexchangeđối tượng là một đối tượng giao dịch tương lai, sử dụngsymbol, period, vàlimitcác tham số để yêu cầu dữ liệu dòng K của một sản phẩm cụ thể (sản phẩm tương lai).

Thời gian K-line mặc định có thể được thiết lập trong backtest và trang giao dịch thực.exchange.GetRecords()Nếu không có thông số nào được chỉ định khi gọi hàm, dữ liệu K-line tương ứng sẽ được trả về theo thời gian K-line được thiết lập trong backtest và các thông số thị trường thực tế. Giá trị trả về là một mảng củaRecordcác cấu trúc, dữ liệu đường K được trả về sẽ được tích lũy theo thời gian, giới hạn trên của các thanh đường K tích lũy bị ảnh hưởng bởiexchange.SetMaxBarLen()cài đặt chức năng. giới hạn mặc định là 5000 thanh khi nó không được thiết lập. Khi dữ liệu đường K đạt đến giới hạn tích lũy thanh đường K, nó sẽ được cập nhật bằng cách thêm một thanh đường K và xóa thanh đường K sớm nhất (ví dụ như hàng đợi vào / ra). Một số sàn giao dịch không cung cấp giao diện đường K, vì vậy docker thu thập dữ liệu hồ sơ giao dịch thị trường (Tradecấu trúc mảng) trong thời gian thực để tạo ra K-đường. Nếu giao diện K-line của trao đổi hỗ trợ truy vấn page, nhiều yêu cầu API sẽ được thực hiện khi gọiexchange.SetMaxBarLen()chức năng để thiết lập một chiều dài đường K lớn hơn. Khiexchange.GetRecords()- Hệ thống backtesting sẽ nhận được một số lượng nhất định các thanh K-line trước khi bắt đầu khoảng thời gian backtesting trước (mục mặc định là 5000, các thiết lập của hệ thống backtesting và số lượng dữ liệu sẽ ảnh hưởng đến số lượng cuối cùng được trả về), như dữ liệu K-line ban đầu. - Số lượng các thanh K-line thu được trong giao dịch thực tế dựa trên số lượng dữ liệu tối đa có thể thu được từ giao diện K-line của sàn giao dịch. Cácperiodtham số được thiết lập thành 5, đó là một yêu cầu để có được dữ liệu K-line với một khoảng thời gian 5 giây.periodtham số không thể chia cho 60 (tức là, thời gian được đại diện không thể chia cho phút).exchange.GetTrades()để thu thập dữ liệu ghi chép giao dịch và tổng hợp các dữ liệu K-line cần thiết.periodtham số được chia cho 60, sau đó dữ liệu đường K cần thiết được tổng hợp bằng cách sử dụng dữ liệu đường K tối thiểu 1 phút (nếu có thể, dữ liệu đường K cần thiết được tổng hợp bằng cách sử dụng khoảng thời gian lớn hơn). Việc thử nghiệm ngược cấp độ mô phỏng trong hệ thống kiểm tra ngược đòi hỏi phải thiết lập khoảng thời gian K-line cơ bản (khi hệ thống kiểm tra ngược mô phỏng kiểm tra ngược cấp độ, dữ liệu K-line tương ứng được sử dụng để tạo dữ liệu Tick theo khoảng thời gian K-line cơ bản được thiết lập). CácC++ngôn ngữ có ví dụ mã sau đây nếu bạn cần xây dựng dữ liệu K-line của riêng bạn:

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

Các sàn giao dịch không hỗ trợexchange.GetRecords()chức năng:

Tên chức năng Không hỗ trợ trao đổi tại chỗ Giao dịch tương lai không được hỗ trợ
GetRecords Zaif / Coincheck / BitFlyer Tiền tương lai_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

Nhận thời gian K-line được đặt trên trang web nền tảng FMZ Quant Trading khi kiểm tra lại và chạy chiến lược trong giao dịch trực tiếp, tức là thời gian K-line mặc định được sử dụng khi gọiexchange.GetRecords()chức năng mà không cần thông qua các thông số.

Thời gian K-đường theo giây, giá trị nguyên bằng giây. số

trao đổi.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

Đặt chiều dài tối đa của đường K.

trao đổi.SetMaxBarLen ((n)

Các thông sốnđược sử dụng để xác định chiều dài đường K tối đa. n đúng số

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

Cácexchange.SetMaxBarLen()chức năng ảnh hưởng đến hai khía cạnh cho thời gian chạy chiến lược tiền điện tử:

  • Ảnh hưởng đến số lượng thanh K-line (Bars) được thu được trong cuộc gọi đầu tiên.
  • Ảnh hưởng đến số lượng tối đa các thanh K-line (Bars).

{@fun/Market/exchange.GetRecords exchange.GetRecords}

exchange.GetRawJSON

Nhận nội dung ban đầu trở lại bởi cuối cùngrestyêu cầu đối tượng trao đổi hiện tại ({@var/EXCHANGE exchange}, {@var/EXCHANGE/exchanges exchanges}).

Dữ liệu trả lời chorestyêu cầu. chuỗi

trao đổi.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);
}

Cácexchange.GetRawJSON()chức năng chỉ được hỗ trợ cho giao dịch thực.C++ language.

{@var/EXCHANGE exchange}

exchange.GetRate

Nhận tỷ giá hối đoái hiện được thiết lập cho đối tượng trao đổi.

Giá trị hiện tại của tỷ giá hối đoái của đối tượng trao đổi. số

trao đổi.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());
}

Nếuexchange.SetRate()đã không được gọi để thiết lập tỷ giá chuyển đổi,exchange.GetRate()hàm trả về một giá trị tỷ lệ mặc định là 1, nghĩa là dữ liệu liên quan đến đồng tiền hiện đang hiển thị (quoteCurrency) chưa được chuyển đổi. Nếu giá trị tỷ giá hối đoái đã được thiết lập bằng cách sử dụngexchange.SetRate(), ví dụ,exchange.SetRate(7)Sau đó tất cả thông tin giá, chẳng hạn như báo giá, chiều sâu và giá đặt hàng thu được thông quaexchangeđối tượng trao đổi sẽ được chuyển đổi bằng cách nhân với tỷ giá hối đoái đã thiết lập7. Nếuexchangetương ứng với một trao đổi với USD như là tiền tệ danh nghĩa, sau khi gọiexchange.SetRate(7), tất cả giá trên thị trường trực tiếp sẽ được chuyển đổi thành giá gần CNY bằng cách nhân7Tại thời điểm này, giá trị tỷ giá hối đoái thu được bằng cách sử dụngexchange.GetRate()7.

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

exchange.SetData

Cácexchange.SetData()chức năng được sử dụng để thiết lập dữ liệu được tải khi chiến lược đang chạy.

Chiều dài của chuỗi sau tham sốvalueMã hóa JSON. số

exchange.SetData ((key, giá trị)

Tên của bộ sưu tập dữ liệu chìa khóa đúng chuỗi Dữ liệu được tải bởiexchange.SetData()cấu trúc dữ liệu là giống như định dạng dữ liệu được yêu cầu bởiexchange.GetData()chức năng khi yêu cầu dữ liệu bên ngoài, tức là:"schema": ["time", "data"]. giá trị đúng mảng

/*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);
    }
}

Nó đòi hỏi rằng dữ liệu cho các thông sốvaluecó cùng định dạng nhưdataBạn có thể thấy rằng timestamp1579622400000tương ứng với thời gian2020-01-22 00:00:00, và khi chương trình chiến lược được chạy sau thời gian này, gọi choexchange.GetData()chức năng để lấy dữ liệu trước khi dấu thời gian dữ liệu tiếp theo1579708800000, nghĩa là, thời gian2020-01-23 00:00:00Những gì bạn nhận được là[1579622400000, 123]nội dung của dữ liệu đó, khi chương trình tiếp tục chạy, thời gian thay đổi, v.v. để có được các mục dữ liệu theo mục. Trong ví dụ sau, trong thời gian chạy (đánh giá ngược hoặc giao dịch trực tiếp), thời điểm hiện tại đạt hoặc vượt quá dấu thời gian1579795200000, cácexchange.GetData()hàm được gọi và giá trị trả về là:{"Time":1579795200000,"Data":["abc", 123,{"price":123}]}. "Time":1579795200000tương ứng với1579795200000trong dữ liệu[1579795200000, ["abc", 123, {"price": 123}]]. "Data":["abc", 123, {"price": 123}]tương ứng với dữ liệu["abc", 123, {"price": 123}]]trong[1579795200000, ["abc", 123, {"price": 123}]].

Dữ liệu được tải có thể là bất kỳ chỉ số kinh tế, dữ liệu ngành, chỉ số có liên quan, v.v., được sử dụng để đánh giá định lượng chiến lược của tất cả các thông tin định lượng.

{@fun/Market/exchange.GetData exchange.GetData}

exchange.GetData

Cácexchange.GetData()chức năng được sử dụng để có được dữ liệu tải bởi cácexchange.SetData()hoặc được cung cấp bởi một liên kết bên ngoài.

Các hồ sơ trong bộ sưu tập dữ liệu. đối tượng

trao đổi.GetData(key) trao đổi.GetData ((key, timeout)

Tên của bộ sưu tập dữ liệu chìa khóa đúng chuỗi Sử dụng để thiết lập thời gian cache trong milliseconds. thời gian nghỉ sai số

/*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);
    }
}

Cuộc gọi để có được dữ liệu được viết trực tiếp.

/*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);
    }
}

Nó hỗ trợ để yêu cầu dữ liệu thông qua các liên kết bên ngoài, định dạng của dữ liệu được yêu cầu để:

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

Ở đâu?schemalà định dạng dữ liệu cho mỗi bản ghi trong cơ thể dữ liệu được tải, được cố định ở["time", "data"]tương ứng với định dạng của dữ liệu nhập từng lần trongdatathuộc tính. Những gì được lưu trữ trongdatathuộc tính là cơ thể của dữ liệu, với mỗi mục bao gồm dấu thời gian cấp độ millisecond và nội dung dữ liệu (có thể là bất kỳ dữ liệu có thể mã hóa JSON nào). Chương trình dịch vụ để thử nghiệm, được viết bằng 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)
}

Dữ liệu phản hồi của chương trình khi nhận được yêu cầu:

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

Mã chiến lược thử nghiệm:

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

Phương pháp gọi để lấy dữ liệu của một liên kết bên ngoài.

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

Yêu cầu dữ liệu cho truy vấn được tạo trên nền tảngdữ liệu, yêu cầu định dạng dữ liệu của câu trả lời là (phải có thời gian, các trường dữ liệu được mô tả trong sơ đồ):

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

Các trường data là các nội dung dữ liệu cần thiết, và các dữ liệu trong trường data cần phải giống như những gì được thỏa thuận trong schema.exchange.GetData()hàm được gọi, một đối tượng JSON được trả về, ví dụ:{"Time":1579795200000, "Data":"..."}.

Nhận dữ liệu ngay lập tức để backtesting và bộ nhớ cache một phút dữ liệu cho giao dịch trực tiếp.from(được đánh dấu thời gian bằng giây),to(được đánh dấu thời gian trong giây) đến yêu cầu, các tham số như:period(thời gian đường K cơ bản, được đánh dấu theo thời gian trong milliseconds) được sử dụng để xác định khung thời gian mà trong đó dữ liệu sẽ được thu thập.

{@fun/Market/exchange.SetData exchange.SetData}

exchange.GetMarkets

Cácexchange.GetMarkets()chức năng được sử dụng để có được thông tin thị trường hối đoái.

Từ điển chứa cấu trúc {@struct/Market Market}. đối tượng

giao dịch.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]);
}

Ví dụ về một cuộc gọi đến một đối tượng giao dịch tương lai:

/*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() + "`");
}

Sử dụng đối tượng trao đổi tương lai để gọiexchange.GetMarkets()chức năng trong hệ thống backtesting. Trước khi gọi bất kỳ chức năng thị trường nào, GetMarkets chỉ trả về dữ liệu thị trường của cặp giao dịch mặc định hiện tại. Sau khi gọi chức năng thị trường, nó trả về dữ liệu thị trường của tất cả các loại yêu cầu. Bạn có thể tham khảo ví dụ kiểm tra sau:

Cácexchange.GetMarkets()hàm trả về một từ điển với một khóa có tên là tên của các loại giao dịch, và cho các sửa đổi tại chỗ được định dạng như một cặp giao dịch, ví dụ:

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

Đối với các sàn giao dịch hợp đồng tương lai, vì có thể có nhiều hợp đồng cho một loại duy nhất, ví dụ:BTC_USDTcác cặp giao dịch, có hợp đồng vĩnh viễn, hợp đồng hàng quý, vv.exchange.GetMarkets()hàm trả về một từ điển với tên khóa của cặp kết hợp với mã hợp đồng, ví dụ:

{
    "BTC_USDT.swap" : {...},     // The key value is the Market structure
    "BTC_USDT.quarter" : {...}, 
    "LTC_USDT.swap" : {...},
    ...
}
  • Cácexchange.GetMarkets()chức năng hỗ trợ giao dịch trực tiếp, hệ thống backtesting.
  • Cácexchange.GetMarkets()chức năng trả về thông tin thị trường chỉ cho các giống được giao dịch trực tuyến trên sàn giao dịch.
  • Cácexchange.GetMarkets()chức năng không hỗ trợ hợp đồng quyền chọn.

Các sàn giao dịch không hỗ trợexchange.GetMarkets()chức năng:

Tên chức năng Không hỗ trợ trao đổi tại chỗ Giao dịch tương lai không được hỗ trợ
GetMarkets Coincheck / Bithumb / BitFlyer

{@struct/Thị trường thị trường}

exchange.GetTickers

Cácexchange.GetTickers()hàm được sử dụng để lấy dữ liệu ticker tổng hợp trao đổi (mảng cấu trúc {@struct/Ticker Ticker}).exchangetrả về dữ liệu ticker cho tất cả các cặp giao dịch khi đó là đối tượng giao dịch tại chỗ;exchangetrả về dữ liệu ticker cho tất cả các hợp đồng khi đó là đối tượng trao đổi tương lai.

Cácexchange.GetTickers()hàm trả về một mảng {@struct/Ticker Ticker} cấu trúc khi nó thành công trong yêu cầu dữ liệu, và null khi nó thất bại. {@struct/Ticker Ticker} mảng, giá trị không

Giao dịch.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());
    }
}

Gọi choexchange.GetTickers()chức năng để thu thập dữ liệu thị trường tổng hợp.

/*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() + "`");
}

Sử dụng đối tượng trao đổi điểm và gọiexchange.GetTickers()trước khi gọi bất kỳ chức năng thị trường nào, GetTickers chỉ trả về dữ liệu ticker của cặp giao dịch mặc định hiện tại. Sau khi gọi chức năng thị trường, nó trả về dữ liệu ticker của tất cả các giống được yêu cầu. Bạn có thể tham khảo ví dụ kiểm tra sau:

  • Chức năng này yêu cầu giao dịch tổng hợp giao diện ticker, không cần thiết lập các cặp giao dịch, mã hợp đồng trước khi gọi. Nó chỉ trả về các ticker của các loại giao dịch trực tuyến trên sàn giao dịch.
  • Hệ thống backtesting hỗ trợ chức năng này.
  • Các đối tượng Exchange không cung cấp giao diện ticker tổng hợp không hỗ trợ chức năng này.
  • Chức năng này không hỗ trợ hợp đồng quyền chọn.

Các sàn giao dịch không hỗ trợexchange.GetTickers()chức năng:

Tên chức năng Không hỗ trợ trao đổi tại chỗ Giao dịch tương lai không được hỗ trợ
GetTickers Zaif / WOO / Gemini / Coincheck / BitFlyer / Bibox Tiền tương lai_WOO / Tiền tương lai_dYdX / Tiền tương lai_Deribit / Tiền tương lai_Bibox / Tiền tương lai_Aevo

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

Thương mại

exchange.Buy

Cácexchange.Buy()chức năng được sử dụng để đặt lệnh mua.Buy()hàm là một hàm thành viên của đối tượng trao đổi {@var/EXCHANGE exchange}.Buy()chức năng hoạt động trên tài khoản trao đổi gắn với đối tượng trao đổiexchangeMục đích của các chức năng thành viên (các phương pháp)exchangeđối tượng chỉ liên quan đếnexchange, và nó sẽ không được lặp lại sau khi tài liệu.

Một đơn đặt hàng thành công trả về ID đơn đặt hàng, một đơn đặt hàng thất bại trả về giá trị null. Thuộc tínhIdcủa cấu trúc lệnh {@struct/Order Order} của nền tảng FMZ bao gồm mã sản phẩm trao đổi và ID đặt hàng ban đầu trao đổi, được tách bằng dấu phẩy tiếng Anh.Idđịnh dạng của cặp giao dịch tại chỗETH_USDTthứ tự của sàn giao dịch OKX là:ETH-USDT,1547130415509278720. Khi gọi choexchange.Buy()chức năng để đặt một lệnh, lệnh trả về giá trịIdlà phù hợp vớiIdthuộc tính của cấu trúc order {@struct/Order Order}.

chuỗi, giá trị không

trao đổi. Mua ((giá, số tiền) trao đổi. Mua ((giá, số tiền,... args)

Cácpricetham số được sử dụng để thiết lập giá lệnh. giá đúng số Cácamounttham số được sử dụng để thiết lập số tiền đặt hàng. số tiền đúng số Các tham số mở rộng có thể xuất thông tin kèm theo vào nhật ký đơn đặt hàng này,argCác thông số có thể được truyền qua nhiều hơn một. arg sai chuỗi, số, bool, đối tượng, mảng, null và bất kỳ loại nào khác được hỗ trợ bởi hệ thống

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

Số thứ tự được trả về bởiexchange.Buy()có thể được sử dụng để truy vấn thông tin đặt hàng và hủy đặt hàng.

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

Khi đặt lệnh cho hợp đồng tương lai tiền điện tử, phải cẩn thận để đảm bảo rằng hướng giao dịch được đặt chính xác, vì sự không phù hợp giữa hướng giao dịch và chức năng giao dịch sẽ dẫn đến lỗi:

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

Lệnh thị trường ngay lập tức.

Khi đặt lệnh cho hợp đồng tương lai, bạn phải chú ý đến việc hướng giao dịch có được đặt đúng không, vì sẽ báo cáo lỗi nếu hướng giao dịch và chức năng giao dịch không phù hợp. Các thông sốpriceđược thiết lập thành-1cho việc đặt lệnh thị trường, đòi hỏi giao diện đặt lệnh của sàn giao dịch để hỗ trợ lệnh thị trường. Khi đặt lệnh thị trường cho các hợp đồng giao ngay tiền điện tử, tham sốamountlà số tiền trong đồng tiền của lệnh. Khi đặt lệnh thị trường cho hợp đồng tương lai tiền điện tử, tham số số tiềnamountlà số lượng hợp đồng. Có một vài sàn giao dịch tiền điện tử không hỗ trợ giao diện lệnh thị trường trong giao dịch trực tiếp. Số lượng lệnh cho lệnh mua thị trường trên một số sàn giao dịch tại chỗ là số lượng đồng xu giao dịch. Xin tham khảoHướng dẫn đặc biệt cho việc trao đổitrong Hướng dẫn sử dụng để biết chi tiết. Nếu bạn đang sử dụng một phiên bản cũ của docker, giá trị trả về của lệnhIdcủaexchange.Buy()chức năng có thể khác với giá trị trả về của lệnhIdđược mô tả trong tài liệu hiện tại.

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

exchange.Sell

Cácexchange.Sell()chức năng được sử dụng để đặt lệnh bán.

Một đơn đặt hàng thành công trả về ID đơn đặt hàng, một đơn đặt hàng thất bại trả về giá trị null.Idcủa cấu trúc lệnh {@struct/Order Order} của nền tảng FMZ bao gồm mã sản phẩm trao đổi và ID đặt hàng ban đầu trao đổi, được tách bằng dấu phẩy tiếng Anh.Idđịnh dạng của cặp giao dịch tại chỗETH_USDTthứ tự của sàn giao dịch OKX là:ETH-USDT,1547130415509278720Khi gọi điện choexchange.Sell()chức năng để đặt một lệnh, lệnh trả về giá trịIdlà phù hợp vớiIdthuộc tính của cấu trúc order {@struct/Order Order}. chuỗi, giá trị không

trao đổi.Bán (giá, số tiền) trao đổi.Bán ((giá, số tiền,... args)

Cácpricetham số được sử dụng để thiết lập giá lệnh. giá đúng số Cácamounttham số được sử dụng để thiết lập số tiền đặt hàng. số tiền đúng số Các tham số mở rộng có thể xuất thông tin kèm theo vào nhật ký đơn đặt hàng này,argCác thông số có thể được truyền qua nhiều hơn một. arg sai chuỗi, số, bool, đối tượng, mảng, null và bất kỳ loại nào khác được hỗ trợ bởi hệ thống

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

Số thứ tự được trả về bởiexchange.Sell()có thể được sử dụng để truy vấn thông tin đơn đặt hàng và hủy bỏ đơn đặt hàng.

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

Khi đặt lệnh cho hợp đồng tương lai tiền điện tử, phải cẩn thận để đảm bảo rằng hướng giao dịch được đặt chính xác, vì sự không phù hợp giữa hướng giao dịch và chức năng giao dịch sẽ dẫn đến lỗi:

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

Lệnh thị trường ngay lập tức.

Khi đặt đơn đặt hàng cho hợp đồng tương lai, bạn phải chú ý đến việc hướng giao dịch có được đặt đúng không, vì sẽ báo cáo lỗi nếu hướng giao dịch và chức năng giao dịch không phù hợp. Số tiền đặt hàng cho hợp đồng tương lai tiền điện tử là số hợp đồng nếu không được chỉ định. Các thông sốpriceđược thiết lập thành-1để đặt lệnh thị trường, đòi hỏi giao diện đặt lệnh của sàn giao dịch để hỗ trợ lệnh thị trường. Khi đặt lệnh thị trường cho các hợp đồng giao ngay tiền điện tử, tham số số tiềnamountlà số tiền trong tiền tệ giao dịch. Khi đặt lệnh thị trường cho hợp đồng tương lai tiền điện tử, tham số số tiềnamountlà số hợp đồng. Có một vài sàn giao dịch tiền điện tử không hỗ trợ giao diện lệnh thị trường trong giao dịch trực tiếp. Nếu bạn đang sử dụng một phiên bản cũ của docker, giá trị trả về của lệnhIdcủaexchange.Sell()chức năng có thể khác với giá trị trả về của lệnhIdđược mô tả trong tài liệu hiện tại.

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

exchange.CreateOrder

Cácexchange.CreateOrder()chức năng được sử dụng để đặt hàng.

Nếu lệnh được đặt thành công, ID lệnh được trả về; nếu lệnh thất bại, một giá trị null được trả về.Idcủa cấu trúc lệnh {@struct/Order Order} của nền tảng FMZ bao gồm mã sản phẩm trao đổi và ID đặt hàng ban đầu trao đổi, được tách bằng dấu phẩy tiếng Anh.IdĐịnh dạng lệnh của cặp giao dịch tại chỗETH_USDTcủa sàn OKX là:ETH-USDT,1547130415509278720Khi gọi điện choexchange.CreateOrder(symbol, side, price, amount)chức năng đặt lệnh, giá trị trả về của lệnhIdlà phù hợp vớiIdthuộc tính của cấu trúc {@struct/Order Order}. chuỗi, giá trị không

exchange.CreateOrder (( biểu tượng, bên, giá, số tiền) exchange.CreateOrder (( biểu tượng, bên, giá, số tiền,...args)

Các thông sốsymbolđược sử dụng để chỉ định cặp giao dịch cụ thể và mã hợp đồng của lệnh.exchange.CreateOrder(symbol, side, price, amount)chức năng đặt hàng,exchangelà đối tượng trao đổi tại chỗ. Nếu tiền tệ đặt hàng là USDT và tiền tệ giao dịch là BTC, tham sốsymbollà:"BTC_USDT", trong định dạng cặp giao dịch được xác định bởi nền tảng FMZ.exchange.CreateOrder(symbol, side, price, amount)chức năng đặt hàng,exchangelà đối tượng trao đổi tương lai. Nếu lệnh là lệnh hợp đồng vĩnh viễn tiêu chuẩn U của BTCs, tham sốsymbollà:"BTC_USDT.swap", và định dạng là một sự kết hợp củacặp giao dịchmã hợp đồngđược xác định bởi nền tảng FMZ, được tách bởi ký tự ..exchange.CreateOrder(symbol, side, price, amount)chức năng đặt hàng,exchangelà đối tượng trao đổi tương lai. Nếu lệnh là lệnh hợp đồng quyền chọn tiêu chuẩn U của BTCs, tham sốsymbollà:"BTC_USDT.BTC-240108-40000-C"(lấy Binance Option BTC-240108-40000-C làm ví dụ), và định dạng là một sự kết hợp củacặp giao dịchđược xác định bởi nền tảng FMZ và mã hợp đồng tùy chọn cụ thể được xác định bởi sàn giao dịch, được tách bằng ký tự .. biểu tượng đúng chuỗi Cácsidetham số được sử dụng để chỉ định hướng giao dịch của lệnh. Đối với các đối tượng trao đổi tại chỗ, các giá trị tùy chọn củasidecác tham số là:buy, sell. buycó nghĩa là mua, vàsellcó nghĩa là bán. Đối với các đối tượng giao dịch tương lai, các giá trị tùy chọn củasidecác tham số là:buy, closebuy, sell, closesell. buycó nghĩa là mở một vị trí dài,closebuycó nghĩa là đóng một vị trí dài,sellcó nghĩa là mở một vị trí ngắn, vàclosesellcó nghĩa là đóng một vị trí ngắn.

mặt đúng chuỗi Các thông sốpriceđược sử dụng để thiết lập giá của lệnh. Giá -1 cho thấy lệnh là lệnh thị trường. giá đúng số Các thông sốamountđược sử dụng để thiết lập số lượng lệnh. Xin lưu ý rằng khi lệnh là một lệnh mua thị trường, số lượng lệnh là số tiền mua; số lượng lệnh của lệnh mua thị trường của một số sàn giao dịch tức thời là số lượng tiền xu giao dịch.Hướng dẫn đặc biệt cho việc trao đổitrong Hướng dẫn người dùng. số tiền đúng số Các thông số mở rộng có thể xuất thêm thông tin cho nhật ký đơn đặt hàng này.argCác thông số có thể được truyền. arg sai Bất kỳ loại nào được hệ thống hỗ trợ, chẳng hạn như chuỗi, số, bool, đối tượng, mảng, giá trị không, v.v.

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

Các đối tượng giao dịch tại chỗ và các đối tượng giao dịch tương lai gọi làexchange.CreateOrder()chức năng để đặt hàng.

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

exchange.CancelOrder

Cácexchange.CancelOrder()chức năng được sử dụng để hủy lệnh. Thuộc tínhIdcủa cấu trúc lệnh {@struct/Order Order} của nền tảng FMZ bao gồm mã sản phẩm trao đổi và ID đặt hàng ban đầu trao đổi, được tách bằng dấu phẩy tiếng Anh.IdĐịnh dạng lệnh của cặp giao dịch tại chỗETH_USDTcủa sàn OKX là:ETH-USDT,1547130415509278720. Các thông sốorderIdqua khi gọi choexchange.CancelOrder()chức năng để hủy một lệnh là phù hợp vớiIdthuộc tính của cấu trúc {@struct/Order Order}.

Cácexchange.CancelOrder()hàm trả về một giá trị thực, ví dụtruenghĩa là yêu cầu hủy lệnh đã được gửi thành công. Nếu nó trả về một giá trị sai, chẳng hạn nhưfalseGiá trị trả về chỉ đại diện cho sự thành công hoặc thất bại của yêu cầu được gửi để xác định xem sàn giao dịch hủy lệnh hay không. Bạn có thể gọiexchange.GetOrders()để xác định xem lệnh có bị hủy hay không. bool

trao đổi.Hủy đơn đặt hàng (định dạng đơn đặt hàng) trao đổi.Hủy đơn đặt hàng ((định dạng đơn đặt hàng,...args)

CácorderIdtham số được sử dụng để xác định lệnh được hủy bỏ. Đặt hàng đúng số, chuỗi Các thông số mở rộng, bạn có thể xuất thông tin đính kèm vào nhật ký rút tiền này,argCác thông số có thể được truyền qua nhiều hơn một. arg sai chuỗi, số, bool, đối tượng, mảng, null và bất kỳ loại nào khác được hỗ trợ bởi hệ thống

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

Hủy lệnh đi.

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

Các chức năng FMZ API có thể tạo ra các chức năng log output như:Log(), exchange.Buy(), exchange.CancelOrder()có thể được theo sau bởi một số thông số đầu ra kèm theo sau các thông số cần thiết. Ví dụ:exchange.CancelOrder(orders[i].Id, orders[i]), để khi hủy lệnh mà ID làorders[i].Id, các thông tin lệnh được xuất ra với nó.orders[i].

Nếu bạn đang sử dụng một phiên bản cũ hơn của docker, tham số orderId của hàm exchange.CancelOrder( có thể khác với orderId được mô tả trong tài liệu hiện tại.

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

exchange.GetOrder

Cácexchange.GetOrder()chức năng được sử dụng để có được thông tin đặt hàng.

truy vấn chi tiết thứ tự theo số thứ tự, và trả về cấu trúc {@struct/Order Order} nếu truy vấn thành công, hoặc trả về null nếu truy vấn thất bại. {@struct/Order Order}, giá trị không

trao đổi.GetOrder ((orderId)

CácorderIdtham số được sử dụng để xác định thứ tự được truy vấn. Thuộc tínhIdcủa cấu trúc lệnh {@struct/Order Order} của nền tảng FMZ bao gồm mã sản phẩm trao đổi và ID đặt hàng ban đầu trao đổi, được tách bằng dấu phẩy tiếng Anh.IdĐịnh dạng lệnh của cặp giao dịch tại chỗETH_USDTcủa sàn OKX là:ETH-USDT,1547130415509278720. Các thông sốorderIdqua khi gọi choexchange.GetOrder()chức năng để truy vấn một lệnh là phù hợp vớiIdthuộc tính của cấu trúc {@struct/Order Order}.

Đặt hàng đúng chuỗi

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

Cácexchange.GetOrder()chức năng không được hỗ trợ bởi một số trao đổi.AvgPricethuộc tính trong cấu trúc {@struct/Order Order} của giá trị trả về là giá trung bình của giao dịch. Một số sàn giao dịch không hỗ trợ trường này, và nếu không, nó được đặt thành 0. Nếu bạn đang sử dụng một phiên bản cũ của docker,orderIdtham số củaexchange.GetOrder()chức năng có thể khác vớiorderIdđược mô tả trong tài liệu hiện tại. Các sàn giao dịch không hỗ trợexchange.GetOrder()chức năng:

Tên chức năng Không hỗ trợ trao đổi tại chỗ Giao dịch tương lai không được hỗ trợ
GetOrder Zaif / Coincheck / Bitstamp

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

exchange.GetOrders

Cácexchange.GetOrders()chức năng được sử dụng để có được các đơn đặt hàng.

Cácexchange.GetOrders()hàm trả về một mảng cấu trúc {@struct/Order Order} nếu yêu cầu dữ liệu thành công, và nó trả về giá trị không nếu yêu cầu dữ liệu thất bại. {@struct/Order Order} mảng, giá trị không

trao đổi.GetOrders ((() trao đổi.GetOrders (bản biểu tượng)

Các thông sốsymbolđược sử dụng để thiết lậpbiểu tượng giao dịchhoặcphạm vi ký hiệu giao dịchđể được thẩm vấn. Đối với các đối tượng trao đổi tại chỗ, nếusymbolNếu tham số không được thông qua, dữ liệu đặt hàng chưa hoàn thành của tất cả các sản phẩm tại chỗ sẽ được yêu cầu. Đối với các đối tượng giao dịch tương lai, nếusymbolNếu tham số không được truyền, mặc định là yêu cầu dữ liệu lệnh chưa hoàn thành của tất cả các loại trong phạm vi kích thước của cặp giao dịch hiện tại và mã hợp đồng.

biểu tượng sai chuỗi

/*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;
}

Sử dụng đối tượng giao dịch tại chỗ để đặt lệnh mua cho nhiều cặp giao dịch khác nhau ở một nửa giá hiện tại, và sau đó truy vấn thông tin lệnh đang tồn tại.

/*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;
}

Sử dụng các đối tượng trao đổi tương lai để đặt lệnh cho nhiều cặp giao dịch và mã hợp đồng khác nhau. Đặt lệnh ở mức giá xa với giá đối tác, giữ lệnh trong trạng thái chưa hoàn thành và truy vấn lệnh theo nhiều cách.

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

Khi gọi choexchange.GetOrders()chức năng, đi vàoSymboltham số để yêu cầu dữ liệu lệnh cho một cặp giao dịch cụ thể và mã hợp đồng.

TrongGetOrderschức năng, các kịch bản sử dụng của tham số biểu tượng được tóm tắt như sau:

Phân loại đối tượng Exchange biểu tượng Parameter Phạm vi truy vấn Nhận xét
Địa điểm Không vượt qua tham số biểu tượng Tìm kiếm tất cả các cặp giao dịch tại chỗ Đối với tất cả các kịch bản gọi, nếu giao diện trao đổi không hỗ trợ nó, một lỗi sẽ được báo cáo và một giá trị null sẽ được trả về.
Địa điểm Xác định loại giao dịch, tham số biểu tượng là: BTC_USDT Tìm kiếm cặp giao dịch BTC_USDT đã chỉ định Đối với các đối tượng trao đổi tại chỗ, định dạng tham số biểu tượng là: BTC_USDT
Tiền tương lai Không vượt qua tham số biểu tượng Tìm kiếm tất cả các sản phẩm giao dịch trong phạm vi kích thước cặp giao dịch và mã hợp đồng hiện tại Nếu cặp giao dịch hiện tại là BTC_USDT và mã hợp đồng là swap, tất cả các hợp đồng vĩnh viễn được ký quỹ bằng USDT sẽ được truy vấn.GetOrders("USDT.swap")
Tiền tương lai Xác định loại giao dịch, tham số biểu tượng là: BTC_USDT.swap Tìm kiếm hợp đồng vĩnh viễn dựa trên USDT cho một BTC cụ thể Đối với các đối tượng giao dịch tương lai, định dạng ký hiệu tham số là: sự kết hợp củacặp giao dịchmã hợp đồngđược xác định bởi nền tảng FMZ, được tách bởi các ký tự"..
Tiền tương lai Xác định phạm vi các sản phẩm giao dịch, tham số biểu tượng là: USDT.swap Tìm kiếm tất cả các hợp đồng vĩnh viễn dựa trên USDT -
Các sàn giao dịch tương lai hỗ trợ các tùy chọn Không vượt qua tham số biểu tượng Tìm kiếm tất cả các hợp đồng quyền chọn trong phạm vi kích thước cặp giao dịch hiện tại Nếu cặp giao dịch hiện tại là BTC_USDT, hợp đồng được thiết lập thành hợp đồng quyền chọn, ví dụ, hợp đồng quyền chọn Binance: BTC-240108-40000-C
Các sàn giao dịch tương lai hỗ trợ các tùy chọn Xác định các sản phẩm giao dịch cụ thể truy vấn hợp đồng tùy chọn được chỉ định Ví dụ, đối với Binance Futures Exchange, tham số biểu tượng là: BTC_USDT.BTC-240108-40000-C
Các sàn giao dịch tương lai hỗ trợ các tùy chọn Xác định phạm vi các sản phẩm giao dịch, tham số biểu tượng là: USDT.option Tìm kiếm tất cả các hợp đồng quyền chọn dựa trên USDT -

TrongGetOrderschức năng, các giao dịch tương lai đối tượng truy vấn phạm vi kích thước được tóm tắt như sau:

biểu tượng Parameter Định nghĩa phạm vi yêu cầu Nhận xét
USDT.swap Phạm vi hợp đồng vĩnh viễn dựa trên USDT. Đối với

kích thước không được hỗ trợ bởi giao diện API trao đổi, một lỗi sẽ được báo cáo và một giá trị null sẽ được trả về khi gọi. USDT.futures. USDT dựa trên hợp đồng giao hàng. ∙∙ USD.swap ∙ ∙ Dải tiền tệ dựa trên vĩnh cửu hợp đồng. USD.futures. Ranh giới giao hàng dựa trên tiền tệ hợp đồng. USDT.option. USDT-based options contract range. USD.option.Dân tệ dựa trên phạm vi hợp đồng tùy chọn. USDT.futures_combo Một loạt các sự kết hợp CFD. Futures_Deribit Exchange. Một loạt các hợp đồng phân phối ký quỹ hỗn hợp. Futures_Kraken Exchange. Một loạt các hợp đồng vĩnh cửu có biên độ hỗn hợp. Ứng dụng trao đổi tương lai

Khi tài khoản được đại diện bởi đối tượng trao đổiexchangekhông có lệnh đang chờ trongphạm vi truy vấnhoặcCác công cụ giao dịch cụ thể(lệnh hoạt động trong trạng thái chưa được thực hiện), gọi hàm này trả về một mảng trống, tức là:[]. Các sàn giao dịch sau đây yêu cầu công cụ truyền vào tham số công cụ khi truy vấn các lệnh chưa hoàn thành hiện tại. Khi gọi hàm GetOrders với các sàn giao dịch này, nếu tham số công cụ không được truyền vào, chỉ yêu cầu các lệnh chưa hoàn thành của công cụ hiện tại, chứ không phải là các lệnh chưa hoàn thành của tất cả các công cụ (vì giao diện giao dịch không hỗ trợ điều này). Zaif, MEXC, LBank, Korbit, Coinw, BitMart, Bithumb, BitFlyer, BigONE.

Các sàn giao dịch không hỗ trợexchange.GetOrders()chức năng:

Tên chức năng Không hỗ trợ trao đổi tại chỗ Giao dịch tương lai không được hỗ trợ
GetOrders Futures_Bibox

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

exchange.GetHistoryOrders

Cácexchange.GetHistoryOrders()chức năng được sử dụng để có được cặp giao dịch hiện tại, các lệnh lịch sử cho các hợp đồng; nó hỗ trợ xác định các loại giao dịch cụ thể.

Cácexchange.GetHistoryOrders()hàm trả về một mảng cấu trúc {@struct/Order Order} nếu yêu cầu dữ liệu thành công, và null nếu yêu cầu thất bại. {@struct/Order Order} mảng, giá trị không

exchange.GetHistoryOrders (() exchange.GetHistoryOrders (tượng hiệu) exchange.GetHistoryOrders (bản tượng, kể từ) exchange.GetHistoryOrders (( biểu tượng, từ, giới hạn) trao đổi.GetHistoryOrders (từ) exchange.GetHistoryOrders ((từ khi, giới hạn)

CácsymbolCác tham số được sử dụng để xác định các biểu tượng thương mại.BTC_USDTCặp giao dịch, ví dụ, khiexchangelà một đối tượng trao đổi tại chỗ, định dạng tham số chosymbolBTC_USDTNếu đó là một đối tượng giao dịch tương lai, lấy hợp đồng vĩnh viễn làm ví dụ, định dạng tham số chosymbollà:BTC_USDT.swap. Nếu bạn đang truy vấn dữ liệu lệnh của hợp đồng quyền chọn, đặt tham sốsymbolđến"BTC_USDT.BTC-240108-40000-C"(lấy Binance Option BTC-240108-40000-C làm ví dụ).cặp giao dịchđược xác định bởi nền tảng FMZ và mã hợp đồng tùy chọn cụ thể được xác định bởi sàn giao dịch, được tách bằng ký tự .. Nếu tham số này không được truyền, dữ liệu lệnh của cặp giao dịch và mã hợp đồng được thiết lập hiện tại sẽ được yêu cầu theo mặc định.

biểu tượng sai chuỗi Cácsincetham số được sử dụng để chỉ định thời gian bắt đầu của truy vấn trong milliseconds. kể từ khi sai số Cáclimittham số được sử dụng để xác định số lượng lệnh để truy vấn. giới hạn sai số

function main() {
    var historyOrders = exchange.GetHistoryOrders()
    Log(historyOrders)
}
def main():
    historyOrders = exchange.GetHistoryOrders()
    Log(historyOrders)
void main() {
    auto historyOrders = exchange.GetHistoryOrders();
    Log(historyOrders);
}
  • Khi nào?symbol, since, limitcác tham số không được chỉ định, truy vấn mặc định là cặp giao dịch hiện tại, các lệnh lịch sử của hợp đồng. truy vấn các lệnh lịch sử trong một phạm vi nhất định gần nhất với thời gian hiện tại, phạm vi truy vấn phụ thuộc vào phạm vi truy vấn duy nhất của giao diện trao đổi.
  • KhisymbolNếu tham số được chỉ định, truy vấn lịch sử lệnh cho loại giao dịch được thiết lập.
  • Khisincetham số được chỉ định, truy vấn theo hướng thời gian hiện tại sử dụngsinceThời gian đóng dấu là thời gian bắt đầu.
  • Nếulimittham số được chỉ định, truy vấn được trả về sau một số lượng đủ các mục.
  • Chức năng này chỉ được hỗ trợ cho các trao đổi cung cấp giao diện truy vấn lệnh lịch sử.

Các sàn giao dịch không hỗ trợexchange.GetHistoryOrders()chức năng:

Tên chức năng Không hỗ trợ trao đổi tại chỗ Giao dịch tương lai không được hỗ trợ
GetHistoryOrders Zaif / Upbit / Coincheck / Bitstamp / Bithumb / BitFlyer / BigONE Futures_dYdX / Futures_Bibox / Futures_ApolloX

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

exchange.SetPrecision

exchange.SetPrecision()chức năng được sử dụng để thiết lập độ chính xác củaexchangeđối tượng trao đổigiá cảSố tiền đặt hàng, sau khi cài đặt, hệ thống sẽ bỏ qua dữ liệu dư thừa tự động.

exchange.SetPrecision ((pricePrecision, amountPrecision)

CácpricePrecisiontham số được sử dụng để kiểm soát độ chính xác của dữ liệu giá. Giá chính xác đúng số CácamountPrecisiontham số được sử dụng để kiểm soát độ chính xác của số lượng dữ liệu được đặt hàng. số tiềnChính xác đúng số

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

Hệ thống backtesting không hỗ trợ chức năng này và độ chính xác số của hệ thống backtesting được xử lý tự động.

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

exchange.SetRate

Đặt tỷ giá hối đoái hiện tại của đối tượng trao đổi.

exchange.SetRate (tỷ lệ)

Cácratetham số được sử dụng để xác định tỷ giá hối đoái chuyển đổi. tỷ lệ đúng số

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

Nếu giá trị tỷ giá hối đoái đã được thiết lập bằng cách sử dụngexchange.SetRate()Sau đó tất cả các thông tin giá như tickers, chiều sâu, giá đặt hàng, vv cho trao đổi đại diện cho hiện tạiexchangeđối tượng trao đổi sẽ được chuyển đổi bằng cách nhân nó với tỷ giá hối đoái đặt ra của 7.exchangelà một trao đổi với đô la Mỹ như là đồng tiền mệnh giá.exchange.SetRate(7), tất cả giá trên thị trường trực tiếp sẽ được chuyển đổi thành giá gần vớiCNYmệnh giá bằng cách nhân với 7.

{@fun/Market/exchange.GetRate exchange.GetRate}

exchange.IO

Cácexchange.IO()hàm được sử dụng cho các cuộc gọi giao diện khác liên quan đến đối tượng trao đổi.

Cácexchange.IO()hàm gọi các giao diện khác liên quan đến đối tượng trao đổi, trả về dữ liệu phản hồi được yêu cầu trên một cuộc gọi thành công và nó trả về null trên một cuộc gọi thất bại. chuỗi, số, bool, đối tượng, mảng, null, và bất kỳ loại khác được hỗ trợ bởi hệ thống

exchange.IO(k,...args)

Cácktham số được sử dụng để thiết lập loại cuộc gọi, với các giá trị tùy chọn"api", "currency", "base", "trade_margin", "trade_normal", "public_base", "mbase", selfTradePreventionMode, simulate, cross, dual, unifiedvà như vậy. k đúng chuỗi Các thông số mở rộng, được thông qua theo kịch bản gọi cụ thể,argCác tham số có thể được truyền nhiều hơn một.exchange.IO()Số lượng và loại tham số cho cácexchange.IO()chức năng là không xác định. arg đúng chuỗi, số, bool, đối tượng, mảng, null và bất kỳ loại nào khác được hỗ trợ bởi hệ thống

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

Sử dụngexchange.IO("api", httpMethod, resource, params, raw)hình thức gọi củaexchange.IO()Điều này sẽ cho phép bạn mở rộng chức năng không được thêm vào nền tảng FMZ.POSTyêu cầu không yêu cầu bạn phải lo lắng về mã hóa, ký kết, hoặc xác minh các thông số, mà đã được xử lý bởi FMZ ở phía dưới, miễn là bạn điền vào các thông số tương ứng.OKX Exchangehợp đồng tương lai, và sử dụng các thông sốrawđể thông qua các thông số thứ tự:

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

Nếu giá trị khóa trongparamstham số (tức là, tham số yêu cầu HTTP) là một chuỗi, nó cần phải được viết bằng dấu ngoặc kép đơn (tức là, ký hiệu ') xung quanh giá trị tham số để bọc giá trị tham số.

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

Nó hỗ trợ truyền vào đầy đủ url tham số mà có thể bỏ qua các hoạt động của chuyển đổi địa chỉ cơ sở (gọiexchange.SetBase()chức năng).

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

Ví dụ về một cuộc gọi mà không có tham số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());
}

Chuyển đổi cặp giao dịch của trao đổi hiện tại, để nó sẽ chuyển đổi cặp giao dịch được cấu hình bởi mãkhi tạo giao dịch trực tiếphoặctại backtest.

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

Đối với các sàn giao dịch với địa chỉ cơ sở khác nhau cho giao diện ticker và giao diện giao dịch, ví dụ, Bitfinex Futures có hai địa chỉ, một cho giao diện ticker và một cho giao diện giao dịch.exchange.SetBase("xxx"). Bitfinex tương lai chuyển đổi địa chỉ cơ sở giao diện công cộng sử dụngexchange.IO("mbase", "xxx").

I. Đối với các sàn giao dịch tập trung vào tiền điện tử, các cuộc gọi giao diện API khác không được đóng gói đồng nhất, với tham sốkđược thiết lập thành"api":

exchange.IO("api", httpMethod, resource, params, raw)
  • httpMethod : Các tham số là một kiểu chuỗi, điền vào kiểu yêu cầuPOST, GET, vv
  • tài nguyên: Parameter là kiểu chuỗi và điền vào đường dẫn yêu cầu; Nó hỗ trợ việc sử dụng các đường dẫn yêu cầu hoàn chỉnh, xem ví dụ tham chiếu để biết chi tiết.
  • params: Parameter là một kiểu chuỗi, đầy các tham số yêu cầu, được mã hóa bằngURL.
  • raw: Các tham số là các tham số chuỗi thô và có thể được bỏ qua.

Cácexchange.IO("api", httpMethod, resource, params, raw)function call sẽ truy cập giao diện trao đổi và trả về null nếu cuộc gọi thất bại và xảy ra lỗi. Chỉ có thương mại thực sự hỗ trợ gọiexchange.IO("api", httpMethod, resource, params, raw) function.

II. Đối với việc chuyển đổi cặp giao dịch, tham sốkđược thiết lập thành"currency":

exchange.IO("currency", currency)
  • Tiền tệ: Parameter là một kiểu chuỗi với định dạng chữ cái lớn đồng nhất, sử dụng dấu chân để táchbaseCurrencytừquoteCurrency, nhưBTC_USDT.

    1. Hệ thống backtesting bây giờ hỗ trợ chuyển đổi các cặp giao dịch (chỉ dành cho các đối tượng trao đổi giao ngay tiền kỹ thuật số), khi backtesting, bạn cần phải chú ý rằng bạn chỉ có thể chuyển sang các cặp giao dịch với cùng một loại tiền tệ, ví dụ, cặp giao dịch hiện tại làETH_BTCchỉ có thể chuyển sangLTC_BTC, không phảiLTC_USDT.
    2. Đối với các hợp đồng tương lai tiền điện tử, đối tượng trao đổi chuyển đổi cặp giao dịch và mã hợp đồng cần phải được đặt lại để xác định hợp đồng nào được giao dịch.
    3. Sử dụng {@fun/Account/exchange.SetCurrency exchange.SetCurrency} chức năng để chuyển đổi các cặp giao dịch là chính xác giống như sử dụngexchange.IO("currency", currency)để đổi cặp giao dịch.

III. Được sử dụng để chuyển đổi chế độ tài khoản đòn bẩy đối tượng trao đổi giao dịch tiền điện tử tại chỗ:

  • Các thông sốkđược thiết lập thành"trade_margin"để chuyển sang chế độ tài khoản đòn bẩy tại chỗ. đặt lệnh và nhận tài sản tài khoản sẽ truy cập giao diện đòn bẩy tại chỗ của sàn giao dịch. Nếu sàn giao dịch phân biệt giữa ký quỹ đầy đủ và ký quỹ tách biệt trong đòn bẩy tại chỗ, sử dụng:exchange.IO("trade_super_margin")để chuyển sang ký quỹ đầy đủ cho tài khoản đòn bẩy, vàexchange.IO("trade_margin")để chuyển sang ký quỹ tách biệt cho tài khoản đòn bẩy.
  • Parameterkđược thiết lập thành"trade_normal"để chuyển trở lại chế độ tài khoản giao ngay bình thường.

Các sàn giao dịch tại chỗ hỗ trợ chuyển đổi giữa các mô hình tài khoản đòn bẩy:

Chuyển đổi Nhận xét đặc biệt
OKX Các cặp giao dịch trong chế độ tài khoản đòn bẩy khác với các cặp giao dịch bình thường, một số cặp giao dịch có thể không có chúng.exchange.IO("trade_super_margin")để chuyển sang vị trí đầy đủ cho các tài khoản đòn bẩy và sử dụngexchange.IO("trade_margin")để chuyển sang vị trí theo vị trí.trade_normalđể chuyển sang chế độ điểm bình thường.exchange.IO("tdMode", "cross")để chỉ định trực tiếp chế độ đòn bẩy.
Huobi Các cặp giao dịch chế độ tài khoản đòn bẩy khác với các cặp giao dịch bình thường, một số cặp giao dịch có thể không có chúng. Có toàn bộ vị trí và vị trí theo vị trí trong tài khoản đòn bẩy Huobi. Sử dụngtrade_marginđể chuyển sang tài khoản đòn bẩy theo vị trí, sử dụngtrade_super_marginđể chuyển sang tài khoản đòn bẩy vị trí đầy đủ.trade_normalđể chuyển sang chế độ tiền tệ-tiền tệ bình thường.
Binance Chế độ tài khoản đòn bẩy được chia thành vị trí theo vị trí và vị trí đầy đủ, sử dụngtrade_marginđể chuyển sang vị trí theo vị trí, sử dụngtrade_super_marginđể chuyển sang vị trí đầy đủ, sử dụngtrade_normalđể chuyển sang chế độ tiền tệ-tiền tệ bình thường.
GateIO Chế độ tài khoản đòn bẩy được chia thành vị trí theo vị trí và vị trí đầy đủ, sử dụngtrade_marginđể chuyển sang vị trí theo vị trí, sử dụngtrade_super_marginđể chuyển sang vị trí đầy đủ, sử dụngtrade_normalđể chuyển sang chế độ tiền tệ-tiền tệ bình thường.
AscendEx Sử dụngexchange.IO("trade_margin")để chuyển sang chế độ tài khoản đòn bẩy vàexchange.IO("trade_normal")để chuyển trở lại chế độ tài khoản bình thường.
WOO Sử dụngexchange.IO("trade_margin")để chuyển sang chế độ tài khoản đòn bẩy vàexchange.IO("trade_normal")để chuyển trở lại chế độ tài khoản bình thường.
CoinEx Sử dụngexchange.IO("trade_margin")để chuyển sang chế độ tài khoản đòn bẩy vàexchange.IO("trade_normal")để chuyển trở lại chế độ tài khoản bình thường.

IV. Các chức năng chuyển đổi khác:Nhìn xem.exchange.IO()chức năng choCác chức năng chuyển đổi kháctrong Hướng dẫn sử dụng.

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

exchange.Log

Cácexchange.Log()function được sử dụng để xuất bản nhật ký đặt hàng và rút tiền trong khu vực cột nhật ký. Khi được gọi, không có lệnh được đặt, chỉ có nhật ký giao dịch được xuất và ghi lại.

giao dịch.Log ((đơn đặt hàngLoại, giá, số tiền) trao đổi.Log ((đơn đặt hàngLoại, giá, số tiền,... args)

CácorderTypetham số được sử dụng để thiết lập kiểu nhật ký đầu ra, các giá trị tùy chọn là {@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}. orderLoại đúng số Cácpricetham số được sử dụng để thiết lập giá hiển thị trong nhật ký đầu ra. giá đúng số Cácamounttham số được sử dụng để thiết lập số lượng đơn đặt hàng được hiển thị trong nhật ký đầu ra. số tiền đúng số Các thông số mở rộng có thể xuất thông tin kèm theo vào nhật ký này,argCác thông số có thể được truyền qua nhiều hơn một. arg sai chuỗi, số, bool, đối tượng, mảng, null và bất kỳ loại nào khác được hỗ trợ bởi hệ thống

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

Sử dụngexchange.Log(orderType, price, amount)Một trong những kịch bản phổ biến nhất là sử dụng {@fun/Trade/exchange.IOexchange.IO} chức năng để truy cập giao diện trao đổi để tạo ra các lệnh có điều kiện, nhưng sử dụngexchange.IO()chức năng không xuất thông tin nhật ký giao dịch trong bản ghi nhật ký giao dịch trực tiếp.exchange.Log()chức năng có thể được sử dụng để bổ sung vào nhật ký đầu ra để ghi lại thông tin đặt hàng, và điều tương tự cũng đúng với các hoạt động rút lệnh.

KhiorderTypetham số làLOG_TYPE_CANCEL, cácpricetham số là thứ tự Id của lệnh rút, được sử dụng để in nhật ký rút khi lệnh được rút trực tiếp bằng cách sử dụngexchange.IO()chức năng.exchange.Log()function là một hàm thành viên của đối tượng trao đổi {@var/EXCHANGE exchange}, khác với hàm toàn cầu {@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

Cácexchange.Encode()chức năng được sử dụng để tính toán mã hóa chữ ký.

Cácexchange.Encode()hàm trả về mã hóa giá trị băm được tính toán. chuỗi

exchange.Encode ((algo, inputFormat, outputFormat, data) exchange.Encode ((algo, inputFormat, outputFormat, data, keyFormat, key)

Các thông sốalgolà thuật toán được sử dụng để tính toán mã hóa. Các cài đặt được hỗ trợ là: raw (không sử dụng thuật toán), 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.1288, blake2s.256algocũng hỗ trợ: text.encoder.utf8, text.decoder.utf8, text.encoder.gbk, text.decoder.gbk, để mã hóa và giải mã chuỗi.algocũng hỗ trợ: thuật toán ed25519. Nó hỗ trợ việc sử dụng các thuật toán băm khác nhau, ví dụ như tham sốalgocó thể được viết như ed25519.md5, ed25519.sha512, v.v.ed25519.seedtính toán. algo đúng chuỗi Sử dụng để xác định định dạng dữ liệu củadatacác tham số.inputFormattham số có thể được đặt thành một trong: raw, hex, base64, và string. raw có nghĩa là dữ liệu là dữ liệu thô, hex có nghĩa là dữ liệu làhexđược mã hóa, base64 có nghĩa là dữ liệu làbase64được mã hóa, và string có nghĩa là dữ liệu là một chuỗi. inputFormat đúng chuỗi Sử dụng để xác định định dạng dữ liệu đầu ra.outputFormattham số hỗ trợ các thiết lập sau: raw, hex, base64, string. raw có nghĩa là dữ liệu là dữ liệu thô, hex có nghĩa là dữ liệu làhexđược mã hóa, base64 có nghĩa là dữ liệu làbase64được mã hóa, và string có nghĩa là dữ liệu là một chuỗi. outputFormat đúng chuỗi Các thông sốdatalà dữ liệu được xử lý. dữ liệu đúng chuỗi Sử dụng để xác định định dạng dữ liệu củakeycác tham số.keytham số có thể được đặt thành một trong: raw, hex, base64, và string. raw có nghĩa là dữ liệu là dữ liệu thô, hex có nghĩa là dữ liệu làhexđược mã hóa, base64 có nghĩa là dữ liệu làbase64được mã hóa, và string có nghĩa là dữ liệu là một chuỗi. keyFormat sai chuỗi Cáckeytham số được sử dụng để chỉ định khóa được sử dụng trong tính toán chữ ký, và nó có thể được sử dụng như một chuỗi văn bản thuần túy."{{accesskey}}", "{{secretkey}}"để đề cập đếnaccessKeysecretKeyđược cấu hình trong {@var/EXCHANGE exchange} đối tượng trao đổi. chìa khóa sai chuỗi

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"];
        }
    }
}

Ví dụ về việc đẩy thay đổi vị trí BitMEX (chỉ dẫn wss):

Chỉ có thương mại thực sự hỗ trợ gọiexchange.Encode()chức năng."{{accesskey}}", "{{secretkey}}"tham chiếu chỉ có giá trị khiexchange.Encode()chức năng được sử dụng.

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

exchange.Go

Các chức năng hỗ trợ không đồng bộ đa luồng có thể biến các hoạt động của tất cả các chức năng được hỗ trợ thành thực thi đồng bộ không đồng bộ.

Cácexchange.Go()hàm trả về một đối tượng đồng thời ngay lập tức, và bạn có thể sử dụngwait()phương pháp của đối tượng đồng thời đó để có được kết quả của yêu cầu đồng thời. đối tượng

trao đổi.Go ( phương pháp) trao đổi.Go ((phương pháp,... args)

Cácmethodtham số được sử dụng để chỉ định tên của hàm đồng thời. Lưu ý rằng tham số là một chuỗi tên hàm, không phải là tham chiếu hàm. phương pháp đúng chuỗi Các thông số đếnđồng thời thực hiện các chức năng, có thể có nhiều hơn một tham sốarg. Loại và số tham sốargphụ thuộc vào các thông số củachức năng thực thi đồng thời. arg sai chuỗi, số, bool, đối tượng, mảng, hàm, null, và tất cả các loại khác được hỗ trợ bởi hệ thống

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()ví dụ sử dụng hàm, để xác địnhundefinedsử dụngtypeof(xx) === "undefined", bởi vìnull == undefinedlà hợp lệ trong 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);
}

Gọi chowait()phương pháp trên một đối tượng đồng thời đã được phát hành sẽ báo cáo một lỗi:

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

Truy cập đồng thời đến nhiều ticker trao đổi:

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

Các cuộc gọi đồng thờiexchange.IO("api", ...)chức năng:

Chức năng này chỉ tạo ra các nhiệm vụ thực thi đa luồng khi chạy trong giao dịch thực tế, backtesting không hỗ trợ thực thi nhiệm vụ đồng thời đa luồng (backtesting có sẵn, nhưng vẫn được thực hiện theo trình tự). Sau khiexchange.Go()hàm trả về một đối tượng,wait()hàm được gọi thông qua đối tượng đó để có được dữ liệu được trả về bởi các chuỗi.wait()hàm phải được gọi để có được dữ liệu trước khi các chủ đề sẽ được phát hành tự động.wait()Phương pháp này được sử dụng để xác định các hàm trong một trình duyệt, nhưng nếu không có chức năng được chỉ định, thì thread sẽ không tự động được phát hành ngay cả khi xảy ra thời gian hết. Kết quả của thread phải được lấy trước khi nó được phát hành tự động (bất kể thành công hoặc thất bại của cuộc gọi giao diện cho truy cập đồng thời).wait()chức năng bất kể việc thực thi thành công hay thất bại, và các tài nguyên của các chuỗi được yêu cầu bởi cácexchange.Go()chức năng phải được giải phóng tự động bởi docker. Cácwait()phương pháp hỗ trợ một tham số timeout: Không có một tham số thời gian, đó là,wait(), hoặc với tham số timeout là 0, tức là,wait(0).wait()các khối chức năng và chờ cho đến khi chuỗi đồng thời kết thúc chạy, trả về kết quả của việc thực hiện chuỗi đồng thời. Đặt tham số timeout -1, tức làwait(-1).wait()hàm trả về ngay lập tức, với các giá trị trả về khác nhau cho các ngôn ngữ lập trình khác nhau, xem phần phụ này cho một ví dụ gọi. Đặt tham số thời gian dừng cụ thể,wait(300), vàwait()Chức năng sẽ chờ tối đa 300 mili giây trước khi quay lại.

Nếu kết quả trả về cuối cùngwait()chức năng không đạt được, các tài nguyên chủ đề sẽ không được giải phóng tự động, điều này sẽ dẫn đến sự tích lũy các chủ đề được yêu cầu và hơn 2000 sẽ báo cáo lỗi:"too many routine wait, max is 2000". Các chức năng được hỗ trợ:GetTicker, GetDepth, GetTrades, GetRecords, GetAccount, GetOrders, GetOrder, CancelOrder, Buy, Sell, GetPositions, IO. Tất cả các chức năng này được thực hiện dựa trên đối tượng trao đổi {@var/EXCHANGE exchange} hiện tại khi được gọi đồng thời. Sự khác biệt giữa ngôn ngữ Python và ngôn ngữ JavaScript làwait()function of concurrent objects trong ngôn ngữ Python trả về hai tham số. tham số đầu tiên là kết quả được trả về bởi một cuộc gọi API không đồng bộ, và tham số thứ hai chỉ ra liệu cuộc gọi không đồng bộ đã hoàn thành hay không.


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}

Tài khoản

exchange.GetAccount

Cácexchange.GetAccount()chức năng được sử dụng để yêu cầu thông tin tài khoản trao đổi.GetAccount()function là một hàm thành viên của đối tượng trao đổi {@var/EXCHANGE exchange}.exchangeđối tượng chỉ liên quan đếnexchange, và nó sẽ không được lặp lại sau khi tài liệu.

truy vấn thông tin tài sản tài khoản và trả về cấu trúc {@struct/Account Account} nếu truy vấn thành công hoặc không có giá trị nếu không thành công. {@struct/Account Account}, giá trị không

trao đổi.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"])
}

Thiết lập các cặp giao dịch, mã hợp đồng, và lấy thông tin tài khoản hiện tại.

Nếu đối tượng trao đổi được thiết lập để trao đổi hợp đồng tương lai cryptocurrency, và chuyển sang một hợp đồng vớiUSDTnhư ký quỹ (xem {@fun/Account/exchange.SetCurrency exchange.SetCurrency}, {@fun/Futures/exchange.SetContractType exchange.SetContractType} chức năng để làm thế nào để chuyển đổi).USDTnhư biên, được ghi trongBalance, FrozenBalancethuộc tính của cấu trúc {@struct/Account Account} Nếu đối tượng trao đổi được thiết lập cho một sàn giao dịch hợp đồng tương lai tiền điện tử, và chuyển sang hợp đồng dựa trên tiền tệ, tài sản được tính bằng tiền tệ dưới dạng ký quỹ và được ghi trongStocks, FrozenStocksthuộc tính của cấu trúc {@struct/Account Account} Khi sử dụng tài khoản thống nhất Binance Futures, khi gọiexchange.GetAccount()chức năng để yêu cầu thông tin tài khoản, dữ liệu được đóng gói là số tiền của tất cả các tài sản chuyển đổi thànhUSDNó được hiển thị trongBalanceNếu bạn cần tính toán số tiền chuyển đổi của các tài sản khác, bạn có thể sử dụng số tiền chuyển đổi USD chia cho giá chỉ số (của tài sản được chuyển đổi) và sau đó chia cho tỷ lệ thế chấp (của tài sản được chuyển đổi) để tính toán nó.

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

exchange.GetAssets

Cácexchange.GetAssetschức năng được sử dụng để yêu cầu thông tin tài sản tài khoản trao đổi.

Cácexchange.GetAssets()hàm trả về một mảng của {@struct/Asset Asset} cấu trúc nếu yêu cầu dữ liệu thành công, hoặc null nếu yêu cầu thất bại. {@struct/Asset Asset} mảng, giá trị không

trao đổi.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);
}

Nhận thông tin về tài sản của một tài khoản trao đổi,exchange.GetAssets()trả về một mảng với các phần tử của cấu trúc tài sản.

CácGetAssets()hàm của đối tượng Futures Exchange trả về các tài sản ký quỹ dưới cặp giao dịch hiện tại (dựa trên tiền tệ, dựa trên USDT, dựa trên USDC, v.v.).

{@struct/Asset Asset}

exchange.GetName

Cácexchange.GetName()hàm được sử dụng để lấy tên của trao đổi mà đối tượng trao đổi hiện tại bị ràng buộc.

Cácexchange.GetName()hàm trả về tên của sàn giao dịch được xác định bởi nền tảng FMZ Quant Trading. chuỗi

trao đổi.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");
}

Cácexchange.GetName()chức năng thường được sử dụng để xác định các đối tượng trao đổi, chẳng hạn nhưexchangehoặcexchanges[1], exchanges[2]trong mã chiến lược. tên của sàn giao dịch hợp đồng tương lai tiền điện tử có tiền tố cố địnhFutures_.

{@fun/Account/exchange.GetLabel exchange.GetLabel}

exchange.GetLabel

Cácexchange.GetLabel()function được sử dụng để lấy nhãn tùy chỉnh được đặt khi đối tượng trao đổi được cấu hình.

Cácexchange.GetLabel()function trả về nhãn tùy chỉnh được đặt khi đối tượng trao đổi được cấu hình. chuỗi

trao đổi.GetLabel ((()

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

Các đối tượng trao đổi nhưexchangehoặcexchanges[1], exchanges[2]trong mã chiến lược được xác định bằng thẻ đặt.

{@var/EXCHANGE exchange}

exchange.GetCurrency

Cácexchange.GetCurrency()chức năng được sử dụng để lấy cặp giao dịch hiện tại.

Cácexchange.GetCurrency()hàm trả về cặp giao dịch được đặt bởi đối tượng trao đổi {@var/EXCHANGE exchange} hiện tại. chuỗi

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

Định dạng cặp giao dịch là chữ cái lớn đồng đều, sử dụng dấu gạch để táchbaseCurrencyquoteCurrency, nhưBTC_USDT.

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

exchange.SetCurrency

Cácexchange.SetCurrency()hàm được sử dụng để chuyển đổi cặp giao dịch hiện tại của đối tượng trao đổi {@var/EXCHANGE exchange}.

trao đổi.SetCurrency ((currency))

CáccurrencyCác định dạng cặp giao dịch là chữ cái lớn đồng đều, sử dụng một dấu gạch dưới để táchbaseCurrencytừquoteCurrency, nhưBTC_USDT. Tiền tệ đúng chuỗi

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. Tương thích vớiexchange.IO("currency", "BTC_USDT")phương pháp chuyển đổi, vui lòng tham khảo {@funexcahnge.IO}.
  2. Hỗ trợ chuyển đổi các cặp giao dịch trong hệ thống backtesting, tên của đồng tiền được mệnh giá không thể thay đổi khi chuyển đổi các cặp giao dịch trong hệ thống backtesting. Ví dụ:BTC_USDTcó thể được chuyển sangLTC_USDT, không phảiLTC_BTC.
  3. Số lượng các loại tiền tệ giao dịch là 0 sau khi chuyển sang cặp giao dịch ban đầu được đặt trên trang không backtest.BTC_USDT, số lượngBTClà 3, sốUSDTlà 10000 tại thời điểm này, chuyển sangLTC_USDTngay lập tức, số lượng các loại tiền tệ giao dịch là 0 sau khi chuyển đổi, tức là số lượngLTC_USDTtrong tài khoản là 0, đó là, số lượngLTCtrong tài khoản là 0, và cặp giao dịch chuyển đổi chia sẻ số lượngUSDT, tức là 10.000.

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

exchange.GetQuoteCurrency

Cácexchange.GetQuoteCurrency()Chức năng được sử dụng để lấy tên của đồng tiền được mệnh giá của cặp giao dịch hiện tại, tức làquoteCurrency.

Cácexchange.GetQuoteCurrency()hàm trả về tên của đồng tiền được mệnh giá của cặp giao dịch hiện tại. chuỗi

exchange.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())
}

Ví dụ: {@var/EXCHANGE exchange} đối tượng trao đổis cặp giao dịch hiện tại làBTC_USDT, cácexchange.GetQuoteCurrency()hàm trả vềUSDTNếu cặp giao dịch hiện tại làETH_BTC, cácexchange.GetQuoteCurrency()hàm trả vềBTC.

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

Tiền tương lai

exchange.GetPositions

Cácexchange.GetPositions()chức năng được sử dụng để có được thông tin vị trí;GetPositions()hàm là một hàm thành viên của đối tượng trao đổi {@var/EXCHANGE exchange}.GetPositions()chức năng nhận được thông tin vị trí của tài khoản trao đổi gắn liền với đối tượng trao đổiexchangeMục đích của các chức năng thành viên (các phương pháp)exchangeđối tượng chỉ liên quan đếnexchangevà sẽ không được lặp lại ở đây.

Cácexchange.GetPositions()hàm trả về một mảng cấu trúc {@struct/Position Position} nếu yêu cầu dữ liệu thành công, và nó trả về giá trị null nếu yêu cầu dữ liệu thất bại. {@struct/Position Position} mảng, giá trị không

trao đổi.GetPositions ((() trao đổi.GetPositions (bản biểu tượng)

Các thông sốsymbolđược sử dụng để thiết lậpBiểu tượng giao dịchhoặcphạm vi ký hiệu giao dịchđể được thẩm vấn. NếusymbolNếu tham số không được truyền, mặc định là yêu cầu dữ liệu vị trí của tất cả các biểu tượng trong phạm vi kích thước của cặp giao dịch hiện tại và mã hợp đồng.

biểu tượng sai chuỗi

/*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; 
}

Sử dụng các đối tượng trao đổi tương lai để đặt lệnh thị trường cho nhiều cặp giao dịch và mã hợp đồng khác nhau.

Hợp đồng tương lai tiền điện tử khác với hợp đồng tương lai tiền điện tử, chỉ có khái niệm hợp lý về vị trí.các cặp giao dịch, mã hợp đồngVui lòng tham khảo các hàm {@fun/Account/exchange.SetCurrency exchange.SetCurrency}, {@fun/Futures/exchange.SetContractType exchange.SetContractType} TrongGetPositionschức năng, các kịch bản sử dụng của tham số biểu tượng được tóm tắt như sau:

Phân loại đối tượng Exchange biểu tượng Parameter Phạm vi truy vấn Nhận xét
Tiền tương lai Không vượt qua tham số biểu tượng Tìm kiếm tất cả các sản phẩm giao dịch trong phạm vi kích thước cặp giao dịch và mã hợp đồng hiện tại Nếu cặp giao dịch hiện tại là BTC_USDT và mã hợp đồng là swap, tất cả các hợp đồng vĩnh viễn dựa trên USDT sẽ được truy vấn.GetPositions("USDT.swap")
Tiền tương lai Xác định sản phẩm giao dịch, tham số biểu tượng là: BTC_USDT.swap Tìm kiếm hợp đồng vĩnh viễn dựa trên USDT của một BTC cụ thể Đối với các đối tượng giao dịch tương lai, định dạng biểu tượng tham số là: sự kết hợp củacặp giao dịchmã hợp đồngđược xác định bởi nền tảng FMZ, được tách bởi các ký tự"..
Tiền tương lai Xác định phạm vi các sản phẩm giao dịch, tham số biểu tượng là: USDT.swap Tìm kiếm tất cả các hợp đồng vĩnh viễn dựa trên USDT -
Các sàn giao dịch tương lai hỗ trợ các tùy chọn Không vượt qua tham số biểu tượng Tìm kiếm tất cả các hợp đồng quyền chọn trong phạm vi kích thước cặp giao dịch hiện tại Nếu cặp giao dịch hiện tại là BTC_USDT, hợp đồng được thiết lập thành hợp đồng quyền chọn, ví dụ, hợp đồng quyền chọn Binance: BTC-240108-40000-C
Các sàn giao dịch tương lai hỗ trợ các tùy chọn Xác định sản phẩm giao dịch cụ thể truy vấn hợp đồng tùy chọn được chỉ định Ví dụ, đối với Binance Futures Exchange, tham số biểu tượng là: BTC_USDT.BTC-240108-40000-C
Các sàn giao dịch tương lai hỗ trợ các tùy chọn Xác định phạm vi các sản phẩm giao dịch, tham số biểu tượng là: USDT.option Tìm kiếm tất cả các hợp đồng quyền chọn dựa trên USDT -

TrongGetPositionschức năng, đối tượng giao dịch tương lai phạm vi kích thước truy vấn được tóm tắt như sau:

biểu tượng Parameter Định nghĩa phạm vi yêu cầu Nhận xét
USDT.swap Phạm vi hợp đồng vĩnh viễn dựa trên USDT. Đối với

kích thước không được hỗ trợ bởi giao diện API trao đổi, một lỗi sẽ được báo cáo và một giá trị null sẽ được trả về khi gọi.

USDT.futures. USDT dựa trên hợp đồng giao hàng.

USD.swap. hợp đồng.

USD.futures. phạm vi giao hàng dựa trên tiền tệ hợp đồng.

USDT.option. USDT-based options contract range.

USD.option. Tùy chọn dựa trên đồng tiền.

  • |

USDT.futures_combo Một loạt các sự kết hợp CFD. Futures_Deribit Exchange.

USD.futures_ff. phạm vi của hợp đồng giao dịch ký quỹ hỗn hợp. Futures_Kraken Exchange.

USD.swap_pf. Futures_Kraken Exchange.

Tương thích vớiexchange.GetPosition()gọi,GetPositionlà chính xác giống nhưGetPositions.

Khi tài khoản được đại diện bởi đối tượng trao đổiexchangekhông có vị trí trongphạm vi truy vấnhoặcCác công cụ giao dịch cụ thể, cácexchange.GetPositions()hàm trả về một mảng trống, ví dụ:[].

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

exchange.SetMarginLevel

Cácexchange.SetMarginLevel()chức năng được sử dụng để thiết lập giá trị đòn bẩy của cặp giao dịch hoặc hợp đồng được chỉ định bởisymbolGoh so với chỉ đi qua trong tham sốmarginLevelđể thiết lập giá trị đòn bẩy của cặp giao dịch hoặc hợp đồng hiện tại của đối tượng giao dịch {@var/EXCHANGE exchange}.

exchange.SetMarginLevel (( biểu tượng, marginLevel) Exchange.SetMarginLevel ((MarginLevel))

CácsymbolCác thông số này được sử dụng để xác định cặp giao dịch hoặc hợp đồng mà giá trị đòn bẩy cần được điều chỉnh.symboltham số củaSetMarginLevel()chức năng phù hợp với định dạng củasymboltham số củaGetTicker()chức năng. biểu tượng sai chuỗi CácmarginLeveltham số được sử dụng để thiết lập giá trị đòn bẩy, thường là một số nguyên cho sàn giao dịch và nó cũng hỗ trợ cài đặt giá trị đòn bẩy điểm nổi cho một số sàn giao dịch. marginLevel đúng số

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

Cácexchange.SetMarginLevel()chức năng hỗ trợ cryptocurrency hợp đồng tương lai trao đổi đối tượng chỉ. hệ thống backtesting hỗ trợ gọiexchange.SetMarginLevel()chức năng để thiết lập giá trị đòn bẩy. Đối với các hợp đồng tương lai tiền điện tử, cơ chế đòn bẩy không đồng đều do các sàn giao dịch hợp đồng tương lai tiền điện tử.exchange.SetMarginLevel()chức năng không tạo ra một yêu cầu mạng, nhưng chỉ thiết lập biến đòn bẩy trong hệ thống FMZ cơ bản (được sử dụng để truyền các tham số trong giao diện đặt lệnh). Giá trị đòn bẩy của một số hợp đồng tương lai trao đổi là một thiết lập của sàn giao dịch, cần phải được thiết lập trên trang trang web trao đổi hoặc sử dụng giao diện API.exchange.SetMarginLevel()có thể có nhiều lý do cho điều này, ví dụ: có một vị trí hiện tại hoặc lệnh đang chờ, khiến không thể đặt một giá trị đòn bẩy mới cho cặp giao dịch hoặc hợp đồng này. Các sàn giao dịch không hỗ trợexchange.SetMarginLevel()chức năng:

Tên chức năng Không hỗ trợ trao đổi tại chỗ Giao dịch tương lai không được hỗ trợ
SetMarginLevel Tiền tương lai_dYdX / Tiền tương lai_Deribit

{@var/EXCHANGE exchange}

exchange.SetDirection

Cácexchange.SetDirection()hàm được sử dụng để đặt hướng lệnh của hàm {@fun/Trade/exchange.Buy exchange.Buy}, hàm {@fun/Trade/exchange.Sell exchange.Sell} khi đặt lệnh cho các hợp đồng tương lai.

chuyển đổi.SetDirection ((hướng)

Cácdirectiontham số được sử dụng để thiết lập hướng của hợp đồng tương lai khi đặt lệnh."buy", "closesell", "sell", "closebuy". hướng đúng chuỗi

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

Cácexchange.SetDirection()chức năng thiết lập sự tương ứng giữa hướng giao dịch hợp đồng tương lai và chức năng đặt lệnh:

Chức năng đặt hàng Hướng định bởi các tham số của hàm SetDirection Nhận xét
exchange.Buy mua Mua và mở các vị trí dài
exchange.Buy closesell Mua và đóng các vị trí ngắn
exchange.Sell bán Bán và mở các vị trí ngắn
exchange.Sell closebuy Bán và đóng các vị trí dài

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

exchange.SetContractType

Cácexchange.SetContractType()hàm được sử dụng để đặt mã hợp đồng hiện tại của đối tượng trao đổi {@var/EXCHANGE exchange}.

Cácexchange.SetContractType()hàm trả về một cấu trúc có chứa mã hợp đồng trao đổi tương ứng với mã hợp đồng hiện tại. Ví dụ, đối với sàn giao dịch hợp đồng tương lai Binance, mã hợp đồng hiện tại làquarter, và cấu trúc giá trị trả về của hàm này là:{"InstrumentID": "BTCUSD_230630", "instrument": "BTCUSD_230630"}. đối tượng

exchange.SetContractType (( biểu tượng)

Cácsymboltham số được sử dụng để thiết lập mã hợp đồng, các giá trị tùy chọn là:"this_week", "next_week", "quarter", "next_quarter", "swap", vv Hợp đồng tương lai tiền điện tửHợp đồng giao hàngmã, nếu không được chỉ định, thường có:

  • this_week: hợp đồng của tuần hiện tại.
  • next_week: hợp đồng tuần sau.
  • quarter: hợp đồng hàng quý.
  • next_quarter: hợp đồng hàng quý tiếp theo.Hợp đồng thường trựcmã trong các hợp đồng tương lai tiền điện tử, nếu không được chỉ định, thường có:
  • swap: hợp đồng vĩnh viễn.

biểu tượng đúng chuỗi

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

Đặt hợp đồng hiện tại là hợp đồng tuần hiện tại:

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

Khi thiết lập hợp đồng vớiUSDTnhư ký quỹ, bạn cần phải chuyển đổi cặp giao dịch trong mã (bạn cũng có thể đặt cặp giao dịch trực tiếp khi thêm đối tượng trao đổi):

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

In giá trị trả về củaexchange.SetContractType()chức năng:

Trong chiến lược hợp đồng tương lai tiền điện tử, hãy lấy ví dụ về việc chuyển sangBTC_USDTCặp giao dịch: Khi chuyển đổi các cặp giao dịch sử dụngexchange.SetCurrency("BTC_USDT")hoặcexchange.IO("currency", "BTC_USDT")chức năng, sau khi chuyển đổi, bạn cần phải sử dụng cácexchange.SetContractType()hệ thống xác định xem nó có phải là một hợp đồng giao dịch mới hay không.Hợp đồng tiêu chuẩn tiền tệhoặc mộtHợp đồng tiêu chuẩn USDTVí dụ, nếu một cặp giao dịch được thiết lập đểBTC_USDT, sử dụngexchange.SetContractType("swap")chức năng để thiết lập mã hợp đồng đểswapTại thời điểm này, nó được thiết lập đểBTCđối vớiTiêu chuẩn USDThợp đồng vĩnh viễn.BTC_USD, sử dụngexchange.SetContractType("swap")chức năng để thiết lập mã hợp đồng đểswapTại thời điểm này, nó được thiết lập đểBTCỪ.Tiêu chuẩn tiền tệhợp đồng vĩnh viễn. Chi tiết về các sàn giao dịch hợp đồng tương lai tiền điện tử được hỗ trợ, với tên hợp đồng cho mỗi sàn giao dịch như sau:

  • Tiền tương lai_OKCoin (OKX) Đặt vào hợp đồng vĩnh viễn:exchange.SetContractType("swap")Đặt vào hợp đồng của tuần này:exchange.SetContractType("this_week")Đặt hợp đồng vào tuần tới:exchange.SetContractType("next_week")Đặt vào hợp đồng hàng tháng:exchange.SetContractType("month")Đặt hợp đồng vào tháng tới:exchange.SetContractType("next_month")Đặt vào các hợp đồng hàng quý:exchange.SetContractType("quarter")Đặt vào hợp đồng quý tiếp theo:exchange.SetContractType("next_quarter")

    OKX có các hợp đồng giao dịch trước thị trường: ngày giao dịch hợp đồng là một thời gian cố định. Mã hợp đồng được xác định bởi sàn giao dịch là, ví dụ:HMSTR-USDT-250207. Đặt cặp giao dịchHMSTR_USDTtrên nền tảng FMZ, và sau đó sử dụngexchange.SetContractType("HMSTR-USDT-250207")để thiết lập hợp đồng. Đối với các chức năng hỗ trợsymbolcác thông số như:exchange.GetTicker(), exchange.CreateOrder(), v.v. Bạn có thể xác địnhsymboltham số như:HMSTR_USDT.HMSTR-USDT-250207để thu thập dữ liệu thị trường của hợp đồng này hoặc đặt hàng.

  • Tiền tương lai_HuobiDM (Tiền tương lai của Huobi) Đặt vào hợp đồng của tuần này:exchange.SetContractType("this_week"). Đặt hợp đồng vào tuần tới:exchange.SetContractType("next_week"). Đặt vào các hợp đồng hàng quý:exchange.SetContractType("quarter"). Đặt vào hợp đồng quý tiếp theo:exchange.SetContractType("next_quarter"). Đặt vào hợp đồng vĩnh viễn:exchange.SetContractType("swap"). Nó hỗ trợ các hợp đồng vớiUSDTnhư ký quỹ, lấyBTChợp đồng ví dụ: sử dụngexchange.IO("currency", "BTC_USDT")để chuyển sang một hợp đồng sử dụngUSDTnhư là biên. Hoặc đặt cặp giao dịch hiện tạiBTC_USDTtrực tiếp khi cấu hình các tham số giao dịch trực tiếp và thêm các đối tượng trao đổi.exchange.SetContractType()chức năng một lần nữa để thiết lập hợp đồng.

  • Tiền tương lai_BitMEX (BitMEX) Đặt vào hợp đồng vĩnh viễn:exchange.SetContractType("swap"). Hợp đồng giao dịch giao dịch tương lai BitMEX là hợp đồng hàng tháng với các mã hợp đồng sau (từ tháng 1 đến tháng 12):

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

    Thiết lập hợp đồng giao hàng:exchange.SetContractType("December")Ví dụ, khi cặp giao dịch được thiết lập đểXBT_USDT, cácexchange.SetContractType("December")chức năng được gọi để thiết lập hợp đồng cho tháng 12 giao hàng trong USDT dựa trên BTC (tương ứng với mã hợp đồng thực tế củaXBTUSDTZ23).

    Tóm tắt thông tin hợp đồng tương lai_BitMEX

    Mã hợp đồng được xác định bởi Futures_BitMEX Cặp giao dịch tương ứng trong FMZ Mã hợp đồng tương ứng trong FMZ Nhận xét
    DOGEUSD DOGE_USD giao dịch Định nghĩa USD, XBT thanh toán. XBT là BTC.
    DOGEUST DOGE_USDT giao dịch Định nghĩa USDT, USDT thanh toán.
    XBTETH XBT_ETH giao dịch ETH được mệnh giá, XBT được thanh toán.
    XBTEUR XBT_EUR giao dịch Định giá bằng EUR, XBT được thanh toán.
    USDTUSDC USDT_USDC giao dịch Định nghĩa USDC, XBT thanh toán.
    ETHUSD_ETH ETH_USD_ETH giao dịch Định giá bằng USD, ETH được thanh toán.
    XBTH24 XBT_USD Tháng 3 Ngày hết hạn: 24 tháng 3, mã tháng là: H; denominated USD, XBT settled.
    ETHUSDZ23 ETH_USD Tháng 12 Ngày hết hạn: 23 tháng 12, mã tháng là: Z; denominated USD, XBT settled.
    XBTUSDTZ23 XBT_USDT Tháng 12 Ngày hết hạn: ngày 23 tháng 12 Mã tháng là: Z ; denominated USDT, settled USDT.
    ADAZ23 ADA_XBT Tháng 12 Ngày hết hạn: 23 tháng 12, mã tháng là: Z ; XBT hóa đơn, XBT thanh toán.
    P_XBTETFX23 USDT_XXX P_XBTETFX23 Thời hạn: 11/23/23; được biểu diễn bằng tỷ lệ phần trăm và được thanh toán bằng USDT.
  • Futures_GateIO Đặt vào hợp đồng của tuần này:exchange.SetContractType("this_week"). Đặt hợp đồng vào tuần tới:exchange.SetContractType("next_week"). Đặt vào các hợp đồng hàng quý:exchange.SetContractType("quarter"). Đặt vào hợp đồng quý tiếp theo:exchange.SetContractType("next_quarter"). Đặt vào hợp đồng vĩnh viễn:exchange.SetContractType("swap"). Nó hỗ trợ các hợp đồng vớiUSDTnhư ký quỹ, lấyBTChợp đồng ví dụ: sử dụngexchange.IO("currency", "BTC_USDT")để chuyển sang một hợp đồng sử dụngUSDTnhư là biên. Hoặc đặt cặp giao dịch hiện tạiBTC_USDTtrực tiếp khi cấu hình các tham số giao dịch trực tiếp và thêm các đối tượng trao đổi.exchange.SetContractType()chức năng một lần nữa để thiết lập hợp đồng.

  • Tiền tương lai_Deribit Đặt vào hợp đồng vĩnh viễn:exchange.SetContractType("swap"). Nó hỗ trợ DeribitUSDChợp đồng. Các hợp đồng giao hàng là:"this_week", "next_week", "month", "quarter", "next_quarter", "third_quarter", "fourth_quarter". CFD (future_combo):"this_week,swap", "next_week,swap", "next_quarter,this_week", "third_quarter,this_week", "month,next_week", có rất nhiều sự kết hợp. Đối với các hợp đồng quyền chọn, bạn cần đi vào mã hợp đồng quyền chọn cụ thể được xác định bởi sàn giao dịch, xem trang web Deribit để biết chi tiết.

  • Futures_KuCoin Ví dụ, nếu cặp giao dịch được thiết lập đểBTC_USDvà mã hợp đồng được thiết lập, đó là hợp đồng dựa trên tiền tệ: Đặt vào hợp đồng vĩnh viễn:exchange.SetContractType("swap"). Đặt vào các hợp đồng hàng quý:exchange.SetContractType("quarter"). Đặt vào hợp đồng quý tiếp theo:exchange.SetContractType("next_quarter").

    USDT như hợp đồng ký quỹ: Ví dụ, nếu cặp giao dịch được thiết lập đểBTC_USDT, và sau đó đặt mã hợp đồng, đó là một hợp đồng với USDT như ký quỹ. Đặt vào hợp đồng vĩnh viễn:exchange.SetContractType("swap").

  • Futures_Binance Binance Futures Exchange mặc định đối với hợp đồng vĩnh viễn của cặp giao dịch hiện tại, mã hợp đồng:swap. Đặt vào hợp đồng vĩnh viễn:exchange.SetContractType("swap"), các hợp đồng vĩnh viễn của Binance có các hợp đồng sử dụngUSDTví dụ,USDThợp đồng vĩnh viễn tiêu chuẩn củaBTCcó thể được sử dụng như một hợp đồng ký quỹ, và cặp giao dịch được thiết lập đểBTC_USDTBinance cũng hỗ trợ các hợp đồng vĩnh viễn sử dụng tiền xu như ký quỹ, ví dụ,BTClà hợp đồng vĩnh cửu tiêu chuẩn của Binance, với cặp giao dịch được thiết lập đểBTC_USD. Đặt vào các hợp đồng hàng quý:exchange.SetContractType("quarter"), hợp đồng giao hàng có hợp đồng tiêu chuẩn tiền tệ (tức là sử dụng tiền tệ làm ký quỹ), ví dụ:BTCTrong hợp đồng hàng quý, cặp giao dịch được thiết lập để:BTC_USDvà sau đó thiết lập hợp đồngexchange.SetContractType("quarter"), nó được thiết lập đểBTChợp đồng hàng quý với hợp đồng tiêu chuẩn tiền tệ. Đặt vào hợp đồng quý tiếp theo:exchange.SetContractType("next_quarter"), ví dụ,BTCcủa hợp đồng hàng quý tiêu chuẩn tiền tệ, cặp giao dịch được thiết lập là:BTC_USD, và sau đó thiết lập hợp đồngexchange.SetContractType("next_quarter"). Binance hỗ trợ một phầnUSDTnhư hợp đồng giao dịch ký quỹ,BTCví dụ, đặt cặp giao dịch đểBTC_USDT, sau đó đặt mã hợp đồng.

    Hỗ trợ cho các hợp đồng Binance Options: Định dạng mã hợp đồng quyền chọn dựa trên mã hợp đồng quyền chọn được xác định bởi sàn giao dịch:BTC-241227-15000-C, XRP-240112-0.5-C, BTC-241227-15000-PHãy lấy mã hợp đồng quyền chọn BinanceBTC-241227-15000-Pví dụ: BTC là mã tiền tệ tùy chọn, 241227 là ngày thực hiện, 15000 là giá thực hiện, P đại diện cho tùy chọn bán và C đại diện cho tùy chọn mua. Để biết chi tiết về loại quyền chọn, cho dù đó là quyền chọn châu Âu hay quyền chọn Mỹ, vui lòng tham khảo thông tin liên quan của hợp đồng quyền chọn của sàn giao dịch. Sàn giao dịch có thể hạn chế người bán tùy chọn và yêu cầu họ nộp đơn xin trình độ riêng biệt.

  • Futures_Bibox Mã hợp đồng cho hợp đồng vĩnh viễn Bibox:swap. Đặt vào hợp đồng vĩnh viễn:exchange.SetContractType("swap").

  • Tiền tương lai_Bybit Chế độ mặc định là hợp đồng vĩnh viễn cho cặp giao dịch hiện tại, mã hợp đồng:swap. Mã hợp đồng tuần này:this_week. Mã hợp đồng tuần tới:next_week. Mã hợp đồng tuần thứ ba:third_week. Mã hợp đồng hàng tháng:month. Mã hợp đồng tháng tới:next_month. Mã hợp đồng quý:quarter. Mã hợp đồng quý tiếp theo:next_quarter. Mã hợp đồng quý 3:third_quarter.

  • Futures_Kraken Chế độ mặc định là hợp đồng vĩnh viễn của cặp giao dịch hiện tại, mã hợp đồng:swap. swap: hợp đồng vĩnh viễn.month: hợp đồng tháng hiện tại.quarter: hợp đồng hàng quý.next_quarterHợp đồng quý tiếp theo.swap_pf: Hợp đồng vĩnh viễn với ký quỹ hỗn hợp.quarter_ff: Hợp đồng hàng quý với ký quỹ hỗn hợp.month_ff: Hợp đồng ký quỹ hỗn hợp trong tháng hiện tại.next_quarter_ff: Hợp đồng biên độ hỗn hợp quý tiếp theo.

  • Tiền tương lai_Bitfinex Chế độ mặc định là hợp đồng vĩnh viễn cho cặp giao dịch hiện tại, mã hợp đồng:swap.

  • Tiền tương lai_Bitget Chế độ mặc định là hợp đồng vĩnh viễn cho cặp giao dịch hiện tại, mã hợp đồng:swap. Cặp giao dịch được thiết lập làBTC_USDđối với các hợp đồng tiêu chuẩn tiền tệ, và cặp giao dịch được thiết lập làBTC_USDTđối với các hợp đồng được thanh toán bởiUSDTHợp đồng demo có thể được thiết lập với các cặp giao dịch nhưSBTC_USD, BTC_SUSDT.

  • Futures_dYdX Mã hợp đồng cho các hợp đồng vĩnh viễn dYdX:swap. Đặt vào hợp đồng vĩnh viễn:exchange.SetContractType("swap"), dYdX chỉ có hợp đồng tiêu chuẩn USDT.

  • Tiền tương lai_MEXC Mã hợp đồng cho các hợp đồng vĩnh viễn của MEXC:swap. Đặt vào hợp đồng vĩnh viễn:exchange.SetContractType("swap"). Đặt cặp giao dịch vàoBTC_USD, đó là hợp đồng tiêu chuẩn tiền tệ, và đặt cặp giao dịch đểBTC_USDT, đó làUSDT- Hợp đồng đã được thỏa thuận.

  • Tiền tương lai_Thiên mật mã Token trong một tài khoản trêncrypto.comgiao dịch ngoại hối có thể được chuyển đổi thành các khoản tín dụng bằng USD để được sử dụng làm ký quỹ cho giao dịch hợp đồng. Đặt vào hợp đồng vĩnh viễn:exchange.SetContractType("swap"). Ví dụ về việc gọiexchange.SetContractType("swap")chức năng để thiết lập một hợp đồng vĩnh viễn cho BTC khi cặp giao dịch được thiết lập đểBTC_USD. Cáccrypto.comHợp đồng giao hàng trao đổi là hợp đồng hàng tháng với mã hợp đồng sau (từ tháng 1 đến tháng 12):

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

    Đặt hợp đồng giao hàng:exchange.SetContractType("October")Ví dụ, khi cặp giao dịch được thiết lập đểBTC_USD, gọi hàmexchange.SetContractType("October")để thiết lập hợp đồng giao hàng tháng 10 cho BTC. Mã hợp đồng tương ứng hiện tại là:BTCUSD-231027.

  • Tiền tương lai Tiền tương lai_WOO hỗ trợ trao đổiUSDTdựa trên hợp đồng với mã hợp đồng vĩnh viễn củaswapVí dụ, khi cặp giao dịch được thiết lập đểBTC_USDT, chức năngexchange.SetContractType("swap")được gọi để thiết lập hợp đồng hiện tại là một hợp đồng vĩnh viễn dựa trên USDT cho BTC.

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

exchange.GetContractType

Cácexchange.GetContractType()hàm được sử dụng để lấy mã hợp đồng cho cài đặt hiện tại của đối tượng trao đổi {@var/EXCHANGE exchange}.

Cácexchange.GetContractType()hàm trả về mã hợp đồng được xác định bởi nền tảng FMZ, ví dụ:this_week, swap, vv chuỗi

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

Cácexchange.GetFundings()chức năng được sử dụng để lấy dữ liệu tỷ lệ tài trợ cho giai đoạn hiện tại.

Cácexchange.GetFundings()hàm trả về một mảng {@struct/Funding Funding} cấu trúc khi yêu cầu dữ liệu thành công, và trả về một giá trị null khi yêu cầu dữ liệu thất bại. {@struct/Funding Funding} mảng, giá trị không

trao đổi.GetFundings() trao đổi.GetFundings (thông hiệu)

Các thông sốsymbolđược sử dụng để thiết lậpbiểu tượng giao dịchhoặcphạm vi ký hiệu giao dịchđược hỏi.symbolNếu tham số này không được vượt qua, dữ liệu tỷ lệ tài trợ hiện tại của tất cả các công cụ sẽ được yêu cầu theo mặc định trong phạm vi kích thước của cặp giao dịch và mã hợp đồng hiện tại.

biểu tượng sai chuỗi

/*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() + "`");
}

Sử dụng đối tượng trao đổi tương lai để gọiexchange.GetFundings()trước khi gọi bất kỳ chức năng thị trường nào, GetFundings chỉ trả về dữ liệu Funding của cặp giao dịch mặc định hiện tại. Sau khi gọi chức năng thị trường, nó trả về dữ liệu Funding của tất cả các giống được yêu cầu. Bạn có thể tham khảo ví dụ kiểm tra sau:

Đối với các sàn giao dịch tương lai không hỗ trợ truy vấn hàng loạt dữ liệu tỷ lệ tài trợ, nếusymboltham số được chỉ định là phạm vi truy vấn, ví dụ:USDT.swaphoặcsymboltham số không được thông qua, giao diện sẽ báo cáo một lỗi.GetFundings()chức năng sử dụng loại này của tương lai trao đổi đối tượng, bạn phải chỉ định cácsymboltham số như một loại hợp đồng vĩnh viễn cụ thể để truy vấn dữ liệu tỷ lệ tài trợ hiện tại của loại hợp đồng đó. Cácexchange.GetFundings()chức năng hỗ trợ các hệ thống giao dịch và backtesting thực tế. Các sàn giao dịch không hỗ trợ mua hàng loạt dữ liệu tỷ lệ tài trợ: Futures_Bitget, Futures_OKX, Futures_MEXC, Futures_Deribit, Futures_Crypto.symboltham số với mã biểu tượng cụ thể, ví dụ:ETH_USDT.swap.

Các sàn giao dịch không hỗ trợexchange.GetFundings()chức năng:

Tên chức năng Không hỗ trợ trao đổi tại chỗ Giao dịch tương lai không được hỗ trợ
GetFundings Tiền tương lai_DigiFinex

{@struct/Funding Funding}

NetSettings

exchange.SetBase

Cácexchange.SetBase()hàm được sử dụng để thiết lập địa chỉ cơ sở của giao diện API trao đổi được cấu hình trong đối tượng trao đổi {@var/EXCHANGE exchange}.

trao đổi.SetBase (s)

Cácstham số được sử dụng để chỉ định địa chỉ cơ sở giao diện API trao đổi. s đúng chuỗi

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

Chuyển địa chỉ cơ sở API trao đổi không được hỗ trợ trong hệ thống backtesting, bởi vì hệ thống backtesting là một môi trường mô phỏng sandbox và nó không thực sự truy cập giao diện API trao đổi.

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

exchange.GetBase

Cácexchange.GetBase()hàm được sử dụng để lấy địa chỉ cơ sở giao diện API trao đổi hiện tại.

Địa chỉ cơ sở giao diện API trao đổi hiện tại. chuỗi

trao đổi.GetBase()

function main() {
    Log(exchange.GetBase())
}
def main():
    Log(exchange.GetBase())
void main() {
    Log(exchange.GetBase());
}

{@fun/NetSettings/exchange.SetBase exchange.SetBase}

exchange.SetProxy

Cácexchange.SetProxy()hàm được sử dụng để thiết lập cấu hình proxy của đối tượng trao đổi {@var/EXCHANGE exchange}.

exchange.SetProxy ((proxy)

Cácproxytham số được sử dụng để xác định cấu hình proxy. đại diện đúng chuỗi

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

Thiết lập đối tượng trao đổi {@var/EXCHANGE exchange}socks5Proxy:

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

Ngoàithông số kỹ thuật toàn cầucủa địa chỉ IP của yêu cầu từ đối tượng trao đổi {@var/EXCHANGE exchange}, cũng có hỗ trợ để chỉ định địa chỉ IP dựa trên {@var/EXCHANGE exchange}:

Nếu cài đặt proxy thất bại,exchange.SetProxy()hàm sẽ trả về null khi được gọi.exchange.SetProxy()chức năng thiết lập proxy cho cácrestMột proxy có thể được thiết lập cho mỗi đối tượng trao đổi {@var/EXCHANGE exchange} và truy cập vào giao diện trao đổi gắn liền với đối tượng trao đổi {@var/EXCHANGE exchange} sau khi thiết lập proxy sẽ được truy cập thông qua proxy. Hỗ trợ cài đặtsocks5proxy, lấy đối tượng trao đổi đầu tiên được thêm vào {@var/EXCHANGE exchange} tức là:exchanges[0]ví dụ:

  • Thiết lập proxy, không tên người dùng, không mật khẩu:exchange.SetProxy("socks5://127.0.0.1:8889").
  • Thiết lập proxy, nhập tên người dùng và mật khẩu:exchange.SetProxy("socks5://username:password@127.0.0.1:8889"). usernamelà tên người dùng vàpasswordlà mật khẩu.
  • Chuyển sang chế độ bình thường mà không cần proxy:exchange.SetProxy("").

Hỗ trợ thiết lập địa chỉ IP của yêu cầu từ đối tượng trao đổi {@var/EXCHANGE exchange}được chỉ định toàn cầu.

{@var/EXCHANGE exchange}

exchange.SetTimeout

Cácexchange.SetTimeout()chức năng được sử dụng để thiết lập thời gianrestyêu cầu đối tượng trao đổi {@var/EXCHANGE exchange}

trao đổi.SetTimeout ((timeout))

Cáctimeouttham số được sử dụng để xác định số milliseconds cho cài đặt thời gian nghỉ. thời gian nghỉ đúng số

function main() {
    exchange.SetTimeout(3000)
    Log(exchange.GetTicker())
}
def main():
    exchange.SetTimeout(3000)
    Log(exchange.GetTicker())
void main() {
    exchange.SetTimeout(3000);
    Log(exchange.GetTicker());
}

Các thông sốtimeoutlà một giá trị mili giây, 1000 mili giây bằng 1 giây.restchỉ giao thức, được sử dụng để thiết lập thời gian nghỉ trênrestyêu cầu, nó có hiệu lực bằng cách đặt một lần.exchange.SetTimeout(3000), thiết lậprestyêu cầu thời gian nghỉ choexchangegọi các chức năng với các yêu cầu mạng nhưexchange.GetTicker()mà không nhận được một câu trả lời trong hơn 3 giây sẽ thời gian ra, và các cuộc gọi chức năng làm thời gian ra sẽ trả về giá trị null.SetTimeout()không phải là một hàm toàn cầu, nó là một phương thức của đối tượng trao đổi {@var/EXCHANGE exchange}.

{@var/EXCHANGE exchange}

Sợi

FMZ Quant Trading Platform thực sự hỗ trợ các chức năng đa luồng củaJavaScriptchiến lược ngôn ngữ từ dưới cùng của hệ thống, và thực hiện các mục tiêu sau:

Các đối tượng Hướng dẫn Nhận xét
sợi Đối tượng toàn cầu đa luồng Các chức năng của thành viên:Thread, getThread, mainThread, vv
Sợi Đối tượng Thread Các chức năng của thành viên:peekMessage, postMessage, join, vv
ThreadLock Đối tượng khóa sợi Các chức năng của thành viên:acquire, releaseChúng có thể được truyền vào môi trường thread như các tham số của chức năng thực thi thread.
ThreadEvent Đối tượng sự kiện Các chức năng của thành viên:set, clear, wait, isSetChúng có thể được truyền vào môi trường thread như một tham số của chức năng thực thi thread.
ThreadCondition Đối tượng điều kiện Các chức năng của thành viên:notify, notifyAll, wait, acquire, releaseChúng có thể được truyền vào môi trường thread như một tham số của chức năng thực thi thread.
ThreadDict Đối tượng từ điển Các chức năng của thành viên:get, setChúng có thể được truyền vào môi trường thread như các tham số của chức năng thực thi thread.

sợi

Cácthreadingobject là một công cụ quản lý đa luồng toàn cầu cung cấp các chức năng như tạo các luồng đồng thời, khóa luồng và đối tượng điều kiện.threadingđối tượng này chỉ được hỗ trợ bởi cácJavaScriptchiến lược ngôn ngữ.

Sợi

CácThread()chức năng được sử dụng để tạo các chủ đề đồng thời.

CácThread()hàm trả về aThreadđối tượng, được sử dụng để quản lý các chủ đề đồng thời được tạo, giao tiếp chủ đề, v.v.

Threadđối tượng

Thread ((func,...args) Thread ((... item)

Các thông sốfunclà một hàm để thực thi đồng thời (được truyền qua tham chiếu), và hỗ trợ truyền vào các hàm ẩn danh.funccó thể chấp nhận nhiều tham số, mà sẽ được truyền qua...argsDo đó, danh sách tham số củafunccần phải phù hợp với...args.

chức đúng chức năng Các thông sốarglà tham số thực tế được truyền đếnfunc(tức là chức năng thực thi chuỗi đồng thời) khi callback được thực hiện; có thể có nhiều tham sốarg, và danh sách tham số củafunccần phải phù hợp với...args.

arg sai chuỗi, số, bool, đối tượng, mảng, hàm, giá trị null và các loại khác được hỗ trợ bởi hệ thống Các thông sốitemlà một mảng chứa các tham chiếu hàm và các tham số của chúng để được thực hiện đồng thời.itemcác tham số có thể được truyền vào khi gọiThread function.

mục đúng mảng

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

Tạo các chủ đề đồng thời cho cả hàm tùy chỉnh và hàm ẩn danh.

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

Sử dụngThread(...items)hình thức để tạo các chủ đề đồng thời và thực hiện nhiều chức năng liên tục.

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

Nó hỗ trợ truyền tham số đến các chức năng được thực hiện đồng thời.

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

Nó hỗ trợ truyền các chuỗi hàm và có thể nhập thư viện bên ngoài một cách năng động để tính toán đồng thời.

Chức năng sợifuncđã đi vàoThread()Function for concurrent execution runs in an isolated environment, so variables outside the thread cannot be directly referenced, and compilation will fail when referenced. Đồng thời, các tham chiếu đến các hàm đóng khác không được hỗ trợ trong thread. Tất cả các API được cung cấp bởi nền tảng có thể được gọi trong thread, nhưng các hàm được người dùng xác định khác không thể được gọi.

Nó hỗ trợ hệ thống backtesting và môi trường giao dịch trực tiếp. Tất cả các chức năng liên quan đến luồng đồng thời chỉ được hỗ trợ như khả năng tương thích mã trong hệ thống backtesting và sẽ không thực sự được thực hiện bởi luồng đồng thời, vì vậy chúng sẽ không được lặp lại trong chương này.

{@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

CácgetThread()hàm được sử dụng để lấy đối tượng thread dựa trên ID thread được chỉ định.

CácgetThread()hàm trả vềThreadđối tượng với threadId được chỉ định bởi tham số

Threadđối tượng

getThread ((ThreadId)

Các thông sốthreadIdlà ID đối tượng thread. Nhận đối tượng thread tương ứng bằng cách chỉ định tham số.

ThreadId đúng số

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

Đưa đối tượng chủ đề được chỉ định quathreadId.

Nó hỗ trợ hệ thống backtesting và môi trường giao dịch trực tiếp.

Nếu chủ đề bạn muốn lấy đã được thực hiện và phát hành, bạn không thể sử dụngthreading.getThread(threadId)để có được đối tượng của sợi.

{@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/threading/Dict Dict}, {@fun/Threads/threading/pending pending}, {@fun/Threads/threading/eventLoop Loop}

mainThread

CácmainThread()chức năng được sử dụng để có được đối tượng sợi của sợi chính, đó là sợi màmain()chức năng trong chiến lược được đặt.

CácmainThread()hàm trả về đối tượng thread của thread chính.

Threadđối tượng

mainThread()

function main() {
    Log("The threadId of the main thread:", threading.mainThread().id())
}

Lấy cáiThreadđối tượng của dây chính và đầu rathreadIdcủa chủ đề.

function test() {
    Log("Output the main thread ID in the test function:", threading.mainThread().id())
}

function main() {
    var t1 = threading.Thread(test)
    t1.join()
}

Đối tượng sợi của sợi chính cũng có thể được lấy trong các sợi song song.

Nó hỗ trợ hệ thống backtesting và môi trường giao dịch trực tiếp.

{@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/pending pending}, {@fun/Threads/threading/eventLoop Loop}

CurrentThread (đề tài hiện tại)

CáccurrentThread()chức năng được sử dụng để có được đối tượng thread của thread hiện tại.

CáccurrentThread()hàm trả về đối tượng thread của thread hiện tại.

Threadđối tượng

CurrentThread (()

function test() {
    Log("Id of the current thread:", threading.currentThread().id())
}

function main() {
    var t1 = threading.Thread(test)
    t1.join()
}

Lấy cáiThreadđối tượng của dòng dây và đầu rathreadIdcủa dòng hiện tại.

Nó hỗ trợ hệ thống backtesting và môi trường giao dịch trực tiếp.

{@fun/Threads/threading/Thread Thread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/Thread Thread}, {@fun/Threads/threading/Lock Lock}, {@fun/Threads/threads/threading/Condition Condition}, {@fun/Threads/threading/event Event}, {@fun/Threads/threading/threading/Dict Dict}, {@fun/Threads/threading/threading/pending pending}, {@fun/Threads/threading/eventLoop eventLoop}

Khóa

CácLock()chức năng được sử dụng để tạo ra một đối tượng khóa thread.

CácLock()hàm trả về một đối tượng khóa thread.

ThreadLockđối tượng

Khóa khóa.

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

Hai chủ đề đồng thời truy cập một tài nguyên chung.

Nó hỗ trợ hệ thống backtesting và môi trường giao dịch trực tiếp.

{@fun/Threads/threading/getThread getThread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/threading/ThreadThread}, {@fun/Threads/threading/Condition Condition}, {@fun/Threads/threading/Event Event}, {@fun/Threads/threading/threading/Dict Dict}, {@fun/Threads/threading/pending pending}, {@fun/Threads/threading/threading/eventLoop}

Điều kiện

CácCondition()function được sử dụng để tạo một đối tượng biến điều kiện, được sử dụng để đạt được đồng bộ hóa và giao tiếp giữa các luồng trong một môi trường đồng thời đa luồng.Condition(), một chuỗi có thể chờ khi một số điều kiện nhất định không được đáp ứng cho đến khi một chuỗi khác thông báo cho nó rằng điều kiện đã được đáp ứng.

CácCondition()hàm trả về aThreadCondition object.

ThreadConditionđối tượng

Tình trạng

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

Hai chủ đề đồng thời truy cập một tài nguyên chung.

Hệ thống backtesting không thực hiện chức năng này, nó chỉ xác định nó.

{@fun/Threads/getThread getThread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/Lock Lock}, {@fun/Threads/threading/threading/Thread Thread}, {@fun/Threads/threading/threading/event Event}, {@fun/Threads/threading/Dict Dict}, {@fun/Threads/threading/pending pending}, {@fun/Threads/threading/eventLoop}

Sự kiện

CácEvent()chức năng được sử dụng để tạo ra mộtsự kiện threadđối tượng, được sử dụng để đồng bộ hóa giữa các luồng, cho phép một luồng chờ thông báo hoặc tín hiệu từ luồng khác.

CácEvent()hàm trả về aThreadEvent object.

ThreadEventđối tượng

Sự kiện

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

Hai chủ đề đồng thời truy cập một tài nguyên chung.

Nó hỗ trợ hệ thống backtesting và môi trường giao dịch trực tiếp.

{@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/threading/Thread Thread}, {@fun/Threads/threading/threading/Dict Dict}, {@fun/Threads/threading/pending pending}, {@fun/Threads/threading/eventLoop}

Đề tài

CácDict()function được sử dụng để tạo một đối tượng từ điển để chuyển sang các luồng đồng thời.

CácDict()hàm trả về aThreadDict object.

ThreadDictđối tượng

Định nghĩa

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

Chuyển một đối tượng bình thường sang chức năng thực thi luồng đồng thời để kiểm tra xem việc sửa đổi giá trị khóa của đối tượng sẽ gây ra thay đổi giá trị khóa của đối tượng trong các luồng khác.

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

Đưa qua.ThreadDictđối tượng được tạo ra bởiDict()chức năng với chức năng thực thi luồng đồng thời, và kiểm tra xem việc sửa đổi giá trị khóa của đối tượng sẽ làm cho giá trị khóa của đối tượng trong các luồng khác thay đổi hay không.

Khi một đối tượng chung được truyền đến một hàm luồng đồng thời, nó được truyền như một bản sao sâu.

Nó hỗ trợ hệ thống backtesting và môi trường giao dịch trực tiếp.

{@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/threading/Thread Thread}, {@fun/Threads/threading/threading/pending pending}, {@fun/Threads/threading/eventLoop}

đang chờ

Cácpendinghàm được sử dụng để lấy số lượng các chủ đề đồng thời chạy trong chương trình chiến lược hiện tại.

Cácpending()hàm trả về số lượng các chủ đề đồng thời mà chương trình chiến lược hiện tại đang chạy.

số

đang chờ ((()

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

Tạo hai chủ đề chạy đồng thời và gọipending()hoạt động tại các nút thời gian khác nhau.

Khi chiến lượcmain()hàm bắt đầu chạy, gọi hàmpending()trực tiếp sẽ trả về 1, bởi vì các chủ đề mà chiến lượcmain()chức năng được đặt cũng là một chủ đề đang chờ.

Nó hỗ trợ hệ thống backtesting và môi trường giao dịch trực tiếp.

{@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}

Sợi

Threadcác đối tượng có thể được tạo hoặc trả về bởithreading.Thread(), threading.getThread(), threading.mainThread(), vàthreading.currentThread().

peekMessage

CácpeekMessage()hàm được sử dụng để nhận một thông điệp từ một chủ đề.

CácpeekMessage()hàm trả về thông điệp được nhận bởi chủ đề liên kết với đối tượng chủ đề hiện tại.

chuỗi, số, bool, đối tượng, mảng, giá trị null và các loại khác được hỗ trợ bởi hệ thống

peekMessage() peekMessage ((timeout)

Các thông sốtimeoutlà thiết lập thời gian hết. Nó sẽ chặn và chờ số milliseconds được thiết lập bởi tham số và trả về dữ liệu. Nếu không có dữ liệu và thời gian hết vượt quá giới hạn, giá trị null sẽ được trả về. Nếutimeoutđược thiết lập thành 0 hoặctimeouttham số không được thông qua, nó có nghĩa là quá trình sẽ chặn và chờ đợi cho đến khi dữ liệu được nhận từ kênh.timeoutđược đặt thành -1, điều đó có nghĩa là quá trình sẽ không chặn và trả về dữ liệu ngay lập tức. Nếu không có dữ liệu, giá trị null sẽ được trả về.

thời gian nghỉ sai số

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

Gửi tin nhắn đến chủ đề chính từ một chủ đề đồng thời.

Khi viết chương trình, chúng ta cần chú ý đến các vấn đề bế tắc.

{@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/Thread/name}, {@Threads/Threads/eventLoop eventLoop}

postMessage

CácpostMessage()hàm được sử dụng để gửi một thông điệp đến một chủ đề.

postMessage ((msg)

Các thông sốmsglà thông điệp được gửi đi.

msg đúng Bất kỳ loại nào được hệ thống hỗ trợ, chẳng hạn như chuỗi, số, bool, đối tượng, mảng, hàm, giá trị không, v.v.

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

Gửi tin nhắn trong các chủ đề đồng thời và sử dụngeventLoop()để nhận thông báo tin nhắn.

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

Nó hỗ trợ gửi một hàm.

Khi một hàm thực thi threads gọipostMessage()chức năng để gửi một tín hiệu hoặc dữ liệu, một sự kiện tin nhắn cũng được tạo ra.eventLoop()chức năng để nhận thông báo tin nhắn.

{@fun/Threads/Thread/peekMessage peekMessage}, {@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 name}, {@fun/Threads/Thread/eventLoop eventLoop}

tham gia

Cácjoin()chức năng được sử dụng để chờ cho các luồng để thoát và lấy lại các tài nguyên hệ thống.

CácThreadRetđối tượngchứa dữ liệu về kết quả thực hiện.

  • id: Thread ID.
  • kết thúc: Có phải sợi được buộc phải kết thúc hay không.
  • đã trôi qua: Thời gian chạy của sợi trong nano giây.
  • ret: Giá trị trả về của hàm thread.

ThreadRetđối tượng

tham gia tham gia ((timeout)

Cáctimeouttham số được sử dụng để thiết lập thời gianout trong milliseconds cho chờ đợi cho các thread để kết thúc.timeouttham số được thiết lập thành 0 hoặctimeouttham số không được thiết lập,join()chức năng sẽ chặn và chờ cho đến khi các chủ đề hoàn thành thực thi.timeouttham số được thiết lập thành -1,join()chức năng sẽ trở lại ngay lập tức.

thời gian nghỉ sai số

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

Kiểm trajoin()chức năng cho thời gian nghỉ và đầu ra giá trị trả về.

Cácjoin()hàm thời gian ra và trở lạiundefined.

{@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/Threads/Thread/id id}, {@fun/Threads/Thread/name name}, {@fun/Threads/Threads/Thread/eventLoop eventLoop}

kết thúc

Cácterminate()chức năng được sử dụng để kết thúc một thread và giải phóng các tài nguyên phần cứng được sử dụng bởi thread được tạo.

kết thúc ((()

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

Kết thúc thực thi một chủ đề bằng vũ lực Sau khi kết thúc một chủ đề bằng vũ lực, sẽ không có đầu ra từ chủ đề này trong nhật ký.

Đối với các sợi được kết thúc bằng vũ lực bởi cácterminate()chức năng, chúng ta không thể sử dụngjoin()chức năng để chờ đợi chúng chấm dứt.

{@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/Thread/eventLoop eventLoop}

getData

CácgetData()Dữ liệu là hợp lệ khi thread chưa thực thi cácjoin()chức năng (đang chờ để thoát thành công) và đã không thực hiện cácterminate()chức năng (kết thúc sợi dây bằng vũ lực).

CácgetData()hàm trả về giá trị khóa tương ứng vớikeytham số trong cặp giá trị khóa được lưu trữ trong ngữ cảnh luồng hiện tại.

chuỗi, số, bool, đối tượng, mảng, giá trị null và các loại khác được hỗ trợ bởi hệ thống

getData() getData ((key)

Cáckeytham số là tên khóa của cặp giá trị khóa được lưu trữ.

chìa khóa đúng chuỗi

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

Ghi lại giá trị của khóacounttrong môi trường thread đồng thời, và sau đó đọc giá trị khóa củacounttrong chủ đề.

{@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

CácsetData()function được sử dụng để lưu trữ các biến trong ngữ cảnh thread.

setData ((key, giá trị)

Cáckeytham số được sử dụng để chỉ định tên khóa của cặp giá trị khóa được lưu trữ.

chìa khóa đúng chuỗi Cácvaluetham số được sử dụng để xác định giá trị khóa của cặp giá trị khóa được lưu trữ.

giá trị đúng Bất kỳ loại nào được hệ thống hỗ trợ, chẳng hạn như chuỗi, số, bool, đối tượng, mảng, hàm, giá trị không, v.v.

function main() {
    var t1 = threading.Thread(function() {
        threading.currentThread().setData("data", 100)
    })
    Sleep(1000)
    Log(`t1.getData("data"):`, t1.getData("data"))
    t1.join()
}

Đặt cặp key-value trong thread đồng thời và đọc cặp key-value trong thread chính.

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

Nó hỗ trợ chuyển giá trị khóa sang các hàm.

Dữ liệu là hợp lệ khi chủ đề chưa thực hiệnjoin()chức năng (đang chờ để thoát thành công) và đã không thực hiện cácterminate()Các giá trị của tham sốvaluephải là một biến có thể được nối tiếp.

{@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 name}, {@fun/Threads/Thread/eventLoop eventLoop}

id

Cácid()hàm được sử dụng để trả vềthreadIdcủa các trường hợp đối tượng đa luồng hiện tại.

Giá trị trả lại củaid()chức năng làthreadId.

số

id()

function main() {
    var t1 = threading.Thread(function() {
        threading.currentThread().setData("data", 100)
    })
    Log(`t1.id():`, t1.id())
    t1.join()
}

Tạo một chủ đề chạy đồng thời và đầu rathreadIdcủa chuỗi đồng thời này trong chuỗi chính.

{@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 setData}, {@fun/Threads/Thread/name name}, {@fun/Threads/Threads/Thread/eventLoop eventLoop}

tên

Cácname()function được sử dụng để trả lại tên của các trường hợp đối tượng đa luồng hiện tại.

Cácname()hàm trả về tên chủ đề đồng thời.

chuỗi

tên

function main() {
    var t1 = threading.Thread(function() {
        threading.currentThread().setData("data", 100)
    })
    Log(`t1.name():`, t1.name())  // t1.name(): Thread-1
    t1.join()
}

Tạo một chủ đề đồng thời và xuất ra tên của chủ đề đồng thời trong chủ đề chính.

{@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/Thread/Thread/eventLoop eventLoop}

eventLoop

CáceventLoop()chức năng được sử dụng để nghe các sự kiện được nhận bởi các chủ đề.

CáceventLoop()hàm trả về thông tin sự kiện nhận được bởi các chủ đề hiện tại. XemCấu trúc thông tin sự kiện.

đối tượng, giá trị không

eventLoop (() eventLoop (thời gian hết)

Các thông sốtimeoutlà thiết lập timeout trong milliseconds. Nếu tham sốtimeoutđược thiết lập là 0, nó sẽ chờ cho một sự kiện xảy ra trước khi trả về. Nếu lớn hơn 0, nó sẽ thiết lập thời gian chờ sự kiện. Nếu nhỏ hơn 0, nó sẽ trả về sự kiện mới nhất ngay lập tức.

thời gian nghỉ sai số

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

Chạy ba chủ đề đồng thời và xuất thông tin sự kiện nhận được. Nếu thời gian hết hoặc hàm trả về ngay lập tức, giá trị đầu ra là không.

Cơ chế xử lýeventLoop()chức năng là giống như chức năng toàn cầuEventLoop().

{@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 setData}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name name}

ThreadLock

Đối tượng khóa Thread, được sử dụng để xử lý đồng bộ hóa nhiều thread.

có được

Cácacquire()chức năng được sử dụng để yêu cầu khóa sợi ( khóa).

có được (((

Vui lòng tham khảothreading.Lock()phần cho các ví dụ.

Cácacquire()chức năng được sử dụng để yêu cầu một khóa thread.acquire()chức năng của một đối tượng khóa chủ đề, nó cố gắng mua khóa. Nếu khóa hiện không được giữ bởi một chủ đề khác, chủ đề gọi thành công mua khóa và tiếp tục thực thi. Nếu khóa đã được giữ bởi một chủ đề khác, chủ đề gọiacquire()sẽ bị chặn cho đến khi khóa được giải phóng.

{@fun/Threads/threading/Lock Lock}, {@fun/Threads/ThreadLock/release release}

giải phóng

Cácrelease()chức năng được sử dụng để giải phóng khóa sợi (đánh khóa).

giải phóng

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

Kiểm tra các kịch bản bế tắc

Cần lưu ý rằng việc sử dụng khóa sợi không đúng cách có thể dẫn đến bế tắc.

{@fun/Threads/threading/Lock Lock}, {@fun/Threads/ThreadLock/acquire acquire}

ThreadEvent

Đối tượng sự kiện, được sử dụng cho thông báo và tín hiệu sự kiện đa luồng.

tập hợp

Cácset()chức năng được sử dụng để thông báo các sự kiện (đặt tín hiệu).

set (()

Vui lòng tham khảothreading.Event()phần cho các ví dụ.

Nếu tín hiệu đã được đặt bằng cách sử dụngset()Chúng ta phải xóa tín hiệu và đặt lại.

{@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/wait wait}, {@fun/Threads/ThreadEvent/isSet isSet}

rõ ràng

Cácclear()chức năng được sử dụng để xóa tín hiệu.

rõ ràng.

Vui lòng tham khảothreading.Event()phần cho các ví dụ.

{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/wait wait}, {@fun/Threads/ThreadEvent/isSet isSet}

Chờ đã.

Cácwait()chức năng được sử dụng để thiết lập một sự kiện ( tín hiệu) chờ đợi, và sẽ chặn trước khi sự kiện ( tín hiệu) được thiết lập; nó hỗ trợ thiết lập một tham số timeout.

Cácwait()hàm trả về xem timeout đã xảy ra. Nếu có, nó trả về một giá trị true.

bool

chờ chút nhé. chờ (đến thời điểm hết)

Cáctimeouttham số được sử dụng để thiết lập thời gian chờ trong milliseconds.

thời gian nghỉ sai số

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

Kiểm tra giá trị trả về củawait() function.

{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/isSet isSet}

isSet

CácisSet()chức năng được sử dụng để xác định xem một sự kiện ( tín hiệu) đã được thiết lập.

CácisSet()hàm trả về xem sự kiện (dấu hiệu) đã được thiết lập; nếu sự kiện (dấu hiệu) đã được thiết lập, nó trả về một giá trị true.

bool

isSet()

Vui lòng tham khảothreading.Event()phần cho các ví dụ.

{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/wait wait}

ThreadCondition

Đối tượng điều kiện, được sử dụng để đồng bộ hóa nhiều luồng.

thông báo

Cácnotify()hàm được sử dụng để đánh thức một luồng chờ (nếu có). Chỉ luồng đã gọiwait()Phương pháp sẽ được đánh thức.

thông báo

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

Sử dụngnotify()chức năng để đánh thức dây chờ.

Cácnotify()hàm đánh thức một chủ đề trong hàng đợi.

Khinotify()chức năng đánh thức một thread, thread sẽ lấy lại khóa thread.

{@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/Threads/ThreadCondition/release release}

thông báo cho tất cả

CácnotifyAll()chức năng đánh thức tất cả các chủ đề đang chờ.

thông báo tất cả

Vui lòng tham khảoThreadCondition.notify()phần cho các ví dụ.

CácnotifyAll()chức năng đánh thức tất cả các chuỗi đang chờ một một, và các chuỗi được đánh thức lấy lại khóa chuỗi.

{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/Threads/ThreadCondition/release release}

Chờ đã.

Cácwait()chức năng được sử dụng để làm cho một sợi chờ dưới một số điều kiện thiết kế nhất định.

chờ chút nhé.

Vui lòng tham khảoThreadCondition.notify()phần cho các ví dụ.

Cácwait()chức năng giải phóng khóa sợi và lấy lại khóa sợi khi thức dậy.

{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/Threads/ThreadCondition/release release}

có được

Cácacquire()chức năng được sử dụng để yêu cầu khóa sợi ( khóa).

có được (((

Vui lòng tham khảoThreadCondition.notify()phần cho các ví dụ.

Trước khi sử dụngwait(), bạn cần phải yêu cầu khóa thread của đối tượng điều kiện hiện tại.

{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/release release}

giải phóng

Cácrelease()chức năng được sử dụng để giải phóng khóa sợi (đánh khóa).

giải phóng

Vui lòng tham khảoThreadCondition.notify()phần cho các ví dụ.

Sau khi sử dụngwait(), chúng ta cần để giải phóng khóa thread (mở khóa) của đối tượng điều kiện hiện tại.

{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquire acquire}

ThreadDict

Đối tượng từ điển, dùng để chia sẻ dữ liệu.

lấy

Cácget()hàm được sử dụng để có được giá trị khóa được ghi trong đối tượng từ điển.

Cácget()hàm trả về giá trị của khóa được chỉ định bởikey parameter.

chuỗi, số, bool, đối tượng, mảng, giá trị null và các loại khác được hỗ trợ bởi hệ thống

get ((key)

Cáckeytham số được sử dụng để chỉ định tên khóa tương ứng với khóa được lấy.

chìa khóa đúng chuỗi

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

Sử dụng các đối tượng sự kiện để thông báo cho các luồng để đọc và sửa đổi dữ liệu.

{@fun/Threads/ThreadDict/set set}

tập hợp

Cácset()hàm được sử dụng để thiết lập một cặp giá trị khóa.

set (key, value)

Các thông sốkeyđược sử dụng để thiết lập tên khóa được sửa đổi.

chìa khóa đúng chuỗi Các thông sốvalueđược sử dụng để thiết lập giá trị khóa được sửa đổi.

giá trị đúng chuỗi, số, bool, đối tượng, mảng, hàm, giá trị null và các loại khác được hỗ trợ bởi hệ thống

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

Nó hỗ trợ chuyển giá trị khóa sang các hàm.

{@fun/Threads/ThreadDict/get get}

Web3

exchange.IO("abi",...)

Trong nền tảng giao dịch FMZ Quant, nó chủ yếu thực hiện các chức năng khác nhau, gọi liên quan đến blockchain thông quaexchange.IO()Các tài liệu sau đây mô tảexchange.IO()Phương pháp gọi củaexchange.IO("abi", ...)chức năng được sử dụng để đăng ký ABI.

exchange.IO(k, địa chỉ, abiContent)

Cácktham số được sử dụng để thiết lập chức năng củaexchange.IO()chức năng, được thiết lập thành"abi"có nghĩa là chức năng được sử dụng để đăng kýABI. k đúng chuỗi Cácaddresstham số được sử dụng để chỉ định địa chỉ của hợp đồng thông minh. địa chỉ đúng chuỗi CácabiContenttham số được sử dụng để xác địnhABIcủa hợp đồng thông minh. abiContent đúng chuỗi

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

Các phương pháp gọi hợp đồng thông minh không cần phải được đăng ký nếu chúng là các phương pháp ERC20 tiêu chuẩn. Đưa nó ra.ABInội dung của hợp đồng có thể được lấy bằng URL sau đây, lấyresultChỉ trường, ví dụ:

https://api.etherscan.io/api?module=contract&action=getabi&address=0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45

exchange.IO("api", eth,...)

Phương pháp gọi củaexchange.IO("api", "eth", ...)hàm được sử dụng để gọi phương thức Ethereum RPC.

Cácexchange.IO("api", "eth", ...)hàm trả về giá trị trả về của phương thức RPC được gọi. chuỗi, số, bool, đối tượng, mảng, null và tất cả các loại khác được hỗ trợ bởi hệ thống

exchange.IO(k, blockChain, rpcMethod)exchange.IO(k, blockChain, rpcMethod,...args)

Cácktham số được sử dụng để thiết lập chức năng củaexchange.IO()chức năng, được thiết lập thành"api"chỉ ra rằng hàm được sử dụng để mở rộng yêu cầu gọi. k đúng chuỗi CácblockChaintham số được sử dụng để thiết lập chức năng củaexchange.IO()chức năng, được thiết lập thành"eth"chỉ ra rằng hàm được sử dụng cho các cuộc gọi phương thức RPC trên Mạng Ethereum. BlockChain đúng chuỗi CácrpcMethodtham số được sử dụng để thiết lập phương pháp RPC được gọi bởi cácexchange.IO()chức năng. phương pháp rpc đúng chuỗi Cácargtham số được sử dụng để chỉ định các tham số của phương thức RPC được gọi. Có thể có nhiều hơn mộtargLoại và số lượngargCác thông số phụ thuộc vào phương pháp RPC được chỉ định bởirpcMethodtham số. arg sai chuỗi, số, bool, đối tượng, mảng, hàm, null, và tất cả các loại khác được hỗ trợ bởi hệ thống

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

Kiểm tra số dư ETH trong ví của bạn:

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

Đối với chuyển tiền ETH, bạn có thể thiết lập{gasPrice: 11, gasLimit: 111, nonce: 111}tham số, được thiết lập trên tham số cuối cùng củaexchange.IO()Bạn có thể bỏ quanoncevà sử dụng hệ thống mặc định, hoặc để lạigasLimit/gasPrice/noncetắt và sử dụng giá trị mặc định của hệ thống cho tất cả.

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

Câu hỏigasPrice:

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

Câu hỏieth_estimateGas:

Các tham số thứ hai củaexchange.IO()chức năng với"eth"có thể trực tiếp gọi các phương pháp RPC có sẵn cho máy chủ node Ethereum.

{@fun BigDecimal}, {@fun BigInt}

exchange.IO("đã mã hóa",...)

Cácexchange.IO("encode", ...)hàm được gọi cho mã hóa dữ liệu.

Cácexchange.IO("encode", ...)hàm trả về dữ liệu được mã hóa. chuỗi

exchange.IO(k, dataFormat,...args)exchange.IO(k, địa chỉ, định dạng dữ liệu)exchange.IO(k, địa chỉ, dataFormat,...args)

Cácktham số được sử dụng để thiết lập chức năng củaexchange.IO()chức năng, được thiết lập thành"encode"có nghĩa là hàm được sử dụng để mã hóa dữ liệu. k đúng chuỗi CácaddressCác tham số được sử dụng để thiết lập địa chỉ của hợp đồng thông minh.exchange.IO("encode", ...)chức năng, đi qua trongaddresstham số chỉ ra mã hóa phương thức gọi trên hợp đồng thông minh.exchange.IO("encode", ...)chức năng, nếuaddresstham số không được truyền, chức năng được sử dụng để mã hóa thứ tự loại được chỉ định và tương đương về chức năng vớiabi.encodetrongSolidity. địa chỉ sai chuỗi CácdataFormattham số được sử dụng để xác định phương pháp, loại và thứ tự của dữ liệu được mã hóa. dataFormat đúng chuỗi Cácargtham số được sử dụng để chỉ định giá trị dữ liệu cụ thể phù hợp vớidataFormatcó thể có nhiều hơn mộtargtham số, và loại và số lượngargcác thông số phụ thuộc vàodataFormatcài đặt tham số. arg sai chuỗi, số, tuple, mảng, và tất cả các loại khác được hỗ trợ bởi hệ thống

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

Ví dụ, gọi phương thức mã hóaunwrapWETH9:

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
    */
}

Nó tương đương với ví dụ mã hóa củaabi.encodetrongSolidity:

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

Nó hỗ trợ mã hóa một tuple hoặc một thứ tự loại chứa một tuple. Lệnh kiểu này bao gồm:tuple, bytesVì vậy khi gọiexchange.IO()để mã hóa, bạn cần tiếp tục truyền hai tham số:

    1. Các biến tương ứng với loại tuple:
    
    {
        a: 30,
        b: 20,
        c: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
    }
    
    

    Các thông số được truyền phải phù hợp với cấu trúc và loạituple, như được định nghĩa trongtypestham số của biểu mẫu:tuple(a uint256,b uint8,c address).

    1. Các biến tương ứng với loạibytes:
    "0011"
    
function main() {
    var path = ["0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "0xdac17f958d2ee523a2206206994597c13d831ec7"]   // ETH address, USDT address
    var ret = exchange.IO("encode", "address[]", path)
    Log("encode: ", ret)
}

Nó hỗ trợ mã hóa thứ tự của mảng hoặc các loại chứa mảng:

Cácexchange.IO()chức năng bao gồm cácencodephương pháp, mà có thể trả lại mã gọi chức năng đểhexĐối với việc sử dụng cụ thể, bạn có thể tham khảo các nền tảng s có sẵn công khaiUniswap V3 Trade Mẫu. Khi phương pháp mã hóa gọi các hợp đồng thông minh, ABI tương ứng cần phải được đăng ký trước.

exchange.IO("EncodePacked",...)

Cácexchange.IO("encodePacked", ...)hàm được gọi theo cách được sử dụng choencodePacked encoding.

Cácexchange.IO("encodePacked", ...)hàm trả vềencodePackeddữ liệu được mã hóa. chuỗi

exchange.IO(k, dataFormat,...args)

Cácktham số được sử dụng để thiết lập chức năng củaexchange.IO()chức năng, được thiết lập thành"encodePacked"có nghĩa là hàm được sử dụng cho dữ liệuencodePackedmã hóa. k đúng chuỗi CácdataFormattham số được sử dụng để xác định loại và thứ tự củaencodePackeddữ liệu được mã hóa. dataFormat đúng chuỗi Cácargtham số được sử dụng để chỉ định giá trị dữ liệu cụ thể phù hợp vớidataFormatcó thể có nhiều hơn mộtargtham số, và loại và số lượngargcác thông số phụ thuộc vàodataFormatcài đặt tham số. arg đúng chuỗi, số, tuple, mảng, và tất cả các loại khác được hỗ trợ bởi hệ thống

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

Khi sử dụngUniswap V3, bạn cần phải truyền vào các thông số như đường dẫn trao đổi, bạn cần phải sử dụngencodePackedHoạt động mã hóa:

exchange.IO("đã giải mã",...)

Cácexchange.IO("decode", ...)hàm được gọi theo cách được sử dụng để giải mã.

Cácexchange.IO("decode", ...)Trả về một chuỗi khi chỉ có một dữ liệu được chỉ định bởidataFormatTrả về một mảng khi có nhiều hơn một dữ liệu được chỉ định bởidataFormattham số. mảng,string

exchange.IO(k, dataTình hình, dữ liệu)

Cácktham số được sử dụng để thiết lập chức năng củaexchange.IO()chức năng, và thiết lập nó để"decode"có nghĩa là chức năng được sử dụng để giải mã dữ liệu. k đúng chuỗi CácdataFormattham số được sử dụng để xác định loại và thứ tự của dữ liệu giải mã. dataFormat đúng chuỗi Cácdatatham số được sử dụng để thiết lập dữ liệu được giải mã. dữ liệu đúng chuỗi

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

Hoạt động ngược củaexchange.IO("encode", ...)chức năng:

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

Ví dụ sau đây đầu tiên thực hiện mộtencodePackedhoạt động trênpathxử lý tham số, bởi vìexactOutputgọi phương thức mà cần được mã hóa sau đó đòi hỏipathnhư một tham số. sau đóencodecácexactOutputphương pháp của hợp đồng tuyến đường, chỉ có một tham số loạituple. Tên phương phápexactOutputđược mã hóa như sau:0x09b81346, và sử dụngexchange.IO("decode", ...)phương pháp giải mã kết quảdecodeRaw, phù hợp với biếndataTuple.

Đối với xử lý dữ liệu,exchange.IO()chức năng hỗ trợ không chỉ mã hóa, mà còn giải mã.

exchange.IO("khóa",...)

Cácexchange.IO("key", ...)chức năng được gọi theo cách để chuyển đổi khóa riêng.

exchange.IO(k, phím)

Các thông sốkđược sử dụng để thiết lập chức năng củaexchange.IO()chức năng, được thiết lập thành"key"nghĩa là chức năng được sử dụng để chuyển đổi khóa riêng. k đúng chuỗi Cáckeytham số được sử dụng để thiết lập khóa riêng. chìa khóa đúng chuỗi

function main() {
    exchange.IO("key", "Private Key")   // "Private Key" represents the private key string, which needs to be filled in specifically
}

Cácexchange.IO()chức năng hỗ trợ chuyển đổi khóa riêng và nó có thể thao tác nhiều địa chỉ ví. Nó cũng có thể thêm nhiều đối tượng trao đổi (xem: {@var/EXCHANGE/exchanges exchanges}) để thao tác nhiều địa chỉ ví.

exchange.IO("api",...)

Cácexchange.IO("api", ...)hàm được gọi theo cách được sử dụng để gọi các phương thức của hợp đồng thông minh.

Cácexchange.IO("api", ...)hàm trả về giá trị trả về của phương thức gọi là hợp đồng thông minh. chuỗi, số, bool, đối tượng, mảng, null và tất cả các loại khác được hỗ trợ bởi hệ thống

exchange.IO(k, địa chỉ, phương pháp)exchange.IO(k, địa chỉ, phương pháp,...args)exchange.IO(k, địa chỉ, phương pháp, giá trị,...args)

Cácktham số được sử dụng để thiết lập chức năng củaexchange.IO()chức năng, được thiết lập thành"api"chỉ ra rằng hàm được sử dụng để mở rộng yêu cầu gọi. k đúng chuỗi Cácaddresstham số được sử dụng để chỉ định địa chỉ của hợp đồng thông minh. địa chỉ đúng chuỗi Cácmethodtham số được sử dụng để xác định phương thức của hợp đồng thông minh được gọi. phương pháp đúng chuỗi Cácvaluetham số được sử dụng để thiết lập số tiền ETH được gửi.stateMutabilitythuộc tính của phương thức hợp đồng thông minh được thực thi làpayable, sau đó làvaluetham số cần phải được thông qua."stateMutability": "payable"có thể xem từ ABI.exchange.IO()chức năng sẽ xác định các thông số cần thiết dựa trênstateMutabilitytính năng trong ABI đã được đăng ký.stateMutabilitythuộc tính lànonpayable, sau đó làvaluetham số không cần phải được truyền. giá trị sai số, chuỗi Cácargtham số được sử dụng để xác định các tham số của phương thức của hợp đồng thông minh được gọi. Có thể có nhiều hơn mộtargtham số, và loại và số lượngargCác tham số phụ thuộc vào phương pháp của hợp đồng thông minh được gọi. arg sai chuỗi, số, bool, và tất cả các loại khác được hỗ trợ bởi hệ thống

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
}

Cácdecimalsphương pháp là mộtconstantphương pháp ERC20 mà không phải chịu tiêu thụ khí và nó có thể truy vấn các dữ liệu chính xác của một token.decimalsreturn value: các dữ liệu chính xác của token.

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

Cácallowancephương pháp là mộtconstantphương pháp ERC20 mà không tạo ra tiêu thụ khí và có thể truy vấn số tiền được ủy quyền của một token cho một địa chỉ hợp đồng nhất định.allowancePhương pháp này có 2 tham số, đầu tiên là địa chỉ ví và thứ hai là địa chỉ được ủy quyền.
owner: địa chỉ của ví, ví dụ được thay thế bằng chuỗi owner, việc sử dụng thực tế cần phải điền vào địa chỉ cụ thể.spender: địa chỉ của hợp đồng được ủy quyền, ví dụ được thay thế bằng chuỗi spender, việc sử dụng thực tế cần phải điền vào địa chỉ cụ thể, ví dụ: nó có thể đượcUniswap 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 || {})
}

CácmulticallPhương pháp này không phải là...constantphương phápUniswap V3tạo ra tiêu thụ khí và được sử dụng để đổi token theo nhiều cách. Cácmulticallphương thức có thể có nhiều cách để truyền tham số, bạn có thể kiểm tra ABI có chứa phương thức cụ thể, bạn cần đăng ký ABI trước khi gọi phương thức.

Đối với các ví dụ cụ thể vềmulticallcác cuộc gọi phương pháp, bạn có thể tham khảo các nền tảngUniswap V3 Trade Mẫu

Một số chi tiết được mô tả ở đây bằng cách sử dụng mã giả:


exchange.IO("api", ContractV3SwapRouterV2, "multicall(uint256,bytes[])", value, deadline, data)

ContractV3SwapRouterV2: địa chỉ của bộ định tuyến v2 của Uniswap V3.value: số tiền ETH để chuyển, được đặt thành 0 nếu token trong giao dịch trao đổi không phải là ETH.deadline: deadlinelà tham số củamulticallphương pháp, có thể được đặt thành (new Date().getTime() / 1000) + 3600, cho thấy nó có hiệu lực trong một giờ.data: datalà tham số củamulticallphương pháp, dữ liệu của hoạt động đóng gói được thực hiện.

Tương tự nhưexchange.IO("api", "eth", "send", "toAddress", toAmount), cácgasLimit/gasPrice/noncethiết lập của phương thức gọi có thể được chỉ định khi gọimulticallphương pháp. Một lần nữa, chúng tôi sử dụng mã giả để mô tả:


exchange.IO("api", ContractV3SwapRouterV2, "multicall(uint256,bytes[])", value, deadline, data, {gasPrice: 123456, gasLimit: 21000})

Các thông số{gasPrice: 11, gasLimit: 111, nonce: 111}có thể được thiết lập theo nhu cầu cụ thể, được thiết lập cho tham số cuối cùng củaexchange.IO()chức năng. Bạn có thể bỏ quanoncevà sử dụng hệ thống mặc định giá trị, hoặc đểgasLimit/gasPrice/noncetắt và sử dụng giá trị mặc định của hệ thống cho tất cả.

exchange.IO("địa chỉ")

Cácexchange.IO("address")hàm được gọi theo cách để có được địa chỉ của ví được cấu hình bởi đối tượng trao đổi {@var/EXCHANGE exchange}.

Cácexchange.IO("address")function trả về địa chỉ ví được cấu hình. chuỗi

exchange.IO(k)

Cácktham số được sử dụng để thiết lập chức năng củaexchange.IO()chức năng, được thiết lập thành"address"có nghĩa là hàm được sử dụng để lấy địa chỉ ví được cấu hình. k đúng chuỗi

function main() {
    Log(exchange.IO("address"))         // Print the wallet address of the private key configured on the exchange object
}

exchange.IO("cơ sở",...)

Cácexchange.IO("base", ...)hàm được gọi theo cách để đặt địa chỉ nút RPC.

exchange.IO(k, địa chỉ)

Cácktham số được sử dụng để thiết lập chức năng củaexchange.IO()chức năng, được thiết lập thành"base"có nghĩa là chức năng được sử dụng để chuyển đổi các nút RPC. k đúng chuỗi Cácaddresstham số được sử dụng để thiết lập địa chỉ nút RPC. địa chỉ đúng chuỗi

function main() {
    var chainRpc = "https://bsc-dataseed.binance.org"
    e.IO("base", chainRpc)    // Switching to BSC chain
}

TA

TA.MACD

CácTA.MACD()chức năng được sử dụng để tính toánchỉ số MACD không giống và tương đồng bằng cấp theo cấp số nhân.

Giá trị trả lại củaTA.MACD()hàm là một mảng hai chiều với cấu trúc:[DIF, DEA, MACD]. mảng

TA.MACD ((inReal) TA.MACD ((inReal, optInFastPeriod, optInSlowPeriod, optInSignalPeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInFastPeriodtham số được sử dụng để thiết lập thời gian nhanh. optInFastPeriod sai số CácoptInSlowPeriodtham số được sử dụng để thiết lập thời gian chậm. optInSlowPeriod sai số CácoptInSignalPeriodtham số được sử dụng để thiết lập thời gian tín hiệu. OpInSignalPeriod sai số

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

CácTAthư viện chỉ số của FMZ Quant, được tối ưu hóa cho các thuật toán chỉ số phổ biến.JavaScript, Python, C++các cuộc gọi chiến lược ngôn ngữ,mã thư viện TA mã nguồn mở. Các giá trị mặc định củaoptInFastPeriod, optInSlowPeriod, vàoptInSignalPeriodcác thông số củaTA.MACD()chức năng là:12, 26, và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

CácTA.KDJ()hàm được sử dụng để tính toánchỉ số ngẫu nhiên.

Giá trị trả lại củaTA.KDJ()hàm là một mảng hai chiều với cấu trúc:[K, D, J]. mảng

TA.KDJ ((inReal) TA.KDJ ((inReal, period, kPeriod, dPeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số Cácperiodtham số được sử dụng để thiết lập thời gian 1. thời gian sai số CáckPeriodtham số được sử dụng để thiết lập thời gian 2. kThiều kỳ sai số CácdPeriodtham số được sử dụng để thiết lập thời gian 3. d Thời gian sai số

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

Các giá trị mặc định choperiod, kPeriod, vàdPeriodcác thông số củaTA.KDJ()chức năng là:9, 3, và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

CácTA.RSI()chức năng được sử dụng để tính toánChỉ số sức mạnh.

Giá trị trả lại củaTA.RSI()chức năng là: một mảng một chiều. mảng

TA.RSI ((inReal) TA.RSI ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian. optInTimePeriod sai số

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

Giá trị mặc định củaoptInTimePeriodtham số củaTA.RSI()chức năng là: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

CácTA.ATR()chức năng được sử dụng để tính toánChỉ số biến động trung bình thực sự.

Giá trị trả lại củaTA.ATR()chức năng là: một mảng một chiều. mảng

TA.ATR ((inPriceHLC) TA.ATR ((inPriceHLC, optInTimePeriod)

CácinPriceHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceHLC đúng {@struct/Record Record} cấu trúc mảng CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian. optInTimePeriod sai số

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

Giá trị mặc định củaoptInTimePeriodtham số củaTA.ATR()chức năng là: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

CácTA.OBV()chức năng được sử dụng để tính toánChỉ số thủy triều năng lượng.

Giá trị trả lại củaTA.OBV()chức năng là: một mảng một chiều. mảng

TA.OBV ((inReal) TA.OBV ((inReal, inPriceV)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácinPriceVtham số được sử dụng để xác định dữ liệu số tiền giao dịch. inPriceV sai {@struct/Record Record} cấu trúc mảng

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

CácTA.MA()chức năng được sử dụng để tính toánChỉ số MACD.

Giá trị trả lại củaTA.MA()chức năng là: một mảng một chiều. mảng

TA.MA(inReal)TA.MA(inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian. optInTimePeriod sai số

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

Giá trị mặc định củaoptInTimePeriodtham số củaTA.MA()chức năng là: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.CM TAF.CMF}, {@fun/TA/TA.Highest.Highest}, {@fun/TA/TA.Lowest.TA.Lowest}, {@fun/TA/TA.Lowest}, {@fun/TA/TA.Lowest.TA.Lowest}, {@fun/TA/TA.Lowest}, {@fun/TA/TA.Lowest.TA.Lowest}

TA.EMA

CácTA.EMA()chức năng được sử dụng để tính toánchỉ số trung bình theo cấp số nhân.

Giá trị trả lại củaTA.EMA()chức năng là: một mảng một chiều. mảng

TA.EMA ((inReal) TA.EMA ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian. optInTimePeriod sai số

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

Giá trị mặc định củaoptInTimePeriodtham số củaTA.EMA()chức năng là: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

CácTA.BOLL()chức năng được sử dụng để tính toánChỉ số Bollinger Band.

Giá trị trả lại củaTA.BOLL()hàm là một mảng hai chiều với cấu trúc:[upLine, midLine, downLine]. mảng

TA.BOLL ((inReal) TA.BOLL ((inReal, thời điểm, nhân)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số Cácperiodtham số được sử dụng để thiết lập khoảng thời gian. thời gian sai số Cácmultipliertham số được sử dụng để thiết lập nhân. nhân sai số

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

Các giá trị mặc định choperiodmultipliercác thông số củaTA.BOLL()chức năng là:202.

{@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

CácTA.Alligator()chức năng được sử dụng để tính toánChỉ số cá sấu.

Giá trị trả lại củaTA.Alligator()hàm là một mảng hai chiều với cấu trúc:[jawLine, teethLine, lipsLine]. mảng

TA.Alligator ((inReal) TA. Alligator ((inReal, hàmDài, răngDài, môiDài)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácjawLengththam số được sử dụng để thiết lập thời gian hàm. hàmDài sai số CácteethLengththam số được sử dụng để thiết lập thời gian răng. răngDài sai số CáclipsLengththam số được sử dụng để thiết lập khoảng môi trên. Môi dài sai số

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

Các giá trị mặc định củajawLength, teethLength, vàlipsLengthcác thông số củaTA.Alligator()chức năng là:13, 8, và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

CácTA.CMF()chức năng được sử dụng để tính toánChỉ số dòng tiền Chaikin.

Giá trị trả lại củaTA.CMF()chức năng là: một mảng một chiều. mảng

TA.CMF ((inReal) TA.CMF ((inReal, inPriceV)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácinPriceVtham số được sử dụng để xác định dữ liệu khối lượng. inPriceV sai {@struct/Record Record} cấu trúc mảng

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

CácTA.Highest()chức năng được sử dụng để tính toángiá cao nhất trong thời gian.

CácTA.Highest()hàm trả về giá trị tối đa của một thuộc tính trong khoảng thời gian nhất định cuối cùng, trừ Bar hiện tại. số

TA.Highest ((inReal) TA.Tăng nhất ((inReal, period, attr)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số Cácperiodtham số được sử dụng để thiết lập khoảng thời gian. thời gian sai số Cácattrtham số được sử dụng để thiết lập các thuộc tính, tùy chọn:Open, Close, Low, High, Volume, OpenInterest. attr sai chuỗi

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

Ví dụ, nếuTA.Highest(records, 30, "High")hàm được gọi, nếu tham số thời gianperiodđược thiết lập thành0, nó có nghĩa là để tính toán tất cảBarscủa dữ liệu K-line được chuyển quainRealtham số; nếu tham số thuộc tínhattrkhông được chỉ định, dữ liệu đường K được truyền bởiinRealtham số được coi là một mảng thông thường.

{@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}

TA.Lowest

CácTA.Lowest()chức năng được sử dụng để tính toángiá thấp nhất trong thời gian.

CácTA.Lowest()hàm trả về giá trị tối thiểu của một thuộc tính trong khoảng thời gian nhất định cuối cùng, trừ Bar hiện tại. số

TA.Lowest ((inReal) TA.Lowest ((inReal, period, attr)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số Cácperiodtham số được sử dụng để thiết lập khoảng thời gian. thời gian sai số Cácattrtham số được sử dụng để thiết lập các thuộc tính, tùy chọn:Open, Close, Low, High, Volume, OpenInterest. attr sai chuỗi

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

Ví dụ, nếuTA.Lowest(records, 30, "Low")hàm được gọi, nếu tham số thời gianperiodđược thiết lập thành0, nó có nghĩa là để tính toán tất cảBarscủa dữ liệu K-line được chuyển quainRealtham số; nếu tham số thuộc tínhattrkhông được chỉ định, dữ liệu đường K được truyền bởiinRealtham số được coi là một mảng thông thường. Việc sử dụngTA.Highest()TA.Lowest()chức năng trongC++chiến lược cần phải lưu ý rằngHighest()Lowest()Mỗi hàm chỉ có 2 tham số. Và tham số đầu tiên được chuyển vào không phải là dữ liệu đường Krthu được khi chức năngauto r = exchange.GetRecords()được gọi. Anh phải gọi chorCác dữ liệu thuộc tính cụ thể.r.Close()dữ liệu giá đóng cửa.Close, High, Low, Open, Volumenhư trongr.Close()phương pháp gọi.

Thử nghiệm ví dụ củaC++Chiến lược ngôn ngữ:

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}

TA.SMA

CácTA.SMA()chức năng được sử dụng để tính toánchỉ số trung bình di chuyển đơn giản.

Giá trị trả lại củaTA.SMA()chức năng là: một mảng một chiều. mảng

TA.SMA ((inReal) TA.SMA ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian. optInTimePeriod sai số

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

Giá trị mặc định củaoptInTimePeriodtham số củaTA.SMA()chức năng là: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

talib.CDL2CROWS

Cáctalib.CDL2CROWS()hàm được sử dụng để tính toánHai Quạ (Bản đồ đường K - Hai Quạ).

Giá trị trả lại củatalib.CDL2CROWS()hàm là một mảng một chiều. mảng

talib.CDL2CROWS ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDL2CROWS()chức năng được mô tả trong tài liệu thư viện talib như sau:CDL2CROWS(Records[Open,High,Low,Close]) = Array(outInteger)Đối với các cuộc gọi trongPythonngôn ngữ, thông qua các tham số là khác nhau và cần phải dựa trên mô tả trên:Records[Open,High,Low,Close].

Ví dụ về chia một biếnrecords(tức là tham sốinPriceOHLC, nhập {@struct/Record Record} mảng cấu trúc) vào:Opendanh sách: được viết bằng Python nhưrecords.Open. Highdanh sách: viết nhưrecords.Hightrong Python.Lowdanh sách: được viết bằng Python nhưrecords.Low. Closedanh sách: được viết bằng Python nhưrecords.Close.

Được gọi trong mã chiến lược Python:

talib.CDL2CROWS(records.Open, records.High, records.Low, records.Close)

Cái kia.talibCác chỉ số được mô tả theo cùng một cách và chúng sẽ không được lặp lại.

talib.CDL3BLACKCROWS

Cáctalib.CDL3BLACKCROWS()hàm được sử dụng để tính toánBa con quạ đen (bảng đồ K-line - Ba con quạ đen).

Giá trị trả lại củatalib.CDL3BLACKCROWS()chức năng là: một mảng một chiều. mảng

talib.CDL3BLACKCROWS ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDL3BLACKCROWS()chức năng được mô tả trong tài liệu thư viện talib như sau:CDL3BLACKCROWS(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDL3INSIDE

Cáctalib.CDL3INSIDE()hàm được sử dụng để tính toánBa bên trong lên / xuống (Bảng đồ K-line: Ba bên trong lên / xuống).

Giá trị trả lại củatalib.CDL3INSIDE()chức năng là: một mảng một chiều. mảng

talib.CDL3INSIDE ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDL3INSIDE()chức năng được mô tả trong tài liệu thư viện talib như sau:CDL3INSIDE(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDL3LINESTRIKE

Cáctalib.CDL3LINESTRIKE()chức năng được sử dụng để tính toánBước ba (K-line chart: Bước ba).

Giá trị trả lại củatalib.CDL3LINESTRIKE()chức năng là: một mảng một chiều. mảng

talib.CDL3LINESTRIKE ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDL3LINESTRIKE()chức năng được mô tả trong tài liệu thư viện talib như sau:CDL3LINESTRIKE(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDL3OUTSIDE

Cáctalib.CDL3OUTSIDE()hàm được sử dụng để tính toánBa bên ngoài lên/dưới (Bảng đồ K-line: Ba bên ngoài lên/dưới).

Giá trị trả lại củatalib.CDL3OUTSIDE()chức năng là: một mảng một chiều. mảng

talib.CDL3OUTSIDE ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDL3OUTSIDE()chức năng được mô tả trong tài liệu thư viện talib như sau:CDL3OUTSIDE(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDL3STARSINSOUTH

Cáctalib.CDL3STARSINSOUTH()hàm được sử dụng để tính toánThree Stars In The South (Bản đồ đường K: Three Stars In The South).

Giá trị trả lại củatalib.CDL3STARSINSOUTH()chức năng là: một mảng một chiều. mảng

talib.CDL3STARSINSOUTH ((inPriceOHLC))

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDL3STARSINSOUTH()chức năng được mô tả trong tài liệu thư viện talib như sau:CDL3STARSINSOUTH(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDL3WHITESOLDIERS

Cáctalib.CDL3WHITESOLDIERS()hàm được sử dụng để tính toánBa người lính da trắng tiến lên (bảng K-line: Ba người lính da trắng tiến lên).

Giá trị trả lại củatalib.CDL3WHITESOLDIERS()chức năng là: một mảng một chiều. mảng

talib.CDL3WHITESOLDIERS ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDL3WHITESOLDIERS()chức năng được mô tả trong tài liệu thư viện talib như sau:CDL3WHITESOLDIERS(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLABANDONEDBABY

Cáctalib.CDLABANDONEDBABY()hàm được sử dụng để tính toánTrẻ bị bỏ rơi (bảng K-line: Trẻ bị bỏ rơi).

Giá trị trả lại củatalib.CDLABANDONEDBABY()chức năng là: một mảng một chiều. mảng

talib.CDLABANDONEDBABY ((inPriceOHLC) talib.CDLABANDONEDBABY ((inPriceOHLC, optInPenetration)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng CácoptInPenetrationtham số được sử dụng để thiết lập Penetration, giá trị mặc định là 0,3. optInPenetration sai số

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

CácCDLABANDONEDBABY()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLABANDONEDBABY(Records[Open,High,Low,Close],Penetration = 0.3) = Array(outInteger)

talib.CDLADVANCEBLOCK

Cáctalib.CDLADVANCEBLOCK()chức năng được sử dụng để tính toánBảng tiên tiến (Bảng K-line: Advance).

Giá trị trả lại củatalib.CDLADVANCEBLOCK()hàm là một mảng một chiều. mảng

talib.CDLADVANCEBLOCK ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLADVANCEBLOCK()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLADVANCEBLOCK(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLBELTHOLD

Cáctalib.CDLBELTHOLD()chức năng được sử dụng để tính toánGiữ dây đai (Bản đồ đường K: Giữ dây đai).

Giá trị trả lại củatalib.CDLBELTHOLD()chức năng là: một mảng một chiều. mảng

talib.CDLBELTHOLD ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLBELTHOLD()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLBELTHOLD(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLBREAKAWAY

Cáctalib.CDLBREAKAWAY()chức năng được sử dụng để tính toánBreakaway (K-line chart: Breakaway).

Giá trị trả lại củatalib.CDLBREAKAWAY()chức năng là: một mảng một chiều. mảng

talib.CDLBREAKAWAY ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLBREAKAWAY(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLCLOSINGMARUBOZU

Cáctalib.CDLCLOSINGMARUBOZU()hàm được sử dụng để tính toánKhóa Marubozu (Bản đồ đường K: đóng trần và chân trần).

Giá trị trả lại củatalib.CDLCLOSINGMARUBOZU()chức năng là: một mảng một chiều. mảng

talib.CDLCLOSINGMARUBOZU ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLCLOSINGMARUBOZU()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLCLOSINGMARUBOZU(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLCONCEALBABYSWALL

Cáctalib.CDLCONCEALBABYSWALL()chức năng được sử dụng để tính toánGiấu Baby Swallow (Bảng K-line: Giấu Baby Swallow pattern).

Giá trị trả lại củatalib.CDLCONCEALBABYSWALL()chức năng là: một mảng một chiều. mảng

talib.CDLCONCEALBABYSWALL ((inPriceOHLC))

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLCONCEALBABYSWALL()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLCONCEALBABYSWALL(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLCOUNTERATTACK

Cáctalib.CDLCOUNTERATTACK()hàm được sử dụng để tính toánPhản tấn công (K-line chart:Counterattack).

Giá trị trả lại củatalib.CDLCOUNTERATTACK()hàm là một mảng một chiều. mảng

talib.CDLCOUNTERATTACK ((inPriceOHLC))

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLCOUNTERATTACK()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLCOUNTERATTACK(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLDARKCLOUDCOVER

Cáctalib.CDLDARKCLOUDCOVER()hàm được sử dụng để tính toánMàn mây tối (Bản đồ đường K: Màn mây tối).

Giá trị trả lại củatalib.CDLDARKCLOUDCOVER()hàm là một mảng một chiều. mảng

talib.CDLDARKCLOUDCOVER ((inPriceOHLC) talib.CDLDARKCLOUDCOVER ((inPriceOHLC, optInPenetration)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng CácoptInPenetrationtham số được sử dụng để thiết lập Penetration, giá trị mặc định là 0,5. optInPenetration sai số

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

CácCDLDARKCLOUDCOVER()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLDARKCLOUDCOVER(Records[Open,High,Low,Close],Penetration = 0.5) = Array(outInteger)

talib.CDLDOJI

Cáctalib.CDLDOJI()hàm được sử dụng để tính toánDoji (K-line chart: Doji).

Giá trị trả lại củatalib.CDLDOJI()chức năng là: một mảng một chiều. mảng

talib.CDLDOJI ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLDOJI()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLDOJI(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLDOJISTAR

Cáctalib.CDLDOJISTAR()chức năng được sử dụng để tính toánNgôi sao Doji (Bản đồ đường K: Ngôi sao Doji).

Giá trị trả lại củatalib.CDLDOJISTAR()chức năng là: một mảng một chiều. mảng

talib.CDLDOJISTAR ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLDOJISTAR()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLDOJISTAR(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLDRAGONFLYDOJI

Cáctalib.CDLDRAGONFLYDOJI()hàm được sử dụng để tính toánDragonfly Doji (K-line chart: Dragonfly Doji).

Giá trị trả lại củatalib.CDLDRAGONFLYDOJI()chức năng là: một mảng một chiều. mảng

talib.CDLDRAGONFLYDOJI ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLDRAGONFLYDOJI()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLDRAGONFLYDOJI(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLENGULFING

Cáctalib.CDLENGULFING()chức năng được sử dụng để tính toánMô hình ngập (Bản đồ đường K: ngập).

Giá trị trả lại củatalib.CDLENGULFING()hàm là một mảng một chiều. mảng

talib.CDLENGULFING ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLENGULFING()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLENGULFING(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLEVENINGDOJISTAR

Cáctalib.CDLEVENINGDOJISTAR()chức năng được sử dụng để tính toánNgôi sao Doji buổi tối (Bản đồ đường K: Ngôi sao Doji buổi tối).

Giá trị trả lại củatalib.CDLEVENINGDOJISTAR()chức năng là: một mảng một chiều. mảng

talib.CDLEVENINGDOJISTAR ((inPriceOHLC) talib.CDLEVENINGDOJISTAR ((inPriceOHLC, optInPenetration)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng CácoptInPenetrationtham số được sử dụng để thiết lập Penetration, giá trị mặc định là 0,3. optInPenetration sai số

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

CácCDLEVENINGDOJISTAR()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLEVENINGDOJISTAR(Records[Open,High,Low,Close],Penetration = 0.3) = Array(outInteger)

talib.CDLEVENINGSTAR

Cáctalib.CDLEVENINGSTAR()chức năng được sử dụng để tính toánNgôi sao buổi tối (Bảng K-line: Ngôi sao buổi tối).

Giá trị trả lại củatalib.CDLEVENINGSTAR()chức năng là: một mảng một chiều. mảng

talib.CDLEVENINGSTAR ((inPriceOHLC) talib.CDLEVENINGSTAR ((inPriceOHLC, optInPenetration)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng CácoptInPenetrationtham số được sử dụng để thiết lập Penetration, giá trị mặc định là 0,3. optInPenetration sai số

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

CácCDLEVENINGSTAR()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLEVENINGSTAR(Records[Open,High,Low,Close],Penetration = 0.3) = Array(outInteger)

talib.CDLGAPSIDESIDEWHITE

Cáctalib.CDLGAPSIDESIDEWHITE()hàm được sử dụng để tính toánCác đường trắng bên cạnh khoảng cách trên/dưới (Bảng đồ đường K: Các đường trắng bên cạnh khoảng cách trên/dưới).

Giá trị trả lại củatalib.CDLGAPSIDESIDEWHITE()chức năng là: một mảng một chiều. mảng

talib.CDLGAPSIDESIDEWHITE ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLGAPSIDESIDEWHITE()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLGAPSIDESIDEWHITE(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLGRAVESTONEDOJI

Cáctalib.CDLGRAVESTONEDOJI()chức năng được sử dụng để tính toánGravestone Doji (K-line chart: Gravestone Doji).

Giá trị trả lại củatalib.CDLGRAVESTONEDOJI()chức năng là: một mảng một chiều. mảng

talib.CDLGRAVESTONEDOJI ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLGRAVESTONEDOJI()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLGRAVESTONEDOJI(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLHAMMER

Cáctalib.CDLHAMMER()hàm được sử dụng để tính toánĐòn búa (K-line chart: Đòn búa).

Giá trị trả lại củatalib.CDLHAMMER()chức năng là: một mảng một chiều. mảng

talib.CDLHAMMER ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLHAMMER()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLHAMMER(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLHANGINGMAN

Cáctalib.CDLHANGINGMAN()hàm được sử dụng để tính toánHanging Man (K-line chart: Hanging Man).

Giá trị trả lại củatalib.CDLHANGINGMAN()hàm là một mảng một chiều. mảng

talib.CDLHANGINGMAN ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLHANGINGMAN()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLHANGINGMAN(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLHARAMI

Cáctalib.CDLHARAMI()chức năng được sử dụng để tính toánMô hình Harami (Bảng đồ đường K: đường âm và đường dương).

Giá trị trả lại củatalib.CDLHARAMI()hàm là một mảng một chiều. mảng

talib.CDLHARAMI ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLHARAMI()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLHARAMI(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLHARAMICROSS

Cáctalib.CDLHARAMICROSS()chức năng được sử dụng để tính toánMô hình chéo Harami (Bản đồ đường K: chéo đường âm và dương).

Giá trị trả lại củatalib.CDLHARAMICROSS()chức năng là: một mảng một chiều. mảng

talib.CDLHARAMICROSS ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLHARAMICROSS()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLHARAMICROSS(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLHIGHWAVE

Cáctalib.CDLHIGHWAVE()chức năng được sử dụng để tính toánNến sóng cao (Bản đồ đường K: Long Leg Cross).

Giá trị trả lại củatalib.CDLHIGHWAVE()hàm là một mảng một chiều. mảng

talib.CDLHIGHWAVE ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLHIGHWAVE()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLHIGHWAVE(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLHIKKAKE

Cáctalib.CDLHIKKAKE()chức năng được sử dụng để tính toánMô hình Hikkake (K-line chart: trap).

Giá trị trả lại củatalib.CDLHIKKAKE()hàm là một mảng một chiều. mảng

talib.CDLHIKKAKE ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLHIKKAKE()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLHIKKAKE(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLHIKKAKEMOD

Cáctalib.CDLHIKKAKEMOD()chức năng được sử dụng để tính toánMô hình Hikkake được sửa đổi (Bản đồ đường K: Bẫy được sửa đổi).

Giá trị trả lại củatalib.CDLHIKKAKEMOD()chức năng là: một mảng một chiều. mảng

talib.CDLHIKKAKEMOD ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLHIKKAKEMOD()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLHIKKAKEMOD(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLHOMINGPIGEON

Cáctalib.CDLHOMINGPIGEON()chức năng được sử dụng để tính toánChim bồ câu hướng dẫn (K-line chart: Chim bồ câu).

Giá trị trả lại củatalib.CDLHOMINGPIGEON()chức năng là: một mảng một chiều. mảng

talib.CDLHOMINGPIGEON ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLHOMINGPIGEON()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLHOMINGPIGEON(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLIDENTICAL3CROWS

Cáctalib.CDLIDENTICAL3CROWS()hàm được sử dụng để tính toánBa con quạ giống hệt nhau (Bản đồ đường K: cùng ba con quạ).

Giá trị trả lại củatalib.CDLIDENTICAL3CROWS()chức năng là: một mảng một chiều. mảng

talib.CDLIDENTICAL3CROWS ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLIDENTICAL3CROWS()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLIDENTICAL3CROWS(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLINNECK

Cáctalib.CDLINNECK()chức năng được sử dụng để tính toánMô hình trong cổ (k-line chart: neckline).

Giá trị trả lại củatalib.CDLINNECK()chức năng là: một mảng một chiều. mảng

talib.CDLINNECK ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLINNECK()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLINNECK(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLINVERTEDHAMMER

Cáctalib.CDLINVERTEDHAMMER()chức năng được sử dụng để tính toánThon đòn đảo ngược (Bản đồ đường K: Thon đòn đảo ngược).

Giá trị trả lại củatalib.CDLINVERTEDHAMMER()chức năng là: một mảng một chiều. mảng

talib.CDLINVERTEDHAMMER ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLINVERTEDHAMMER()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLINVERTEDHAMMER(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLKICKING

Cáctalib.CDLKICKING()hàm được sử dụng để tính toánĐánh đá (K-line chart: đá).

Giá trị trả lại củatalib.CDLKICKING()hàm là một mảng một chiều. mảng

talib.CDLKICKING ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLKICKING()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLKICKING(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLKICKINGBYLENGTH

Cáctalib.CDLKICKINGBYLENGTH()chức năng được sử dụng để tính toánkick - bò/gấu được xác định bởi Marubozu dài hơn (bảng đồ K-line: kick bull/kick bear).

Giá trị trả lại củatalib.CDLKICKINGBYLENGTH()chức năng là: một mảng một chiều. mảng

talib.CDLKICKINGBYLENGTH ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLKICKINGBYLENGTH()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLKICKINGBYLENGTH(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLLADDERBOTTOM

Cáctalib.CDLLADDERBOTTOM()chức năng được sử dụng để tính toánBottom of the ladder (K-line chart: Bottom of the ladder) Bottom of the ladder (Bottom of the ladder) Bottom of the ladder (Bottom of the ladder) Bottom of the ladder (Bottom of the ladder) Bottom of the ladder Bottom of the ladder Bottom of the ladder Bottom of the ladder Bottom of the ladder.

Giá trị trả lại củatalib.CDLLADDERBOTTOM()chức năng là: một mảng một chiều. mảng

talib.CDLLADDERBOTTOM ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLLADDERBOTTOM()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLLADDERBOTTOM(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLLONGLEGGEDDOJI

Cáctalib.CDLLONGLEGGEDDOJI()chức năng được sử dụng để tính toánLong Legged Doji (Bản đồ đường K: Long Legged Doji).

Giá trị trả lại củatalib.CDLLONGLEGGEDDOJI()chức năng là: một mảng một chiều. mảng

talib.CDLLONGLEGGEDDOJI ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLLONGLEGGEDDOJI()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLLONGLEGGEDDOJI(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLLONGLINE

Cáctalib.CDLLONGLINE()chức năng được sử dụng để tính toánLong Line Candle (K-line chart: Long Line).

Giá trị trả lại củatalib.CDLLONGLINE()chức năng là: một mảng một chiều. mảng

talib.CDLLONGLINE ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLLONGLINE()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLLONGLINE(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLMARUBOZU

Cáctalib.CDLMARUBOZU()chức năng được sử dụng để tính toánMarubozu (bản đồ đường K: đầu trần và chân trần).

Giá trị trả lại củatalib.CDLMARUBOZU()hàm là một mảng một chiều. mảng

talib.CDLMARUBOZU ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLMARUBOZU()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLMARUBOZU(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLMATCHINGLOW

Cáctalib.CDLMATCHINGLOW()hàm được sử dụng để tính toánKhớp thấp (Bản đồ đường K: Khớp thấp).

Giá trị trả lại củatalib.CDLMATCHINGLOW()chức năng là: một mảng một chiều. mảng

talib.CDLMATCHINGLOW ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLMATCHINGLOW()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLMATCHINGLOW(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLMATHOLD

Cáctalib.CDLMATHOLD()hàm được sử dụng để tính toánChế độ giữ nắp (k-line chart: Chế độ giữ nắp).

Giá trị trả lại củatalib.CDLMATHOLD()chức năng là: một mảng một chiều. mảng

talib.CDLMATHOLD ((inPriceOHLC) talib.CDLMATHOLD ((inPriceOHLC, optInPenetration)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng CácoptInPenetrationtham số này là tùy chọn và được sử dụng để chỉ định tỷ lệ phần trăm của chiều rộng của đường xu hướng tăng/giảm, giá trị mặc định là 0,5. optInPenetration sai số

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

CácCDLMATHOLD()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLMATHOLD(Records[Open,High,Low,Close],Penetration = 0.5) = Array(outInteger)

talib.CDLMORNINGDOJISTAR

Cáctalib.CDLMORNINGDOJISTAR()chức năng được sử dụng để tính toánMorning Doji Star (Bản đồ đường K: Morning Doji Star).

Giá trị trả lại củatalib.CDLMORNINGDOJISTAR()chức năng là: một mảng một chiều. mảng

talib.CDLMORNINGDOJISTAR ((inPriceOHLC) talib.CDLMORNINGDOJISTAR ((inPriceOHLC, optInPenetration)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng CácoptInPenetrationtham số được sử dụng để xác định mức độ chồng chéo giữa giá mở đầu xác nhận và phần rắn, giá mặc định là 0,3. optInPenetration sai số

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

CácCDLMORNINGDOJISTAR()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLMORNINGDOJISTAR(Records[Open,High,Low,Close],Penetration = 0.3) = Array(outInteger)

talib.CDLMORNINGSTAR

Cáctalib.CDLMORNINGSTAR()hàm được sử dụng để tính toánMorning Star (K-line chart: Morning Star).

Giá trị trả lại củatalib.CDLMORNINGSTAR()chức năng là: một mảng một chiều. mảng

talib.CDLMORNINGSTAR ((inPriceOHLC) talib.CDLMORNINGSTAR ((inPriceOHLC, optInPenetration)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng CácoptInPenetrationtham số là ngưỡng tỷ lệ thay đổi giá cần thiết để xác nhận xu hướng và có giá trị trong phạm vi [0,1], với giá trị mặc định là 0,3. optInPenetration sai số

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

CácCDLMORNINGSTAR()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLMORNINGSTAR(Records[Open,High,Low,Close],Penetration=0.3) = Array(outInteger)

talib.CDLONNECK

Cáctalib.CDLONNECK()chức năng được sử dụng để tính toánMô hình trên cổ (bảng đồ K-line: Mô hình trên cổ).

Giá trị trả lại củatalib.CDLONNECK()hàm là một mảng một chiều. mảng

talib.CDLONNECK ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLONNECK()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLONNECK(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLPIERCING

Cáctalib.CDLPIERCING()chức năng được sử dụng để tính toánMô hình đâm (Bản đồ đường K: Mô hình đâm).

Giá trị trả lại củatalib.CDLPIERCING()hàm là một mảng một chiều. mảng

talib.CDLPIERCING ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLPIERCING()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLPIERCING(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLRICKSHAWMAN

Cáctalib.CDLRICKSHAWMAN()hàm được sử dụng để tính toánRickshaw Man (K-line chart: Rickshaw Man).

Giá trị trả lại củatalib.CDLRICKSHAWMAN()chức năng là: một mảng một chiều. mảng

talib.CDLRICKSHAWMAN ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLRICKSHAWMAN()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLRICKSHAWMAN(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLRISEFALL3METHODS

Cáctalib.CDLRISEFALL3METHODS()hàm được sử dụng để tính toánBa phương pháp tăng/giảm (Bản đồ đường K: Ba phương pháp tăng/giảm).

Giá trị trả lại củatalib.CDLRISEFALL3METHODS()chức năng là: một mảng một chiều. mảng

talib.CDLRISEFALL3METHODS ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLRISEFALL3METHODS()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLRISEFALL3METHODS(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLSEPARATINGLINES

Cáctalib.CDLSEPARATINGLINES()hàm được sử dụng để tính toánCác đường phân ly (Bản đồ đường K: Các đường phân ly).

Giá trị trả lại củatalib.CDLSEPARATINGLINES()hàm là một mảng một chiều. mảng

talib.CDLLINES chia cắt ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLSEPARATINGLINES()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLSEPARATINGLINES(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLSHOOTINGSTAR

Cáctalib.CDLSHOOTINGSTAR()chức năng được sử dụng để tính toánShooting Star (Bản đồ đường K: Shooting Star).

Giá trị trả lại củatalib.CDLSHOOTINGSTAR()hàm là một mảng một chiều. mảng

talib.CDLSHOOTINGSTAR ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLSHOOTINGSTAR()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLSHOOTINGSTAR(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLSHORTLINE

Cáctalib.CDLSHORTLINE()chức năng được sử dụng để tính toánNến đường ngắn (Bản đồ đường K: Đường ngắn).

Giá trị trả lại củatalib.CDLSHORTLINE()chức năng là: một mảng một chiều. mảng

talib.CDLSSORTLINE ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLSHORTLINE()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLSHORTLINE(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLSPINNINGTOP

Cáctalib.CDLSPINNINGTOP()hàm được sử dụng để tính toánSpinning Top (Bản đồ đường K: Spinning Top).

Giá trị trả lại củatalib.CDLSPINNINGTOP()chức năng là: một mảng một chiều. mảng

talib.CDLSPINNINGTOP ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLSPINNINGTOP()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLSPINNINGTOP(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLSTALLEDPATTERN

Cáctalib.CDLSTALLEDPATTERN()hàm được sử dụng để tính toánMô hình ngưng hoạt động (bảng đồ đường K: Mô hình ngưng hoạt động).

Giá trị trả lại củatalib.CDLSTALLEDPATTERN()chức năng là: một mảng một chiều. mảng

talib.CDLSTALLEDPATTERN ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLSTALLEDPATTERN()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLSTALLEDPATTERN(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLSTICKSANDWICH

Cáctalib.CDLSTICKSANDWICH()chức năng được sử dụng để tính toánStick Sandwich (Bản đồ đường K: Stick Sandwich).

Giá trị trả lại củatalib.CDLSTICKSANDWICH()hàm là một mảng một chiều. mảng

talib.CDLSTICKSANDWICH ((inPriceOHLC))

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLSTICKSANDWICH()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLSTICKSANDWICH(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLTAKURI

Cáctalib.CDLTAKURI()hàm được sử dụng để tính toánTakuri (doji con rồng với một đường bóng dưới rất dài) (Bản đồ đường K: Takuri).

Giá trị trả lại củatalib.CDLTAKURI()hàm là một mảng một chiều. mảng

talib.CDLTAKURI ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLTAKURI()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLTAKURI(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLTASUKIGAP

Cáctalib.CDLTASUKIGAP()chức năng được sử dụng để tính toánKhu vực Gap Tasuki (Bản đồ đường K: Khu vực Gap Tasuki).

Giá trị trả lại củatalib.CDLTASUKIGAP()hàm là một mảng một chiều. mảng

talib.CDLTASUKIGAP ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLTASUKIGAP()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLTASUKIGAP(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLTHRUSTING

Cáctalib.CDLTHRUSTING()chức năng được sử dụng để tính toánMô hình đẩy (Bảng K-line: Mô hình đẩy).

Giá trị trả lại củatalib.CDLTHRUSTING()chức năng là: một mảng một chiều. mảng

talib.CDLTHRUSTING ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLTHRUSTING()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLTHRUSTING(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLTRISTAR

Cáctalib.CDLTRISTAR()chức năng được sử dụng để tính toánMô hình Tristar (Bản đồ đường K: Mô hình Tristar).

Giá trị trả lại củatalib.CDLTRISTAR()chức năng là: một mảng một chiều. mảng

talib.CDLTRISTAR ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLTRISTAR()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLTRISTAR(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLUNIQUE3RIVER

Cáctalib.CDLUNIQUE3RIVER()chức năng được sử dụng để tính toánUnique 3 River (K-line chart: Unique 3 River).

Giá trị trả lại củatalib.CDLUNIQUE3RIVER()chức năng là: một mảng một chiều. mảng

talib.CDLUNIQUE3RIVER ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLUNIQUE3RIVER()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLUNIQUE3RIVER(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLUPSIDEGAP2CROWS

Cáctalib.CDLUPSIDEGAP2CROWS()hàm được sử dụng để tính toánUpside Gap Two Crows (Bản đồ đường K: Upside Gap Two Crows).

Giá trị trả lại củatalib.CDLUPSIDEGAP2CROWS()chức năng là: một mảng một chiều. mảng

talib.CDLUPSIDEGAP2CROWS ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLUPSIDEGAP2CROWS()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLUPSIDEGAP2CROWS(Records[Open,High,Low,Close]) = Array(outInteger)

talib.CDLXSIDEGAP3METHODS

Cáctalib.CDLXSIDEGAP3METHODS()hàm được sử dụng để tính toánUpside/Downside Gap ba phương pháp (Bảng K-line: Upside/Downside Gap ba phương pháp).

Giá trị trả lại củatalib.CDLXSIDEGAP3METHODS()chức năng là: một mảng một chiều. mảng

talib.CDLXSIDEGAP3METHODS ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácCDLXSIDEGAP3METHODS()chức năng được mô tả trong tài liệu thư viện talib như sau:CDLXSIDEGAP3METHODS(Records[Open,High,Low,Close]) = Array(outInteger)

talib.AD

Cáctalib.AD()chức năng được sử dụng để tính toánĐường A/D Chaikin (định chỉ stochastic đường).

Giá trị trả lại củatalib.AD()chức năng là: một mảng một chiều. mảng

talib.AD(inPriceHLCV)

CácinPriceHLCVtham số được sử dụng để xác định dữ liệu đường K. inPriceHLCV đúng {@struct/Record Record} cấu trúc mảng

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

CácAD()chức năng được mô tả trong tài liệu thư viện talib như sau:AD(Records[High,Low,Close,Volume]) = Array(outReal)

talib.ADOSC

Cáctalib.ADOSC()chức năng được sử dụng để tính toánMáy dao động Chaikin A/D (Máy dao động Chaikin).

Giá trị trả lại củatalib.ADOSC()hàm là một mảng một chiều. mảng

talib.ADOSC ((inPriceHLCV) talib.ADOSC ((inPriceHLCV, optInFastPeriod, optInSlowPeriod)

CácinPriceHLCVtham số được sử dụng để xác định dữ liệu đường K. inPriceHLCV đúng {@struct/Record Record} cấu trúc mảng CácoptInFastPeriodtham số được sử dụng để thiết lập thời gian nhanh. optInFastPeriod sai số CácoptInSlowPeriodtham số được sử dụng để thiết lập thời gian chậm. optInSlowPeriod sai số

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

CácADOSC()chức năng được mô tả trong tài liệu thư viện talib như sau:ADOSC(Records[High,Low,Close,Volume],Fast Period = 3,Slow Period = 10) = Array(outReal)

talib.OBV

Cáctalib.OBV()hàm được sử dụng để tính toánVề khối lượng cân đối (đợt năng lượng).

Giá trị trả lại củatalib.OBV()hàm là một mảng một chiều. mảng

talib.OBV ((inReal) talib.OBV ((inReal, inPriceV)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácinPriceVtham số được sử dụng để xác định dữ liệu đường K. inPriceV sai {@struct/Record Record} cấu trúc mảng

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

CácOBV()chức năng được mô tả trong tài liệu thư viện talib như sau:OBV(Records[Close],Records[Volume]) = Array(outReal)

talib.ACOS

Cáctalib.ACOS()hàm được sử dụng để tính toánVector Trigonometric ACos (hàm cosinus ngược).

Giá trị trả lại củatalib.ACOS()hàm là một mảng một chiều. mảng

talib.ACOS ((inReal)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số

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

CácACOS()chức năng được mô tả trong tài liệu thư viện talib như sau:ACOS(Records[Close]) = Array(outReal)

talib.ASIN

Cáctalib.ASIN()chức năng được sử dụng để tính toánVector Trigonometric ASin (công thức sinus ngược).

Giá trị trả lại củatalib.ASIN()hàm là một mảng một chiều. mảng

talib.ASIN ((inReal)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số

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

CácASIN()chức năng được mô tả trong tài liệu thư viện talib như sau:ASIN(Records[Close]) = Array(outReal)

talib.ATAN

Cáctalib.ATAN()chức năng được sử dụng để tính toánVector Trigonometric ATan (công thức xúc ngược).

Giá trị trả lại củatalib.ATAN()chức năng là: một mảng một chiều. mảng

talib.ATAN ((inReal)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số

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

CácATAN()chức năng được mô tả trong tài liệu thư viện talib như sau:ATAN(Records[Close]) = Array(outReal)

talib.CEIL

Cáctalib.CEIL()hàm được sử dụng để tính toánVector Ceiling (chức năng làm tròn).

Giá trị trả lại củatalib.CEIL()hàm là một mảng một chiều. mảng

talib.CEIL ((inReal)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số

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

CácCEIL()chức năng được mô tả trong tài liệu thư viện talib như sau:CEIL(Records[Close]) = Array(outReal)

talib.COS

Cáctalib.COS()chức năng được sử dụng để tính toánVector Trigonometric Cos (chức năng cosine).

Giá trị trả lại củatalib.COS()chức năng là: một mảng một chiều. mảng

talib.COS ((inReal)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số

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

CácCOS()chức năng được mô tả trong tài liệu thư viện talib như sau:COS(Records[Close]) = Array(outReal)

talib.COSH

Cáctalib.COSH()hàm được sử dụng để tính toánVector Trigonometric Cosh (giá trị cosinus siêu xoắn).

Giá trị trả lại củatalib.COSH()hàm là một mảng một chiều. mảng

talib.COSH ((inReal)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số

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

CácCOSH()chức năng được mô tả trong tài liệu thư viện talib như sau:COSH(Records[Close]) = Array(outReal)

talib.EXP

Cáctalib.EXP()chức năng được sử dụng để tính toánVector Arithmetic Exp (phương thức biểu thức).

Giá trị trả lại củatalib.EXP()chức năng là: một mảng một chiều. mảng

talib.EXP ((inReal))

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số

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

CácEXP()chức năng được mô tả trong tài liệu thư viện talib như sau:EXP(Records[Close]) = Array(outReal)

talib.FLOOR

Cáctalib.FLOOR()chức năng được sử dụng để tính toánĐường vector (đóng xuống).

Giá trị trả lại củatalib.FLOOR()hàm là một mảng một chiều. mảng

talib.FLOOR ((inReal)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số

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

CácFLOOR()chức năng được mô tả trong tài liệu thư viện talib như sau:FLOOR(Records[Close]) = Array(outReal)

talib.LN

Cáctalib.LN()chức năng được sử dụng để tính toánVector Log Natural (logaritm tự nhiên).

Giá trị trả lại củatalib.LN()hàm là một mảng một chiều. mảng

talib.LN ((inReal)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số

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

CácLN()chức năng được mô tả trong tài liệu thư viện talib như sau:LN(Records[Close]) = Array(outReal)

talib.LOG10

Cáctalib.LOG10()hàm được sử dụng để tính toánVector Log10 (chức năng logaritm).

Giá trị trả lại củatalib.LOG10()hàm là một mảng một chiều. mảng

talib.LOG10 ((inReal)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số

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

CácLOG10()chức năng được mô tả trong tài liệu thư viện talib như sau:LOG10(Records[Close]) = Array(outReal)

talib.SIN

Cáctalib.SIN()hàm được sử dụng để tính toánVector Trigonometric Sin (giá trị sinus).

Giá trị trả lại củatalib.SIN()hàm là một mảng một chiều. mảng

talib.SIN ((inReal)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số

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

CácSIN()chức năng được mô tả trong tài liệu thư viện talib như sau:SIN(Records[Close]) = Array(outReal)

talib.SINH

Cáctalib.SINH()chức năng được sử dụng để tính toánVector Trigonometric Sinh (phương thức sinus hyperbolic).

Giá trị trả lại củatalib.SINH()chức năng là: một mảng một chiều. mảng

talib.SINH ((inReal)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số

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

CácSINH()chức năng được mô tả trong tài liệu thư viện talib như sau:SINH(Records[Close]) = Array(outReal)

talib.SQRT

Cáctalib.SQRT()chức năng được sử dụng để tính toánVector Quadrat Root (quadrat root).

Giá trị trả lại củatalib.SQRT()chức năng là: một mảng một chiều. mảng

talib.SQRT ((inReal)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số

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

CácSQRT()chức năng được mô tả trong tài liệu thư viện talib như sau:SQRT(Records[Close]) = Array(outReal)

talib.TAN

Cáctalib.TAN()chức năng được sử dụng để tính toánVector Trigonometric Tan (tangent).

Giá trị trả lại củatalib.TAN()hàm là một mảng một chiều. mảng

talib.TAN ((inReal)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số

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

CácTAN()chức năng được mô tả trong tài liệu thư viện talib như sau:TAN(Records[Close]) = Array(outReal)

talib.TANH

Cáctalib.TANH()chức năng được sử dụng để tính toánVector Trigonometric Tanh (phương thức tiếp xúc siêu xoắn).

Giá trị trả lại củatalib.TANH()chức năng là: một mảng một chiều. mảng

talib.TANH ((inReal)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số

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

CácTANH()chức năng được mô tả trong tài liệu thư viện talib như sau:TANH(Records[Close]) = Array(outReal)

talib.MAX

Cáctalib.MAX()chức năng được sử dụng để tính toán giá trị cao nhất (tối đa) cho mộtThời gian cụ thể.

Giá trị trả lại củatalib.MAX()chức năng là: một mảng một chiều. mảng

talib.MAX ((inReal) talib.MAX ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 30. optInTimePeriod sai số

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

CácMAX()chức năng được mô tả trong tài liệu thư viện talib như sau:MAX(Records[Close],Time Period = 30) = Array(outReal)

talib.MAXINDEX

Cáctalib.MAXINDEX()hàm được sử dụng để tính toánchỉ số giá trị cao nhất trong thời gian được chỉ định (tỉ số tối đa).

Giá trị trả lại củatalib.MAXINDEX()chức năng là: một mảng một chiều. mảng

talib.MAXINDEX ((inReal) talib.MAXINDEX ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 30. optInTimePeriod sai số

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

CácMAXINDEX()chức năng được mô tả trong tài liệu thư viện talib như sau:MAXINDEX(Records[Close],Time Period = 30) = Array(outInteger)

talib.MIN

Cáctalib.MIN()Chức năng được sử dụng để tính giá trị thấp nhất (giá trị tối thiểu) ** cho khoảng thời gian được chỉ định.

Giá trị trả lại củatalib.MIN()chức năng là: một mảng một chiều. mảng

talib.MIN ((inReal) talib.MIN ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 30. optInTimePeriod sai số

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

CácMIN()chức năng được mô tả trong tài liệu thư viện talib như sau:MIN(Records[Close],Time Period = 30) = Array(outReal)

talib.MININDEX

Cáctalib.MININDEX()hàm được sử dụng để tính toánchỉ số giá trị thấp nhất (định chỉ số giá trị tối thiểu)trong thời gian được chỉ định.

Giá trị trả lại củatalib.MININDEX()chức năng là: một mảng một chiều. mảng

talib.MININDEX ((inReal) talib.MININDEX ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 30. optInTimePeriod sai số

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

CácMININDEX()chức năng được mô tả trong tài liệu thư viện talib như sau:MININDEX(Records[Close],Time Period = 30) = Array(outInteger)

talib.MINMAX

Cáctalib.MINMAX()hàm được sử dụng để tính toángiá trị thấp nhất và cao nhất (tối thiểu và tối đa) trong khoảng thời gian được chỉ định.

Giá trị trả lại củatalib.MINMAX()Các yếu tố đầu tiên của mảng hai chiều này là mảng giá trị tối thiểu, và các yếu tố thứ hai là mảng giá trị tối đa. mảng

talib.MINMAX ((inReal) talib.MINMAX ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 30. optInTimePeriod sai số

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

CácMINMAX()chức năng được mô tả trong tài liệu thư viện talib như sau:MINMAX(Records[Close],Time Period = 30) = [Array(outMin),Array(outMax)]

talib.MINMAXINDEX

Cáctalib.MINMAXINDEX()hàm được sử dụng để tính toánChỉ số giá trị thấp nhất và cao nhất (chỉ số tối thiểu và tối đa) trong thời gian được chỉ định.

Giá trị trả lại củatalib.MINMAXINDEX()Các phần tử đầu tiên của mảng hai chiều này là mảng được lập chỉ mục tối thiểu, và phần tử thứ hai là mảng được lập chỉ mục tối đa. mảng

talib.MINMAXINDEX ((inReal) talib.MINMAXINDEX ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 30. optInTimePeriod sai số

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

CácMINMAXINDEX()chức năng được mô tả trong tài liệu thư viện talib như sau:MINMAXINDEX(Records[Close],Time Period = 30) = [Array(outMinIdx),Array(outMaxIdx)]

talib.SUM

Cáctalib.SUM()hàm được sử dụng để tính toánTóm lại.

Giá trị trả lại củatalib.SUM()chức năng là: một mảng một chiều. mảng

talib.SUM ((inReal) talib.SUM ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 30. optInTimePeriod sai số

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

CácSUM()chức năng được mô tả trong tài liệu thư viện talib như sau:SUM(Records[Close],Time Period = 30) = Array(outReal)

talib.HT_DCPERIOD

Cáctalib.HT_DCPERIOD()chức năng được sử dụng để tính toánChuyển đổi Hilbert - Thời gian chu kỳ thống trị (Chuyển đổi Hilbert, Thời gian thống trị).

Giá trị trả lại củatalib.HT_DCPERIOD()chức năng là: một mảng một chiều. mảng

talib.HT_DCPERIOD ((inReal)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số

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

CácHT_DCPERIOD()chức năng được mô tả trong tài liệu thư viện talib như sau:HT_DCPERIOD(Records[Close]) = Array(outReal)

talib.HT_DCPHASE

Cáctalib.HT_DCPHASE()chức năng được sử dụng để tính toánChuyển đổi Hilbert - Giai đoạn chu kỳ thống trị (Chuyển đổi Hilbert, Giai đoạn chu kỳ thống trị).

Giá trị trả lại củatalib.HT_DCPHASE()chức năng là: một mảng một chiều. mảng

talib.HT_DCPHASE ((inReal)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số

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

CácHT_DCPHASE()chức năng được mô tả trong tài liệu thư viện talib như sau:HT_DCPHASE(Records[Close]) = Array(outReal)

talib.HT_PHASOR

Cáctalib.HT_PHASOR()chức năng được sử dụng để tính toánChuyển đổi Hilbert - Phân phần phazor (Chuyển đổi Hilbert, Phân phần pha).

Giá trị trả lại củatalib.HT_PHASOR()hàm là một mảng hai chiều. mảng

talib.HT_PHASOR ((inReal)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số

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

CácHT_PHASOR()chức năng được mô tả trong tài liệu thư viện talib như sau:HT_PHASOR(Records[Close]) = [Array(outInPhase),Array(outQuadrature)]

talib.HT_SINE

Cáctalib.HT_SINE()chức năng được sử dụng để tính toánChuyển đổi Hilbert - sóng sinus.

Giá trị trả lại củatalib.HT_SINE()chức năng là: một mảng hai chiều. mảng

talib.HT_SINE ((inReal)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số

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

CácHT_SINE()chức năng được mô tả trong tài liệu thư viện talib như sau:HT_SINE(Records[Close]) = [Array(outSine),Array(outLeadSine)]

talib.HT_TRENDMODE

Cáctalib.HT_TRENDMODE()chức năng được sử dụng để tính toánChuyển đổi Hilbert - Xu hướng và chế độ chu kỳ.

Giá trị trả lại củatalib.HT_TRENDMODE()chức năng là: một mảng một chiều. mảng

talib.HT_TRENDMODE ((inReal)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số

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

CácHT_TRENDMODE()chức năng được mô tả trong tài liệu thư viện talib như sau:HT_TRENDMODE(Records[Close]) = Array(outInteger)

talib.ATR

Cáctalib.ATR()chức năng được sử dụng để tính toánPhạm vi thực trung bình.

Giá trị trả lại củatalib.ATR()hàm là một mảng một chiều. mảng

talib.ATR ((inPriceHLC) talib.ATR ((inPriceHLC, optInTimePeriod)

CácinPriceHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceHLC đúng {@struct/Record Record} cấu trúc mảng CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácATR()chức năng được mô tả trong tài liệu thư viện talib như sau:ATR(Records[High,Low,Close],Time Period = 14) = Array(outReal)

talib.NATR

Cáctalib.NATR()chức năng được sử dụng để tính toánPhạm vi thực trung bình bình thường hóa.

Giá trị trả lại củatalib.NATR()hàm là một mảng một chiều. mảng

talib.NATR ((inPriceHLC) talib.NATR ((inPriceHLC, optInTimePeriod)

CácinPriceHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceHLC đúng {@struct/Record Record} cấu trúc mảng CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácNATR()chức năng được mô tả trong tài liệu thư viện talib như sau:NATR(Records[High,Low,Close],Time Period = 14) = Array(outReal)

talib.TRANGE

Cáctalib.TRANGE()chức năng được sử dụng để tính toánPhạm vi thực sự.

Giá trị trả lại củatalib.TRANGE()chức năng là: một mảng một chiều. mảng

talib.TRANGE ((inPriceHLC)

CácinPriceHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácTRANGE()chức năng được mô tả trong tài liệu thư viện talib như sau:TRANGE(Records[High,Low,Close]) = Array(outReal)

talib.BBANDS

Cáctalib.BBANDS()hàm được sử dụng để tính toánBollinger Bands.

Giá trị trả lại củatalib.BBANDS()hàm là: một mảng hai chiều. Mảng chứa ba yếu tố là: mảng đường trên, mảng đường giữa và mảng đường dưới. mảng

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)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 5. optInTimePeriod sai số CácoptInNbDevUptham số được sử dụng để thiết lập nhân đường lên, giá trị mặc định là 2. optInNbDevUp sai số CácoptInNbDevDntham số được sử dụng để thiết lập nhân đường dưới, giá trị mặc định là 2. chọnInNbDevDn sai số CácoptInMATypetham số được sử dụng để thiết lập kiểu trung bình, giá trị mặc định là 0. optInMAType sai số

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

CácBBANDS()chức năng được mô tả trong tài liệu thư viện talib như sau:BBANDS(Records[Close],Time Period = 5,Deviations up = 2,Deviations down = 2,MA Type = 0) = [Array(outRealUpperBand),Array(outRealMiddleBand),Array(outRealLowerBand)]

talib.DEMA

Cáctalib.DEMA()chức năng được sử dụng để tính toánTrung bình di chuyển hàm số hai.

Giá trị trả lại củatalib.DEMA()hàm là một mảng một chiều. mảng

talib.DEMA ((inReal) talib.DEMA ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 30. optInTimePeriod sai số

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

CácDEMA()chức năng được mô tả trong tài liệu thư viện talib như sau:DEMA(Records[Close],Time Period = 30) = Array(outReal)

talib.EMA

Cáctalib.EMA()chức năng được sử dụng để tính toánTrung bình di chuyển theo cấp số.

Giá trị trả lại củatalib.EMA()hàm là một mảng một chiều. mảng

talib.EMA ((inReal) talib.EMA ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 30. optInTimePeriod sai số

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

CácEMA()chức năng được mô tả trong tài liệu thư viện talib như sau:EMA(Records[Close],Time Period = 30) = Array(outReal)

talib.HT_TRENDLINE

Cáctalib.HT_TRENDLINE()chức năng được sử dụng để tính toánChuyển đổi Hilbert - Xu hướng ngay lập tức.

Giá trị trả lại củatalib.HT_TRENDLINE()chức năng là: một mảng một chiều. mảng

talib.HT_TRENDLINE ((inReal)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số

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

CácHT_TRENDLINE()chức năng được mô tả trong tài liệu thư viện talib như sau:HT_TRENDLINE(Records[Close]) = Array(outReal)

talib.KAMA

Cáctalib.KAMA()chức năng được sử dụng để tính toánKaufman Đường trung bình chuyển động thích nghi.

Giá trị trả lại củatalib.KAMA()chức năng là: một mảng một chiều. mảng

talib.KAMA ((inReal) talib.KAMA ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 30. optInTimePeriod sai số

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

CácKAMA()chức năng được mô tả trong tài liệu thư viện talib như sau:KAMA(Records[Close],Time Period = 30) = Array(outReal)

talib.MA

Cáctalib.MA()chức năng được sử dụng để tính toánTrung bình động.

Giá trị trả lại củatalib.MA()chức năng là: một mảng một chiều. mảng

talib.MA(inReal)talib.MA(inReal, optInTimePeriod)talib.MA(inReal, optInTimePeriod, optInMAType)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 30. optInTimePeriod sai số CácoptInMATypetham số được sử dụng để thiết lập kiểu trung bình, giá trị mặc định là 0. optInMAType sai số

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

CácMA()chức năng được mô tả trong tài liệu thư viện talib như sau:MA(Records[Close],Time Period = 30,MA Type = 0) = Array(outReal)

talib.MAMA

Cáctalib.MAMA()chức năng được sử dụng để tính toánMESA Đường trung bình động thích nghi.

Giá trị trả lại củatalib.MAMA()chức năng là: một mảng hai chiều. mảng

talib.MAMA ((inReal) talib.MAMA ((inReal, optInFastLimit) talib.MAMA ((inReal, optInFastLimit, optInSlowLimit)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInFastLimittham số được sử dụng để thiết lập giới hạn nhanh, giá trị mặc định là 0,5. - Cho phép. sai số CácoptInSlowLimittham số được sử dụng để thiết lập giới hạn chậm, giá trị mặc định là 0,05. optInSlowLimit sai số

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

CácMAMA()chức năng được mô tả trong tài liệu thư viện talib như sau:MAMA(Records[Close],Fast Limit = 0.5,Slow Limit = 0.05) = [Array(outMAMA),Array(outFAMA)]

talib.MIDPOINT

Cáctalib.MIDPOINT()chức năng được sử dụng để tính toánĐiểm trung bình trong thời gian (điểm trung bình).

Giá trị trả lại củatalib.MIDPOINT()hàm là một mảng một chiều. mảng

talib.MIDPOINT ((inReal) talib.MIDPOINT ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácMIDPOINT()chức năng được mô tả trong tài liệu thư viện talib như sau:MIDPOINT(Records[Close],Time Period = 14) = Array(outReal)

talib.MIDPRICE

Cáctalib.MIDPRICE()chức năng được sử dụng để tính toánGiá trung điểm trong thời gian (giá trung điểm).

Giá trị trả lại củatalib.MIDPRICE()hàm là một mảng một chiều. mảng

talib.MIDPRICE ((inPriceHL) talib.MIDPRICE ((inPriceHL, optInTimePeriod)

CácinPriceHLtham số được sử dụng để xác định dữ liệu đường K. inPriceHL đúng {@struct/Record Record} cấu trúc mảng CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácMIDPRICE()chức năng được mô tả trong tài liệu thư viện talib như sau:MIDPRICE(Records[High,Low],Time Period = 14) = Array(outReal)

talib.SAR

Cáctalib.SAR()chức năng được sử dụng để tính toánSAR Parabolic.

Giá trị trả lại củatalib.SAR()chức năng là: một mảng một chiều. mảng

talib.SAR ((inPriceHL) talib.SAR ((inPriceHL, optInAcceleration) talib.SAR ((inPriceHL, optInAcceleration, optInMaximum)

CácinPriceHLtham số được sử dụng để xác định dữ liệu đường K. inPriceHL đúng {@struct/Record Record} cấu trúc mảng CácoptInAccelerationtham số được sử dụng để thiết lập yếu tố gia tốc, giá trị mặc định là 0,02. OpInAcceleration sai số CácoptInMaximumtham số được sử dụng để thiết lập AF tối đa, giá trị mặc định là 0.2. OpInMaximum sai số

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

CácSAR()chức năng được mô tả trong tài liệu thư viện talib như sau:SAR(Records[High,Low],Acceleration Factor = 0.02,AF Maximum = 0.2) = Array(outReal)

talib.SAREXT

Cáctalib.SAREXT()chức năng được sử dụng để tính toánParabolic SAR - Extended (enhanced parabolic steering) (Điều chỉnh điều khiển bằng parabolic).

Giá trị trả lại củatalib.SAREXT()hàm là một mảng một chiều. mảng

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)

CácinPriceHLtham số được sử dụng để xác định dữ liệu đường K. inPriceHL đúng {@struct/Record Record} cấu trúc mảng CácoptInStartValuetham số được sử dụng để thiết lập Start Value, giá trị mặc định là 0. optInStartValue sai số CácoptInOffsetOnReversetham số được sử dụng để đặt Offset trên Reverse, giá trị mặc định là 0. OpInOffsetOnReverse sai số CácoptInAccelerationInitLongtham số được sử dụng để thiết lập AF Init Long, giá trị mặc định là 0,02. chọnInAccelerationInitLong sai số CácoptInAccelerationLongtham số được sử dụng để thiết lập AF Long, giá trị mặc định là 0,02. OpInAccelerationLong sai số CácoptInAccelerationMaxLongtham số được sử dụng để thiết lập AF Max Long, giá trị mặc định là 0.2. optInAccelerationMaxLong sai số CácoptInAccelerationInitShorttham số được sử dụng để thiết lập AF Init Short, giá trị mặc định là 0.02. chọnInAccelerationInitShort sai số CácoptInAccelerationShorttham số được sử dụng để thiết lập AF Short, giá trị mặc định là 0.02. chọnInAccelerationShort sai số CácoptInAccelerationMaxShorttham số được sử dụng để thiết lập AF Max Short, giá trị mặc định là 0.2. optInAccelerationMaxShort sai số

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

CácSAREXT()chức năng được mô tả trong tài liệu thư viện talib như sau: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

Cáctalib.SMA()hàm được sử dụng để tính toánTrung bình di chuyển đơn giản.

Giá trị trả lại củatalib.SMA()chức năng là: một mảng một chiều. mảng

talib.SMA ((inReal) talib.SMA ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 30. optInTimePeriod sai số

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

CácSMA()chức năng được mô tả trong tài liệu thư viện talib như sau:SMA(Records[Close],Time Period = 30) = Array(outReal)

talib.T3

Cáctalib.T3()chức năng được sử dụng để tính toánTrung bình di chuyển nhân tố ba (T3) (trung bình di chuyển nhân tố ba).

Giá trị trả lại củatalib.T3()hàm là một mảng một chiều. mảng

talib.T3 ((inReal) talib.T3 ((inReal, optInTimePeriod) talib.T3 ((inReal, optInTimePeriod, optInVFactor)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 5. optInTimePeriod sai số CácoptInVFactortham số được sử dụng để thiết lập yếu tố khối lượng, giá trị mặc định là 0,7. optInVFactor sai số

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

CácT3()chức năng được mô tả trong tài liệu thư viện talib như sau:T3(Records[Close],Time Period = 5,Volume Factor = 0.7) = Array(outReal)

talib.TEMA

Cáctalib.TEMA()hàm được sử dụng để tính toánTrung bình di chuyển nhân tố ba.

Giá trị trả lại củatalib.TEMA()hàm là một mảng một chiều. mảng

talib.TEMA ((inReal) talib.TEMA ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 30. optInTimePeriod sai số

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

CácTEMA()chức năng được mô tả trong tài liệu thư viện talib như sau:TEMA(Records[Close],Time Period = 30) = Array(outReal)

talib.TRIMA

Cáctalib.TRIMA()chức năng được sử dụng để tính toánTrung bình di chuyển tam giác (trung bình di chuyển ba nhân).

Giá trị trả lại củatalib.TRIMA()hàm là một mảng một chiều. mảng

talib.TRIMA ((inReal) talib.TRIMA ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 30. optInTimePeriod sai số

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

CácTRIMA()chức năng được mô tả trong tài liệu thư viện talib như sau:TRIMA(Records[Close],Time Period = 30) = Array(outReal)

talib.WMA

Cáctalib.WMA()chức năng được sử dụng để tính toánTrung bình di chuyển cân nhắc (WMA).

Giá trị trả lại củatalib.WMA()hàm là một mảng một chiều. mảng

talib.WMA ((inReal) talib.WMA ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 30. optInTimePeriod sai số

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

CácWMA()chức năng được mô tả trong tài liệu thư viện talib như sau:WMA(Records[Close],Time Period = 30) = Array(outReal)

talib.LINEARREG

Cáctalib.LINEARREG()hàm được sử dụng để tính toánPhục hồi tuyến tính.

Giá trị trả lại củatalib.LINEARREG()hàm là một mảng một chiều. mảng

talib.LINEARREG ((inReal) talib.LINEARREG ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácLINEARREG()chức năng được mô tả trong tài liệu thư viện talib như sau:LINEARREG(Records[Close],Time Period = 14) = Array(outReal)

talib.LINEARREG_ANGLE

Cáctalib.LINEARREG_ANGLE()chức năng được sử dụng để tính toánGóc hồi quy tuyến tính.

Giá trị trả lại củatalib.LINEARREG_ANGLE()chức năng là: một mảng một chiều. mảng

talib.LINEARREG_ANGLE ((inReal) talib.LINEARREG_ANGLE ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácLINEARREG_ANGLE()chức năng được mô tả trong tài liệu thư viện talib như sau:LINEARREG_ANGLE(Records[Close],Time Period = 14) = Array(outReal)

talib.LINEARREG_INTERCEPT

Cáctalib.LINEARREG_INTERCEPT()chức năng được sử dụng để tính toánLinear Regression Intercept.

Giá trị trả lại củatalib.LINEARREG_INTERCEPT()chức năng là: một mảng một chiều. mảng

talib.LINEARREG_INTERCEPT ((inReal) talib.LINEARREG_INTERCEPT ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácLINEARREG_INTERCEPT()chức năng được mô tả trong tài liệu thư viện talib như sau:LINEARREG_INTERCEPT(Records[Close],Time Period = 14) = Array(outReal)

talib.LINEARREG_SLOPE

Cáctalib.LINEARREG_SLOPE()chức năng được sử dụng để tính toánĐộ nghiêng hồi quy tuyến tính.

Giá trị trả lại củatalib.LINEARREG_SLOPE()chức năng là: một mảng một chiều. mảng

talib.LINEARREG_SLOPE ((inReal) talib.LINEARREG_SLOPE ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácLINEARREG_SLOPE()chức năng được mô tả trong tài liệu thư viện talib như sau:LINEARREG_SLOPE(Records[Close],Time Period = 14) = Array(outReal)

talib.STDDEV

Cáctalib.STDDEV()hàm được sử dụng để tính toánPhạm vi lệch chuẩn.

Giá trị trả lại củatalib.STDDEV()chức năng là: một mảng một chiều. mảng

talib.STDDEV ((inReal) talib.STDDEV ((inReal, optInTimePeriod) talib.STDDEV ((inReal, optInTimePeriod, optInNbDev)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 5. optInTimePeriod sai số CácoptInNbDevtham số được sử dụng để thiết lập các Deviations, giá trị mặc định là 1. optInNbDev sai số

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

CácSTDDEV()chức năng được mô tả trong tài liệu thư viện talib như sau:STDDEV(Records[Close],Time Period = 5,Deviations = 1) = Array(outReal)

talib.TSF

Cáctalib.TSF()hàm được sử dụng để tính toánDự báo chuỗi thời gian.

Giá trị trả lại củatalib.TSF()hàm là một mảng một chiều. mảng

talib.TSF ((inReal) talib.TSF ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácTSF()chức năng được mô tả trong tài liệu thư viện talib như sau:TSF(Records[Close],Time Period = 14) = Array(outReal)

talib.VAR

Cáctalib.VAR()hàm được sử dụng để tính toánSự khác biệt.

Giá trị trả lại củatalib.VAR()chức năng là: một mảng một chiều. mảng

talib.VAR ((inReal) talib.VAR ((inReal, optInTimePeriod) talib.VAR ((inReal, optInTimePeriod, optInNbDev)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 5. optInTimePeriod sai số CácoptInNbDevtham số được sử dụng để thiết lập các Deviations, giá trị mặc định là 1. optInNbDev sai số

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

CácVAR()chức năng được mô tả trong tài liệu thư viện talib như sau:VAR(Records[Close],Time Period = 5,Deviations = 1) = Array(outReal)

talib.ADX

Cáctalib.ADX()chức năng được sử dụng để tính toánChỉ số chuyển động theo hướng trung bình.

Giá trị trả lại củatalib.ADX()hàm là một mảng một chiều. mảng

talib.ADX ((inPriceHLC) talib.ADX ((inPriceHLC, optInTimePeriod)

CácinPriceHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceHLC đúng {@struct/Record Record} cấu trúc mảng CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácADX()chức năng được mô tả trong tài liệu thư viện talib như sau:ADX(Records[High,Low,Close],Time Period = 14) = Array(outReal)

talib.ADXR

Cáctalib.ADXR()chức năng được sử dụng để tính toánĐánh giá chỉ số chuyển động theo hướng trung bình (chỉ số đánh giá).

Giá trị trả lại củatalib.ADXR()hàm là một mảng một chiều. mảng

talib.ADXR ((inPriceHLC) talib.ADXR ((inPriceHLC, optInTimePeriod)

CácinPriceHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceHLC đúng {@struct/Record Record} cấu trúc mảng CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácADXR()chức năng được mô tả trong tài liệu thư viện talib như sau:ADXR(Records[High,Low,Close],Time Period = 14) = Array(outReal)

talib.APO

Cáctalib.APO()chức năng được sử dụng để tính toánMáy dao động giá tuyệt đối.

Giá trị trả lại củatalib.APO()chức năng là: một mảng một chiều. mảng

talib.APO ((inReal) talib.APO ((inReal, optInFastPeriod) talib.APO ((inReal, optInFastPeriod, optInSlowPeriod) talib.APO ((inReal, optInFastPeriod, optInSlowPeriod, optInMAType)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInFastPeriodtham số được sử dụng để thiết lập thời gian nhanh, giá trị mặc định là 12. optInFastPeriod sai số CácoptInSlowPeriodtham số được sử dụng để thiết lập thời gian chậm, giá trị mặc định là 26. optInSlowPeriod sai số CácoptInMATypetham số được sử dụng để thiết lập kiểu trung bình, giá trị mặc định là 0. optInMAType sai số

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

CácAPO()chức năng được mô tả trong tài liệu thư viện talib như sau:APO(Records[Close],Fast Period = 12,Slow Period = 26,MA Type = 0) = Array(outReal)

talib.AROON

Cáctalib.AROON()chức năng được sử dụng để tính toánAroon (điểm báo Aroon).

Giá trị trả lại củatalib.AROON()hàm là một mảng hai chiều. mảng

talib.AROON ((inPriceHL) talib.AROON ((inPriceHL, optInTimePeriod)

CácinPriceHLtham số được sử dụng để xác định dữ liệu đường K. inPriceHL đúng {@struct/Record Record} cấu trúc mảng CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácAROON()chức năng được mô tả trong tài liệu thư viện talib như sau:AROON(Records[High,Low],Time Period = 14) = [Array(outAroonDown),Array(outAroonUp)]

talib.AROONOSC

Cáctalib.AROONOSC()chức năng được sử dụng để tính toánAroon Oscillator.

Giá trị trả lại củatalib.AROONOSC()chức năng là: một mảng một chiều. mảng

talib.AROONOSC ((inPriceHL) talib.AROONOSC ((inPriceHL, optInTimePeriod)

CácinPriceHLtham số được sử dụng để xác định dữ liệu đường K. inPriceHL đúng {@struct/Record Record} cấu trúc mảng CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácAROONOSC()chức năng được mô tả trong tài liệu thư viện talib như sau:AROONOSC(Records[High,Low],Time Period = 14) = Array(outReal)

talib.BOP

Cáctalib.BOP()chức năng được sử dụng để tính toánSự cân bằng quyền lực.

Giá trị trả lại củatalib.BOP()hàm là một mảng một chiều. mảng

talib.BOP ((inPriceOHLC)

CácinPriceOHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceOHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácBOP()chức năng được mô tả trong tài liệu thư viện talib như sau:BOP(Records[Open,High,Low,Close]) = Array(outReal)

talib.CCI

Cáctalib.CCI()chức năng được sử dụng để tính toánChỉ số kênh hàng hóa (thông hiệu đồng căn).

Giá trị trả lại củatalib.CCI()hàm là một mảng một chiều. mảng

talib.CCI ((inPriceHLC) talib.CCI ((inPriceHLC, optInTimePeriod)

CácinPriceHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceHLC đúng {@struct/Record Record} cấu trúc mảng CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácCCI()chức năng được mô tả trong tài liệu thư viện talib như sau:CCI(Records[High,Low,Close],Time Period = 14) = Array(outReal)

talib.CMO

Cáctalib.CMO()chức năng được sử dụng để tính toánĐộng cơ dao động Chande (CMO).

Giá trị trả lại củatalib.CMO()chức năng là: một mảng một chiều. mảng

talib.CMO ((inReal) talib.CMO ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácCMO()chức năng được mô tả trong tài liệu thư viện talib như sau:CMO(Records[Close],Time Period = 14) = Array(outReal)

talib.DX

Cáctalib.DX()chức năng được sử dụng để tính toánChỉ số chuyển động theo hướng.

Giá trị trả lại củatalib.DX()chức năng là: một mảng một chiều. mảng

talib.DX ((inPriceHLC) talib.DX ((inPriceHLC, optInTimePeriod)

CácinPriceHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceHLC đúng {@struct/Record Record} cấu trúc mảng CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácDX()chức năng được mô tả trong tài liệu thư viện talib như sau:DX(Records[High,Low,Close],Time Period = 14) = Array(outReal)

talib.MACD

Cáctalib.MACD()hàm được sử dụng để tính toánChuyển động trung bình hội tụ/phân biệt (trung bình chuyển động làm mịn theo cấp số nhân).

Giá trị trả lại củatalib.MACD()chức năng là: một mảng hai chiều. mảng

talib.MACD ((inReal) talib.MACD ((inReal, optInFastPeriod) talib.MACD ((inReal, optInFastPeriod, optInSlowPeriod) talib.MACD ((inReal, optInFastPeriod, optInSlowPeriod, optInSignalPeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInFastPeriodtham số được sử dụng để thiết lập thời gian nhanh, giá trị mặc định là 12. optInFastPeriod sai số CácoptInSlowPeriodtham số được sử dụng để thiết lập thời gian chậm, giá trị mặc định là 26. optInSlowPeriod sai số CácoptInSignalPeriodtham số được sử dụng để thiết lập thời gian tín hiệu, giá trị mặc định là 9. optInSignalPhần thời gian sai số

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

CácMACD()chức năng được mô tả trong tài liệu thư viện talib như sau:MACD(Records[Close],Fast Period = 12,Slow Period = 26,Signal Period = 9) = [Array(outMACD),Array(outMACDSignal),Array(outMACDHist)]

talib.MACDEXT

Cáctalib.MACDEXT()hàm được sử dụng để tính toánMACD với loại MA có thể điều khiển.

Giá trị trả lại củatalib.MACDEXT()hàm là một mảng hai chiều. mảng

talib.MACDEXT ((inReal) 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)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInFastPeriodtham số được sử dụng để thiết lập thời gian nhanh, giá trị mặc định là 12. optInFastPeriod sai số CácoptInFastMATypetham số được sử dụng để thiết lập kiểu trung bình nhanh, giá trị mặc định là 0. optInFastMAType sai số CácoptInSlowPeriodtham số được sử dụng để thiết lập thời gian chậm, giá trị mặc định là 26. optInSlowPeriod sai số CácoptInSlowMATypetham số được sử dụng để thiết lập loại trung bình chậm, giá trị mặc định là 0. optInSlowMAType sai số CácoptInSignalPeriodtham số được sử dụng để thiết lập thời gian tín hiệu, giá trị mặc định là 9. optInSignalPhần thời gian sai số CácoptInSignalMATypetham số được sử dụng để thiết lập loại tín hiệu trung bình, giá trị mặc định là 0. optInSignalMATyp sai số

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

CácMACDEXT()chức năng được mô tả trong tài liệu thư viện talib như sau: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

Cáctalib.MACDFIX()hàm được sử dụng để tính toánPhương pháp điều chỉnh sự hội tụ/phân biệt trung bình động 12/26.

Giá trị trả lại củatalib.MACDFIX()hàm là một mảng hai chiều. mảng

talib.MACDFIX ((inReal) talib.MACDFIX ((inReal, optInSignalPeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInSignalPeriodtham số được sử dụng để thiết lập thời gian tín hiệu, giá trị mặc định là 9. optInSignalPhần thời gian sai số

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

CácMACDFIX()chức năng được mô tả trong tài liệu thư viện talib như sau:MACDFIX(Records[Close],Signal Period = 9) = [Array(outMACD),Array(outMACDSignal),Array(outMACDHist)]

talib.MFI

Cáctalib.MFI()chức năng được sử dụng để tính toánChỉ số dòng tiền.

Giá trị trả lại củatalib.MFI()hàm là một mảng một chiều. mảng

talib.MFI ((inPriceHLCV) talib.MFI ((inPriceHLCV, optInTimePeriod)

CácinPriceHLCVtham số được sử dụng để xác định dữ liệu đường K. inPriceHLCV đúng {@struct/Record Record} cấu trúc mảng CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácMFI()chức năng được mô tả trong tài liệu thư viện talib như sau:MFI(Records[High,Low,Close,Volume],Time Period = 14) = Array(outReal)

talib.MINUS_DI

Cáctalib.MINUS_DI()chức năng được sử dụng để tính toánChỉ số hướng giảm (định số âm).

Giá trị trả lại củatalib.MINUS_DI()hàm là một mảng một chiều. mảng

talib.MINUS_DI ((inPriceHLC) talib.MINUS_DI ((inPriceHLC, optInTimePeriod)

CácinPriceHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceHLC đúng {@struct/Record Record} cấu trúc mảng CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácMINUS_DI()chức năng được mô tả trong tài liệu thư viện talib như sau:MINUS_DI(Records[High,Low,Close],Time Period = 14) = Array(outReal)

talib.MINUS_DM

Cáctalib.MINUS_DM()chức năng được sử dụng để tính toánTrừ chuyển động theo hướng (sự chuyển động âm).

Giá trị trả lại củatalib.MINUS_DM()hàm là một mảng một chiều. mảng

talib.MINUS_DM ((inPriceHL) talib.MINUS_DM ((inPriceHL, optInTimePeriod)

CácinPriceHLtham số được sử dụng để xác định dữ liệu đường K. inPriceHL đúng {@struct/Record Record} cấu trúc mảng CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácMINUS_DM()chức năng được mô tả trong tài liệu thư viện talib như sau:MINUS_DM(Records[High,Low],Time Period = 14) = Array(outReal)

talib.MOM

Cáctalib.MOM()hàm được sử dụng để tính toánĐộng lực.

Giá trị trả lại củatalib.MOM()hàm là một mảng một chiều. mảng

talib.MOM ((inReal) talib.MOM ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 10. optInTimePeriod sai số

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

CácMOM()chức năng được mô tả trong tài liệu thư viện talib như sau:MOM(Records[Close],Time Period = 10) = Array(outReal)

talib.PLUS_DI

Cáctalib.PLUS_DI()chức năng được sử dụng để tính toánThêm chỉ số hướng.

Giá trị trả lại củatalib.PLUS_DI()chức năng là: một mảng một chiều. mảng

talib.PLUS_DI ((inPriceHLC) talib.PLUS_DI ((inPriceHLC, optInTimePeriod)

CácinPriceHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceHLC đúng {@struct/Record Record} cấu trúc mảng CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácPLUS_DI()chức năng được mô tả trong tài liệu thư viện talib như sau:PLUS_DI(Records[High,Low,Close],Time Period = 14) = Array(outReal)

talib.PLUS_DM

Cáctalib.PLUS_DM()hàm được sử dụng để tính toánThêm chuyển động theo hướng.

Giá trị trả lại củatalib.PLUS_DM()hàm là một mảng một chiều. mảng

talib.PLUS_DM ((inPriceHL) talib.PLUS_DM ((inPriceHL, optInTimePeriod)

CácinPriceHLtham số được sử dụng để xác định dữ liệu đường K. inPriceHL đúng {@struct/Record Record} cấu trúc mảng CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácPLUS_DM()chức năng được mô tả trong tài liệu thư viện talib như sau:PLUS_DM(Records[High,Low],Time Period = 14) = Array(outReal)

talib.PPO

Cáctalib.PPO()chức năng được sử dụng để tính toánTỷ lệ phần trăm dao động giá.

Giá trị trả lại củatalib.PPO()hàm là một mảng một chiều. mảng

talib.PPO ((inReal) talib.PPO ((inReal, optInFastPeriod) talib.PPO ((inReal, optInFastPeriod, optInSlowPeriod) talib.PPO ((inReal, optInFastPeriod, optInSlowPeriod, optInMAType)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInFastPeriodtham số được sử dụng để thiết lập thời gian nhanh, giá trị mặc định là 12. optInFastPeriod sai số CácoptInSlowPeriodtham số được sử dụng để thiết lập thời gian chậm, giá trị mặc định là 26. optInSlowPeriod sai số CácoptInMATypetham số được sử dụng để thiết lập kiểu trung bình, giá trị mặc định là 0. optInMAType sai số

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

CácPPO()chức năng được mô tả trong tài liệu thư viện talib như sau:PPO(Records[Close],Fast Period = 12,Slow Period = 26,MA Type = 0) = Array(outReal)

talib.ROC

Cáctalib.ROC()hàm được sử dụng để tính toánTỷ lệ thay đổi: ((giá/prevPrice) -1) * 100 (giá thay đổi).

Giá trị trả lại củatalib.ROC()hàm là một mảng một chiều. mảng

talib.ROC ((inReal) talib.ROC ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 10. optInTimePeriod sai số

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

CácROC()chức năng được mô tả trong tài liệu thư viện talib như sau:ROC(Records[Close],Time Period = 10) = Array(outReal)

talib.ROCP

Cáctalib.ROCP()hàm được sử dụng để tính toánTỷ lệ thay đổi Tỷ lệ phần trăm: (giá-prevPrice) /prevPrice (tỷ lệ thay đổi giá).

Giá trị trả lại củatalib.ROCP()chức năng là: một mảng một chiều. mảng

talib.ROCP ((inReal) talib.ROCP ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 10. optInTimePeriod sai số

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

CácROCP()chức năng được mô tả trong tài liệu thư viện talib như sau:ROCP(Records[Close],Time Period = 10) = Array(outReal)

talib.ROCR

Cáctalib.ROCR()chức năng được sử dụng để tính toánTỷ lệ thay đổi: (giá/giá trước) (tỷ lệ thay đổi giá).

Giá trị trả lại củatalib.ROCR()hàm là một mảng một chiều. mảng

talib.ROCR ((inReal) talib.ROCR ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 10. optInTimePeriod sai số

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

CácROCR()chức năng được mô tả trong tài liệu thư viện talib như sau:ROCR(Records[Close],Time Period = 10) = Array(outReal)

talib.ROCR100

Cáctalib.ROCR100()hàm được sử dụng để tính toánTỷ lệ thay đổi tỷ lệ 100 thang: (giá/giá trước) *100 (tỷ lệ thay đổi giá).

Giá trị trả lại củatalib.ROCR100()chức năng là: một mảng một chiều. mảng

talib.ROCR100 ((inReal) talib.ROCR100 ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 10. optInTimePeriod sai số

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

CácROCR100()chức năng được mô tả trong tài liệu thư viện talib như sau:ROCR100(Records[Close],Time Period = 10) = Array(outReal)

talib.RSI

Cáctalib.RSI()chức năng được sử dụng để tính toánChỉ số sức mạnh tương đối.

Giá trị trả lại củatalib.RSI()hàm là một mảng một chiều. mảng

talib.RSI ((inReal) talib.RSI ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácRSI()chức năng được mô tả trong tài liệu thư viện talib như sau:RSI(Records[Close],Time Period = 14) = Array(outReal)

talib.STOCH

Cáctalib.STOCH()chức năng được sử dụng để tính toánChỉ số Stochastic (STOCH).

Giá trị trả lại củatalib.STOCH()hàm là một mảng hai chiều. mảng

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)

CácinPriceHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceHLC đúng {@struct/Record Record} cấu trúc mảng CácoptInFastK_Periodtham số được sử dụng để thiết lập thời gian Fast-K, giá trị mặc định là 5. optInFastK_Period sai số CácoptInSlowK_Periodtham số được sử dụng để thiết lập thời gian Slow-K, giá trị mặc định là 3. optInSlowK_Period sai số CácoptInSlowK_MATypetham số được sử dụng để thiết lập loại trung bình Slow-K, giá trị mặc định là 0. optInSlowK_MAType sai số CácoptInSlowD_Periodtham số được sử dụng để thiết lập thời gian Slow-D, giá trị mặc định là 3. optInSlowD_Period sai số CácoptInSlowD_MATypetham số được sử dụng để thiết lập loại trung bình Slow-D, giá trị mặc định là 0. optInSlowD_MAType sai số

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

CácSTOCH()chức năng được mô tả trong tài liệu thư viện talib như sau: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

Cáctalib.STOCHF()chức năng được sử dụng để tính toánStochastic Fast (định chỉ STOCH nhanh).

Giá trị trả lại củatalib.STOCHF()hàm là một mảng hai chiều. mảng

talib.STOCHF ((inPriceHLC) talib.STOCHF ((inPriceHLC, optInFastK_Period) talib.STOCHF ((inPriceHLC, optInFastK_Period, optInFastD_Period) talib.STOCHF ((inPriceHLC, optInFastK_Period, optInFastD_Period, optInFastD_MAType)

CácinPriceHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceHLC đúng {@struct/Record Record} cấu trúc mảng CácoptInFastK_Periodtham số được sử dụng để thiết lập thời gian Fast-K, giá trị mặc định là 5. optInFastK_Period sai số CácoptInFastD_Periodtham số được sử dụng để thiết lập thời gian Fast-D, giá trị mặc định là 3. optInFastD_Period sai số CácoptInFastD_MATypetham số được sử dụng để thiết lập kiểu trung bình Fast-D, giá trị mặc định là 0. optInFastD_MAType sai số

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

CácSTOCHF()chức năng được mô tả trong tài liệu thư viện talib như sau:STOCHF(Records[High,Low,Close],Fast-K Period = 5,Fast-D Period = 3,Fast-D MA = 0) = [Array(outFastK),Array(outFastD)]

talib.STOCHRSI

Cáctalib.STOCHRSI()chức năng được sử dụng để tính toánChỉ số sức mạnh tương đối của Stochastic.

Giá trị trả lại củatalib.STOCHRSI()chức năng là: một mảng hai chiều. mảng

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)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số CácoptInFastK_Periodtham số được sử dụng để thiết lập thời gian Fast-K, giá trị mặc định là 5. optInFastK_Period sai số CácoptInFastD_Periodtham số được sử dụng để thiết lập thời gian Fast-D, giá trị mặc định là 3. optInFastD_Period sai số CácoptInFastD_MATypetham số được sử dụng để thiết lập kiểu trung bình Fast-D, giá trị mặc định là 0. optInFastD_MAType sai số

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

CácSTOCHRSI()chức năng được mô tả trong tài liệu thư viện talib như sau:STOCHRSI(Records[Close],Time Period = 14,Fast-K Period = 5,Fast-D Period = 3,Fast-D MA = 0) = [Array(outFastK),Array(outFastD)]

talib.TRIX

Cáctalib.TRIX()chức năng được sử dụng để tính toánRate-of-Change (ROC) 1 ngày của EMA 3 lần trơn tru.

Giá trị trả lại củatalib.TRIX()chức năng là: một mảng một chiều. mảng

talib.TRIX ((inReal) talib.TRIX ((inReal, optInTimePeriod)

CácinRealtham số được sử dụng để xác định dữ liệu đường K. inReal đúng {@struct/Record Record} cấu trúc mảng, mảng số CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 30. optInTimePeriod sai số

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

CácTRIX()chức năng được mô tả trong tài liệu thư viện talib như sau:TRIX(Records[Close],Time Period = 30) = Array(outReal)

talib.ULTOSC

Cáctalib.ULTOSC()chức năng được sử dụng để tính toánMáy dao động cuối cùng.

Giá trị trả lại củatalib.ULTOSC()hàm là một mảng một chiều. mảng

talib.ULTOSC ((inPriceHLC) talib.ULTOSC ((inPriceHLC, optInTimePeriod1) talib.ULTOSC ((inPriceHLC, optInTimePeriod1, optInTimePeriod2) talib.ULTOSC ((inPriceHLC, optInTimePeriod1, optInTimePeriod2, optInTimePeriod3)

CácinPriceHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceHLC đúng {@struct/Record Record} cấu trúc mảng CácoptInTimePeriod1tham số được sử dụng để thiết lập giai đoạn đầu tiên, giá trị mặc định là 7. optInTimePeriod1 sai số CácoptInTimePeriod2tham số được sử dụng để thiết lập giai đoạn thứ hai, giá trị mặc định là 14. optInTimePeriod2 sai số CácoptInTimePeriod3tham số được sử dụng để thiết lập giai đoạn thứ ba, giá trị mặc định là 28. optInTimePeriod3 sai số

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

CácULTOSC()chức năng được mô tả trong tài liệu thư viện talib như sau:ULTOSC(Records[High,Low,Close],First Period = 7,Second Period = 14,Third Period = 28) = Array(outReal)

talib.WILLR

Cáctalib.WILLR()hàm được sử dụng để tính toánWilliams %R.

Giá trị trả lại củatalib.WILLR()chức năng là: một mảng một chiều. mảng

talib.WILLR ((inPriceHLC) talib.WILLR ((inPriceHLC, optInTimePeriod)

CácinPriceHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceHLC đúng {@struct/Record Record} cấu trúc mảng CácoptInTimePeriodtham số được sử dụng để thiết lập khoảng thời gian, giá trị mặc định là 14. optInTimePeriod sai số

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

CácAVGPRICE()chức năng được mô tả trong tài liệu thư viện talib như sau:AVGPRICE(Records[Open,High,Low,Close]) = Array(outReal)

talib.MEDPRICE

Cáctalib.MEDPRICE()chức năng được sử dụng để tính toánGiá trung bình.

Giá trị trả lại củatalib.MEDPRICE()hàm là một mảng một chiều. mảng

talib.MEDPRICE ((inPriceHL)

CácinPriceHLtham số được sử dụng để xác định dữ liệu đường K. inPriceHL đúng {@struct/Record Record} cấu trúc mảng

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

CácMEDPRICE()chức năng được mô tả trong tài liệu thư viện talib như sau:MEDPRICE(Records[High,Low]) = Array(outReal)

talib.TYPPRICE

Cáctalib.TYPPRICE()hàm được sử dụng để tính toánGiá điển hình.

Giá trị trả lại củatalib.TYPPRICE()hàm là một mảng một chiều. mảng

talib.TYPPRICE ((inPriceHLC)

CácinPriceHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácTYPPRICE()chức năng được mô tả trong tài liệu thư viện talib như sau:TYPPRICE(Records[High,Low,Close]) = Array(outReal)

talib.WCLPRICE

Cáctalib.WCLPRICE()chức năng được sử dụng để tính toánGiá đóng cửa cân nhắc.

Giá trị trả lại củatalib.WCLPRICE()hàm là một mảng một chiều. mảng

talib.WCLPRICE ((inPriceHLC)

CácinPriceHLCtham số được sử dụng để xác định dữ liệu đường K. inPriceHLC đúng {@struct/Record Record} cấu trúc mảng

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

CácWCLPRICE()chức năng được mô tả trong tài liệu thư viện talib như sau:WCLPRICE(Records[High,Low,Close]) = Array(outReal)

Cấu trúc