[TOC]
Sau 9 năm lặp lại kỹ thuật, nền tảng giao dịch lượng tử FMZ đã được xây dựng lại nhiều lần, mặc dù với tư cách là người dùng chúng tôi có thể đã không nhận thấy nó. Trong hai năm qua, nền tảng đã thực hiện rất nhiều tối ưu hóa và nâng cấp về trải nghiệm người dùng, bao gồm nâng cấp toàn diện giao diện UI, làm phong phú các công cụ giao dịch định lượng thường được sử dụng và thêm hỗ trợ dữ liệu kiểm tra lại.
Để thiết kế chiến lược thuận tiện hơn, logic giao dịch rõ ràng hơn và dễ dàng hơn cho người mới bắt đầu, nền tảng đã nâng cấp giao diện API được sử dụng bởi chiến lược. Dockers sử dụng phiên bản mới nhất có thể kích hoạt các tính năng mới này. Nền tảng vẫn tương thích với các cuộc gọi giao diện cũ ở mức độ lớn nhất. Thông tin về các tính năng mới của giao diện API đã được cập nhật vào tài liệu API của nền tảng giao dịch FMZ Quant:
Hướng dẫn cú pháp:https://www.fmz.com/syntax-guideHướng dẫn người dùng:https://www.fmz.com/user-guide
Vì vậy, chúng ta hãy nhanh chóng xem xét các giao diện nào đã được nâng cấp và những thay đổi cần thiết để sử dụng các chiến lược cũ để làm cho chúng tương thích với API hiện tại.
Để thiết kế các chiến lược đa sản phẩm và các chiến lược giám sát thị trường đầy đủ, giao diện thị trường tổng hợp là điều cần thiết. Để làm cho chiến lược dễ dàng hơn để phát triển và tránh tái phát minh các sự kiện, nền tảng giao dịch FMZ Quant kết hợp loại API trao đổi này.
Nếu sàn giao dịch không có giao diện này (các sàn giao dịch cá nhân), khi gọiexchange.GetTickers()
, một thông báo lỗi được hiển thị: Không được hỗ trợ.
Chức năng này không có bất kỳ thông số và nó sẽ trả về dữ liệu thị trường thời gian thực của tất cả các loại trong giao diện thị trường tổng hợp của sàn giao dịch.
exchange.GetTickers()
là phiên bản yêu cầu đầy đủ tính năng củaexchange.GetTicker()
chức năng (xem cẩn thận, sự khác biệt giữa hai tên chức năng này chỉ là đơn và số nhiều).
Chúng tôi sử dụng môi trường mô phỏng điểm OKX để thử nghiệm:
function main() {
exchange.IO("simulate", true)
var tickers = exchange.GetTickers()
if (!tickers) {
throw "tickers error"
}
var tbl = {type: "table", title: "test tickers", cols: ["Symbol", "High", "Open", "Low", "Last", "Buy", "Sell", "Time", "Volume"], rows: []}
for (var i in tickers) {
var ticker = tickers[i]
tbl.rows.push([ticker.Symbol, ticker.High, ticker.Open, ticker.Low, ticker.Last, ticker.Buy, ticker.Sell, ticker.Time, ticker.Volume])
}
LogStatus("`" + JSON.stringify(tbl) + "`")
return tickers.length
}
Những người mới được thêm vàoexchange.CreateOrder()
chức năng là trọng tâm của nâng cấp này.exchange.CreateOrder()
là để chỉ định loại và hướng của lệnh trong các tham số chức năng trực tiếp. theo cách này, nó không còn phụ thuộc vào cặp giao dịch hiện tại, mã hợp đồng, hướng giao dịch và các cài đặt khác của hệ thống.
Trong các kịch bản đặt lệnh giao dịch đa loài và các kịch bản đồng thời, sự phức tạp của thiết kế được giảm đáng kể.exchange.CreateOrder()
chức năng làsymbol
, side
, price
, amount
.
Kiểm tra sử dụng môi trường mô phỏng tương lai OKX:
function main() {
exchange.IO("simulate", true)
var id1 = exchange.CreateOrder("ETH_USDT.swap", "buy", 3300, 1)
var id2 = exchange.CreateOrder("BTC_USDC.swap", "closebuy", 70000, 1)
var id3 = exchange.CreateOrder("LTC_USDT.swap", "sell", 110, 1)
Log("id1:", id1, ", id2:", id2, ", id3:", id3)
}
Bằng cách này, chỉ có baexchange.CreateOrder()
Các cuộc gọi hàm được sử dụng để đặt ba lệnh tương lai của các loại và hướng khác nhau.
Những người mới được thêm vàoexchange.GetHistoryOrders()
chức năng được sử dụng để có được các lệnh giao dịch lịch sử của một số nhất định. chức năng cũng đòi hỏi sự hỗ trợ của giao diện trao đổi.
Để truy vấn các đơn đặt hàng lịch sử, các giao diện được thực hiện bởi các sàn giao dịch khác nhau rất khác nhau:
Mô tả chức năng chi tiết không được lặp lại ở đây, bạn có thể tham khảo hướng dẫn cú pháp trong tài liệu API:
https://www.fmz.com/syntax-guide#fun_exchange.gethistoryorders
Kiểm tra bằng môi trường giao dịch Binance:
function main() {
var orders = exchange.GetHistoryOrders("ETH_USDT")
// Write to chart
var tbl = {type: "table", title: "test GetHistoryOrders", cols: ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []}
for (var order of orders) {
tbl.rows.push([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType])
}
LogStatus("orders.length:", orders.length, "\n", "`" + JSON.stringify(tbl) + "`")
}
Phiên bản cũ của chức năng thu thập dữ liệu vị trí làexchange.GetPosition()
. Bản nâng cấp này thêm một chức năng mua lại vị trí mới để phù hợp hơn với ngữ nghĩa đặt tên chức năng:exchange.GetPositions()
Đồng thời, nó vẫn tương thích / nâng cấp với chức năng GetPosition.
Cácexchange.GetPositions()
hàm có ba hình thức gọi:
function main() {
exchange.IO("simulate", true)
exchange.SetCurrency("BTC_USDT")
exchange.SetContractType("swap")
var p1 = exchange.GetPositions()
var p2 = exchange.GetPositions("")
var tbls = []
for (var positions of [p1, p2]) {
var tbl = {type: "table", title: "test GetPosition/GetPositions", cols: ["Symbol", "Amount", "Price", "FrozenAmount", "Type", "Profit", "Margin", "ContractType", "MarginLevel"], rows: []}
for (var p of positions) {
tbl.rows.push([p.Symbol, p.Amount, p.Price, p.FrozenAmount, p.Type, p.Profit, p.Margin, p.ContractType, p.MarginLevel])
}
tbls.push(tbl)
}
LogStatus("`" + JSON.stringify(tbls) + "`")
}
Khi tham số được chuyển sangexchange.GetPositions()
chức năng làETH_USDT.swap
, dữ liệu vị trí của hợp đồng vĩnh viễn dựa trên U của ETH
Khi tham số được chuyển sangexchange.GetPositions()
chức năng là một chuỗi trống
Cải tiến chính của chức năng thị trườngexchange.GetTicker()
Điều này cho phép chức năng yêu cầu dữ liệu thị trường trực tiếp theo thông tin sản phẩm được chỉ định bởi tham số mà không cần cặp giao dịch và mã hợp đồng hiện tại. Nó đơn giản hóa quá trình viết mã. Đồng thời, nó vẫn tương thích với phương pháp gọi mà không cần thông qua các tham số, và tương thích với chiến lược nền tảng cũ ở mức độ lớn nhất.
Các thông sốsymbol
có các định dạng khác nhau cho giao dịch tức thời/tương lai đối với đối tượng trao đổiexchange
:
AAA_BBB
, AAA đại diện cho baseCurrency, tức là tiền tệ giao dịch, và BBB đại diện cho quoteCurrency, tức là tiền tệ định giá.
Ví dụ: cặp giao dịch giao ngay BTC_USDT.AAA_BBB.XXX
, AAA đại diện cho baseCurrency, tức là tiền tệ giao dịch, BBB đại diện cho quoteCurrency, tức là tiền tệ định giá, và XXX đại diện cho mã hợp đồng, chẳng hạn như trao đổi hợp đồng vĩnh cửu.
Ví dụ: BTC_USDT.swap, hợp đồng vĩnh viễn dựa trên U của BTCvar symbols = ["BTC_USDT.swap", "BTC_USDT.quarter", "BTC_USD.swap", "BTC_USD.next_quarter", "ETH_USDT.swap"]
function main() {
exchange.SetCurrency("ETH_USD")
exchange.SetContractType("swap")
var arr = []
var t = exchange.GetTicker()
arr.push(t)
for (var symbol of symbols) {
var ticker = exchange.GetTicker(symbol)
arr.push(ticker)
}
var tbl = {type: "table", title: "test GetTicker", cols: ["Symbol", "High", "Open", "Low", "Last", "Buy", "Sell", "Time", "Volume"], rows: []}
for (var ticker of arr) {
tbl.rows.push([ticker.Symbol, ticker.High, ticker.Open, ticker.Low, ticker.Last, ticker.Buy, ticker.Sell, ticker.Time, ticker.Volume])
}
LogStatus("`" + JSON.stringify(tbl) + "`")
return arr
}
Yêu cầu một lô dữ liệu thị trường cho một biểu tượng cụ thể đã trở nên đơn giản hơn nhiều.
Tương tự như chức năng GetTicker,exchange.GetDepth()
Điều này cho phép chúng ta chỉ định trực tiếp biểu tượng khi yêu cầu dữ liệu độ sâu.
Kiểm tra bằng môi trường Binance Futures:
function main() {
exchange.SetCurrency("LTC_USD")
exchange.SetContractType("swap")
Log(exchange.GetDepth())
Log(exchange.GetDepth("ETH_USDT.quarter"))
Log(exchange.GetDepth("BTC_USD.swap"))
}
Tương tự như chức năng GetTicker,exchange.GetTrades()
Điều này cho phép chúng ta chỉ định biểu tượng trực tiếp khi yêu cầu dữ liệu giao dịch thị trường.
Kiểm tra bằng môi trường Binance Futures:
function main() {
var arr = []
var arrR = []
var symbols = ["LTC_USDT.swap", "ETH_USDT.quarter", "BTC_USD.swap"]
for (var symbol of symbols) {
var r = exchange.Go("GetTrades", symbol)
arrR.push(r)
}
for (var r of arrR) {
arr.push(r.wait())
}
var tbls = []
for (var i = 0; i < arr.length; i++) {
var trades = arr[i]
var symbol = symbols[i]
var tbl = {type: "table", title: symbol, cols: ["Time", "Amount", "Price", "Type", "Id"], rows: []}
for (var trade of trades) {
tbl.rows.push([trade.Time, trade.Amount, trade.Price, trade.Type, trade.Id])
}
tbls.push(tbl)
}
LogStatus("`" + JSON.stringify(tbls) + "`")
}
Nâng cấp này cũng tương thích với các tham số biểu tượng được chỉ định bởiexchange.Go()
chức năng khi gọi giao diện API nền tảng đồng thời.
Chức năng GetRecords đã được điều chỉnh rất nhiều lần này. Ngoài việc hỗ trợ tham số ký hiệu để chỉ định trực tiếp thông tin loại dữ liệu đường K được yêu cầu, tham số thời gian ban đầu được giữ lại để chỉ định thời gian đường K, và một tham số giới hạn được thêm để chỉ định chiều dài đường K dự kiến khi yêu cầu. Đồng thời, nó cũng tương thích với phiên bản cũ của chức năng GetRecords chỉ đi qua trong tham số thời gian.
Phương pháp gọi củaexchange.GetRecords()
chức năng là:
Kiểm tra bằng môi trường Binance Futures:
function main() {
exchange.SetCurrency("ETH_USDT")
exchange.SetContractType("swap")
var r1 = exchange.GetRecords()
var r2 = exchange.GetRecords(60 * 60)
var r3 = exchange.GetRecords("BTC_USDT.swap")
var r4 = exchange.GetRecords("BTC_USDT.swap", 60)
var r5 = exchange.GetRecords("LTC_USDT.swap", 60, 3000)
Log("r1 time difference between adjacent bars:", r1[1].Time - r1[0].Time, "Milliseconds, Bar length:", r1.length)
Log("r2 time difference between adjacent bars:", r2[1].Time - r2[0].Time, "Milliseconds, Bar length:", r2.length)
Log("r3 time difference between adjacent bars:", r3[1].Time - r3[0].Time, "Milliseconds, Bar length:", r3.length)
Log("r4 time difference between adjacent bars:", r4[1].Time - r4[0].Time, "Milliseconds, Bar length:", r4.length)
Log("r5 time difference between adjacent bars:", r5[1].Time - r5[0].Time, "Milliseconds, Bar length:", r5.length)
}
Chức năng GetOrders cũng thêmsymbol
các tham số, có thể chỉ định loại lệnh chưa hoàn thành hiện tại (đặt hàng đang chờ) được truy vấn trực tiếp; nó cũng hỗ trợ truy vấn tất cả các lệnh đang chờ (bất kể loại); và tương thích với phương pháp gọi ban đầu.
Cácexchange.GetOrders()
hàm có thể được gọi theo những cách sau:
Kiểm tra sử dụng môi trường mô phỏng tương lai OKX:
function main() {
exchange.IO("simulate", true)
exchange.SetCurrency("BTC_USDT")
exchange.SetContractType("swap")
// Write to chart
var tbls = []
for (var symbol of ["null", "ETH_USDT.swap", ""]) {
var tbl = {type: "table", title: symbol, cols: ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []}
var orders = null
if (symbol == "null") {
orders = exchange.GetOrders()
} else {
orders = exchange.GetOrders(symbol)
}
for (var order of orders) {
tbl.rows.push([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType])
}
tbls.push(tbl)
}
LogStatus("`" + JSON.stringify(tbls) + "`")
}
Khi không có tham số nào được thông qua, yêu cầu mặc định là cho tất cả các lệnh đang chờ chưa hoàn tất của cặp giao dịch BTC_USDT hiện tại và hợp đồng chuyển đổi vĩnh viễn.
KhiETH_USDT.swap
Nếu tham số được chỉ định, tất cả các lệnh đang chờ của hợp đồng vĩnh viễn của cặp giao dịch ETH_USDT được yêu cầu.
Khi một chuỗi trống""
được thông qua, tất cả các lệnh chưa hoàn thành của tất cả các hợp đồng ký quỹ USDT được yêu cầu.
Nó vẫn tương thích với chức năng định vị vị trí cũ và cũng thêm tham số biểu tượng, có thể xác định thông tin loại của dữ liệu vị trí cụ thể được yêu cầu.
Việc sử dụng hàm này là chính xác giống nhưexchange.GetPositions()
.
Đối vớiexchange.IO("api", ...)
gọi hàm, tất cả các đối tượng trao đổi đã được nâng cấp để hỗ trợ chuyển trực tiếp các địa chỉ yêu cầu hoàn chỉnh.
Ví dụ, nếu bạn muốn gọi giao diện OKX:
// GEThttps://www.okx.com/api/v5/account/max-withdrawal ccy: BTC
Hỗ trợ ghi trực tiếp vào địa chỉ cơ sởhttps://www.okx.com
mà không cần phải thay đổi địa chỉ cơ sở trước và sau đó gọi chức năng IO.
Kiểm tra sử dụng môi trường mô phỏng tương lai OKX:
function main() {
exchange.IO("simulate", true)
return exchange.IO("api", "GET", "https://www.okx.com/api/v5/account/max-withdrawal", "ccy=BTC")
}
Nâng cấp này chủ yếu ảnh hưởng đến các thông sốid
củaexchange.GetOrder(id)
Các tham số id được thay đổi từ ban đầu giao dịch lệnh id đến một định dạng chuỗi chứa các sản phẩm giao dịch.
Tất cả các ID đơn hàng được đóng gói trên nền tảng FMZ đều ở định dạng này.
Ví dụ:
123456
Trước khi nâng cấp này, nếu bạn muốn gọi chức năng GetOrder, lệnh Id được chuyển vào là123456
.BTC-USDT
.
Lưu ý rằng điều này đề cập đến mã sản phẩm giao dịch được trao đổi, chứ không phải cặp giao dịch được xác định bởi nền tảng FMZ.Sau khi nâng cấp này, định dạng của ID tham số cần được truyền vàoexchange.GetOrder(id)
chức năng được điều chỉnh để:BTC-USDT,123456
.
Trước tiên, hãy để tôi giải thích tại sao thiết kế này được thực hiện: Bởi vì chức năng CreateOrder đã được nâng cấp để chỉ định loại lệnh trực tiếp (loại lệnh được đặt có thể khác với cặp giao dịch và mã hợp đồng được đặt hiện tại). Nếu ID lệnh được trả lại không chứa thông tin loại, thì ID lệnh này sẽ không thể sử dụng được. Bởi vì khi kiểm tra lệnh, chúng ta không biết loại (hợp đồng) lệnh là cho loại nào. Hầu hết các sàn giao dịch yêu cầu xác định các tham số mô tả mã loại khi kiểm tra và hủy lệnh.
Làm thế nào để phù hợp với tác động này: Nếu bạn sử dụngexchange.IOchức năng để gọi giao diện lệnh trao đổi trực tiếp để đặt đơn đặt hàng, giá trị trả về thường chứa biểu tượng ban đầu của sàn giao dịch (mã sản phẩm) và ID đơn đặt hàng ban đầu. Sau đó liên kết hai với dấu phẩy tiếng Anh sẽ là ID đơn đặt hàng phù hợp với định nghĩa của nền tảng FMZ. Tương tự như vậy, nếu bạn sử dụng giao diện đặt hàng được đóng gói trên nền tảng FMZ để đặt hàng, vì đầu của ID đặt hàng là mã sản phẩm giao dịch, nếu bạn cần sử dụng ID đặt hàng ban đầu, chỉ cần xóa mã sản phẩm và dấu phẩy.
Tác động của việc nâng cấp nàyexchange.CancelOrder()
chức năng là giống nhưexchange.GetOrder()
function.
Tác động của việc nâng cấp nàyexchange.Buy()
chức năng là giống nhưexchange.GetOrder()
chức năng.
Đơn đặt hàng ID trả về bởiexchange.Buy()
chức năng là một cấu trúc mới, ví dụ, ID được trả về khi đặt lệnh tương lai trên sàn giao dịch OKX là:LTC-USDT-SWAP,1578360858053058560
.
Tác động của việc nâng cấp nàyexchange.Sell()
chức năng là giống nhưexchange.GetOrder()
chức năng.
Đơn đặt hàng ID trả về bởiexchange.Sell()
chức năng là một cấu trúc mới, ví dụ, ID được trả về khi đặt lệnh tương lai trên sàn giao dịch OKX là:ETH-USDT-SWAP,1578360832820125696
.
Bản cập nhật này thêm một trường Symbol vào cấu trúc Ticker, ghi lại thông tin thị trường của cấu trúc Ticker hiện tại.
Định dạng của trường này là chính xác giống như các biểu tượng định dạng tham số củaexchange.GetTicker()
function.
Bản cập nhật này thêm một trường biểu tượng vào cấu trúc Order, và định dạng của trường này chính xác giống như định dạng tham số biểu tượng củaexchange.GetTicker()
chức năng.
Bản cập nhật này cũng sửa đổi trường ID của cấu trúc đặt hàng, ghi lại thông tin sản phẩm và thông tin đặt hàng ban đầu trong định dạng ID đặt hàng mới.exchange.GetOrder()
chức năng, mà sẽ không được lặp lại ở đây.
Bản cập nhật này thêm một trường biểu tượng vào cấu trúc vị trí.exchange.GetTicker()
function.
Để đáp ứng nhu cầu của người dùng, nâng cấp này trước tiên sẽ tương thích với giao dịch trực tiếp, và hệ thống kiểm tra lại sẽ được điều chỉnh trong vòng một tuần. Nếu mã chiến lược cá nhân bị ảnh hưởng, vui lòng làm theo hướng dẫn trong bài viết này để thực hiện thay đổi và điều chỉnh.
Các lĩnh vực củaAccount
cấu trúc được trả về bởiGetAccount
Các chức năng của đối tượng giao dịch tương lai đã được mở rộng.
Tài sản Tổng vốn chủ sở hữu của đồng tiền tài sản ký quỹ hiện tại. Ngoại trừ một vài sàn giao dịch tương lai không hỗ trợ lĩnh vực này, hầu hết các sàn giao dịch đều hỗ trợ lĩnh vực này. Nó chủ yếu được sử dụng để tính toán lợi nhuận và lỗ ký quỹ tài khoản thời gian thực.
UPnL Lợi nhuận và lỗ chưa thực hiện của tất cả các vị trí được giữ trong đồng tiền tài sản ký quỹ hiện tại.
Chức năng thành viên SetMarginLevel của đối tượng trao đổi tương lai đã được nâng cấp và biểu tượng tham số đã được thêm vào.
Ví dụ thử nghiệm:
function main() {
exchange.SetCurrency("ETH_USDT")
exchange.SetContractType("swap")
// The current trading pair is ETH_USDT, the contract code is swap, and the leverage value is set to 10
exchange.SetMarginLevel(10)
// Directly specify the trading pair BTC_USDT, contract code swap, and set the leverage value to 20
exchange.SetMarginLevel("BTC_USDT.swap", 20)
}