
No campo da negociação de ativos de criptomoeda, obter e analisar dados de mercado, consultar taxas e monitorar alterações de ativos de conta são operações essenciais. A seguir estão exemplos de código para implementar alguns requisitos comuns.
Ao escrever um programa de estratégia de negociação quantitativa na FMZ, primeiro você precisa analisar os requisitos. Assim, de acordo com as necessidades, analisamos os seguintes pontos:
GET https://api.binance.com/api/v3/ticker/price。
No FMZ, acesse a interface de cotação de câmbio (interface pública que não requer assinatura) usandoHttpQueryfunção.涨跌幅百分比 =(当前价格 - 初始价格)/ 初始价格 * 100, a unidade é “%”.Pense no problema e decida uma solução. Começamos a projetar o programa.
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. Estrutura de Dados
var dictSymbolsPrice = {}: Um objeto vazio usado para armazenar informações de preço para cada par de negociação. A chave é o símbolo do par de negociação, e o valor é um objeto que contém o nome do par de negociação, uma matriz de dados de preço e informações de alteração.
while (true) {
// ...
}
O programa monitora continuamente os preços dos pares de negociação da API da Binance por meio de um loop infinito.
var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))
Obtenha as informações atuais sobre o preço do par de negociação por meio da API da Binance. Se o valor retornado não for uma matriz, aguarde 5 segundos e tente novamente.
for (var i = 0; i < arr.length; i++) {
// ...
}
Percorra a matriz de informações de preço obtida e atualize os dados em dictSymbolsPrice. Para cada par de negociação, adicione o registro de data e hora atual e o preço à matriz de dados correspondente.
} catch(e) {
Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
}
Capture exceções e registre informações sobre elas para garantir que o programa possa continuar a ser executado.
for (var symbol in dictSymbolsPrice) {
// ...
}
Percorra dictSymbolsPrice, calcule o aumento ou a diminuição de cada par de negociação e exclua os dados mais antigos se o comprimento dos dados exceder 4 horas.
var entries = Object.entries(dictSymbolsPrice)
entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange)
for (var i = 0; i < entries.length; i++) {
// ...
}
Classifique os pares de negociação por aumento ou diminuição, do maior para o menor, e gere uma tabela contendo as informações do par de negociação.
LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
Sleep(5000)
Exiba a tabela e a hora atual em formato de log e aguarde 5 segundos antes de continuar para o próximo ciclo.
O programa obtém informações de preço em tempo real do par de negociação por meio da API da Binance, calcula o aumento ou a diminuição e as exibe no log na forma de uma tabela. O programa é executado em um loop contínuo para atingir a função de monitoramento em tempo real dos preços dos pares de transações. Vale ressaltar que o programa inclui tratamento de exceções para garantir que a execução não seja interrompida devido a exceções na obtenção de informações de preço.

Como os dados só podem ser coletados pouco a pouco no início, é impossível calcular a ascensão e a queda de forma contínua se não forem coletados dados suficientes para 4 horas. Portanto, no começo, o preço inicial é usado como referência para cálculo. Após coletar dados suficientes para 4 horas, os dados mais antigos são eliminados um por um para manter um período de janela de 4 horas para calcular a subida e a queda.
Consultar a taxa de financiamento é similar ao código acima. Primeiro, você precisa verificar a documentação da API da Binance para encontrar a interface relacionada à taxa de financiamento. A Binance tem várias interfaces para consultar taxas de financiamento. Aqui, tomamos a interface de contratos baseados em U como exemplo:
GET https://fapi.binance.com/fapi/v1/premiumIndex
Como há muitos contratos, exibimos aqui os dez com as maiores taxas de financiamento.
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)
}
}
A estrutura de dados retornada é a seguinte. Da documentação da Binance, podemos ver que lastFundingRate é a taxa de financiamento que queremos.
{
"symbol":"STMXUSDT",
"markPrice":"0.00883606",
"indexPrice":"0.00883074",
"estimatedSettlePrice":"0.00876933",
"lastFundingRate":"0.00026573",
"interestRate":"0.00005000",
"nextFundingTime":1702828800000,
"time":1702816229000
}
Teste de operação de disco real:

Um usuário mencionou que uma versão do Python é necessária, e ela é da bolsa OKX. Aqui também é implementado, a propósito:
https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1Dados retornados pela interface:
{
"code":"0",
"data":[
{
"fundingTime":1702828800000,
"fundingList":[
{
"instId":"BTC-USDT-SWAP",
"nextFundingRate":"0.0001102188733642",
"minFundingRate":"-0.00375",
"fundingRate":"0.0000821861465884",
"maxFundingRate":"0.00375"
} ...
Código específico:
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)
Teste de operação de disco real:

Esses exemplos fornecem ideias básicas de design e métodos de chamada. Em projetos reais, modificações e extensões apropriadas podem ser necessárias com base em necessidades específicas. Espero que esses códigos possam ajudar você a atender melhor às suas diversas necessidades na negociação de ativos digitais de criptomoeda.