
Di bidang perdagangan aset mata uang kripto, memperoleh dan menganalisis data pasar, menanyakan kurs, dan memantau perubahan aset akun semuanya merupakan operasi utama. Berikut ini adalah contoh kode untuk mengimplementasikan beberapa persyaratan umum.
Saat menulis program strategi perdagangan kuantitatif di FMZ, Anda perlu terlebih dahulu menganalisis persyaratannya. Jadi sesuai kebutuhan, kami menganalisis poin-poin berikut:
GET https://api.binance.com/api/v3/ticker/price。
Di FMZ, akses antarmuka kutipan pertukaran (antarmuka publik yang tidak memerlukan tanda tangan) menggunakanHttpQueryfungsi.涨跌幅百分比 =(当前价格 - 初始价格)/ 初始价格 * 100, satuannya adalah “%”.Pikirkan masalahnya dan tentukan solusinya. Kami mulai merancang programnya.
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. Struktur Data
var dictSymbolsPrice = {}: Objek kosong yang digunakan untuk menyimpan informasi harga untuk setiap pasangan perdagangan. Kuncinya adalah simbol pasangan perdagangan, dan nilainya adalah objek yang berisi nama pasangan perdagangan, serangkaian data harga, dan informasi perubahan.
while (true) {
// ...
}
Program ini terus memantau harga pasangan perdagangan API Binance melalui putaran tak terbatas.
var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))
Dapatkan informasi harga terkini dari pasangan perdagangan melalui API Binance. Jika nilai yang dikembalikan bukan array, tunggu 5 detik dan coba lagi.
for (var i = 0; i < arr.length; i++) {
// ...
}
Telusuri susunan informasi harga yang diperoleh dan perbarui data dalam dictSymbolsPrice. Untuk setiap pasangan perdagangan, tambahkan stempel waktu dan harga saat ini ke susunan data yang sesuai.
} catch(e) {
Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
}
Menangkap pengecualian dan mencatat informasi pengecualian untuk memastikan bahwa program dapat terus dijalankan.
for (var symbol in dictSymbolsPrice) {
// ...
}
Lintasi dictSymbolsPrice, hitung kenaikan atau penurunan setiap pasangan perdagangan, dan hapus data paling awal jika panjang data melebihi 4 jam.
var entries = Object.entries(dictSymbolsPrice)
entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange)
for (var i = 0; i < entries.length; i++) {
// ...
}
Urutkan pasangan perdagangan berdasarkan kenaikan atau penurunannya dari tinggi ke rendah, dan buat tabel yang berisi informasi pasangan perdagangan.
LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
Sleep(5000)
Keluarkan tabel dan waktu saat ini dalam bentuk log, dan tunggu selama 5 detik sebelum melanjutkan ke siklus berikutnya.
Program ini memperoleh informasi harga real-time dari pasangan perdagangan melalui API Binance, lalu menghitung kenaikan atau penurunan dan mengeluarkannya ke log dalam bentuk tabel. Program ini dijalankan dalam putaran berkelanjutan untuk mencapai fungsi pemantauan harga pasangan transaksi secara real-time. Perlu dicatat bahwa program ini menyertakan penanganan pengecualian untuk memastikan bahwa eksekusi tidak terganggu karena pengecualian saat memperoleh informasi harga.

Karena data hanya dapat dikumpulkan sedikit demi sedikit di awal, mustahil untuk menghitung kenaikan dan penurunan secara bergulir jika data yang cukup untuk 4 jam belum terkumpul. Oleh karena itu, pada awalnya, harga awal digunakan sebagai patokan perhitungan. Setelah mengumpulkan data yang cukup selama 4 jam, data terlama dihilangkan satu per satu untuk mempertahankan periode jendela 4 jam guna menghitung kenaikan dan penurunan.
Menanyakan tingkat pendanaan mirip dengan kode di atas. Pertama, Anda perlu memeriksa dokumentasi API Binance untuk menemukan antarmuka terkait tingkat pendanaan. Binance memiliki beberapa antarmuka untuk menanyakan tingkat pendanaan. Berikut ini kami ambil antarmuka kontrak berbasis U sebagai contoh:
GET https://fapi.binance.com/fapi/v1/premiumIndex
Karena terlalu banyak kontrak, kami tampilkan sepuluh kontrak teratas dengan tingkat pendanaan tertinggi di sini.
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)
}
}
Struktur data yang dikembalikan adalah sebagai berikut. Dari dokumentasi Binance, kita dapat melihat bahwa lastFundingRate adalah tingkat pendanaan yang kita inginkan.
{
"symbol":"STMXUSDT",
"markPrice":"0.00883606",
"indexPrice":"0.00883074",
"estimatedSettlePrice":"0.00876933",
"lastFundingRate":"0.00026573",
"interestRate":"0.00005000",
"nextFundingTime":1702828800000,
"time":1702816229000
}
Uji operasi disk nyata:

Seorang pengguna menyebutkan bahwa versi Python diperlukan, dan versi tersebut berasal dari bursa OKX. Berikut ini juga diimplementasikan dengan cara:
https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1Data yang dikembalikan oleh antarmuka:
{
"code":"0",
"data":[
{
"fundingTime":1702828800000,
"fundingList":[
{
"instId":"BTC-USDT-SWAP",
"nextFundingRate":"0.0001102188733642",
"minFundingRate":"-0.00375",
"fundingRate":"0.0000821861465884",
"maxFundingRate":"0.00375"
} ...
Kode khusus:
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)
Uji operasi disk nyata:

Contoh-contoh ini menyediakan ide desain dasar dan metode pemanggilan. Dalam proyek yang sebenarnya, modifikasi dan perluasan yang sesuai mungkin diperlukan berdasarkan kebutuhan spesifik. Saya harap kode-kode ini dapat membantu Anda memenuhi berbagai kebutuhan dalam perdagangan aset digital mata uang kripto dengan lebih baik.