[TOC]

Hướng dẫn cơ bản

Bắt đầu

FMZ Quant Trading Platform có thể làm gì?

Nền tảng FMZ Quant Trading là cộng đồng định lượng chuyên nghiệp nhất trong lĩnh vực giao dịch định lượng. Tại đây bạn có thể học, viết, chia sẻ, mua và bán các chiến lược định lượng; bạn có thể tiến hành kiểm tra hậu trường trực tuyến và sử dụng robot mô phỏng để tiến hành giao dịch mô phỏng; bạn cũng có thể chạy, công bố và xem giao dịch trực tiếp. Chúng tôi hỗ trợ hầu hết các sàn giao dịch tiền kỹ thuật số chính thống.

Chuỗi hướng dẫn hoàn chỉnh

Hướng dẫn đồ họa:

Nếu có bất kỳ vấn đề nào, bạn có thể đăng câu hỏi và thảo luận trong diễn đàn bất cứ lúc nào, hoặc gửi vé, hoặc liên hệ với một quản trị viên trong nhóm Telegram (Telegram), nói chung, câu hỏi sẽ được trả lời nhanh chóng.

Hỗ trợ ChatGPT cho hỗ trợ phát triển

FMZ Quantitative Trading Platform đã áp dụng ChatGPT như một công cụ hỗ trợ phát triển có thể được truy cập bằng cách nhấp vào ChatGPT trong thanh tắt trong Dashboard để chuyển sangTrang công cụ phụ trợ ChatGPT.

Những ngôn ngữ lập trình có sẵn để thực hiện các chiến lược của tôi?

FMZ Quant nền tảng giao dịch hỗ trợ để sử dụngJavaScript, TypeScript, Python, C++, Pine MylanguageBlockly Visualizationđể viết và thiết kế các chiến lược.

Nó hỗ trợTypeScriptngôn ngữ, vẫn đặt nó vàoJavaScriptchiến lược khi chúng ta tạo ra các chiến lược, sau đó chúng ta viết// @ts-checkở đầu mã chiến lược hoặc nhấp vào nútTypeScriptở góc trên bên phải của khu vực chỉnh sửa chiến lược để chuyển sangTypeScriptNền tảng sẽ nhận ra mã nhưTypeScripttự động và cung cấp cho bạn sự hỗ trợ biên soạn và kiểm tra kiểu phù hợp cho:

  • An toàn kiểu:TypeScriptchức năng kiểm tra kiểu tĩnh của có thể giúp bạn tìm ra các lỗi tiềm ẩn khi viết mã và cải thiện chất lượng mã.
  • Hoàn thành mã tự động:TypeScripthệ thống kiểu của nó làm cho nó nhanh hơn để tìm các thuộc tính và phương pháp bạn cần khi viết mã, cải thiện hiệu quả phát triển.
  • Cấu trúc mã rõ ràng hơn: VớiTypeScript, bạn có thể tổ chức tốt hơn và duy trì mã của bạn, làm cho nó dễ đọc và hiểu.
  • Tính năng lập trình hướng đối tượng mạnh mẽ:TypeScriptcung cấp các tính năng lập trình hướng đối tượng mạnh mẽ, chẳng hạn như giao diện, lớp học, generics và như vậy, giúp bạn viết mã chiến lược mạnh mẽ và tái sử dụng hơn.

Bạn chỉ cần làm chủ một trong những ngôn ngữ này. Ngoài việc hỗ trợ cách thiết kế chiến lược bằng cách viết mã, bạn cũng có thể tạo chiến lược bằng cách sử dụng các mô-đun trực quan (Blockly).

BlocklyHướng dẫn hiển thị:

Thiết lậpPythonphiên dịch được sử dụng bởiPythonchương trình chiến lược

Các chiến lược được viết trongPython, khi backtesting hoặc giao dịch trực tiếp, nếu môi trường hệ thống docker có cả haiPython2Python3cài đặt, bạn có thể thiết lậpPythonphiên bản được khởi động tại thời gian chạy trên dòng đầu tiên của chiến lược, chẳng hạn như#!python3#!python2Và bạn cũng có thể chỉ định một đường dẫn tuyệt đối, chẳng hạn như:#!/usr/bin/python3.

Docker là gì?

Docker có thể được hiểu như là người thực hiện chiến lược giao dịch của bạn, chịu trách nhiệm về các yêu cầu dữ liệu phức tạp, nhận dữ liệu, liên kết mạng, đăng lại đăng nhập và vân vân. Docker chạy trên máy chủ của bạn, ngay cả khi trang web nền tảng FMZ Quant Trading có lỗi mạng, nó sẽ không ảnh hưởng đến hoạt động của docker của bạn. Docker có thể chạy trênLinux, Cửa sổ, Mac OS, Android, Raspberry Pi ARM Linuxvà các hệ thống khác.Trang Docker, Các bước cài đặt và cập nhật Linux docker. Các bot và nhật ký được quản lý bởi docker được lưu trữ trong thư mục/logs/storage. hồ sơ là mộtSqlitetệp cơ sở dữ liệu vớidb3, có thể được chỉnh sửa trực tiếp bởiSqlitephần mềm quản lý. Đối với một tập tin với phần mở rộngdb3Trong cơ sở dữ liệu bot thực sự, tên tệp là ID bot.

Các giao thức được hỗ trợ

  • Tài sản Blockchain: Hơn 50 sàn giao dịch tài sản blockchain (tiền mã hóa) chính thống hiện được hỗ trợ trên nền tảng của chúng tôi.
  • Truy cập giao thức chung:giao thức chung

An ninh chiến lược

Khi các chiến lược giao dịch được phát triển trên nền tảng FMZ Quant Trading, nội dung chiến lược chỉ hiển thị cho chủ tài khoản FMZ. Và trên nền tảng giao dịch định lượng FMZ, bạn có thể đạt được bản địa hóa hoàn toàn mã chiến lược.Pythongói, được tải trong mã chiến lược, để nội dung chiến lược nội dung có thể được thực hiện.

An ninh củaPythonmã: Bởi vìPythonlà một ngôn ngữ mã nguồn mở cực kỳ dễ dàng để giải mã, nếu chiến lược không phải là để sử dụng cá nhân mà để thuê, bạn có thể chạy chiến lược trên docker được triển khai của riêng bạn và thuê nó dưới dạng tài khoản phụ hoặc quản lý docker đầy đủ nếu bạn lo lắng về rò rỉ chiến lược.

Việc mã hóa củaPythonmã chiến lược: Theo mặc định,Pythonmã chiến lược không được mã hóa khi được sử dụng bởi tác giả và được mã hóa khi cho thuê cho người khác. Bằng cách chỉnh sửa mã sau đây ở đầuPythonchiến lược, bạn có thể xác định xem có nên mã hóa mã chiến lược cho sử dụng cá nhân hoặc cho thuê.PythonCác phiên bản hỗ trợ mã hóa mã chiến lược là như sau:Python 2.7, Python 3.5Python 3.6.

  • Các tác giả chiến lược tự chạy nó và mã hóa mã chiến lược cho người khác sử dụng thông qua mã đăng ký: Xác định#!pythonnhư phiên bản của trình diễn Python, và sau đó sử dụng,để giữ riêng biệt; nhập lệnh mã hóaencryptNếu bạn không chỉ định phiên bản củaPython, thêm#!,encrypt directly.
 #!python,encrypt

Hoặc

  #!encrypt
  • Nó sẽ không mã hóa các mã chiến lược khi nhà viết chiến lược chạy cho riêng mình và chia sẻ với những người khác thông qua mã đăng ký:
  #!python, not encrypted

Hoặc

  #!not encrypted

Sử dụng mãos.getenv('__FMZ_ENV__')để xác định xem mã mã hóa có hợp lệ hay không; trả lại chuỗi"encrypt"chỉ ra rằng nó đã có hiệu lực. Nó chỉ có giá trị trong bot thực, và backtest sẽ không mã hóaPythonmã chiến lược.

#!encrypt
def main():
    ret = os.getenv('__FMZ_ENV__')
    # If the print variable ret is the string "encrypt" or ret == "encrypt" is true, that means the encryption is valid. 
    Log(ret, ret == "encrypt")

Chăm sóc an toàn

Các dữ liệu nhạy cảm, chẳng hạn như thông tin tài khoản và chuỗi mã hóa trong các tham số chiến lược được cấu hình trên nền tảng FMZ Quant Trading, được mã hóa trên trình duyệt web. Tất cả thông tin được lưu trữ trên nền tảng FMZ Quant Trading đều được mã hóa (không phải dữ liệu văn bản thuần), và chỉ có người dùng thiết bị riêng có thể giải mã và sử dụng thông tin, cải thiện đáng kể tính bảo mật của dữ liệu nhạy cảm. Xin đừng tiết lộ hoặc bán các chiến lược nếu thông tin nhạy cảm khác được bao gồm trong mã chiến lược, cài đặt tham số và mô tả chiến lược vv.

  • Nền tảng của chúng tôi hỗ trợ cấu hình địa phương của thông tin nhạy cảm, chẳng hạn như thông tin tài khoản trao đổi và khóa bí mật Trên trang nơi nền tảng cấu hình thông tin trao đổi, tất cả các điều khiển hộp văn bản được mã hóa với mặt nạ hỗ trợ cách cấu hình đường dẫn tệp để tải tệp địa phương docker.RSA KEYphương pháp xác thực của trao đổi như một ví dụ để giải thích chi tiết cách cấu hình thông tin nhạy cảm cục bộ trên thiết bị nơi chương trình docker nằm.
  1. Tạo khóa công cộng và khóa riêng RSA Ví dụ, tạo khóa công cộng và khóa riêng theo định dạngPKCS#8, có rất nhiều công cụ có sẵn để tạo ra, chẳng hạn nhưopenssl.
  2. Tạo mộtRSA KEYtrên sàn giao dịch, và tải lên khóa công khai được tạo ra trongBước 1trong quá trình tạo dựng.
  3. Lưu khóa riêng được tạo trongBước 1trong cùng một thư mục của docker trong định dạng củatxtfile, hoặc trong các đường dẫn khác trong thư mục của chương trình docker.
  4. Khi cấu hình trao đổi trên nền tảng FMZ, điền vàoRSA KEYđược tạo bởi trao đổi trong hộp chỉnh sửa của cấu hìnhAccess Key.
  5. Khi cấu hình trao đổi trên nền tảng FMZ, điền vào đường dẫn củatxttệp được đặt trong thư mục cùng một cấp độ của docker trongBước 3trong hộp chỉnh sửa của cấu hìnhSecret KeyVí dụ, nếu tên tập tin được đặt là:rsaKey.txt, và tệp và docker được điền vào cùng một thư mục cấp:file:///rsaKey.txt. Nếu tệp nằm trong thư mục bên cạnh thư mục của chương trình dockerrsa_key, điền vào:file:///rsa_key//rsaKey.txtNếu bạn đặtrsaKey. txtở nơi khác trên máy tính hoặc máy chủ của bạn làm theo các hướng dẫn này phù hợp, cần lưu ý rằng tệp này chỉ có thể được đặt ở cả thư mục cùng cấp độ hoặc thư mục con liên quan đến docker.

Điều này làm cho nó an toàn hơn để định vị và lưu khóa riêng, bạn có thể tham khảovideo giải thíchcho quy trình chi tiết.

Hệ thống kiểm tra ngược

Hệ thống backtest là gì và nó được sử dụng để làm gì?

Sau khi bạn hoàn thành việc thiết kế một chiến lược giao dịch định lượng, làm thế nào bạn có thể biết tình hình cơ bản của chiến lược của mình, chẳng hạn như logic của chiến lược và hướng lợi nhuận của chiến lược? Tất nhiên, chúng tôi không thể sử dụng tiền thật trực tiếp để chạy chiến lược trên thị trường giao dịch thực, nhưng chúng tôi có thể sử dụng dữ liệu lịch sử để kiểm tra chiến lược của bạn và biết lợi nhuận của chiến lược của bạn trong dữ liệu lịch sử.

Liệu dữ liệu hệ thống backtest có chính xác và như thế nào về độ chính xác của kết quả backtest?

Nền tảng FMZ Quant Trading chia hệ thống backtest thànhMức thị trường thực tếMức độ mô phỏng. Mức thị trường thực tế là để backtest hoàn toàn theo các dữ liệu lịch sử đầy đủ; trong khi mô phỏng mức backtest tạo ratickCả hai đều dựa trên dữ liệu lịch sử thực tế, nhưng dữ liệu thị trường thực tế chính xác hơn và kết quả đáng tin cậy hơn.Mô tả cơ chế FMZ BacktestTuy nhiên, backtesting chỉ là hiệu suất của chiến lược theo dữ liệu lịch sử. Dữ liệu lịch sử không thể đại diện đầy đủ cho thị trường tương lai. Thị trường lịch sử có thể lặp lại, hoặc nó cũng có thể dẫn đến Black Swan. Do đó, kết quả backtest nên được xử lý hợp lý và khách quan.

Các vấn đề cần lưu ý khi kiểm tra lại các chiến lược ngôn ngữ lập trình khác nhau:

Kiểm tra hậu quả củaJavaScriptC++chiến lược giao dịch được tiến hành trong trình duyệt, và các bot thị trường thực sự hoặcWexAppthị trường thực tế (tức làWexApptrao đổi mô phỏng của nền tảng FMZ Quant Trading) chạy mà không cần cài đặt bất kỳ phần mềm, thư viện hoặc mô-đun nào khác. Kiểm tra hậu quả củaPythonđược thực hiện trên docker; nó có thể được thực hiện trên máy chủ công cộng được thêm vào bởi nền tảng FMZ Quant Trading, và nó cũng có thể được thực hiện trên docker của người dùng.Pythoncài đặt trên hệ thống nơi docker nằm. Nếu một số thư viện được yêu cầu, chúng cần phải được cài đặt bằng tay (chỉ các thư viện phổ biến được hỗ trợ trên các máy chủ công cộng).

Dữ liệu backtest trong hệ thống

Có hai loại backtest nền tảng FMZ Quant Trading: backtest cấp độ mô phỏng và backtest cấp độ thị trường thực.tickMỗi giai đoạn K-line sẽ tạo ra 12 điểm thời gian backtesting; tuy nhiên, mức thị trường thực tế thu thậpticksPhương pháp kiểm tra lại của FMZ cho phép chiến lược giao dịch giao dịch nhiều lần trên một đường K duy nhất, tránh tình huống giao dịch chỉ có thể được thực hiện ở mức giá đóng. Nó chính xác hơn trong khi tính đến tốc độ kiểm tra lại. Để biết thêm chi tiết, vui lòng tham khảoLiên kết.

Phương pháp DEBUG chiến lược trong hệ thống backtesting

JavaScript chiến lược backtesting debugging trong Chrome DevTools

Các trao đổi được hỗ trợ trong hệ thống kiểm tra ngược

  • Tiền mã hóa (Tiền mã hóa)

    Tên Loại Hướng dẫn
    Bitfinex đối tượng trao đổi tại chỗ hỗ trợ các cặp giao dịch hạn chế, chẳng hạn như:BTC_USD, ETH_USDLTC_USD, v.v. (lưu ý tiền tệ báo giá của các cặp giao dịch làUSDđô la)
    Binance đối tượng trao đổi tại chỗ hỗ trợ các cặp giao dịch hạn chế, chẳng hạn như:BTC_USDT, ETH_USDT, ETH_BTCLTC_BTC, vv
    OKX đối tượng trao đổi tại chỗ hỗ trợ các cặp giao dịch hạn chế, chẳng hạn như:BTC_USDT, ETH_USDT, ETH_BTCLTC_BTC, vv
    Huobi đối tượng trao đổi tại chỗ hỗ trợ các cặp giao dịch hạn chế, chẳng hạn như:BTC_USDT, ETH_USDT, ETH_BTCLTC_BTC, vv
    OKX Futures đối tượng giao dịch tương lai hỗ trợ các cặp giao dịch hạn chế, chẳng hạn như:BTC_USDETH_USD, v.v.; đồng tiền báo giá của các cặp giao dịch làUSD; sau khi thiết lập mã hợp đồng cụ thể (vui lòng tham khảo chức năngexchange.SetContractTypeCác mã hợp đồng được hỗ trợ bao gồm:this_week, next_week, quarterswap
    HuobiDM đối tượng giao dịch tương lai HuobiDM là Huobi Futures (Huobi Contract), hỗ trợ các cặp giao dịch hạn chế, chẳng hạn như:BTC_USDETH_USD, v.v.; đồng tiền báo giá của các cặp giao dịch làUSD; sau khi thiết lập mã hợp đồng cụ thể (vui lòng tham khảo chức năngexchange.SetContractTypeCác mã hợp đồng được hỗ trợ bao gồm:this_week, next_week, quarterswap.
    BitMEX đối tượng giao dịch tương lai cặp giao dịch làXBT_USD; sau khi thiết lập mã hợp đồng cụ thể (vui lòng tham khảo chức năngexchange.SetContractType), hợp đồng là hợp đồng ký quỹ mật mã; mã hợp đồng được hỗ trợ là:XBTUSD
    Binance Futures đối tượng giao dịch tương lai hỗ trợ các cặp giao dịch hạn chế, chẳng hạn như:BTC_USDTETH_USDT, v.v.; đồng tiền báo giá của các cặp giao dịch làUSD; sau khi thiết lập mã hợp đồng cụ thể (vui lòng tham khảo chức năngexchange.SetContractType), hợp đồng là mộtUSDT- hợp đồng ký quỹ; mã hợp đồng được hỗ trợ làswap
    Các tùy chọn Deribit đối tượng giao dịch tương lai các cặp giao dịch là:BTC_USDETH_USD; sau khi thiết lập mã hợp đồng cụ thể (vui lòng tham khảo chức năngexchange.SetContractType), hợp đồng là một hợp đồng ký quỹ; mã hợp đồng tùy chọn cụ thể cần được thiết lập

    Đối với các đối tượng giao dịch tương lai trong hệ thống backtest, thay đổi cặp giao dịch tạm thời không được hỗ trợ trong các mã chiến lược.

Mức độ mô phỏng

Các backtest cấp mô phỏng dựa trên dữ liệu K-line cơ bản của hệ thống backtest, mô phỏng dữ liệu tick trong khuôn khổ giá cao nhất, giá thấp nhất, giá mở cửa, và giá đóng giá trị của một K-line Bar cơ bản theo một thuật toán nhất định.tickThông tin chi tiết, vui lòng tham khảo:FMZ Quant Simulation Level Backtest Mechanism Mô tả.

Mức thị trường thực tế

Các backtest thị trường thực là thực tếtickĐối với các chiến lược dựa trênticksử dụng mức thị trường thực để backtest gần hơn với thực tế.tickdữ liệu là dữ liệu được ghi lại thực tế, không phải mô phỏng. Nó hỗ trợ dữ liệu độ sâu, ghi lại dữ liệu chơi lại giao dịch thị trường, độ sâu tùy chỉnh và mỗi dữ liệu giao dịch cá nhân. Kích thước tối đa của dữ liệu backtest thị trường thực là tối đa 50MB, không giới hạn khoảng thời gian backtest trong giới hạn trên của bộ dữ liệu. Nếu bạn cần mở rộng khoảng thời gian backtest càng nhiều càng tốt, bạn có thể giảm giá trị của thiết lập thiết bị Call depth và không sử dụng từng dữ liệu giao dịch cá nhân để tăng khoảng thời gian backtest.GetDepth,GetTradesCác chức năng để có được dữ liệu thị trường phát lại.GetTicker,GetTrades, GetDepthGetRecordssẽ không đẩy thời gian nhiều lần khi thời gian di chuyển trên dòng thời gian backtest (điều này sẽ không kích hoạt một bước nhảy đến thời điểm dữ liệu thị trường tiếp theo). Các cuộc gọi lặp đi lặp lại đến một trong các chức năng trên sẽ đẩy thời gian backtest để di chuyển trên dòng thời gian backtest (nhảy đến thời điểm dữ liệu thị trường tiếp theo). Khi mức thị trường thực được sử dụng để backtest, không nên chọn thời gian trước đó. Có thể không có dữ liệu cấp thị trường thực trong khoảng thời gian sớm.

Các backtest thị trường thực hiện hỗ trợ:

  • Binance
  • OKX (OKX Spot)
  • HuobiDM (Huobi Future)

Phương pháp kiểm tra ngược tối ưu hóa tham số hệ thống

Chức năng tối ưu hóa tham số của hệ thống backtest của nền tảng FMZ Quant Trading là thiết lập tối ưu hóa theo từng tùy chọn tối ưu hóa tham số trong quá trình backtest, và các tùy chọn được hiển thị như sau:

  • Giá trị tối thiểu: để giới hạn giá trị khởi động của các thông số.
  • Giá trị tối đa: để giới hạn giá trị tối đa của các thông số sau khi thay đổi từng bước.
  • Kích thước bước: số lượng biến thể gia tăng của các thông số.

Tạo các kết hợp tham số, và đi qua tất cả các kết hợp đó để backtest (tức là backtest mỗi sự kết hợp tham số một lần).sốloại có thể được tối ưu hóa trong hệ thống backtesting.

Ví dụ, đặt các tùy chọn tối ưu hóa tham số trên trang backtest:

img

Các phương thức tối ưu hóa tham số backtest:

img

Lưu cài đặt Backtest

Trong trang chỉnh sửa chiến lược, trong trang của Backtest (đặc biệt là hệ thống kiểm tra lại), bạn có thể đặt các tùy chọn như cấu hình kiểm tra lại và tham số chiến lược để kiểm tra lại chiến lược. Các cài đặt kiểm tra lại đề cập đến khoảng thời gian kiểm tra lại, nền tảng trao đổi, điểm trượt và phí dịch vụ vv; trong khi các tham số chiến lược được sử dụng để đặt các tùy chọn tham số cho chiến lược. Khi tất cả các cấu hình chiến lược được thiết lập, bạn có thể kiểm tra lại chiến lược theo cài đặt. Vậy làm thế nào để bạn lưu các cài đặt được cấu hình này để sử dụng trong trang kiểm tra lại tiếp theo (các tùy chọn được thiết lập trong khi trang làm mới sẽ được đặt lại)? Bạn có thể nhấp vào nút Save Settings trên trang kiểm tra lại chiến lược, và tất cả các cài đặt kiểm tra lại (bao gồm cả các cấu hình kiểm tra lại và cài đặt tham số) sẽ được ghi lại dưới dạng mã nguồn trong trang kiểm tra lại chiến lược. Khi mở trang kiểm tra lại chiến lược và chuyển sang trang cấu hình lại, thông tin cấu hình được ghi

img

LấyJavaScriptchiến lược như một ví dụ, và nhấp vào Save Backtest Settings to Source File:

img

Có một chút khác biệt về Save Backtest Settings to Source File giữaJavaScript, Python, cppMylanguage:

/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
'''backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
'''
/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

Mylanguage:

(*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
*)

Nguồn dữ liệu tùy chỉnh

Hệ thống sử dụngGETPhương pháp để yêu cầu một URL tùy chỉnh (URL có thể truy cập công khai) để lấy một nguồn dữ liệu bên ngoài cho backtest. Các tham số yêu cầu bổ sung là như sau:

Parameter Ý nghĩa Giải thích
Biểu tượng Tên biểu tượng như BTC_USD_OKCoin_EN
Eid Chuyển đổi như OKCoin_EN
Vòng Độ chính xác của giá chẳng hạn như 3, giá trong dữ liệu trả về phải được nhân với 1000 và tròn
Vòng quanh Độ chính xác về số lượng Ví dụ như 2, số tiền trong dữ liệu được trả về phải được nhân với 100 và làm tròn
Thời gian Khoảng thời gian thanh (mi-lít giây) như 60,000 chỉ ra thanh yêu cầu một phút
Độ sâu Mức độ sâu 1-20
Thương mại Có cần chia dữ liệu hay không đúng/sai
Từ Thời gian bắt đầu Unix timestamp
Để Thời kỳ kết thúc Unix timestamp

Lưu ý:

Round and V-Round are two parameters designed to avoid losing the precision of floating-point numbers during network transmission. The price data, trading volume and order amount, are all transmitted using integers.

Một ví dụ về dữ liệu khâu:

http://customserver:80/data?symbol=BTC_USD_OKCoin_EN&eid=OKCoin_EN&round=3&vround=3&period=900000&from=1564315200&to=1567267200

Định dạng được trả về phải là một trong hai định dạng sau (được hệ thống nhận ra tự động):

Kiểm tra ngược bình thường ở mức thanh

{
    "schema":["time","open","high","low","close","vol"],
    "data":[[1564315200000,9531300,9531300,9497060,9497060,787],[1564316100000,9495160,9495160,9474260,9489460,338]]
}

Dữ liệu backtest cấp độ tick (bao gồm thông tin độ sâu thị trường, một mảng có định dạng độ sâu là [giá, khối lượng]; có thể có nhiều mức độ độ sâu; yêu cầu đề cập đến thứ tự tăng giá và đề nghị đề cập đến thứ tự ngược giá.)

{
    "schema":["time","asks", "bids","trades","close","vol"],
    "data":[[1564315200000,[[9531300,10]], [[9531300,10]],[[1564315200000,0,9531300,10]],9497060,787]]
}

Mô tả

Vùng Mô tả
Kế hoạch Nó xác định các thuộc tính của các cột trong mảng dữ liệu, có độ nhạy chữ cái và chỉ giới hạn trong time, open, high, low, close, vol, asksbids
Dữ liệu Một mảng lưu trữ dữ liệu theo sơ đồ

Định dạng dữ liệu

Vùng Mô tả
yêu cầu/đề nghị [giá, khối lượng],...]
thương mại [thời gian, hướng đi, giá, khối lượng,...]

Cung cấp dữ liệu tỷ lệ tài trợ:

Ví dụ, khi kiểm tra lại Binance Futures, cần có dữ liệu bổ sung về tỷ lệ tài trợ, cần được cung cấp bởi nguồn dữ liệu tùy chỉnh. Ví dụ, cấu trúc dữ liệu của tỷ lệ tài trợ được yêu cầu trong quá trình kiểm tra lại Binance Futures được hiển thị như sau:

{
  "detail": {},
  "symbol": "futures_binance.eth_usdt.funding",
  "schema": ["time", "open", "high", "low", "close", "vol"],
  "data": [
    [1582876800000, 25289, 25289, 25289, 25289, 0],
    [1582905600000, 30522, 30522, 30522, 30522, 0],
    [1582934400000, 40998, 40998, 40998, 40998, 0],
        ...
    [1626652800000, 198, 198, 198, 198, 0],
    [1626681600000, 691, 691, 691, 691, 0],                  // The adjacent periodic interval is 8 hours
    [1626710400000, 310, 310, 310, 310, 0],                  // The funding rate of Binance updates every 8 hours, and why the data of the funding rate turns out to be 310?
    [1626739200000, 310, 310, 310, 310, 0],                  // Like the bars data, to avoid losing the precision of floating-point numbers during network transmission, the data uses integer, so the data needs to be processed according to round parameter; the data, returned to the backtest system after processing, is 310 
    [1626768000000, -41610, -41610, -41610, -41610, 0],      // The funding rate might be a negative value
    [1626796800000, -5125, -5125, -5125, -5125, 0],
        ...   
    [1627977600000, 10000, 10000, 10000, 10000, 0]
  ]
}

Một ví dụ về yêu cầu dữ liệu từ hệ thống backtest:

http://customserver:80/data?symbol=futures_binance.eth_usdt.funding&eid=Futures_Binance&round=8&vround=5&depth=20&trades=1&custom=0&period=3600000&from=1360771200&to=1628006400

Ví dụ về nguồn dữ liệu tùy chỉnh:

Xác định nguồn dữ liệu, URL:http://xxx.xx.x.xx:9090/dataTùy chỉnh máy chủ dữ liệu, viết bằng golang:

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

func Handle (w http.ResponseWriter, r *http.Request) {
    // e.g. set on backtest DataSourse: http://xxx.xx.x.xx:9090/data
    // r.URL: /data?depth=20&detail=true&eid=Binance&from=1566820800&period=900000&round=3&symbol=BTC_USDT_Binance&to=1569686400&trades=1&vround=5
    // response
    defer func() {
        // response data
        /* e.g. data
        {
            "schema":["time","open","high","low","close","vol"],
            "data":[
                [1564315200000,9531300,9531300,9497060,9497060,787],
                [1564316100000,9495160,9495160,9474260,9489460,338]
            ]
        }
        */
        ret := map[string]interface{}{
            "schema" : []string{"time","open","high","low","close","vol"},
            "data" : []interface{}{
                []int64{1564315200000,9531300,9531300,9497060,9497060,787},
                []int64{1564316100000,9495160,9495160,9474260,9489460,338},
            },
        }
        b, _ := json.Marshal(ret)
        w.Write(b)
    }()
}

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

Chiến lược thử nghiệm,JavaScriptví dụ:

/*backtest
start: 2019-07-28 00:00:00
end: 2019-07-29 00:00:00
period: 1m
platforms: [{"eid":"OKX","currency":"BTC_USDT","feeder":"http://120.24.2.20:9090/data"}]
*/

function main() {
    var ticker = exchange.GetTicker()
    var records = exchange.GetRecords()
    Log(ticker)
    Log(records)
}

Biểu đồ được vẽ bằng dữ liệu tùy chỉnh trong hệ thống backtest:

Chiến lược in thông tin:

Local Backtest Engine

FMZ Quant Trading nền tảng đã mở nguồn cho cácJavaScriptphiên bản vàPythonphiên bản của động cơ backtest cục bộ, hỗ trợ cài đặtThời gian đường K cơ bảntrong quá trình backtesting.

Chìa khóa phím tắt trang backtest

  • Chìa khóa tắt để chuyển đổi giữa trang chiến lược Editing và trang Backtesting

    Sử dụng chìa khóa.Ctrl +,để chuyển trở lại trang Backtest và trang Edit Strategy.Ctrl, nhấn phím,.

  • Chìa khóa tắt cho chiến lược tiết kiệm

    Sử dụng chìa khóa.Ctrl + sđể cứu chiến lược.

  • Chọn tắt để bắt đầu backtest chiến lược

    Sử dụng chìa khóa.Ctrl + bđể cho phép Start Backtest.

Mô tả mã

Chức năng nhập cảnh

Tên chức năng Mô tả
main() nó là một hàm nhập.
onexit() nó là một chức năng dọn dẹp khi ra khỏi bình thường, thời gian thực hiện tối đa của nó là 5 phút, có thể được để lại không được khai báo; nếu thời gian dừng xảy ra, mộtngắtlỗi sẽ được báo cáo.
onerror() nó là một chức năng thoát bất thường, thời gian thực thi tối đa của nó là 5 phút, có thể được để lại không được tuyên bố.Pythoncppkhông hỗ trợ chức năng này.
init() nó là một chức năng khởi tạo, chương trình chiến lược của nó sẽ được gọi tự động khi nó bắt đầu chạy, mà có thể được để lại undeclared.
  • Mô tả:
    1. Hệ thống backtest không hỗ trợ chức năngonerror().
    1. Nếu hàmonerror()được kích hoạt trong bot, chức năngonexit()sẽ không được kích hoạt.

onexit ((()

onexit(), xử lý công việc dọn dẹp, với thời gian thực hiện tối đa 5 phút, được thực hiện bởi người dùng.

function main(){
    Log("Start running, stop after 5 seconds, and execute onexit function!")
    Sleep(1000 * 5)
}

// onexit function implementation
function onexit(){
    var beginTime = new Date().getTime()
    while(true){
        var nowTime = new Date().getTime()
        Log("The program stops counting down..The cleaning starts and has passed:", (nowTime - beginTime) / 1000, "Seconds!")
        Sleep(1000)
    }
}
import time 
def main():
    Log("Start running, stop after 5 seconds, and execute onexit function!")
    Sleep(1000 * 5)

def onexit():
    beginTime = time.time() * 1000
    while True:
        ts = time.time() * 1000
        Log("The program stops counting down..The cleaning starts and has passed:", (ts - beginTime) / 1000, "Seconds!")
        Sleep(1000)
void main() {
    Log("Start running, stop after 5 seconds, and execute onexit function!");
    Sleep(1000 * 5);
}

void onexit() {
    auto beginTime = Unix() * 1000;
    while(true) {
        auto ts = Unix() * 1000;
        Log("The program stops counting down..The cleaning starts and has passed:", (ts - beginTime) / 1000, "Seconds!");
        Sleep(1000);
    }
}

init()

Người dùng thực hiện chức năng khởi tạoinit(), mà sẽ tự động thực hiện chức nănginit()ở đầu của chiến lược để hoàn thành nhiệm vụ khởi tạo.

function main(){
    Log("The first line of the code executed in the program!", "#FF0000")
    Log("Exit!")
}

// Initialization Function
function init(){     
    Log("Initialization!")
}
def main():
    Log("The first line of the code is executed!", "#FF0000")
    Log("Exit!")

def init():
    Log("Initialization!")
void main() {
    Log("The first line of the code is executed!", "#FF0000");
    Log("Exit!");
}

void init() {
    Log("Initialization!");
}

onerror()

Việc thực hiện chức năngonerror()sẽ được kích hoạt, khi một ngoại lệ xảy ra. chức năng này không hỗ trợ các chiến lược được viết trongPythoncpp.

function main() {
    var arr = []
    Log(arr[6].Close)
}

function onerror() {
    Log("error")
}
# not supported by python 
// not supported by C++ 

Khung chiến lược cổ điển

Trong các chiến lược được viết trongJavaScript, Pythoncpp, cácSleep()trong bot, nó được sử dụng để kiểm soát các khoảng thời gian thăm dò chiến lược, và cũng kiểm soát tần suất yêu cầu truy cập giao diện API của sàn giao dịch.

  • Các ví dụ cơ bản về các chiến lược tiền điện tử:

    function onTick(){
        //Write strategy logic here, and it will be called constantly, such as printing market information
        Log(exchange.GetTicker())
    }
    
    function main(){
        while(true){
            onTick()
            //The function "Sleep" is mainly used to control the polling frequency of cryptocurrency strategies to prevent accessing the exchange API interafce too frequently 
            Sleep(60000)
        }
    }
    
    def onTick():
        Log(exchange.GetTicker())
    
    def main():
        while True:
            onTick()
            Sleep(60000)
    
    void onTick() {
        Log(exchange.GetTicker());
    }
    
    void main() {
        while(true) {
            onTick();
            Sleep(60000);
        }
    }
    

    Hãy lấy ví dụ đơn giản nhất, nếu tôi muốn đặt một lệnh mua với giá 100 và số lượng 1 trên sàn giao dịch mỗi giây, tôi có thể viết nó như thế này:

    function onTick(){
        // It is just an example; for all the assets will be used to place orders fast during backtest or in the bot, do not implement the example in the bot
        exchange. Buy(100, 1)
    }
    
    function main(){
        while(true){
            onTick()
            // The pause period can be customized in millisecond (1 second = 1000 milliseconds)
            Sleep(1000)
        }
    }
    
    def onTick():
        exchange.Buy(100, 1)
    
    def main():
        while True:
            onTick()
            Sleep(1000)
    
    void onTick() {
        exchange.Buy(100, 1);
    }
    
    void main() {
        while(true) {
            onTick();
            Sleep(1000);
        }
    }
    

Thư viện mẫu

Cácthư viện mẫulà một mô-đun mã tái sử dụng trong nền tảng FMZ Quant Trading, hoạt động như một danh mục mã chiến lược giao dịch.Thư viện mẫu, một mẫu được thêm vào trang Chiến lược của tài khoản hiện đã đăng nhập vào nền tảng FMZ Quant Trading. Sau khi tạo, không còn có thể sửa đổi danh mục thành một chiến lược bình thường.

Thư viện mẫuJavaScript:

img

Thư viện mẫuPython:

img

Thư viện mẫucpp:

img

  • Chức năng xuất của Template library Chức năng xuất là một hàm giao diện của Template library, và nó có thể được gọi bằng chiến lược tham chiếu đến Template library.

    /*
    -- This method is called directly with $.Test() after the strategy refers to the template
    -- The "main" function will not be triggered in the strategy, and it is only used as the entry point for template debugging
    */
    $.Test = function() {
        Log('Test')
    }
    
    function main() {
        $.Test()
    }
    
    def Test():
        Log("template call")
    
    # Export "Test" function; the main strategy can be called by ext.Test()
    ext.Test = Test 
    
    // The strategy refers to the template and calls this method directly with ext::Test()
    void Test() {
        Log("template call");
    }
    
  • Bộ thư viện mẫu tham số Thư viện mẫu cũng có thể đặt các thông số giao diện của riêng mình, được sử dụng dưới dạng biến toàn cầu trong mã của Thư viện mẫu.

    Template library cài đặt tham số:

    img

    Mã thư viện mẫu:

    $.SetParam1 = function(p1) {
        param1 = p1
    }
    
    $.GetParam1 = function() {
        Log("param1:", param1)
        return param1
    }
    
    def SetParam1(p1):
        global param1
        param1 = p1
    
    def GetParam1():
        Log("param1:", param1)
        return param1
    
    ext.SetParam1 = SetParam1
    ext.GetParam1 = GetParam1
    
    void SetParam1(float p1) {
        param1 = p1;
    }
    
    float GetParam1() {
        Log("param1:", param1);
        return param1;
    }
    

    Xem mã chiến lược trongThư viện mẫuví dụ nêu trên:

    function main () {
        Log("call $.GetParam1:", $.GetParam1())
        Log("call $.SetParam1:", "#FF0000")
        $.SetParam1(20)
        Log("call $.GetParam1:", $.GetParam1())
    }
    
    def main():
        Log("call ext.GetParam1:", ext.GetParam1())
        Log("call ext.SetParam1:", "#FF0000")
        ext.SetParam1(20)
        Log("call ext.GetParam1:", ext.GetParam1())
    
    void main() {
        Log("call ext::GetParam1:", ext::GetParam1());
        Log("call ext::SetParam1:", "#FF0000");
        ext::SetParam1(20);
        Log("call ext::GetParam1:", ext::GetParam1());
    }
    

    img

  • Lời trích dẫn Thư viện mẫu

    Sau khi kiểm tra tham chiếu trong cột mẫu của trang chỉnh sửa chiến lược, lưu chiến lược.

    img

Cấu trúc tích hợp

Các biến số toàn cầu

Chuyển đổi

ExchangeMột đối tượng trao đổi được xem là một đối tượng trao đổi. Theo mặc định, nó được xem là đối tượng trao đổi đầu tiên được thêm vào các tham số chiến lược. Tất cả sự tương tác dữ liệu với trao đổi được thực hiện thông qua các chức năng trong đối tượng này.

  • Thêm các đối tượng trao đổi trong Backtest

  • Thêm đối tượng trao đổi trên trang Bot

Các đối tượng trao đổi bổ sung tương ứng vớiexchangecác đối tượng trong mã:

function main() {
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel())
}
def main():
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel())
void main() {
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel());
}
Chuyển đổi

Nó có thể được hiểu là một mảng lưu trữ tất cả các đối tượng trao đổi nhưexchangecác đối tượng trao đổi, có thể chứa nhiều đối tượng trao đổi;exchanges[0]exchange.

Các đối tượng trao đổi bổ sung tương ứng vớiexchanges[0], exchanges[1], exchanges[2]... và vân vân trong mã chiến lược.

function main() {
    for(var i = 0; i < exchanges.length; i++) {
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel())
    }
}
def main():
    for i in range(len(exchanges)):
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel())
void main() {
    for(int i = 0; i < exchanges.size(); i++) {
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel());
    }
}
Tình trạng đơn đặt hàng

Thuộc tínhStatustrongOrder structure.

Tên liên tục Định nghĩa Giá trị
ORDER_STATE_PENDING chưa hoàn thành 0
Order_state_closed kết thúc 1
ORDER_STATE_CANCELED hủy bỏ 2
ORDER_STATE_UNKNOWN trạng thái không rõ (các trạng thái khác) 3

ORDER_STATE_UNKNOWNtrạng thái có thể gọiexchange.GetRawJSON()để có được thông tin trạng thái đặt hàng ban đầu, truy vấn tệp trao đổi và xem mô tả cụ thể. Các tên hằng số trong biểu mẫu có thể được sử dụng trực tiếp trong mã chiến lược để so sánh với thuộc tínhStatustrongOrderIn những tên hằng số sẽ hiển thị các con số liên tục.tên liên tụcvà tương ứng của họgiá trị, và các tên hằng số khác dưới đây hoạt động theo cùng một cách, vì vậy sẽ không có mô tả chi tiết hơn về chúng.

Loại giao dịch lệnh

Thuộc tínhTypetrongOrder structure.

Tên liên tục Định nghĩa Giá trị
ORDER_TYPE_BUY Lệnh mua 0
ORDER_TYPE_SELL Đơn đặt hàng 1
Loại vị trí

Thuộc tínhTypetrongPosition structure.

Tên liên tục Định nghĩa Mô tả Ứng dụng Giá trị
PD_LONG Vị trí dài Sử dụng hợp đồng tương lai tiền điện tửexchange.SetDirection("closebuy")để thiết lập hướng đóng vị trí, và đóng loại vị trí này Tiền tương lai tiền điện tử 0
PD_SHORT Vị trí ngắn Sử dụng hợp đồng tương lai tiền điện tửexchange.SetDirection("closesell")để thiết lập hướng đóng vị trí, và đóng loại vị trí này Tiền tương lai tiền điện tử 1
Hướng dẫn mở và đóng các vị trí tương lai

Thuộc tínhOffsettrongOrder structure.

Tên liên tục Định nghĩa Giá trị
ORDER_OFFSET_OPEN Đơn đặt hàng vị trí mở 0
ORDER_OFFSET_CLOSE Các lệnh đóng lệnh 1
Các thông số chiến lược

Trong mã chiến lược giao dịch, các tham số chiến lược được thiết lập trên giao diện chiến lược được phản ánh dưới dạng các biến toàn cầu.JavaScriptngôn ngữ có thể truy cập trực tiếp các giá trị tham số được thiết lập hoặc sửa đổi trên giao diện chiến lược; trong khi trong các chức năng củaPythonchiến lược, từ khóaglobalcần thiết để sửa đổi các biến tổng thể trong chiến lược.

Loại tham số:

img

Chất biến Mô tả Nhận xét Loại Giá trị mặc định Mô tả
Số Loại số Nhận xét Số 1 C ++ chiến lược là một kiểu dấu phẩy nổi
Dòng chuỗi Nhận xét Dòng chữ (dòng chữ) Xin chào FMZ. Giá trị mặc định không cần phải được trích dẫn.
Hộp ComboBox Nhận xét ComboBox (được chọn) 1|2|3 Bản thân biến combox là một giá trị số, đại diện cho chỉ số của cột được chọn bởi điều khiển Combobox. Giá trị của ComboBox đầu tiên là 1, và những người khác là 0, v.v.
Bool Tùy chọn kiểm tra Nhận xét Boolean (true/false) đúng Nếu được kiểm tra, biến bool là đúng; nếu không được kiểm tra, biến bool là sai
SecretString Dòng mã hóa Nhận xét Dòng mã hóa (dòng) Mật khẩu Với cùng một cách sử dụng như một chuỗi, chuỗi được mã hóa sẽ được gửi bằng mã hóa và sẽ không được truyền qua văn bản đơn giản
  • Các tham số giao diện được đặt trong phần tham số chiến lược bên dưới phần chỉnh sửa mã của trang chỉnh sửa chiến lược.
  • Các thông số giao diện tồn tại dưới dạng biến toàn cầu trong mã chiến lược, nghĩa là các thông số giao diện có thể được sửa đổi trong mã.
  • Các tên biến của các thông số giao diện trong mã chiến lược (được nhìn thấy trong hình thức trên):number, string, combox, bool, secretString.
  • Tùy chọn mô tả: tên của các thông số giao diện trên giao diện chiến lược.
  • Tùy chọn nhận xét: mô tả chi tiết về các thông số giao diện; mô tả sẽ được hiển thị khi chuột di chuyển qua các thông số giao diện.
  • Tùy chọn loại: loại của các thông số giao diện.
  • Tùy chọn giá trị mặc định: các giá trị mặc định của các thông số giao diện.

Cài đặt tùy thuộc tham số: Một tham số có thể được thiết lập để cho phép một tham số khác được hiển thị và ẩn dựa trên sự lựa chọn của các tham số.numberA, đó là một loại số.numberAđược hiển thị hoặc ẩn dựa trên liệu tham sốisShowAChúng ta cần thiết lập biếnnumberAvề các thông số giao diện như:numberA@isShowA.

img

Bằng cách này, nếu tham sốisShowAkhông được kiểm tra, tham sốnumberAĐối với các tham số của loại điều khiển ComboBox, phần phụ thuộc của các tham số là để đánh giá xem giá trị tham số bằnggiá trị chỉ sốTrong cùng một cách, lấy tham sốisShowAKhi đặt các biến trong các thông số, viết:numberA@combox==2. Các thông sốnumberAsẽ hiển thị hoặc ẩn, dựa trên xem các tham sốcomboxsẽ được kiểm tra là tùy chọn thứ ba (nơi chỉ số 0 tương ứng với tùy chọn đầu tiên, chỉ số 1 tương ứng với lựa chọn thứ hai và chỉ số 2 tương ứng với lựa chọn thứ ba).

Các tham số giao diện chiến lược, điều khiển tương tác và chức năng nhóm tham số trên Template: Chỉ cần thêm(?First group)ở đầu mô tả của tham số bắt đầu nhóm, như được hiển thị trong hình sau:

img

Khi bạn đang sử dụng chiến lược, các tham số được hiển thị trong các nhóm:

img

Lưu giá trị mặc định của tham số: Các tham số chiến lược được hiển thị trong hình. Trong quá trình backtest, nếu bạn muốn lưu các giá trị mặc định của các tham số chiến lược, bạn có thể nhấp vàoSave settingsnút sau khi sửa đổi các thông số chiến lược.

img

img

Bạn có thể lưu các thiết lập tham số chiến lược dưới dạng mã:

/*backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
*/
'''backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
'''
/*backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
*/

Cấu trúc dữ liệu

Một số chức năng sẽ đi kèm với bản gốcJSONdữ liệu được yêu cầu trong cuộc gọi.JSONdữ liệu được lưu trữ trong thuộc tínhInfocủa đối tượng được trả về. Vì backtest không phải là để truy cập vào một giao diện nền tảng, dữ liệu được trả về trong backtest không có thuộc tínhInfoSau đây là mô tả các thuộc tính chính của mỗi cấu trúc dữ liệu.

Thương mại

Nhận tất cả lịch sử giao dịch (không phải chính nó), được trả về bởi hàmexchange.GetTrades().

{
    Id      : 9585306,          // Trading record ID; if the exchange interface does not provide order ID, use the timestamp to fill in 
    Time    : 1567736576000,    // Time (Unix timestamp milliseconds)
    Price   : 1000,             // Price
    Amount  : 1,                // Volume
    Type    : 0                 // Order Type; refer to the order type in the constants; 0 is ORDER_TYPE_BUY, meaning the value of ORDER_TYPE_BUY is 0
}
Chú cỏ

Giá báo giá thị trường được trả về bởi hàmexchange.GetTicker().

{
    Info    : {...},             // After requesting the platform interface, this attribute is not available in the raw data that the exchange interface responds to, during the backtest
    High    : 1000,              // Highest price; if the platform interface does not provide the 24-hour highest price, use sell price 1 to fill in 
    Low     : 500,               // Lowest price; if the platform interface does not provide the 24-hour lowest price, use buy price 1 to fill in 
    Sell    : 900,               // Sell price 1
    Buy     : 899,               // Buy price 1 
    Last    : 900,               // Last executed price
    Volume  : 10000000,          // Recent trading volume; in principle, the unit of spot trading volume is base currency, and the unit of futures trading volume is contract quantity. If the platform interface does not provide this kind of data, use the existing data of the platform interface to fill in; for instance, it might be a trading volume in the unit of quote currency  
    Time    : 1567736576000      // Millisecond-level timestamp
}
Ghi lại

Tiêu chuẩnOHLCcấu trúc được sử dụng để vẽ đường K và tính toán và phân tích chỉ số quy trình.exchange.GetRecords()trả về mảng cấu trúc.Recordcấu trúc đại diện cho một thanh đường k, cụ thể là một đường kBAR.TimetrongRecordlà thời gian bắt đầu của giai đoạn thanh K-line.

{
    Time    : 1567736576000,     // A timestamp, accurate to millisecond, in the same format as the result obtained by Javascript's newDate().GetTime()
    Open    : 1000,              // Open price
    High    : 1500,              // Highest price
    Low     : 900,               // Lowest price
    Close   : 1200,              // Close price 
    Volume  : 1000000            // Trading volume; in principle, the unit of spot trading volume is base currency, and the unit of futures trading volume is contract quantity. If the platform interface does not provide this kind of data, use the existing data of the platform interface to fill in; for instance, it might be a trading volume in the unit of quote currency
}
Trật tự

Cấu trúc thứ tự có thể được trả về bởi các hàm, bao gồmexchange.GetOrder()exchange.GetOrders(). Chức năngexchange.GetOrders()trả về mảng hoặc một mảng trống của cấu trúc (nếu không cóĐơn đặt hàng chưa hoàn thành hiện tại, trở lại[], cụ thể là một mảng trống).

{
    Info        : {...},         // After requesting the platform interface, this attribute is not available in the raw data that the exchange interface responds to, during the backtest
    Id          : 123456,        // Unique ide