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

Hướng dẫn API FMZ

Tác giả:Không, Tạo: 2020-04-20 10:19:00, Cập nhật: 2023-04-12 14:44:56

trong 10 nhật ký cuối cùng và xóa phần còn lại LogReset ((10)
}


```Python
def main():
    LogReset(10)
void main() {
    LogReset(10);
}

LogVacuum ((()

LogVacuum(), sau khi gọiLogReset()chức năng để xóa nhật ký, phục hồi không gian lưu trữ chiếm bởiSQLiteKhi xóa dữ liệu. Chức năng không trả về giá trị. Lý do làSQLitekhông lấy lại không gian chiếm đóng khi xóa dữ liệu, vì vậy bạn cần thực hiệnVACUUMđể dọn dẹp bảng và giải phóng không gian. Khi gọi chức năng này, hoạt động di chuyển tệp sẽ xảy ra với sự chậm trễ lớn.

API báo giá thị trường

Các chức năng giao diện thị trường chính:

Tên chức năng Mô tả
GetTicker Nhận dữ liệu trích dẫn
GetRecords Nhận dữ liệu K-line
GetDepth Nhận dữ liệu sổ đặt hàng (dữ liệu chiều sâu đặt hàng)
GetTrades Nhận các hồ sơ giao dịch mới nhất trên thị trường

Các chức năng sau đây có thể được gọi thông quaexchangehoặcexchanges[0]đối tượng; ví dụ: các chức năng, nhưexchange.GetTicker();hoặcexchanges[0].GetTicker();, trả về giá thị trường của các cặp giao dịch hiện tại và đặt hợp đồng.

Mẹo quan trọng để gọi các hàm API với quyền truy cập mạng:Khi gọi bất kỳ hàm API nào truy cập vào giao diện nền tảng (chẳng hạn nhưexchange.GetTicker(), exchange.Buy(Price, Amount), exchange.CancelOrder(Id), vv), sự thất bại của truy cập có lẽ là do nhiều lý do. do đó, chúng ta phải làm lỗi dung nạp xử lý cho các chức năng này gọi. ví dụ:exchange.GetTicker()chức năng để thu thập dữ liệu thị trường có thể, do các vấn đề máy chủ nền tảng và các vấn đề truyền tải mạng, v.v.exchange.GetTicker()chức năng lànullSau đó, giá trị trả về củaexchange.GetTicker()phải được xử lý bằng cách xử lý dung nạp lỗi.

Dữ liệu được trả về bởiexchange.GetTicker()chức năng trong mã sau được gán chotickerbiến, và chúng ta cần phải đối phó với dung nạp lỗi trước khi sử dụngticker variable.

function main() {
    var ticker = exchange.GetTicker()
    if(!ticker){
        // Recall once, or use other processing logic
        ticker = exchange.GetTicker()
    }
}
def main():
    ticker = exchange.GetTicker()
    if not ticker:
        ticker = exchange.GetTicker()
void main() {
    auto ticker = exchange.GetTicker();
    if(!ticker.Valid) {
        ticker = exchange.GetTicker();
        Log("Test");
    }
}

Ngoài ra, để kiểm tra hiệu suất dung nạp lỗi của chiến lược, FMZ đã bổ sung mộtChế độ chịu lỗibacktest. Hệ thống backtest có thể ngẫu nhiên trả về một số cuộc gọi API sẽ xảy ra khi truy cập mạng theo các thông số được đặt, và trả về các giá trị trả về một số cuộc gọi thất bại. Bạn có thể nhanh chóng kiểm tra độ mạnh mẽ của chương trình trong bot. Chuyển sang trang hệ thống backtest trên trang chỉnh sửa chiến lược, nhấp vàotam giác đảo ngượcđiều khiển thả xuống bên phải của nút Start Backtest, và nút Backtest Fault Tolerant sẽ bật lên.

đổi.GetTicker()

exchange.GetTicker()Nhận được báo giá thị trường hiện tại của các cặp giao dịch và hợp đồng hiện tại, với giá trị lợi nhuận:Tickercấu trúc. Trong hệ thống backtest,Tickerdữ liệu được trả về bởiexchange.GetTicker()chức năng, nơiHighLowlà các giá trị mô phỏng, lấy từ thời gian hiện tại của bán 1 mua 1 trong bot. Tiền điện tử trong hoạt động thực sự là giá cao nhất và giá thấp nhất trong một khoảng thời gian nhất định được xác định bởi sàn giao dịchTick interface.

function main(){
    var ticker = exchange.GetTicker()
    /*
        The platform interface may not be accessible due to network problems (even if the device's docker program can open the platform website, the API may not be accessible)
        At this time, ticker is null, when accessing ticker. When it is "High", it will cause an error; so when testing, ensure that you can access the platform interface
    */
    Log("High:", ticker.High, "Low:", ticker.Low, "Sell:", ticker.Sell, "Buy:", ticker.Buy, "Last:", ticker.Last, "Volume:", ticker.Volume)
}
def main():
    ticker = exchange.GetTicker()
    Log("High:", ticker["High"], "Low:", ticker["Low"], "Sell:", ticker["Sell"], "Buy:", ticker["Buy"], "Last:", ticker["Last"], "Volume:", ticker["Volume"])
void main() {
    auto ticker = exchange.GetTicker();
    Log("High:", ticker.High, "Low:", ticker.Low, "Sell:", ticker.Sell, "Buy:", ticker.Buy, "Last:", ticker.Last, "Volume:", ticker.Volume);
}

Trong bot thực sự (không backtest),Infothuộc tính trong giá trị trả về củaexchange.GetTicker()hàm lưu trữ dữ liệu ban đầu được trả về khi giao diện được gọi.

đổi.GetDepth()

exchange.GetDepth()lấy dữ liệu sổ lệnh trao đổi của các cặp giao dịch và hợp đồng hiện tại.Depth structure.

Depthcấu trúc bao gồm hai mảng cấu trúc, cụ thể làAsks[]Bids[], AsksBidschứa các biến cấu trúc sau:

Loại dữ liệu Tên biến Mô tả
số Giá cả giá cả
số Số tiền số tiền

Ví dụ, nếu tôi muốn có được giá bán thứ hai hiện tại, tôi có thể viết mã như thế này:

function main(){
    var depth = exchange.GetDepth()
    /*
       The platform interface may not be accessible due to network reasons (even if the device's docker program can open the platform website, the API may not be accessible)
       At this time, depth is null. When accessing depth.Asks[1].Price, it will cause an error; so when testing, ensure that you can access the platform interface
    */
    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);
}

giao dịch.GetTrades ((()

exchange.GetTrades()nhận được lịch sử giao dịch nền tảng (không phải của riêng bạn).TradeMột số sàn giao dịch không hỗ trợ nó. Dữ liệu cụ thể được trả về phụ thuộc vào hồ sơ giao dịch trong phạm vi, theo hoàn cảnh cụ thể. Dữ liệu được trả về là một mảng, trong đó trình tự thời gian của mỗi phần tử là giống như trình tự dữ liệu trả về củaexchange.GetRecordshàm, nghĩa 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.

// In the simulated backtest, the data is empty; to have a trading history, there must be a real bot running
function main(){
    var trades = exchange.GetTrades()
    /*
        The platform interface may not be accessible due to network reasons (even if the device's docker program can open the platform website, the API may not be accessible)
        At this time, "trades" is null. When accessing trades[0].Id, it will cause an error; so when testing, ensure that you can access the platform 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);
}

trao đổi.GetRecords()

exchange.GetRecords(Period)trả về dữ liệu K-line. K-line thời gian được chỉ định khi tạo bot; nếu bạn chỉ định các thông số khiexchange.GetRecords()Nếu không có tham số được chỉ định, dữ liệu K-line được trả về theo thời gian K-line được đặt trên các tham số bot hoặc thời gian K-line được đặt trên trang backtest.

ParameterPeriod:

  • Thời gian_M1: đề cập đến 1 phút
  • Thời gian_M5: đề cập đến 5 phút
  • Thời kỳ_M15: đề cập đến 15 phút
  • Giai đoạn_M30: đề cập đến 30 phút
  • Thời gian_H1: đề cập đến 1 giờ
  • Thời gian_D1: đề cập đến 1 ngày Giá trị tham số củaPeriodchỉ có thể vượt qua các khoảng thời gian tiêu chuẩn được xác định ở trên, nhưng cũng có thể vượt qua số, trong đơn vị giây.

Giá trị trả về củaexchange.GetRecords(Period)chức năng: 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.SetMaxBarLencài đặt chức năng. giới hạn trên mặc định là 5000 thanh K-line khi không được thiết lập. Khi dữ liệu K-Line đạt đến giới hạn tích lũy thanh K-Line, nó sẽ được cập nhật bằng cách thêm thanh K-Line và xóa thanh K-Line 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 K-line, sau đó docker thu thập dữ liệu ghi lại giao dịch thị trường trong thời gian thực để tạo ra K-line.

Số lượng thanh K-line lấy khiGetRecordshàm được gọi ban đầu.

  • 1000 thanh đường K đầu tiên tại thời điểm bắt đầu của thời gian backtesting được lấy trước trong hệ thống backtesting như dữ liệu đường K ban đầu.
  • Số lượng cụ thể của các thanh K-line được mua trong bot thực dựa trên số lượng dữ liệu tối đa có thể được mua bởi giao diện K-line của sàn giao dịch.

Đối vớiexchange.GetRecords(Period)chức năng, bot và backtest củatiền điện tửcả hai hỗ trợ thời gian tùy chỉnh, và các tham sốPeriodlà số giây. Ví dụ:

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

Thiết lậpPeriodtham số đến 5 là yêu cầu dữ liệu đường K với khoảng thời gian 5 giây. NếuPeriodtham số không được chia ngang bằng 60 (tức là khoảng thời gian đại diện là một khoảng thời gian không có sẵn phút), lớp dưới cùng của hệ thống sử dụng giao diện có liên quan củaGetTradesđể thu thập dữ liệu hồ sơ giao dịch và tổng hợp dữ liệu K-line cần thiết. NếuPeriodtham số được chia ngang bằng 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 (sử dụng thời gian dài hơn để tổng hợp dữ liệu đường K cần thiết nếu có thể).

function main(){
    var records = exchange.GetRecords(PERIOD_H1)
    /*
        The platform interface may not be accessible due to network reasons (even if the device's docker program can open the platform website, the API may not be accessible)
        At this time, "records" is null. When accessing records[0].Time, it will cause an error; so when testing, ensure that you can access the platform 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], "Current K-line (latest)", 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 is, Time:", records[1]["Time"], "Close:", records[1]["Close"])
    Log("Current K-line (latest)", records[-1], "Current K-line (latest)", 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 is, Time:", records[1].Time, "Close:", records[1].Close);
    Log("Current K-line (latest)", records[records.size() - 1], "Current K-line (latest)", records[records.size() - 2]);
}

exchange.GetRecords()hàm có hai điều kiện để thu thập dữ liệu đường K:

  • Sàn giao dịch cung cấp một giao diện dữ liệu đường K. Trong trường hợp này, dữ liệu thu được là dữ liệu được trao đổi trực tiếp.

  • Các sàn giao dịch không cung cấp một giao diện dữ liệu K-line. Chương trình FMZ docker có được các hồ sơ giao dịch mới nhất của sàn giao dịch mỗi khi các chương trình chiến lược gọiexchange.GetRecords(), đó là, nó gọi làexchange.GetTrades()chức năng để thu thập dữ liệu và tổng hợp dữ liệu đường K.

Các backtest ở cấp độ mô phỏng trong hệ thống cần thiết lậpKhoảng thời gian đường K cơ bản(khi hệ thống backtesting mô phỏng mức độ backtesting, dữ liệu đường K tương ứng được sử dụng để tạo dữ liệu tick theo tập hợpKhoảng thời gian đường K cơ bản); cần lưu ý rằng thời gian của dữ liệu K-line thu được trong chiến lược không thể ngắn hơnThời gian đường K cơ bảnBởi vì trong backtest cấp mô phỏng, dữ liệu đường K của mỗi giai đoạn được tổng hợp bởi dữ liệu đường K tương ứng với các giai đoạn đường K cơ bản trong hệ thống backtest.

Trongcppngôn ngữ, nếu bạn cần xây dựng dữ liệu K-line của riêng bạn, có những ví dụ mã sau:

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

trao đổi.GetPeriod()

Cácexchange.GetPeriod()hàm trả về K-line thời gian đặt trên trang web nền tảng FMZ khi chạy các chiến lược trongbacktestbot. Giá trị trả về là một số nguyên trong đơn vị của giây. Giá trị trả về: loại số.

function main() {
    // For example, in the backtest and bot, set the K-line period on the website page of FMZ platform to 1 hour
    var period = exchange.GetPeriod()
    Log("K-line period:", period / (60 * 60), "hour")
}
def main():
    period = exchange.GetPeriod()
    Log("K-line period:", period / (60 * 60), "hour")
void main() {
    auto period = exchange.GetPeriod();
    Log("K-line period:", period / (60 * 60.0), "hour");
}

trao đổi.SetMaxBarLen(Len)

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

  • Ảnh hưởng đến số lượng thanh K-line (BAR) thu được lần đầu tiên.
  • Ảnh hưởng đến giới hạn trên của các thanh K-line (BAR).
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]);
}

trao đổi.GetRawJSON()

exchange.GetRawJSON()trả về nội dung thô (dòng chuỗi) trả về bởi cuối cùngRESTyêu cầu, có thể được sử dụng để phân tích dữ liệu bởi chính bạn. Giá trị trả về: kiểu chuỗi, chỉ có giá trị trong môi trường giao dịch trực tiếp tiền điện tử. Backtest không hỗ trợ chức năng. Chiến lược trongcppngôn ngữ không hỗ trợ chức năng.

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++ doe not support "GetRawJSON" function
    Log(obj);
}

trao đổi.GetRate()

exchange.GetRate()trả về tỷ giá hối đoái của đồng tiền hiện đang được sử dụng trong sàn giao dịch và đồng tiền định giá hiện đang được hiển thị, và giá trị trả về 1 cho thấy chuyển đổi tỷ giá hối đoái bị vô hiệu hóa. Giá trị trả về: kiểu số.

Lưu ý:

  • Nếuexchange.SetRate()đã không được gọi để thiết lập tỷ giá hối đoái, giá trị tỷ giá hối đoái trả về bởiexchange.GetRate()là 1 theo mặc định, nghĩa là chuyển đổi tỷ giá hối đoái hiện đang hiển thị chưa được trao đổi.
  • Nếuexchange.SetRate()đã được sử dụng để thiết lập giá trị tỷ giá hối đoái, chẳng hạn như:exchange.SetRate(7), sau đó tất cả thông tin giá của đối tượng trao đổi hiện tại đại diện cho tiền tệ lưu thông của nền tảng giao dịch, chẳng hạn như báo giá, chiều sâu, giá lệnh, v.v., sẽ được nhân với tỷ giá hối đoái 7 được thiết lập trước đó để chuyển đổi.
  • Nếuexchangetương ứng với một trao đổi với USD như là tiền tệ định giá, sau khi gọiexchange.SetRate(7), tất cả giá của bot sẽ được chuyển đổi sang giá gần CNY bằng cách nhân với 7.exchange.GetRate()là 7.

đổi.GetUSDCNY()

exchange.GetUSDCNY()trả về tỷ giá hối đoái mới nhất của đô la Mỹ (nguồn dữ liệu được cung cấp bởiyahooGiá trị trả về: kiểu số.

exchange.SetData ((Key, Value)

Cácexchange.SetData(Key, Value)chức năng được sử dụng để thiết lập dữ liệu được tải vào thời điểm chiến lược đang chạy, có thể là bất kỳ chỉ số kinh tế, dữ liệu ngành, chỉ số có liên quan, vv. Nó có thể được sử dụng để định lượng tất cả các thông tin định lượng cho các chiến lược giao dịch và cũng hỗ trợ sử dụng trong hệ thống backtest.

Phương pháp gọi củaexchange.SetData(Key, Value)chức năng:

  • Viết dữ liệu trực tiếp vào chiến lược Định dạng dữ liệu được yêu cầu nhưdatabiến trong ví dụ sau.

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

    Khi chạy mã thử nghiệm trên, dữ liệu tương ứng sẽ được thu được tại thời điểm tương ứng, như được hiển thị trong hình:

    img

    Như chúng ta có thể thấy, thời gian tương ứng của dấu thời gian15796224000002020-01-22 00: 00: 00; khi chương trình chiến lược chạy sau thời gian này, trước khi dấu thời gian dữ liệu tiếp theo1579708800000, tức là trước thời điểm2020-01-23 00: 00: 00, gọi choexchange.GetData(Source)Tất cả những gì nhận được là nội dung của[1579622400000, 123]Khi chương trình tiếp tục chạy và thời gian thay đổi, lấy dữ liệu từng mảnh như thế này.

  • Yêu cầu dữ liệu thông qua các liên kết bên ngoài

    Định dạng 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 của mỗi bản ghi trong phần chính của dữ liệu được tải, định dạng được cố định như["time", "data"], tương ứng vớidatađịnh dạng thuộc tính của dữ liệu một một.dataattribute lưu trữ cơ thể chính của dữ liệu, và mỗi mảnh dữ liệu được tạo thành từ dấu thời gian và nội dung dữ liệu ở cấp độ millisecond (nội dung dữ liệu có thể là bất kỳ dữ liệu được mã hóa JSON nào).

    Chương trình dịch vụ cho thử nghiệm được viết bằngGongôn ngữ:

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

    Sau khi nhận được yêu cầu, chương trình sẽ trả lời dữ liệ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:

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

exchange.GetData ((Nguồn)

Cácexchange.GetData(Source)chức năng được sử dụng để có được dữ liệu tải bởi cácexchange.SetData(Key, Value)Các dữ liệu được thu được tại một thời điểm trong quá trình backtest, và dữ liệu được lưu trữ trong một phút trong quá trình giao dịch thực tế.

  • Nhận phương pháp gọi dữ liệu được ghi 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() {
        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);
        }
    }
    
  • Phương pháp gọi dữ liệu từ các liên kết bên ngoài

    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"));
    }
    
  • Sử dụng dữ liệu cơ bản của trung tâm dữ liệu nền tảng Sử dụngexchange.GetData(Source)hàm để nhậnDữ liệu cơ bản.

Khi gọi choexchange.GetData(Source)trong hệ thống backtest, khi sử dụng giao diện truy cập để yêu cầu dữ liệu, hệ thống backtest sẽ thêm các tham số from (tiếng dấu thời gian giây), đến (tiếng dấu thời gian giây), thời gian (kỷ đoạn đường K, timestamp milliseconds) và các tham số khác tự động vào yêu cầu, để xác định phạm vi thời gian của dữ liệu cần thu được.

API giao dịch

Các chức năng sau đây có thể được gọi thông quaexchangehoặcexchanges[0]ví dụ:exchange.Sell(100, 1);chỉ ra lệnh tiếp theo là lệnh bán với giá 100 và số lượng 1 trên sàn giao dịch.

trao đổi. Mua ((Giá, Số tiền)

exchange.Buy(Price, Amount)được sử dụng để đặt lệnh mua và trả về ID lệnh. Giá trị tham số:Pricelà giá đặt hàng theo kiểu số, vàAmountlà số tiền đặt hàng theo kiểu số. Giá trị trả về: kiểu chuỗi hoặc kiểu số (loại cụ thể phụ thuộc vào loại trả về của mỗi nền tảng trao đổi).

Số đặt hàng được trả lại có thể được sử dụng để truy vấn thông tin đặt hàng và hủy đặt hà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);
}
  • Đơn đặt hàng tương lai

    Khi đặt lệnh cho hợp đồng tương lai, chúng ta phải chú ý đến việc hướng giao dịch có được đặt đúng không. Nếu hướng giao dịch và chức năng giao dịch không phù hợp, sẽ báo cáo lỗi. Số lượng lệnh được đặt trên sàn giao dịch tương lai tiền điện tử là số lượng hợp đồng trừ khi được chỉ định khác. Ví dụ:

    // The following is the wrong call
    function main() {
        exchange.SetContractType("quarter")
      
        // Set short direction
        exchange.SetDirection("sell")     
        // Place a buy order, and you will get an error, so you can only sell short
        var id = exchange.Buy(50, 1)      
    
        // Set short direction
        exchange.SetDirection("buy")      
        // Place a sell order, and you will get an error, so you can only buy long
        var id2 = exchange.Sell(60, 1)    
      
        // Set close long position direction
        exchange.SetDirection("closebuy")    
        // Place a buy order, and you will get an error, so you can only sell short
        var id3 = exchange.Buy(-1, 1)        
      
        // Set close short position direction
        exchange.SetDirection("closesell")   
        // Place a sell order, and you will get an error, so you can only buy long
        var id4 = exchange.Sell(-1, 1)       
    }
    
    # The following is the wrong 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 the wrong 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);
    }
    

    Thông báo 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
    
  • Trật tự thị trường

    Lưu ý: Giao diện lệnh trao đổi được yêu cầu để hỗ trợ các lệnh thị trường (khi loại lệnh là lệnh mua, tham số số tiền đặt hàng là số tiền trong đồng tiền báo giá), và phương pháp lệnh thị trường của hợp đồng tương lai tiền điện tử được sử dụng để đặt lệnh, và đơn vị của tham số số lượng làSố lượng hợp đồngMột vài sàn giao dịch trực tiếp cho tiền kỹ thuật số không hỗ trợ giao diện lệnh thị trường.

    // For example, trading pairs: ETH_BTC, bought in by market order
    function main() {
        // Buy a market order, and buy ETH coins equal to 0.1 BTC (quote currency) 
        exchange.Buy(-1, 0.1)    
    }
    
    def main():
        exchange.Buy(-1, 0.1)
    
    void main() {
        exchange.Buy(-1, 0.1);
    }
    

trao đổi.Bán ((Giá, Số tiền)

exchange.Sell(Price, Amount)đặt lệnh bán và trả về ID lệnh. Giá trị tham số:Pricelà giá đặt hàng, kiểu số.Amountlà số tiền đặt hàng, loại số. Giá trị trả về: loại chuỗi hoặc loại số (loại cụ thể phụ thuộc vào loại trả về của mỗi sàn giao dịch).

Số đơn hàng được trả lại, có thể được sử dụng để truy vấn thông tin đơn hàng và hủy đơn hà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);
}
  • Đơn đặt hàng tương lai

    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. Nếu hướng giao dịch và chức năng giao dịch không phù hợp, sẽ báo cáo lỗi. Số tiền đặt hàng của nền tảng tương lai tiền điện tử là số hợp đồng trừ khi được chỉ định khác.

  • Các lệnh thị trường

    Lưu ý: giao diện đặt hàng trên nền tảng được yêu cầu để hỗ trợ lệnh thị trường. (Khi loại lệnh là lệnh bán, tham số số tiền đặt hàng là số lượng coin hoạt động được bán), và tiền điện tử tương lai đặt lệnh theo hình thức lệnh thị trường, và đơn vị tham số số tiền đặt hàng làSố lượng hợp đồngMột vài sàn giao dịch tiền kỹ thuật số trong giao dịch thực không hỗ trợ giao diện lệnh thị trường.

    // For example, trading pairs: ETH_BTC, sold out by market order 
    function main() {
        // Note: Sell by a market order, and sell 0.2 ETH coins 
        exchange.Sell(-1, 0.2)   
    }
    
    def main():
        exchange.Sell(-1, 0.2)
    
    void main() {
        exchange.Sell(-1, 0.2);
    }
    

trao đổi.Hủy đơn đặt hàng (Id)

exchange.CancelOrder(orderId), mục đích của chức năng này là hủy lệnh với Id. Giá trị tham số:Idlà số đơn đặt hàng, theo kiểu chuỗi hoặc kiểu số (loại cụ thể phụ thuộc vào loại trả về khi đặt đơn đặt hàng trên mỗi nền tảng); giá trị trả về: loại bool.

Trả về kết quả hoạt động;truecó nghĩa là yêu cầu hủy lệnh đã được gửi thành công;falsecó nghĩa là yêu cầu hủy lệnh không gửi (giá trị trả về chỉ cho thấy liệu yêu cầu gửi có thành công hay không, vì vậy tốt nhất là gọiexchange.GetOrders()để kiểm tra xem nền tảng có hủy lệnh hay khô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);
}

Chức năng API của FMZ, có thể tạo các chức năng đầu ra nhật ký, chẳng hạn nhưLog(...), exchange.Buy(Price, Amount)exchange.CancelOrder(Id). Bạn có thể làm theo các tham số cần thiết với một số tham số đầu ra bổ sung, chẳng hạn nhưexchange.CancelOrder(orders[j].Id, orders[j])Bằng cách này, nó là hủy bỏorders[j]lệnh mà đi kèm với đầu ra của thông tin lệnh này, cụ thể làOrdercấu trúc củaorders[j].

function main() {
    Log("data1", "data2", "data3", "...")
    var data2 = 200
    var id = exchange.Sell(100000, 0.1, "Incidental data1", data2, "...")
    exchange.CancelOrder(id, "Incidental data1", data2, "...")
    LogProfit(100, "Incidental data1", data2, "...")
}
def main():
    Log("data1", "data2", "data3", "...")
    data2 = 200
    id = exchange.Sell(100000, 0.1, "Incidental data1", data2, "...")
    exchange.CancelOrder(id, "Incidental data1", data2, "...")
    LogProfit(100, "Incidental data1", data2, "...")
void main() {
    Log("data1", "data2", "data3", "...");
    int data2 = 200;
    auto id = exchange.Sell(100000, 0.1, "Incidental data1", data2, "...");
    exchange.CancelOrder(id, "Incidental data1", data2, "...");
    LogProfit(100, "Incidental data1", data2, "...");
}

trao đổi.GetOrder ((Id))

exchange.GetOrder(orderId)Nhận chi tiết theo số thứ tự. Giá trị tham số:Idlà số thứ tự được lấy, vàIdlà kiểu chuỗi hoặc số (loại cụ thể phụ thuộc vào loại trả về của mỗi sàn giao dịch).Ordercấu trúc. (Không được hỗ trợ bởi một số sàn giao dịch)

  • Ordercấu trúc
  • AvgPricechỉ ra giá thực hiện trung bình (một số sàn giao dịch không hỗ trợ trường này; đặt nó thành 0 nếu không hỗ trợ).
function main(){
    var id = exchange.Sell(1000, 1)
    // The 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);
}

trao đổi.GetOrders ((()

exchange.GetOrders()Nhận tất cả các đơn đặt hàng chưa hoàn thành.OrderMảng cấu trúc Đối vớiOrdercấu trúc, xin vui lòng tham khảoexchange.GetOrder()Khi tài khoản được đại diện bởi đối tượng trao đổiexchangekhông có lệnh chờ, gọiexchange.GetOrders()để trả về một mảng trống, cụ thể là:[].

function main(){
    exchange.Sell(1000, 1)
    exchange.Sell(1000, 1)
    var orders = exchange.GetOrders()
    Log("Information for unfinished order 1, ID:", orders[0].Id, "Price:", orders[0].Price, "Amount:", orders[0].Amount,
        "DealAmount:", orders[0].DealAmount, "type:", orders[0].Type)
    Log("Information for unfinished order 2, ID:", orders[1].Id, "Price:", orders[1].Price, "Amount:", orders[1].Amount,
        "DealAmount:", orders[1].DealAmount, "type:", orders[1].Type)
}
def main():
    exchange.Sell(1000, 1)
    exchange.Sell(1000, 1)
    orders = exchange.GetOrders()
    Log("Information for unfinished order 1, ID:", orders[0]["Id"], "Price:", orders[0]["Price"], "Amount:", orders[0]["Amount"], 
        "DealAmount:", orders[0]["DealAmount"], "type:", orders[0]["Type"])
    Log("Information for unfinished order 2, ID:", orders[1]["Id"], "Price:", orders[1]["Price"], "Amount:", orders[1]["Amount"],
        "DealAmount:", orders[1]["DealAmount"], "type:", orders[1]["Type"])
void main() {
    exchange.Sell(1000, 1);
    exchange.Sell(1000, 1);
    auto orders = exchange.GetOrders();
    Log("Information for unfinished order 1, ID:", orders[0].Id, "Price:", orders[0].Price, "Amount:", orders[0].Amount, 
        "DealAmount:", orders[0].DealAmount, "type:", orders[0].Type);
    Log("Information for unfinished order 2, ID:", orders[1].Id, "Price:", orders[1].Price, "Amount:", orders[1].Amount,
        "DealAmount:", orders[1].DealAmount, "type:", orders[1].Type);
}

Cácexchange.GetOrders()chức năng nhận được thông tin thứ tự chưa hoàn thành của hiện tại được thiết lậpcặp giao dịchCần lưu ý rằng tương lai tiền điện tử có sự khác biệt giữa không chỉ các cặp giao dịch mà còn là mã hợp đồng.

// Test OKX contract tradings, to know whether "GetOrders" gets all unfinished contract orders
function main(){
    // The next weekly buy order; the price of the order minus 50 guarantees no execution; pending orders
    exchange.SetContractType("this_week")
    exchange.SetDirection("buy")
    var ticker = exchange.GetTicker()
    Log(ticker)
    exchange.Buy(ticker.Last - 50, 1)

    // The next quarterly sell order; the price plus 50 guarantees that it will not be executed, and the pending order has been switched to a quarterly contract
    exchange.SetContractType("quarter")
    exchange.SetDirection("sell")
    ticker = exchange.GetTicker()
    Log(ticker)
    exchange.Sell(ticker.Last + 50, 1)

    // Get the unfinished orders
    Log("orders", exchange.GetOrders())
}
def main():
    exchange.SetContractType("this_week")
    exchange.SetDirection("buy")
    ticker = exchange.GetTicker()
    Log(ticker)
    exchange.Buy(ticker["Last"] - 50, 1)

    exchange.SetContractType("quarter")
    exchange.SetDirection("sell")
    ticker = exchange.GetTicker()
    Log(ticker)
    exchange.Sell(ticker["Last"] + 50, 1)

    Log("orders", exchange.GetOrders())
void main() {
    exchange.SetContractType("this_week");
    exchange.SetDirection("buy");
    auto ticker = exchange.GetTicker();
    Log(ticker);
    exchange.Buy(ticker.Last - 50, 1);

    exchange.SetContractType("quarter");
    exchange.SetDirection("sell");
    ticker = exchange.GetTicker();
    Log(ticker);
    exchange.Sell(ticker.Last + 50, 1);

    Log("orders", exchange.GetOrders());
}

Thông tin đặt hàng chưa hoàn thành:

[{"Id":17116430886,"Amount":1,"Price":808.4,"DealAmount":0,"AvgPrice":0,"Status":0,"Type":1,"ContractType":"quarter"}]

Nó có thể được nhìn thấy rằng trong giao dịch tiền điện tử, các đơn đặt hàng nhận được bởiexchange.GetOrders()chỉ là các đơn đặt hàng chưa hoàn thành của hợp đồng hiện tại.

đổi.SetPrecision(...)

exchange.SetPrecision(PricePrecision, AmountPrecision)thiết lập độ chính xác thập phân của giá và số tiền lệnh biểu tượng; nó sẽ được cắt ngắn tự động sau khi thiết lập. Giá trị tham số:PricePrecisionlà loại số, được sử dụng để kiểm soát số lượng chữ số thập phân trong dữ liệu giá;AmountPrecisionlà loại số, được sử dụng để kiểm soát dấu chấm thập phân sau số tiền đặt hàng.PricePrecisionAmountPrecisionbacktest không hỗ trợ chức năng, và độ chính xác số của backtest sẽ được xử lý tự động.

function main(){
    // Set the decimal precision of the price to 2 digits, and set the precision of the quantity of the symbol order to 3 digits
    exchange.SetPrecision(2, 3)
}    
def main():
    exchange.SetPrecision(2, 3)
void main() {
    exchange.SetPrecision(2, 3);
}

exchange.SetRate ((Rate))

exchange.SetRate(Rate)thiết lập tỷ giá hối đoái của đồng tiền lưu thông trong sàn giao dịch. Giá trị tham số:Ratelà củanumberĐánh giá trả về:number type.

function main(){
    Log(exchange.GetTicker())
    // Set the exchange rate conversion
    exchange.SetRate(7)
    Log(exchange.GetTicker())
    // Set to 1, without 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);
}

Lưu ý:

  • Nếu bạn đã thiết lập giá trị tỷ giá bằng cách sử dụngexchange.SetRate(Rate), chẳng hạn như 7, sau đó, tất cả các thông tin giá, bao gồm cả giá thị trường hiện tại, chiều sâu và giá lệnh, của tiền tệ lưu thông đại diện cho hiện tạiexchangeđối tượng, sẽ được nhân với tỷ giá hối đoái được thiết lập của 7 để chuyển đổi.

  • Ví dụ,exchangelà tỷ giá hối đoái bằng đô la Mỹ.exchange.SetRate(7)được gọi, tất cả các giá giao dịch thực tế sẽ được nhân 7 và chuyển đổi thành giá gần CNY.

exchange.IO(…)

exchange.IO("api", httpMethod, resource, params, raw), gọi các giao diện chức năng khác của trao đổi. Giá trị tham số:httpMehodlà kiểu chuỗi; nó điền vào kiểu yêu cầu, chẳng hạn nhưPOSThoặcGET. resourcelà kiểu chuỗi, nó điền vào đường dẫn yêu cầu.paramslà kiểu chuỗi, nó điền vào các tham số yêu cầu.rawlà tham số chuỗi JSON gốc và nó có thể bị bỏ qua.exchange.IO("api", httpMethod, resource, params, raw)function call sẽ truy cập giao diện trao đổi. Khi xảy ra lỗi và cuộc gọi thất bại, nó trả về một giá trị null (chức năng với yêu cầu mạng, chẳng hạn nhưGetTicker()GetAccount(), vv, trả về giá trị null khi cuộc gọi thất bại). Chỉ giao dịch trực tiếp hỗ trợ gọiexchange.IO("api", ...) function.

Đối với ví dụ về thứ tự lô OKX, sử dụng tham sốrawđể thông qua các thông số lệnh:

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 directly access the platform batch ordering interface
    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ụng chức năng này, bạn cần phải đi đến trao đổi để hiểuAPIgiao diện của trao đổi để mở rộng các chức năng mà FMZ đã không thêm (bạn không phải lo lắng về quá trình mã hóa tham số, chữ ký và xác minh khi bạn gửi mộtPOSTFMZ đã xử lý hoàn toàn ở lớp dưới, vì vậy bạn chỉ cần điền vào các thông số tương ứng).

Lưu ý: Nếu giá trị khóa trongparamstham số (tức là, các tham số yêu cầu HTTP) là một chuỗi, nó cần phải được bọc với dấu ngoặc kép đơn (biểu tượng') ở cả hai bên của giá trị tham số. Ví dụ:bitfinex exchange.

var amount = 1
var price = 10
var basecurrency = "ltc"
function main () {
    // Notice that amount.toString() and price.toString() both have a ' character on the left and right
    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);
}

Ví dụ về truy cậpOKXgiao diện:

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

Dữ liệu được trả về trong quá trình thử nghiệm:

{"code":"0","data":[],"msg":""}

Các thiết lập khác củaexchange.IOchức năng:

  • Chuyển đổi các cặp giao dịch của sàn giao dịch hiện tại

    exchange.IO("currency", "ETH_BTC")

    function main() {
        // For example, set the current trading pair of the exchange object on the bot to BTC_USDT, and print the current trading pair market
        Log(exchange.GetTicker())
        // Switch 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());
    }
    

    Bằng cách này,các cặp giao dịchcấu hìnhkhi bot được thêm vàohoặcbacktest được chạysẽ được chuyển qua các mã.

    Lưu ý:

      1. Hệ thống backtest bây giờ hỗ trợ chuyển đổi cặp giao dịch (chỉ các đối tượng trao đổi tại chỗ của tiền điện tử). Trong quá trình backtest, cần lưu ý rằng chỉ có các cặp giao dịch của cùng một loại tiền tệ có thể được chuyển đổi. Ví dụ, cặp giao dịch hiện tại làETH_BTC, mà chỉ có thể được chuyển sangLTC_BTC, khôngLTC_USDT.
      1. Nếuwebsocketchế độ giao thức được chuyển đổi trên các đối tượng trao đổi giao ngay Huobi, bạn không thể sử dụngexchange.IO("currency", "XXX_YYY")để chuyển đổi tiền tệ.
      1. Đối với sàn giao dịch tương lai tiền điện tử, nếu các cặp giao dịch được chuyển đổi, bạn cần thiết lập lại hợp đồng để xác định hợp đồng nào bạn muốn giao dịch.
      1. Bạn cũng có thể sử dụngexchange.SetCurrency(Symbol)chức năng để chuyển đổi các cặp giao dịch, và sử dụngexchange.IO("currency","XXX_YYY")phương pháp để duy trì tính tương thích.
  • exchange.IOchức năng chuyển đổi địa chỉ cơ sở API trao đổi (hợp đồng RESET; một số trao đổi không hỗ trợ điều đó). Bây giờ việc sử dụngexchange.SetBase(Base)chức năng đã được hỗ trợ để chuyển đổi địa chỉ cơ sở API trao đổi, và sử dụngexchange.IO("base","https://xxx.xxx.xxx")phương pháp để duy trì tính tương thích.

    Ví dụ: Khi đối tượng trao đổi được đóng gói, địa chỉ cơ sở mặc định làhttps://api.huobipro.com, để chuyển sang:https://api.huobi.pro, sử dụng mã sau.

    function main () {
        // exchanges[0] is the first exchange object added when the bot is added 
        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");
    }
    

    Chuyển địa chỉ cơ sở trở lại:https://api.huobipro.com.

    function main () {
        exchanges[0].IO("base", "https://api.huobipro.com")
    }
    
    def main():
        exchanges[0].IO("base", "https://api.huobipro.com")
    

Thêm nữa