
В сфере торговли криптовалютными активами ключевыми операциями являются получение и анализ рыночных данных, запрос курсов и мониторинг изменений активов на счетах. Ниже приведены примеры кода для реализации некоторых общих требований.
При написании программы количественной торговой стратегии на FMZ сначала необходимо проанализировать требования. Итак, в зависимости от потребностей мы анализируем следующие пункты:
GET https://api.binance.com/api/v3/ticker/price。
На FMZ получите доступ к интерфейсу биржевых котировок (публичный интерфейс, не требующий подписи) с помощьюHttpQueryфункция.涨跌幅百分比 =(当前价格 - 初始价格)/ 初始价格 * 100, единица измерения — «%».Обдумайте проблему и найдите решение. Мы приступили к разработке программы.
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. Структура данных
var dictSymbolsPrice = {}: Пустой объект, используемый для хранения информации о ценах для каждой торговой пары. Ключ — это символ торговой пары, а значение — объект, содержащий название торговой пары, массив данных о ценах и информацию об изменениях.
while (true) {
// ...
}
Программа непрерывно отслеживает цены торговых пар API Binance через бесконечный цикл.
var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))
Получите текущую информацию о ценах торговой пары через API Binance. Если возвращаемое значение не является массивом, подождите 5 секунд и повторите попытку.
for (var i = 0; i < arr.length; i++) {
// ...
}
Просмотрите полученный массив информации о ценах и обновите данные в dictSymbolsPrice. Для каждой торговой пары добавьте текущую временную метку и цену в соответствующий массив данных.
} catch(e) {
Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
}
Перехватывайте исключения и записывайте информацию об исключениях, чтобы гарантировать возможность продолжения выполнения программы.
for (var symbol in dictSymbolsPrice) {
// ...
}
Пройдитесь по dictSymbolsPrice, рассчитайте увеличение или уменьшение каждой торговой пары и удалите самые ранние данные, если длина данных превышает 4 часа.
var entries = Object.entries(dictSymbolsPrice)
entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange)
for (var i = 0; i < entries.length; i++) {
// ...
}
Отсортируйте торговые пары по возрастанию или убыванию от большего к меньшему и создайте таблицу, содержащую информацию о торговых парах.
LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
Sleep(5000)
Выведите таблицу и текущее время в виде журнала и подождите 5 секунд, прежде чем перейти к следующему циклу.
Программа получает информацию о ценах торговой пары в режиме реального времени через API Binance, затем рассчитывает рост или падение и выводит ее в журнал в виде таблицы. Программа выполняется в непрерывном цикле для реализации функции мониторинга цен пар транзакций в режиме реального времени. Следует отметить, что программа включает обработку исключений, чтобы гарантировать, что выполнение не будет прервано из-за исключений при получении информации о ценах.

Поскольку данные можно собирать только по частям в начале, невозможно рассчитать подъем и падение на скользящей основе, если не собрано достаточно данных за 4 часа. Поэтому в начале начальная цена используется как точка отсчета для расчета. После сбора достаточного количества данных за 4 часа самые старые данные удаляются один за другим, чтобы сохранить 4-часовой период окна для расчета роста и падения.
Запрос ставки финансирования аналогичен коду выше. Сначала вам нужно проверить документацию API Binance, чтобы найти интерфейс, связанный со ставкой финансирования. Binance имеет несколько интерфейсов для запроса ставок финансирования. Здесь мы возьмем интерфейс контрактов на основе U в качестве примера:
GET https://fapi.binance.com/fapi/v1/premiumIndex
Поскольку контрактов слишком много, мы выводим здесь десятку с самыми высокими ставками финансирования.
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)
}
}
Возвращаемая структура данных выглядит следующим образом. Из документации Binance мы видим, что lastFundingRate — это желаемая нами ставка финансирования.
{
"symbol":"STMXUSDT",
"markPrice":"0.00883606",
"indexPrice":"0.00883074",
"estimatedSettlePrice":"0.00876933",
"lastFundingRate":"0.00026573",
"interestRate":"0.00005000",
"nextFundingTime":1702828800000,
"time":1702816229000
}
Тест реальной работы диска:

Пользователь упомянул, что нужна версия Python, и она взята с биржи OKX. Здесь кстати тоже реализовано:
https://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"
} ...
Конкретный код:
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)
Тест реальной работы диска:

Эти примеры предоставляют основные идеи дизайна и методы вызова. В реальных проектах могут потребоваться соответствующие модификации и расширения в зависимости от конкретных потребностей. Надеюсь, эти коды помогут вам лучше удовлетворить ваши разнообразные потребности в торговле цифровыми активами криптовалюты.