[TOC]
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
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
Mylanguage
vàBlockly Visualization
để viết và thiết kế các chiến lược.
Nó hỗ trợTypeScript
ngôn ngữ, vẫn đặt nó vàoJavaScript
chiế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 sangTypeScript
Nền tảng sẽ nhận ra mã nhưTypeScript
tự độ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:
TypeScript
chứ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ã.TypeScript
hệ 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.TypeScript
, 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.TypeScript
cung 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).
Blockly
Hướng dẫn hiển thị:
Thiết lập
Python
phiên dịch được sử dụng bởiPython
chươ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ả haiPython2vàPython3cài đặt, bạn có thể thiết lậpPython
phiê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
và#!python2
Và 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ộtSqlite
tệp cơ sở dữ liệu vớidb3
, có thể được chỉnh sửa trực tiếp bởiSqlite
phần mềm quản lý. Đối với một tập tin với phần mở rộngdb3
Trong cơ sở dữ liệu bot thực sự, tên tệp là ID bot.
Các giao thức được hỗ trợ
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.Python
gó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ủaPython
mã:
Bởi vìPython
là 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ủaPython
mã chiến lược:
Theo mặc định,Python
mã 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 ở đầuPython
chiế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ê.Python
Các phiên bản hỗ trợ mã hóa mã chiến lược là như sau:Python 2.7
, Python 3.5
vàPython 3.6
.
#!python
như 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óaencrypt
Nếu bạn không chỉ định phiên bản củaPython
, thêm#!,encrypt
directly. #!python,encrypt
Hoặc
#!encrypt
#!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óaPython
mã 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")
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
RSA KEY
phươ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.PKCS#8
, có rất nhiều công cụ có sẵn để tạo ra, chẳng hạn nhưopenssl
.RSA KEY
trê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.txt
file, hoặc trong các đường dẫn khác trong thư mục của chương trình docker.RSA KEY
được tạo bởi trao đổi trong hộp chỉnh sửa của cấu hìnhAccess Key
.txt
tệ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 Key
Ví 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.txt
Nế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 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ếvà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 ratick
Cả 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ủaJavaScriptvàC++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.tick
Mỗ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ậpticks
Phươ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
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_USD vàLTC_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_BTC vàLTC_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_BTC vàLTC_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_BTC vàLTC_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_USD vàETH_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.SetContractType Các mã hợp đồng được hỗ trợ bao gồm:this_week , next_week , quarter vàswap |
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_USD vàETH_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.SetContractType Các mã hợp đồng được hỗ trợ bao gồm:this_week , next_week , quarter vàswap . |
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_USDT vàETH_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_USD vàETH_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.
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.tick
Thông tin chi tiết, vui lòng tham khảo:FMZ Quant Simulation Level Backtest Mechanism Mô 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êntick
sử dụng mức thị trường thực để backtest gần hơn với thực tế.tick
dữ 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
,GetTrades
Các chức năng để có được dữ liệu thị trường phát lại.GetTicker
,GetTrades
, GetDepth
vàGetRecords
sẽ 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ợ:
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:
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:
Các phương thức tối ưu hóa tham số backtest:
Trong trang chỉnh sửa chiến lược, trong trang của
LấyJavaScript
chiến lược như một ví dụ, và nhấp vào
Có một chút khác biệt về JavaScript
, Python
, cpp
vàMylanguage
:
/*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"}]
*)
Hệ thống sử dụngGET
Phươ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 |
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/data
Tù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,JavaScript
ví 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:
FMZ Quant Trading nền tảng đã mở nguồn cho cácJavaScript
phiên bản vàPython
phiê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 tắt để chuyển đổi giữa trang chiến lược
Sử dụng chìa khóa.Ctrl +,
để chuyển trở lại trang 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
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ố.Python vàcpp khô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. |
onerror()
.onerror()
được kích hoạt trong bot, chức năngonexit()
sẽ không được kích hoạt.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);
}
}
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!");
}
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 trongPython
vàcpp
.
function main() {
var arr = []
Log(arr[6].Close)
}
function onerror() {
Log("error")
}
# not supported by python
// not supported by C++
Trong các chiến lược được viết trongJavaScript
, Python
vàcpp
, 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);
}
}
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
JavaScript
:
Python
:
cpp
:
Chức năng xuất của
/*
-- 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");
}
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());
}
Lời trích dẫn
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.
Exchange
Mộ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
Thêm đối tượng trao đổi trên trang
Các đối tượng trao đổi bổ sung tương ứng vớiexchange
cá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());
}
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ưexchange
các đối tượng trao đổi, có thể chứa nhiều đối tượng trao đổi;exchanges[0]
là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());
}
}
Thuộc tínhStatus
trongOrder
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ínhStatus
trongOrder
In 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.
Thuộc tínhType
trongOrder
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 |
Thuộc tínhType
trongPosition
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 |
Thuộc tínhOffset
trongOrder
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 |
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.JavaScript
ngô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ủaPython
chiến lược, từ khóaglobal
cần thiết để sửa đổi các biến tổng thể trong chiến lược.
Loại tham số:
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 |
number
, string
, combox
, bool
, secretString
.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ốisShowA
Chúng ta cần thiết lập biếnnumberA
về các thông số giao diện như:numberA@isShowA
.
Bằng cách này, nếu tham sốisShowA
khô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ốisShowA
Khi đặt các biến trong các thông số, viết:numberA@combox==2
. Các thông sốnumberA
sẽ hiển thị hoặc ẩn, dựa trên xem các tham sốcombox
sẽ đượ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 (?First group)
ở đầu mô tả của tham số bắt đầu nhóm, như được hiển thị trong hình sau:
Khi bạn đang sử dụng chiến lược, các tham số được hiển thị trong các nhóm:
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 settings
nút sau khi sửa đổi các thông số chiến lược.
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]]
*/
Một số chức năng sẽ đi kèm với bản gốcJSON
dữ liệu được yêu cầu trong cuộc gọi.JSON
dữ liệu được lưu trữ trong thuộc tínhInfo
củ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ínhInfo
Sau đây là mô tả các thuộc tính chính của mỗi cấu trúc dữ liệu.
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
}
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
}
Tiêu chuẩnOHLC
cấ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.Record
cấu trúc đại diện cho một thanh đường k, cụ thể là một đường kBAR
.Time
trongRecord
là 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
}
Cấu trúc thứ tự có thể được trả về bởi các hàm, bao gồmexchange.GetOrder()
và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