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, tỷ lệ truy vấn và theo dõi sự thay đổi tài sản tài khoản là các hoạt động quan trọng. Dưới đây là các trường hợp mã để thực hiện một số nhu cầu phổ biến.
Khi viết các chương trình chiến lược giao dịch định lượng trên FMZ, nhu cầu cần được phân tích trước tiên.
GET https://api.binance.com/api/v3/ticker/price
‖
Trên FMZ, truy cập giao diện giao dịch của sàn giao dịch (không yêu cầu chữ ký giao diện công cộng) được sử dụngHttpQuery
Chức năng.涨跌幅百分比 =(当前价格 - 初始价格)/ 初始价格 * 100
Đơn vị là %Sau khi giải quyết vấn đề và xác định giải pháp, chúng tôi bắt đầu thiết kế.
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)
}
}
var dictSymbolsPrice = {}
: một đối tượng trống, được sử dụng để lưu trữ thông tin giá của mỗi cặp giao dịch. Chìa khóa là ký hiệu của cặp giao dịch, giá trị là một đối tượng, chứa tên của cặp giao dịch, mảng dữ liệu giá và thông tin giảm giá.while (true) {
// ...
}
Chương trình liên tục theo dõi giá giao dịch trên 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 về giá hiện tại của cặp giao dịch thông qua API Binance. Nếu không phải là một mảng, hãy chờ 5 giây và thử lại.for (var i = 0; i < arr.length; i++) {
// ...
}
Đi qua các mảng thông tin giá thu được, cập nhật dữ liệu trong dictSymbolsPrice. Đối với mỗi cặp giao dịch, các mảng thời gian và giá hiện tại được thêm 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)
}
Khám phá sự bất thường và ghi lại thông tin bất thường để đảm bảo chương trình có thể tiếp tục thực hiện.for (var symbol in dictSymbolsPrice) {
// ...
}
Đi qua dictSymbolsPrice, tính toán mức giảm giá của mỗi 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++) {
// ...
}
Xác định các cặp giao dịch từ cao đến thấp theo mức giảm giá và tạo ra một bảng chứa thông tin về các cặp giao dịch.LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
Sleep(5000)
Xuất ra biểu mẫu 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 lấy thông tin giá thời gian thực của các cặp giao dịch thông qua API Binance, sau đó tính giá giảm và xuất ra sổ đăng ký dưới dạng bảng. Chương trình thực hiện chức năng giám sát giá giao dịch trong thời gian thực bằng cách chạy liên tục. Lưu ý rằng chương trình có xử lý ngoại lệ để đảm bảo không bị gián đoạn khi lấy thông tin giá.
Vì dữ liệu chỉ được thu thập từng chút một khi bắt đầu và không thu thập đủ dữ liệu trong 4 giờ, việc tính toán đà sụt giảm không thể cuộn. Vì vậy, khi bắt đầu, tính toán đà sụt giảm được dựa trên giá ban đầu, sau khi thu thập đủ dữ liệu trong 4 giờ, sau đó loại bỏ dữ liệu cũ nhất để duy trì thời gian cửa sổ 4 giờ.
Tìm kiếm tỷ lệ vốn và các mã trên tương tự nhau. Đầu tiên, bạn cần xem tài liệu API của Binance để tìm giao diện liên quan đến tỷ lệ vốn.
GET https://fapi.binance.com/fapi/v1/premiumIndex
Vì có quá nhiều hợp đồng, chúng tôi đã xuất khẩu 10 khoản đầu tư 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: "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ác cấu trúc dữ liệu được trả về như sau: Xem tài liệu của Binance và bạn sẽ thấy LastFundingRate là tỷ lệ vốn 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 chạy trên đĩa thật:
Một người dùng đã đề xuất một ví dụ về việc cần phiên bản Python, và đó là OKX.
https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1
Dữ liệu được trả về bởi 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)
Thử nghiệm chạy trên đĩa thật:
Những ví dụ này cung cấp những ý tưởng thiết kế cơ bản, các phương pháp gọi, các dự án thực tế có thể cần sửa đổi và mở rộng phù hợp với nhu cầu cụ thể. Hy vọng các mã này sẽ 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ử.
98K-band tracking_LongMong rằng giáo viên Chị Mộng sẽ sớm đưa ra một trường hợp về sự thay đổi tài sản của tài khoản @Monitoring.
98K-band tracking_LongCảm ơn
Những nhà phát minh định lượng - những giấc mơ nhỏĐược rồi, đó là trong kế hoạch.