암호화폐 자산 거래 공간에서 시장 데이터를 얻고 분석하고, 쿼리율을 조사하고, 계정 자산 움직임을 모니터링하는 것은 모두 중요한 작업입니다. 아래는 몇 가지 일반적인 요구 사항에 대한 구현의 코드 예입니다.
FMZ 플랫폼에서 양적 거래 전략 프로그램을 작성할 때, 요구 사항에 직면했을 때 가장 먼저 해야 할 일은 그것을 분석하는 것입니다. 그래서 요구 사항에 따라 우리는 다음과 같은 내용을 분석했습니다:
GET https://api.binance.com/api/v3/ticker/price
- 그래요
FMZ 플랫폼에서,HttpQuery
교환 틱어 인터페이스 (서명 없이 공개된 인터페이스) 를 액세스하는 기능price fluctuations (%) = (current price - initial price) / initial price * 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)
}
// 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 = {}
: 각 거래 쌍의 가격 정보를 저장하는 빈 객체. 키는 거래 쌍의 기호이며 값은 거래 쌍의 이름, 가격 데이터 배열 및 가격 변동에 대한 정보를 포함하는 객체입니다.while (true) {
// ...
}
이 프로그램은 무궁무진한 루프를 통해 Binance API 거래 쌍 가격을 지속적으로 모니터링합니다. 2.2. 가격 정보를 얻으십시오
var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))
바이낸스 API를 통해 거래 쌍의 현재 가격 정보를 얻으십시오. 반환이 배열이 아닌 경우 5 초 동안 기다려 다시 시도하십시오. 2.3 가격 데이터를 업데이트
for (var i = 0; i < arr.length; i++) {
// ...
}
얻은 가격 정보 배열을 통해 반복하고 dictSymbolsPrice에서 데이터를 업데이트합니다. 각 거래 쌍에 대해 해당 데이터 배열에 현재 시간표와 가격을 추가하십시오. 2.4 예외 처리
} catch(e) {
Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
}
예외를 캡처하고 예외 정보를 로그하여 프로그램이 계속 실행될 수 있도록 합니다. 2.5. 가격 변동을 계산
for (var symbol in dictSymbolsPrice) {
// ...
}
dictSymbolsPrice를 통해 반복하여 각 거래 쌍의 가격 변동을 계산하고 4시간 이상 지속되는 경우 가장 오래된 데이터를 제거합니다. 2.6. 테이블을 정렬 및 생성
var entries = Object.entries(dictSymbolsPrice)
entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange)
for (var i = 0; i < entries.length; i++) {
// ...
}
거래 쌍의 가격 변동 순서 하락 순서로 분류하고 거래 쌍에 대한 정보를 포함하는 테이블을 생성합니다. 2.7. 로그 출력 및 지연
LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
Sleep(5000)
테이블과 현재 시간을 로그 형태로 출력하고 다음 라운드를 계속하기 위해 5초 기다립니다.
이 프로그램은 바이낸스 API를 통해 거래 쌍의 실시간 가격 정보를 얻고, 그 다음 가격 변동을 계산하고 테이블 형태로 로그에 출력합니다. 이 프로그램은 거래 쌍의 가격을 실시간으로 모니터링하는 기능을 실현하기 위해 연속적인 루프에서 실행됩니다. 이 프로그램은 가격 정보를 얻는 경우 예외로 인해 실행이 중단되지 않도록 예외 처리를 포함하고 있습니다.
데이터 수집은 초기에는 조금씩만 가능하기 때문에 4시간 분량의 데이터를 수집하지 않고서는 계속적으로 가격 변동을 계산할 수 없습니다. 따라서 초기 가격을 계산 기준으로 사용하고, 4시간 동안 충분한 데이터를 수집한 후 가장 오래된 데이터를 제거하여 가격 변동을 계산하는 4시간 분량을 유지합니다.
자금율 확인은 위의 코드와 비슷합니다. 우선 자금율 관련 인터페이스를 찾기 위해 Binance API 문서를 확인해야합니다. Binance는 자금율을 조회 할 수있는 여러 인터페이스를 가지고 있습니다.
GET https://fapi.binance.com/fapi/v1/premiumIndex
계약이 너무 많기 때문에 우리는 10대 투자율을 여기에 수출합니다.
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)
}
}
반환된 데이터 구조는 다음과 같습니다. 그리고 바이낸스 문서를 확인해보세요.
{
"symbol":"STMXUSDT",
"markPrice":"0.00883606",
"indexPrice":"0.00883074",
"estimatedSettlePrice":"0.00876933",
"lastFundingRate":"0.00026573",
"interestRate":"0.00005000",
"nextFundingTime":1702828800000,
"time":1702816229000
}
실시간 거래 실행 테스트:
한 사용자가 파이썬 버전의 예제를 요청했고, 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": "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)
실시간 거래 실행 테스트:
이 예제들은 기본적인 디자인 아이디어와 호출 방법을 제공하는데, 실제 프로젝트는 특정 필요에 따라 적절한 변경 및 확장 작업을 수행해야 할 수 있습니다. 이러한 코드가 암호화폐 디지털 자산 거래의 다양한 요구를 더 잘 충족시키는 데 도움이 될 수 있기를 바랍니다.