
Trong lĩnh vực giao dịch tài sản tiền điện tử, việc thu thập và phân tích dữ liệu thị trường, truy vấn tỷ giá và theo dõi những thay đổi về tài sản trong tài khoản đều là những hoạt động quan trọng. Sau đây là các ví dụ mã để thực hiện một số yêu cầu phổ biến.
Khi viết chương trình chiến lược giao dịch định lượng trên FMZ, trước tiên bạn cần phân tích các yêu cầu. Vì vậy, theo nhu cầu, chúng tôi phân tích các điểm sau:
GET https://api.binance.com/api/v3/ticker/price。
Trên FMZ, truy cập giao diện báo giá trao đổi (giao diện công khai không yêu cầu chữ ký) bằng cách sử dụngHttpQuerychức năng.涨跌幅百分比 =(当前价格 - 初始价格)/ 初始价格 * 100, đơn vị là “%”.Hãy suy nghĩ kỹ về vấn đề và đưa ra giải pháp. Chúng tôi bắt đầu thiết kế chương trình.
var dictSymbolsPrice = {}
function main() {
while (true) {
// GET https://api.binance.com/api/v3/ticker/price
try {
var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))
if (!Array.isArray(arr)) {
Sleep(5000)
continue
}
var ts = new Date().getTime()
for (var i = 0; i < arr.length; i++) {
var symbolPriceInfo = arr[i]
var symbol = symbolPriceInfo.symbol
var price = symbolPriceInfo.price
if (typeof(dictSymbolsPrice[symbol]) == "undefined") {
dictSymbolsPrice[symbol] = {name: symbol, data: []}
}
dictSymbolsPrice[symbol].data.push({ts: ts, price: price})
}
} catch(e) {
Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
}
// 计算涨跌幅
var tbl = {
type : "table",
title : "涨跌幅",
cols : ["交易对", "当前价格", "4小时前价格", "涨跌幅", "数据长度", "最早数据时间", "最新数据时间"],
rows : []
}
for (var symbol in dictSymbolsPrice) {
var data = dictSymbolsPrice[symbol].data
if (data[data.length - 1].ts - data[0].ts > 1000 * 60 * 60 * 4) {
dictSymbolsPrice[symbol].data.shift()
}
data = dictSymbolsPrice[symbol].data
dictSymbolsPrice[symbol].percentageChange = (data[data.length - 1].price - data[0].price) / data[0].price * 100
}
var entries = Object.entries(dictSymbolsPrice)
entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange)
for (var i = 0; i < entries.length; i++) {
if (i > 9) {
break
}
var name = entries[i][1].name
var data = entries[i][1].data
var percentageChange = entries[i][1].percentageChange
var currPrice = data[data.length - 1].price
var currTs = _D(data[data.length - 1].ts)
var prePrice = data[0].price
var preTs = _D(data[0].ts)
var dataLen = data.length
tbl.rows.push([name, currPrice, prePrice, percentageChange + "%", dataLen, preTs, currTs])
}
LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
Sleep(5000)
}
}
1. Cấu trúc dữ liệu
var dictSymbolsPrice = {}: Một đối tượng rỗng dùng để lưu trữ thông tin giá cho từng cặp giao dịch. Khóa là biểu tượng của cặp giao dịch và giá trị là một đối tượng chứa tên của cặp giao dịch, một mảng dữ liệu giá và thông tin thay đổi.
while (true) {
// ...
}
Chương trình liên tục theo dõi giá cặp giao dịch của Binance API thông qua một vòng lặp vô hạn.
var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))
Nhận thông tin giá hiện tại của cặp giao dịch thông qua Binance API. Nếu giá trị trả về không phải là một mảng, hãy đợi 5 giây và thử lại.
for (var i = 0; i < arr.length; i++) {
// ...
}
Duyệt qua mảng thông tin giá thu được và cập nhật dữ liệu trong dictSymbolsPrice. Đối với mỗi cặp giao dịch, hãy thêm dấu thời gian và giá hiện tại vào mảng dữ liệu tương ứng.
} catch(e) {
Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
}
Phát hiện ngoại lệ và ghi lại thông tin ngoại lệ để đảm bảo chương trình có thể tiếp tục thực thi.
for (var symbol in dictSymbolsPrice) {
// ...
}
Duyệt dictSymbolsPrice, tính toán mức tăng hoặc giảm của từng cặp giao dịch và xóa dữ liệu sớm nhất nếu độ dài dữ liệu vượt quá 4 giờ.
var entries = Object.entries(dictSymbolsPrice)
entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange)
for (var i = 0; i < entries.length; i++) {
// ...
}
Sắp xếp các cặp giao dịch theo mức tăng hoặc giảm từ cao đến thấp và tạo bảng chứa thông tin về cặp giao dịch.
LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
Sleep(5000)
Xuất bảng và thời gian hiện tại dưới dạng nhật ký và đợi 5 giây trước khi tiếp tục chu kỳ tiếp theo.
Chương trình thu thập thông tin giá theo thời gian thực của cặp giao dịch thông qua Binance API, sau đó tính toán mức tăng hoặc giảm và xuất ra nhật ký dưới dạng bảng. Chương trình được thực hiện theo vòng lặp liên tục để đạt được chức năng theo dõi giá cặp giao dịch theo thời gian thực. Cần lưu ý rằng chương trình bao gồm chức năng xử lý ngoại lệ để đảm bảo việc thực thi không bị gián đoạn do các ngoại lệ khi lấy thông tin giá.

Vì dữ liệu chỉ có thể được thu thập từng bit một khi bắt đầu nên không thể tính toán được mức tăng và giảm liên tục nếu không thu thập đủ dữ liệu trong 4 giờ. Do đó, lúc đầu, giá ban đầu được sử dụng làm chuẩn mực để tính toán. Sau khi thu thập đủ dữ liệu trong 4 giờ, dữ liệu cũ nhất sẽ được loại bỏ từng cái một để duy trì khoảng thời gian cửa sổ 4 giờ để tính toán mức tăng và giảm.
Truy vấn tỷ lệ tài trợ tương tự như mã trên. Trước tiên, bạn cần kiểm tra tài liệu API của Binance để tìm giao diện liên quan đến tỷ lệ tài trợ. Binance có một số giao diện để truy vấn tỷ lệ tài trợ. Ở đây chúng tôi lấy giao diện của hợp đồng dựa trên U làm ví dụ:
GET https://fapi.binance.com/fapi/v1/premiumIndex
Vì có quá nhiều hợp đồng nên chúng tôi sẽ đưa ra mười hợp đồng có tỷ lệ tài trợ cao nhất ở đây.
function main() {
while (true) {
// GET https://fapi.binance.com/fapi/v1/premiumIndex
try {
var arr = JSON.parse(HttpQuery("https://fapi.binance.com/fapi/v1/premiumIndex"))
if (!Array.isArray(arr)) {
Sleep(5000)
continue
}
arr.sort((a, b) => parseFloat(b.lastFundingRate) - parseFloat(a.lastFundingRate))
var tbl = {
type: "table",
title: "U本位合约资金费率前十",
cols: ["合约", "资金费率", "标记价格", "指数价格", "当期费率时间", "下期费率时间"],
rows: []
}
for (var i = 0; i < 9; i++) {
var obj = arr[i]
tbl.rows.push([obj.symbol, obj.lastFundingRate, obj.markPrice, obj.indexPrice, _D(obj.time), _D(obj.nextFundingTime)])
}
LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
} catch(e) {
Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
}
Sleep(1000 * 10)
}
}
Cấu trúc dữ liệu trả về như sau. Từ tài liệu Binance, chúng ta có thể thấy lastFundingRate là tỷ lệ tài trợ mà chúng ta muốn.
{
"symbol":"STMXUSDT",
"markPrice":"0.00883606",
"indexPrice":"0.00883074",
"estimatedSettlePrice":"0.00876933",
"lastFundingRate":"0.00026573",
"interestRate":"0.00005000",
"nextFundingTime":1702828800000,
"time":1702816229000
}
Kiểm tra hoạt động của đĩa thực tế:

Một người dùng đã đề cập rằng cần có phiên bản Python và phiên bản này đến từ sàn giao dịch OKX. Nhân tiện cũng thực hiện như sau:
https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1Dữ liệu trả về từ giao diện:
{
"code":"0",
"data":[
{
"fundingTime":1702828800000,
"fundingList":[
{
"instId":"BTC-USDT-SWAP",
"nextFundingRate":"0.0001102188733642",
"minFundingRate":"-0.00375",
"fundingRate":"0.0000821861465884",
"maxFundingRate":"0.00375"
} ...
Mã cụ thể:
import requests
import json
from time import sleep
from datetime import datetime
def main():
while True:
# https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1
try:
response = requests.get("https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1")
arr = response.json()["data"][0]["fundingList"]
Log(arr)
if not isinstance(arr, list):
sleep(5)
continue
arr.sort(key=lambda x: float(x["fundingRate"]), reverse=True)
tbl = {
"type": "table",
"title": "U本位合约资金费率前十",
"cols": ["合约", "下期费率", "最小", "当期", "最大"],
"rows": []
}
for i in range(min(9, len(arr))):
obj = arr[i]
row = [
obj["instId"],
obj["nextFundingRate"],
obj["minFundingRate"],
obj["fundingRate"],
obj["maxFundingRate"]
]
tbl["rows"].append(row)
LogStatus(_D(), "\n", '`' + json.dumps(tbl) + '`')
except Exception as e:
Log(f"Error: {str(e)}")
sleep(10)
Kiểm tra hoạt động của đĩa thực tế:

Những ví dụ này cung cấp ý tưởng thiết kế cơ bản và phương pháp gọi. Trong các dự án thực tế, có thể cần phải sửa đổi và mở rộng phù hợp dựa trên nhu cầu cụ thể. Tôi hy vọng những mã này có thể giúp bạn đáp ứng tốt hơn các nhu cầu khác nhau của mình trong giao dịch tài sản kỹ thuật số tiền điện tử.