Trong không gian giao dịch tài sản tiền điện tử, thu thập và phân tích dữ liệu thị trường, truy vấn tỷ lệ và theo dõi chuyển động tài sản tài khoản đều là các hoạt động quan trọng.
Khi viết một chương trình chiến lược giao dịch định lượng trên nền tảng FMZ, điều đầu tiên bạn cần làm khi bạn gặp một yêu cầu là phân tích nó.
GET https://api.binance.com/api/v3/ticker/price
.
Trên nền tảng FMZ, sử dụngHttpQuery
chức năng để truy cập giao diện ticker trao đổi (công thức giao diện công khai không yêu cầu chữ ký).price fluctuations (%) = (current price - initial price) / initial price * 100
trong Sau khi giải quyết vấn đề, cũng như xác định chương trình, 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)
}
// Calculate price fluctuations
var tbl = {
type : "table",
title : "Price fluctuations",
cols : ["trading pair", "current price", "price 4 hours ago", "price fluctuations", "data length", "earliest data time", "latest data time"],
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)
}
}
var dictSymbolsPrice = {}
: Một đối tượng trống để lưu trữ thông tin giá cho mỗi cặp giao dịch. Chìa 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 về biến động giá.while (true) {
// ...
}
Chương trình liên tục theo dõi giá cặp giao dịch Binance API thông qua một vòng lặp vô hạn. 2.2. Tìm thông tin về giá cả
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 kết quả không phải là một mảng, chờ 5 giây và thử lại. 2.3 Cập nhật dữ liệu giá
for (var i = 0; i < arr.length; i++) {
// ...
}
Lặp lại thông 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, thêm dấu thời gian và giá hiện tại vào mảng dữ liệu tương ứng. 2.4 Xử lý ngoại lệ
} catch(e) {
Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
}
Bắt các ngoại lệ và ghi lại thông tin ngoại lệ để đảm bảo rằng chương trình có thể tiếp tục thực hiện. 2.5. Tính toán biến động giá
for (var symbol in dictSymbolsPrice) {
// ...
}
Lặp lại thông qua dictSymbolsPrice, tính biến động giá của mỗi cặp giao dịch và loại bỏ dữ liệu sớm nhất nếu dài hơn 4 giờ. 2.6. Loại và tạo bảng
var entries = Object.entries(dictSymbolsPrice)
entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange)
for (var i = 0; i < entries.length; i++) {
// ...
}
Loại các cặp giao dịch theo thứ tự giảm của biến động giá và tạo ra một bảng chứa thông tin về các cặp giao dịch. 2.7. Log output và delay
LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
Sleep(5000)
Tạo ra bảng và thời gian hiện tại dưới dạng nhật ký và chờ 5 giây để tiếp tục vòng lặp tiếp theo.
Chương trình có được thông tin giá thời gian thực của cặp giao dịch thông qua Binance API, sau đó tính toán biến động giá, và đầu ra nó vào nhật ký dưới dạng bảng. Chương trình được thực hiện trong một vòng lặp liên tục để nhận ra chức năng giám sát thời gian thực của giá của các cặp giao dịch. Lưu ý rằng chương trình bao gồm xử lý ngoại lệ để đảm bảo rằng việc thực hiện không bị gián đoạn bởi các ngoại lệ khi có được thông tin giá.
Vì dữ liệu chỉ có thể được thu thập từng chút một khi bắt đầu, không thể tính toán biến động giá trên cơ sở tuần tự mà không thu thập đủ dữ liệu cho một cửa sổ 4 giờ. Do đó, giá ban đầu được sử dụng làm cơ sở tính toán và sau khi thu thập đủ dữ liệu trong 4 giờ, dữ liệu cũ nhất sẽ được loại bỏ để duy trì cửa sổ 4 giờ để tính toán biến động giá.
Kiểm tra tỷ lệ tài trợ tương tự như mã trên, trước tiên, chúng ta cần kiểm tra tài liệu API Binance để tìm giao diện liên quan đến tỷ lệ tài trợ. Binance có một số giao diện cho phép chúng ta truy vấn tỷ lệ quỹ, ở đây chúng ta lấy giao diện của hợp đồng U như một ví dụ:
GET https://fapi.binance.com/fapi/v1/premiumIndex
Vì có rất nhiều hợp đồng, chúng tôi đang xuất khẩu 10 tỷ lệ tài trợ lớn 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: "Top 10 funding rates for U-denominated contracts",
cols: ["contracts", "funding rate", "marked price", "index price", "current rate time", "next rate time"],
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 được trả về như sau, và kiểm tra tài liệu Binance, nó cho thấy rằng lastFundingRate là tỷ lệ tài trợ mà chúng tôi muốn.
{
"symbol":"STMXUSDT",
"markPrice":"0.00883606",
"indexPrice":"0.00883074",
"estimatedSettlePrice":"0.00876933",
"lastFundingRate":"0.00026573",
"interestRate":"0.00005000",
"nextFundingTime":1702828800000,
"time":1702816229000
}
Thử nghiệm giao dịch trực tiếp:
Một người dùng đã yêu cầu một phiên bản Python của ví dụ, và nó là cho trao đổi OKX.
Dữ liệu được trả về bởi giao diệnhttps://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1
:
{
"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": "Top 10 funding rates for U-denominated contracts",
"cols": ["contracts", "next rate", "minimum", "current", "maximum"],
"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)
Thử nghiệm giao dịch trực tiếp:
Những ví dụ này cung cấp các ý tưởng thiết kế cơ bản và phương pháp gọi, dự án thực tế có thể cần phải thực hiện các thay đổi và mở rộng thích hợp dựa trên nhu cầu cụ thể. Hy vọng, các mã này có thể giúp bạn đáp ứng tốt hơn các nhu cầu khác nhau trong giao dịch tài sản kỹ thuật số tiền điện tử.