Dalam ruang perdagangan aset cryptocurrency, memperoleh dan menganalisis data pasar, menanyakan tingkat, dan memantau pergerakan aset akun adalah semua operasi penting.
Ketika menulis program strategi perdagangan kuantitatif di platform FMZ, hal pertama yang perlu Anda lakukan ketika Anda menemukan persyaratan adalah menganalisisnya.
GET https://api.binance.com/api/v3/ticker/price
Aku tidak tahu.
Di platform FMZ, gunakanHttpQuery
fungsi untuk mengakses antarmuka ticker pertukaran (antarmuka publik yang tidak memerlukan tanda tangan).price fluctuations (%) = (current price - initial price) / initial price * 100
dalam Setelah mencari tahu masalah, serta mendefinisikan program, kami kemudian turun ke bisnis 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 informasi harga untuk setiap pasangan perdagangan. Kunci adalah simbol pasangan perdagangan, dan nilainya adalah objek yang berisi nama pasangan perdagangan, array data harga, dan informasi tentang fluktuasi harga.while (true) {
// ...
}
Program ini terus memantau harga pasangan perdagangan Binance API melalui loop tak terbatas. 2.2. Dapatkan informasi harga
var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))
Dapatkan informasi harga saat ini dari pasangan perdagangan melalui Binance API. Jika pengembalian bukan array, tunggu 5 detik dan coba lagi. 2.3 Pembaruan data harga
for (var i = 0; i < arr.length; i++) {
// ...
}
Iterasi melalui array informasi harga yang diperoleh dan memperbarui data di dictSymbolsPrice. Untuk setiap pasangan perdagangan, tambahkan timestamp saat ini dan harga ke array data yang sesuai. 2.4 Pengolahan pengecualian
} catch(e) {
Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
}
Tangkap pengecualian dan log informasi pengecualian untuk memastikan bahwa program dapat terus dijalankan. 2.5. Menghitung fluktuasi harga
for (var symbol in dictSymbolsPrice) {
// ...
}
Iterate melalui dictSymbolsPrice, menghitung fluktuasi harga dari setiap pasangan perdagangan, dan menghapus data tertua jika lebih dari 4 jam. 2.6. Mengurutkan dan menghasilkan tabel
var entries = Object.entries(dictSymbolsPrice)
entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange)
for (var i = 0; i < entries.length; i++) {
// ...
}
Atur pasangan perdagangan dalam urutan menurun fluktuasi harga mereka dan menghasilkan tabel yang berisi informasi tentang pasangan perdagangan. 2.7. output log dan keterlambatan
LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
Sleep(5000)
Keluarkan tabel dan waktu saat ini dalam bentuk log dan tunggu selama 5 detik untuk melanjutkan babak berikutnya.
Program ini memperoleh informasi harga real-time dari pasangan perdagangan melalui Binance API, kemudian menghitung fluktuasi harga, dan mengeluarkannya ke log dalam bentuk tabel. Program ini dijalankan dalam loop terus menerus untuk mewujudkan fungsi pemantauan real-time harga pasangan perdagangan. Perhatikan bahwa program ini mencakup pemrosesan pengecualian untuk memastikan bahwa eksekusi tidak terganggu oleh pengecualian saat mendapatkan informasi harga.
Karena data hanya dapat dikumpulkan sedikit demi sedikit pada awalnya, tidak mungkin untuk menghitung fluktuasi harga secara bergulir tanpa mengumpulkan data yang cukup untuk jendela 4 jam. Oleh karena itu, harga awal digunakan sebagai dasar untuk perhitungan, dan setelah mengumpulkan data yang cukup selama 4 jam, data tertua akan dihilangkan untuk mempertahankan jendela 4 jam untuk perhitungan fluktuasi harga.
Memeriksa tingkat pendanaan mirip dengan kode di atas, pertama-tama, kita perlu memeriksa dokumentasi API Binance untuk menemukan antarmuka terkait tingkat pendanaan. Binance memiliki beberapa antarmuka yang memungkinkan kita menanyakan tingkat dana, di sini kita mengambil antarmuka kontrak berdenominasi U sebagai contoh:
GET https://fapi.binance.com/fapi/v1/premiumIndex
Karena ada begitu banyak kontrak, kami mengekspor 10 tingkat pendanaan 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 sebagai berikut, dan periksa dokumentasi Binance, itu menunjukkan 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 coba perdagangan langsung:
Seorang pengguna telah meminta versi Python dari contoh, dan itu untuk pertukaran OKX. Berikut adalah contoh:
Data yang dikembalikan oleh antarmukahttps://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"
} ...
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": "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)
Uji coba perdagangan langsung:
Contoh-contoh ini memberikan ide-ide desain dasar dan metode panggilan, proyek sebenarnya mungkin perlu membuat perubahan dan ekstensi yang sesuai berdasarkan kebutuhan spesifik.