Dalam ruang perdagangan aset cryptocurrency, mendapatkan dan menganalisis data pasaran, menanyakan kadar, dan memantau pergerakan aset akaun adalah semua operasi kritikal.
Apabila menulis program strategi perdagangan kuantitatif di platform FMZ, perkara pertama yang perlu anda lakukan apabila anda menghadapi keperluan adalah untuk menganalisisnya.
GET https://api.binance.com/api/v3/ticker/price
.
Pada platform FMZ, gunakanHttpQuery
fungsi untuk mengakses antara muka ticker pertukaran (antara muka awam yang tidak memerlukan tandatangan).price fluctuations (%) = (current price - initial price) / initial price * 100
dalam Selepas menyelesaikan masalah, dan juga menentukan program, kami mula merancang program.
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 = {}
: Objek kosong untuk menyimpan maklumat harga untuk setiap pasangan dagangan. Kunci adalah simbol pasangan dagangan, dan nilainya adalah objek yang mengandungi nama pasangan dagangan, pelbagai data harga, dan maklumat mengenai turun naik harga.while (true) {
// ...
}
Program ini terus memantau harga pasangan perdagangan Binance API melalui gelung tanpa akhir. 2.2. Dapatkan maklumat harga
var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))
Dapatkan maklumat harga semasa pasangan dagangan melalui API Binance. Jika pulangan bukan array, tunggu selama 5 saat dan cuba lagi. 2.3 Mengemas kini data harga
for (var i = 0; i < arr.length; i++) {
// ...
}
Iterate melalui array maklumat harga yang diperoleh dan mengemas kini data dalam dictSymbolsPrice. Untuk setiap pasangan dagangan, tambah stempel masa dan harga semasa ke array data yang sepadan. 2.4 Pemprosesan pengecualian
} catch(e) {
Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
}
Menangkap pengecualian dan log maklumat pengecualian untuk memastikan bahawa program boleh terus dijalankan. 2.5. Mengira turun naik harga
for (var symbol in dictSymbolsPrice) {
// ...
}
Iterate melalui dictSymbolsPrice, mengira turun naik harga setiap pasangan dagangan, dan membuang data terdahulu jika lebih lama daripada 4 jam. 2.6. Susun dan hasilkan jadual
var entries = Object.entries(dictSymbolsPrice)
entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange)
for (var i = 0; i < entries.length; i++) {
// ...
}
Mengurutkan pasangan dagangan mengikut urutan penurunan turun turun fluktuasi harga mereka dan menghasilkan jadual yang mengandungi maklumat mengenai pasangan dagangan. 2.7. output log dan kelewatan
LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
Sleep(5000)
Keluarkan jadual dan masa semasa dalam bentuk log dan tunggu selama 5 saat untuk meneruskan pusingan seterusnya.
Program ini memperoleh maklumat harga masa nyata pasangan dagangan melalui Binance API, kemudian mengira turun naik harga, dan mengeluarkan ke log dalam bentuk jadual. Program ini dijalankan dalam gelung berterusan untuk merealisasikan fungsi pemantauan masa nyata harga pasangan dagangan. Perhatikan bahawa program ini termasuk pemprosesan pengecualian untuk memastikan bahawa pelaksanaan tidak terganggu oleh pengecualian ketika mendapatkan maklumat harga.
Oleh kerana data hanya boleh dikumpulkan sedikit demi sedikit pada mulanya, tidak mungkin untuk mengira turun naik harga secara bergolak tanpa mengumpul data yang mencukupi untuk tetingkap 4 jam. Oleh itu, harga awal digunakan sebagai asas untuk pengiraan, dan selepas mengumpul data yang mencukupi selama 4 jam, data tertua akan dihapuskan untuk mengekalkan tetingkap 4 jam untuk pengiraan turun naik harga.
Memeriksa kadar pembiayaan adalah sama dengan kod di atas, pertama sekali, kita perlu memeriksa dokumentasi API Binance untuk mencari antara muka yang berkaitan dengan kadar pembiayaan. Binance mempunyai beberapa antara muka yang membolehkan kita menyoal kadar dana, di sini kita mengambil antara muka kontrak yang berjenama U sebagai contoh:
GET https://fapi.binance.com/fapi/v1/premiumIndex
Oleh kerana terdapat banyak kontrak, kami mengeksport 10 kadar pembiayaan terbesar 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: "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)
}
}
Struktur data yang dikembalikan adalah seperti berikut, dan periksa dokumentasi Binance, ia menunjukkan bahawa lastFundingRate adalah kadar pembiayaan yang kita mahukan.
{
"symbol":"STMXUSDT",
"markPrice":"0.00883606",
"indexPrice":"0.00883074",
"estimatedSettlePrice":"0.00876933",
"lastFundingRate":"0.00026573",
"interestRate":"0.00005000",
"nextFundingTime":1702828800000,
"time":1702816229000
}
Ujian berjalan perdagangan langsung:
Seorang pengguna telah meminta versi Python contoh, dan ia adalah untuk pertukaran OKX.
Data yang dikembalikan oleh antara mukahttps://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"
} ...
Kod 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": "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)
Ujian berjalan perdagangan langsung:
Contoh-contoh ini memberikan idea reka bentuk asas dan kaedah panggilan, projek sebenar mungkin perlu membuat perubahan dan pelanjutan yang sesuai berdasarkan keperluan tertentu.