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.
1. Bagaimana cara menulis kode yang menunjukkan peningkatan terbesar dalam perdagangan spot Binance dalam waktu 4 jam?
Saat menulis program strategi perdagangan kuantitatif di FMZ, Anda perlu terlebih dahulu menganalisis persyaratannya. Jadi sesuai kebutuhan, kami menganalisis poin-poin berikut:
- Bahasa pemrograman apa yang digunakan untuk menulis desain tersebut?
Implementasi yang direncanakan menggunakan Javascript. - Butuh data pasar spot real-time untuk semua mata uang
Ketika kami melihat persyaratan ini, hal pertama yang kami lakukan adalah melihat dokumentasi API Binance untuk melihat apakah ada data pasar agregat (data pasar agregat akan menjadi yang terbaik, karena akan memakan waktu dan melelahkan untuk memeriksa setiap produk satu per satu) satu).
Menanyakan antarmuka informasi pasar agregat:GET https://api.binance.com/api/v3/ticker/price。
Di FMZ, akses antarmuka kutipan pertukaran (antarmuka publik yang tidak memerlukan tanda tangan) menggunakanHttpQueryfungsi. - Perlu menghitung data periode jendela bergulir 4 jam
Pikirkan tentang cara menyusun program statistik ini. - Hitung kenaikan dan penurunan, urutkan
Pikirkan tentang algoritma naik dan turun, apakah itu:涨跌幅百分比 =(当前价格 - 初始价格)/ 初始价格 * 100, satuannya adalah “%”.
Pikirkan masalahnya dan tentukan solusinya. Kami mulai merancang programnya.
Desain kode
javascript
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)
}
}
Analisis Kode
-
- 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.
- Struktur Data
-
- Fungsi utama main()
-
2.1. Perulangan tak terbatas
javascriptwhile (true) { // ... }Program ini terus memantau harga pasangan perdagangan API Binance melalui putaran tak terbatas.
-
2.2. Dapatkan informasi harga
javascriptvar 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.
-
2.3. Memperbarui data harga
javascriptfor (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.
-
2.4. Penanganan Pengecualian
javascript} 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.
-
2.5. Hitung kenaikan atau penurunannya
javascriptfor (var symbol in dictSymbolsPrice) { // ... }Lintasi dictSymbolsPrice, hitung kenaikan atau penurunan setiap pasangan perdagangan, dan hapus data paling awal jika panjang data melebihi 4 jam.
-
2.6. Mengurutkan dan membuat tabel
javascriptvar 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.
-
2.7. Keluaran log dan penundaan
javascriptLogStatus(_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.
Uji operasi disk nyata
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.
2. Periksa tingkat pendanaan semua kontrak berjangka U-margin Binance
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
Implementasi Kode
Karena terlalu banyak kontrak, kami tampilkan sepuluh kontrak teratas dengan tingkat pendanaan tertinggi di sini.
javascript
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.
javascript
{
"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:
Versi Python untuk mendapatkan nilai tukar kontrak OKX
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:
python
{
"code":"0",
"data":[
{
"fundingTime":1702828800000,
"fundingList":[
{
"instId":"BTC-USDT-SWAP",
"nextFundingRate":"0.0001102188733642",
"minFundingRate":"-0.00375",
"fundingRate":"0.0000821861465884",
"maxFundingRate":"0.00375"
} ...
Kode khusus:
python
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:
END
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.
- 1





