В сфере торговли криптовалютными активами ключевыми операциями являются получение и анализ рыночных данных, запросных тарифов и мониторинг изменений в активах счетов. Ниже приведены примеры для реализации некоторых распространенных потребностей.
При написании количественной стратегии торговли на 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)
}
}
var dictSymbolsPrice = {}
: пустой объект, используемый для хранения ценовой информации для каждой торговой пары. Ключ - это символ торговой пары, а значение - объект, содержащий название торговой пары, массив данных о ценах и информацию о паре.while (true) {
// ...
}
Программа постоянно отслеживает цены на сделки в Binance API через бесконечный цикл.var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))
Получить информацию о текущей цене пары с помощью API Binance. Если возвращается неарифметика, подождите 5 секунд и попробуйте снова.for (var i = 0; i < arr.length; i++) {
// ...
}
Пройдите через полученные матрицы информации о ценах, обновляя данные в диктСимволахPrice. Для каждой сделки в соответствующую матрицу данных добавляется текущий временной диапазон и цена.} 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 часа, последовательно удаляется самый старый данный, чтобы сохранить четырехчасовое окно.
Сравнение кода к запросу на ставку и выше аналогично. Для начала нужно просмотреть API-документацию Binance, чтобы найти интерфейс, связанный с ставкой.
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)
Проверка на диске:
Эти примеры дают базовые идеи по дизайну, методы использования, которые могут потребоваться в реальных проектах для соответствующих изменений и расширений в соответствии с конкретными потребностями. Надеемся, что эти коды помогут вам лучше удовлетворить различные потребности в торговле криптовалютами и цифровыми активами.
98-K-диапазон отслеживания _LongМы ожидаем, что учительница в скором времени выпустит пример изменения активов @monitoringaccount.
98-K-диапазон отслеживания _LongПоздравления
Изобретатели количественного измерения - мечтыХорошо, это в планах.