Dalam bidang perdagangan aset cryptocurrency, mendapatkan dan menganalisis data pasar, tingkat permintaan, dan memantau perubahan aset akun adalah operasi penting. Berikut adalah contoh kode untuk beberapa kebutuhan umum.
Ketika menulis program strategi perdagangan kuantitatif di FMZ, kebutuhan yang dihadapi perlu dianalisis terlebih dahulu. Jadi berdasarkan kebutuhan, kami menganalisis beberapa hal berikut:
GET https://api.binance.com/api/v3/ticker/price
Saya tidak tahu.
Di FMZ, akses ke antarmuka pasar (antarmuka publik tanpa tanda tangan) digunakanHttpQuery
Fungsi tersebut.涨跌幅百分比 =(当前价格 - 初始价格)/ 初始价格 * 100
, satuan adalah Setelah memikirkan masalah dan menentukan solusinya, kami mulai merancang sendiri.
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 = {}
: objek kosong yang digunakan untuk menyimpan informasi harga untuk setiap pasangan perdagangan. Kunci adalah simbol pasangan perdagangan, nilai adalah objek yang berisi nama pasangan perdagangan, susunan data harga, dan informasi penurunan harga.while (true) {
// ...
}
Program ini terus memantau harga transaksi pada API Binance melalui siklus tak terbatas.var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))
Mendapatkan informasi harga saat ini dari pasangan melalui API Binance. Jika yang dikembalikan bukan suatu aritmatika, tunggu 5 detik dan coba lagi.for (var i = 0; i < arr.length; i++) {
// ...
}
Melalui arsip informasi harga yang diperoleh, memperbarui data di dictSymbolsPrice. Untuk setiap pasangan transaksi, timestamp dan harga saat ini ditambahkan ke arsip data yang sesuai.} catch(e) {
Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
}
Mengambil kesalahan dan mencatat informasi kesalahan untuk memastikan bahwa program dapat terus berjalan.for (var symbol in dictSymbolsPrice) {
// ...
}
Melalui dictSymbolsPrice, perhitungkan penurunan margin untuk setiap pasangan perdagangan, dan hapus data tertua jika panjang data lebih dari 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++) {
// ...
}
Mengurutkan pasangan transaksi dari tinggi ke rendah sesuai dengan penurunan volatilitas dan menghasilkan tabel yang berisi informasi tentang pasangan transaksi.LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
Sleep(5000)
Mengekspor tabel dan waktu saat ini dalam bentuk log, dan menunggu 5 detik untuk melanjutkan siklus berikutnya.Program ini memperoleh informasi harga real-time dari pasangan perdagangan melalui API Binance, kemudian menghitung penurunan, dan mengekspornya ke log dalam bentuk tabel. Program ini memiliki fungsi untuk memantau transaksi terhadap harga secara real-time melalui eksekusi looping. Perlu dicatat bahwa program ini mencakup penanganan keanehan untuk memastikan bahwa eksekusi tidak terganggu karena keanehan saat memperoleh informasi harga.
Karena data hanya dikumpulkan sedikit demi sedikit pada awalnya, jika tidak dikumpulkan cukup data selama 4 jam, maka tidak mungkin untuk menghitung penurunan penurunan. Jadi, pada awalnya, harga awal dihitung sebagai acuan, dan setelah mengumpulkan cukup data selama 4 jam, data tertua dihapus secara berturut-turut untuk mempertahankan periode jendela 4 jam.
Permintaan tingkat modal dan kode di atas mirip. Pertama, Anda perlu melihat dokumentasi API Binance untuk menemukan antarmuka yang terkait dengan tingkat modal.
GET https://fapi.binance.com/fapi/v1/premiumIndex
Karena banyaknya kontrak, kami adalah salah satu dari sepuluh perusahaan yang paling tinggi dalam hal biaya ekspor.
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, melihat dokumen Binance menunjukkan bahwa Last Funding Rate adalah tingkat dana yang kita inginkan.
{
"symbol":"STMXUSDT",
"markPrice":"0.00883606",
"indexPrice":"0.00883074",
"estimatedSettlePrice":"0.00876933",
"lastFundingRate":"0.00026573",
"interestRate":"0.00005000",
"nextFundingTime":1702828800000,
"time":1702816229000
}
Percobaan berjalan pada hardisk:
Ada pengguna yang mengajukan contoh yang membutuhkan versi Python, dan itu adalah OKX Exchange.
https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1
Data 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 spesifik:
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)
Percobaan berjalan pada hardisk:
Contoh-contoh ini memberikan ide-ide desain dasar, metode panggilan, dan proyek-proyek yang sebenarnya mungkin perlu diubah dan diperluas sesuai dengan kebutuhan tertentu. Kami berharap kode ini dapat membantu Anda memenuhi kebutuhan yang lebih baik dalam perdagangan aset digital cryptocurrency.
Pelacakan 98K-band_LongKami berharap guru kecil Dream akan segera menemukan kasus perubahan aset akun @Monitoring.
Pelacakan 98K-band_LongPujian
Penemu Kuantitas - Mimpi KecilBaiklah, ini dalam rencana.