SPACE ID 价格

SPACE ID价格ID

上线
买入
¥1.31CNY
+2.48%1D
截至今日20:58(UTC),SPACE ID(ID)的人民币价格为 ¥1.31 CNY。
价格图表
SPACE ID兑CNY价格实时走势图(ID/CNY)
最近更新时间2025-08-13 20:58:12(UTC+0)

今日SPACE ID实时价格CNY

今日 SPACE ID 实时价格为 ¥1.31 CNY,当前市值为 ¥1.42B。过去24小时内,SPACE ID 价格涨幅为2.48%,24小时交易量为 ¥216.56M。ID/CNY(SPACE ID 兑 CNY)兑换率实时更新。
1SPACE ID的人民币价格是多少?
截至目前,SPACE ID(ID)的人民币价格为 ¥1.31 CNY。您现在可以用 1ID 兑换 ¥1.31,或用 ¥10 兑换 7.64 ID。在过去24小时内, ID兑换CNY的最高价格为 ¥1.33 CNY,ID兑换CNY的最低价格为 ¥1.26 CNY。

您认为今天 SPACE ID 价格会上涨还是下跌?

总票数:
上涨
0
下跌
0
投票数据每24小时更新一次。它反映了社区对 SPACE ID 的价格趋势预测,不应被视作投资建议。

SPACE ID市场信息

价格表现(24小时)
24小时
24小时最低价¥1.2624小时最高价¥1.33
历史最高价:
¥13.14
涨跌幅(24小时):
+2.48%
涨跌幅(7日):
+14.56%
涨跌幅(1年):
-52.34%
市值排名:
#243
市值:
¥1,423,543,223.9
完全稀释市值:
¥1,423,543,223.9
24小时交易额:
¥216,560,304.84
流通量:
1.09B ID
最大发行量:
2.00B ID

SPACE ID (ID) 简介

SPACE ID 令牌:重新定义数字货币的概念

在区块链技术只是概念的时借,人们对其将如何改变我们的生活持怀疑态度。然而,这种创新技术已经迅速渗透到我们生活的各个方面,其中包括如今流行的数字货币。顾名思义,数字货币是以数字形式存在的货币。SPACE ID 令牌只是其中一大堆数字货币中的一种。

SPACE ID 令牌的独特性

  1. 去中心化: 作为一种去中心化的货币,SPACE ID 令牌取消了中间人的角色,使得交易更加透明和公平。它具有对抗国家级审查的能力,这意味着没有任何政府或机构能禁止或限制人们使用 SPACE ID 令牌。

  2. 安全性: 使用区块链技术,为 SPACE ID 令牌实现铁壁般的安全性。每笔交易都会永久记录在不可篡改的共享公共账簿中,使其不受黑客攻击。

  3. 无缝交易: SPACE ID 令牌通过区块链中的智能合约实现快速、方便的交易。用户无需通过任何银行或金融机构就可以进行交易,节省了时间和手续费。

对 SPACE ID 令牌的看法

随着数字货币的不断发展和创新,潜在的用途和投资机会也日益增多。SPACE ID 令牌不仅为区块链技术带来了新的可能性,还为全球投资者提供了稳健的投资机会。

尽管目前数字货币行业在某些方面仍存在风险,比如价格波动或潜在的网络安全威胁,但这并没有阻止 SPACE ID 令牌或其他数字货币的增长。其强大的去中心化能力、安全性和无缝交易能力使其受到了越来越多的人们的关注和追捧。

SPACE ID 令牌无疑为数字货币市场打开了新的篇章,充满了无尽的可能性。这让我们对未来的数字货币市场有了更多的期待,也对SPACE ID 令牌有了更高的期许。

SPACE ID 的 AI 分析报告

今日加密市场热点查看报告

SPACE ID价格历史(CNY)

过去一年,SPACE ID价格上涨了-52.34%。在此期间,ID兑CNY的最高价格为 ¥5.17,ID兑CNY 的最低价格为 ¥0.9686。
时间涨跌幅(%)涨跌幅(%)最低价相应时间段内 {0} 的最低价。最高价 最高价
24h+2.48%¥1.26¥1.33
7d+14.56%¥1.13¥1.33
30d+5.51%¥1.08¥1.48
90d-16.13%¥0.9686¥1.64
1y-52.34%¥0.9686¥5.17
所有时间+630.94%¥0.9686(2025-06-22, 53天前)¥13.14(2024-03-17, 1年前)
SPACE ID价格历史数据(所有时间)

SPACE ID的最高价格是多少?

ID 的历史最高价(ATH)折合 CNY 为¥13.14,录得时间为2024-03-17。与SPACE ID历史最高价相比,当前SPACE ID价格跌幅为90.03%。

SPACE ID的最低价格是多少?

ID 的历史最低价(ATL)折合 CNY 为¥0.9686,录得时间为2025-06-22。与SPACE ID历史最低价相比,当前SPACE ID价格涨幅为35.19%。

SPACE ID价格预测

什么时候是购买 ID 的好时机?我现在应该买入还是卖出 ID?

在决定买入还是卖出 ID 时,您必须首先考虑自己的交易策略。长期交易者和短期交易者的交易活动也会有所不同。Bitget ID 技术分析 可以为您提供交易参考。
根据 ID 4小时技术分析,交易信号为 强力买入
根据 ID 1日技术分析,交易信号为 强力买入
根据 ID 1周技术分析,交易信号为 卖出

ID 在2026的价格是多少?

根据ID的历史价格表现预测模型,预计ID的价格将在2026达到¥1.49

ID 在2031的价格是多少?

预计2031年ID价格涨跌为+19.00%。到2031年底,预计ID价格将达到 ¥4.43,累计投资回报率为+249.47%。

热门活动

如何购买SPACE ID(ID)

创建您的免费 Bitget 账户

创建您的免费 Bitget 账户

使用您的电子邮件地址/手机号码在 Bitget 注册,并创建一个强大的密码以确保您的账户安全
认证您的帐户

认证您的帐户

输入您的个人信息并上传有效的身份照片进行身份认证
将 ID 兑换为 CNY

将 ID 兑换为 CNY

在 Bitget 上选择加密货币进行交易。

常见问题

哪些因素影响SPACE ID的价格?

SPACE ID的价格受到多个因素的影响,包括市场需求与供应、投资者情绪、技术发展、合作伙伴关系、监管新闻以及整体市场状况。

我如何在Bitget交易所购买SPACE ID?

要在Bitget交易所购买SPACE ID,您需要在Bitget上创建一个账户,完成必要的验证步骤,将资金存入您的账户,然后导航到交易部分购买SPACE ID。

SPACE ID 是一个好的投资吗?

SPACE ID 是否适合投资取决于多种因素,包括您的个人风险承受能力、投资目标以及对项目基本面的研究。在投资之前,进行彻底的研究并考虑市场条件非常重要。

SPACE ID的未来价格预测是什么?

SPACE ID的价格预测,像任何加密货币一样,都是投机性的,并且在分析师之间可能会有很大的差异。谨慎对待价格预测,并将其视为您决策过程中的众多因素之一是很重要的。

SPACE ID能在明年达到历史最高点吗?

虽然如果出现积极的发展,例如增加采用或有利的市场条件,SPACE ID有可能达到历史最高点,但预测具体的价格水平是投机和不确定的。

在Bitget交易所交易SPACE ID的最佳策略是什么?

针对SPACE ID的良好交易策略可能包括设定明确的进出点、使用止损订单、分析市场趋势,并及时了解与SPACE ID及更广泛的加密货币市场相关的新闻。

为什么SPACE ID会经历高波动性?

SPACE ID的波动性可归因于市场动态,包括投机交易、低流动性、宏观经济因素以及投资者情绪的变化。加密货币通常比传统资产更具波动性。

SPACE ID的价格波动如何影响我的投资组合?

SPACE ID价格的波动可能会影响您的投资组合价值,特别是当您对该资产有显著敞口时。投资多样化可以帮助减轻波动性对投资组合的影响。

SPACE ID 最近有哪些发展可能影响其价格?

可能影响 SPACE ID 价格的近期发展包括新合作关系、技术升级、社区参与举措或监管变化。保持对这些发展的了解对于理解价格变化至关重要。

投资SPACE ID是否存在风险?

是的,投资SPACE ID存在风险,例如市场波动、监管变化、潜在的安全漏洞以及来自其他项目的竞争。评估这些风险非常重要,并且只投资您愿意承受损失的金额。

SPACE ID 现价多少?

SPACE ID 的实时价格为 ¥1.31(ID/CNY),当前市值为 ¥1,423,543,223.9 CNY。由于加密货币市场全天候无间断交易,SPACE ID 的价格经常波动。您可以在 Bitget 上查看 SPACE ID 的市场价格及其历史数据。

SPACE ID 的24小时成交量是多少?

过去24小时,SPACE ID 的成交量是 ¥216.56M。

SPACE ID 的最高价是多少?

SPACE ID 的最高价是 ¥13.14。这个最高价是指 SPACE ID 上市以来的最高价格。

Bitget 上能买 SPACE ID 吗?

可以。SPACE ID 已经在 Bitget 中心化交易所上架。更多信息请查阅我们实用的 如何购买 space-id 指南。

我可以通过投资 SPACE ID 获得稳定的收入吗?

当然,Bitget 推出了一个机器人交易平台,其提供智能交易机器人,可以自动执行您的交易,帮您赚取收益。

我在哪里能以最低的费用购买 SPACE ID?

Bitget 提供行业领先的交易费用和市场深度,以确保交易者能够从投资中获利。您可通过 Bitget 交易所交易。

您可以在哪里购买SPACE ID(ID)?

通过 Bitget App 购买
数分钟完成账户注册,即可通过信用卡或银行转账购买加密货币。
Download Bitget APP on Google PlayDownload Bitget APP on AppStore
通过 Bitget 交易所交易
将加密货币存入 Bitget 交易所,交易流动性大且费用低

视频部分 — 快速认证、快速交易

play cover
如何在 Bitget 完成身份认证以防范欺诈
1. 登录您的 Bitget 账户。
2. 如果您是 Bitget 的新用户,请观看我们的教程,了解如何创建账户。
3. 将鼠标移动到您的个人头像上,点击【未认证】,然后点击【认证】。
4. 选择您签发的国家或地区和证件类型,然后根据指示进行操作。
5. 根据您的偏好,选择“手机认证”或“电脑认证”。
6. 填写您的详细信息,提交身份证复印件,并拍摄一张自拍照。
7. 提交申请后,身份认证就完成了!
加密货币投资,包括通过 Bitget 在线购买 SPACE ID,都存在市场风险。Bitget 为您提供简单方便的 SPACE ID 购买方式,我们尽最大努力让我们的用户充分了解我们在交易所提供的每一种加密货币。但是,我们不对您的 SPACE ID 购买可能产生的结果负责。此页面和本网站包含的任何信息均不代表对任何特定加密货币的认可,任何价格数据均采集自公开互联网,不被视为来自Bitget的买卖要约。

ID/CNY 价格计算器

ID
CNY
1 ID = 1.31 CNY,当前 1 SPACE ID(ID)兑换 CNY 的价格为 1.31。汇率实时更新,仅供参考。
在所有主流交易平台中,Bitget 提供最低的交易手续费。VIP 级别越高,费率越优惠。

ID资料

SPACE ID评级
4.4
100 评级
合约:
0x2dfF...f766406(BNB Smart Chain (BEP20))
更多more
相关链接:

Bitget 观点

BGUSER-NXB07P6L
BGUSER-NXB07P6L
3天前
2
这是把在线自适应(自动寻找最优开/平仓阈值)完整合并后的单文件脚本。直接保存为 okx_bitget_arb_adaptive.py 运行即可(先小仓或先用 DRY_RUN=True 验证)。 你要把 6 个占位符密钥换成你自己的(我保留了硬编码位点,便于你直接填)。 # -*- coding: utf-8 -*- """ OKX ↔ Bitget 永续套利(在线自适应阈值) - 实时订阅标记价/最新价 - 价差接近零时锁价开仓;达到阈值平仓 - 持续记录价差CSV;每隔固定时间用最近窗口做网格搜索,动态更新开/平仓阈值 - 参数抑制抖动:单次更新限制步长 """ import os, hmac, base64, hashlib, json, time, asyncio, datetime as dt import csv, math, statistics, pathlib import requests, websockets from collections import deque ######################## # ==== 配置:硬编码密钥(在本地替换占位符) ==== # ######################## OKX_API_KEY = "REPLACE_WITH_YOUR_OKX_API_KEY" OKX_API_SECRET = "REPLACE_WITH_YOUR_OKX_API_SECRET" OKX_API_PASSPHRASE = "REPLACE_WITH_YOUR_OKX_PASSPHRASE" BG_API_KEY = "REPLACE_WITH_YOUR_BITGET_API_KEY" BG_API_SECRET = "REPLACE_WITH_YOUR_BITGET_API_SECRET" BG_PASSPHRASE = "REPLACE_WITH_YOUR_BITGET_PASSPHRASE" ######################## # ==== 交易/策略参数 ==== # ######################## # 标的 OKX_INST_ID = "BTC-USDT-SWAP" # OKX 永续 BG_SYMBOL = "BTCUSDT" # Bitget USDT本位永续 BG_PRODUCT = "USDT-FUTURES" # Bitget 产品线 # 初始阈值(会被在线优化动态更新) OPEN_EQUALITY_USD = 2.0 # |价差| <= 2 开仓锁价 CLOSE_SPREAD_USD = 18.0 # |价差| >= 18 平仓 USE_MARK_PRICE = True # True=标记价;False=最新成交价 # 手数/张数(先小量测试) OKX_SZ = "10" BG_SIZE = "10" # 开仓方向(默认 OKX 多 / Bitget 空;可改) OPEN_OKX_SIDE = "buy" # buy/sell OPEN_BG_SIDE = "sell" # buy/sell OKX_TD_MODE = "cross" # cross/isolated OKX_POS_SIDE = "long" if OPEN_OKX_SIDE=="buy" else "short" BG_MARGIN_COIN = "USDT" # REST & WS OKX_BASE = "https://www.okx.com" BG_BASE = "https://api.bitget.com" OKX_WS_PUBLIC = "wss://ws.okx.com:8443/ws/v5/public" BG_WS_PUBLIC = "wss://ws.bitget.com/v2/ws/public" # 运行控制 DRY_RUN = True # True=只打印不下单;False=真下单(建议先True验证) REQUEST_TIMEOUT = 10 WS_RETRY_DELAY = 2 ######################## # ==== 在线自适应配置 ==== # ######################## CSV_LOG_PATH = "spread_log.csv" # 价差日志 FEE_USD_PER_SIDE = 2.0 # 单边总成本估计(手续费+滑点+资金费摊销),自行校准 SLIPPAGE_USD = 0.5 # 触发时额外滑点预算(用于回测) USE_SHARPE = False # 目标函数:False=最大化总收益;True=最大化夏普 ANNUALIZATION_K = 365.0 # 夏普年化基数(按日收益) ROLLING_HOURS = 24 # 在线优化窗口(过去N小时数据) OPT_INTERVAL_MIN = 10 # 每隔N分钟重优化 MAX_STEP_USD = 2.0 # 单次参数最大更新步长,抑制抖动 # 网格搜索范围(可按你的风格扩大/缩窄) OPEN_GRID = [round(x * 0.5, 2) for x in range(1, 11)] # 0.5,1.0,...,5.0 CLOSE_GRID = list(range(8, 41, 2)) # 8,10,...,40 # 内存滚动缓存(减少IO) ROLLING_CACHE_MAX = 200000 rolling_buf = deque(maxlen=ROLLING_CACHE_MAX) last_opt_ts = 0 # 上次优化时间(epoch秒) ######################## # ==== 工具函数 ==== # ######################## def iso_ts_ms_str(): return str(int(time.time() * 1000)) def okx_headers(method, path, body): ts = dt.datetime.utcnow().isoformat(timespec="milliseconds") + "Z" prehash = f"{ts}{method.upper()}{path}{body}" sign = base64.b64encode(hmac.new(OKX_API_SECRET.encode(), prehash.encode(), hashlib.sha256).digest()).decode() return { "OK-ACCESS-KEY": OKX_API_KEY, "OK-ACCESS-SIGN": sign, "OK-ACCESS-TIMESTAMP": ts, "OK-ACCESS-PASSPHRASE": OKX_API_PASSPHRASE, "Content-Type": "application/json" } def bg_sign(ts_ms:str, method:str, path:str, body:str, secret:str)->str: msg = f"{ts_ms}{method.upper()}{path}{body}".encode() sign = hmac.new(secret.encode(), msg, hashlib.sha256).digest() return base64.b64encode(sign).decode() def bg_headers(method, path, body): ts = iso_ts_ms_str() sign = bg_sign(ts, method, path, body, BG_API_SECRET) return { "ACCESS-KEY": BG_API_KEY, "ACCESS-SIGN": sign, "ACCESS-PASSPHRASE": BG_PASSPHRASE, "ACCESS-TIMESTAMP": ts, "Content-Type": "application/json" } ######################## # ==== 下单/平仓(OKX) ==== # ######################## def okx_place_market(instId, tdMode, side, posSide, sz): path = "/api/v5/trade/order" url = OKX_BASE + path body = { "instId": instId, "tdMode": tdMode, "side": side, # buy/sell "posSide": posSide, # long/short(对冲) "ordType": "market", "sz": str(sz) } data = json.dumps(body, separators=(",",":")) if DRY_RUN: print("[DRYRUN][OKX] place", data) return {"dryrun":True, "req":body} r = requests.post(url, headers=okx_headers("POST", path, data), data=data, timeout=REQUEST_TIMEOUT) r.raise_for_status() return r.json() def okx_close_market(instId, tdMode, posSide, sz): side = "sell" if posSide=="long" else "buy" return okx_place_market(instId, tdMode, side, posSide, sz) ######################## # ==== 下单/平仓(Bitget v2) ==== # ######################## def bg_place_market(symbol, productType, marginCoin, side, tradeSide, size): path = "/api/v2/mix/order/place-order" url = BG_BASE + path body = { "symbol": symbol, "productType": productType, # USDT-FUTURES "marginCoin": marginCoin, # USDT "side": side, # buy/sell "tradeSide": tradeSide, # open/close "orderType": "market", "size": str(size), "clientOid": f"arb_{int(time.time()*1000)}" } data = json.dumps(body, separators=(",",":")) if DRY_RUN: print("[DRYRUN][Bitget] place", data) return {"dryrun":True, "req":body} r = requests.post(url, headers=bg_headers("POST", path, data), data=data, timeout=REQUEST_TIMEOUT) r.raise_for_status() return r.json() def bg_open(symbol, productType, marginCoin, side, size): return bg_place_market(symbol, productType, marginCoin, side, "open", size) def bg_close(symbol, productType, marginCoin, side, size): opp_side = "buy" if side=="sell" else "sell" return bg_place_market(symbol, productType, marginCoin, opp_side, "close", size) ######################## # ==== 价格源(WS) ==== # ######################## class PriceFeed: def __init__(self): self.okx_price = None self.bg_price = None def okx_channel(self): if USE_MARK_PRICE: return {"op":"subscribe","args":[{"channel":"mark-price","instId":OKX_INST_ID}]} else: return {"op":"subscribe","args":[{"channel":"tickers","instId":OKX_INST_ID}]} def bg_channel(self): channel = "markPrice" if USE_MARK_PRICE else "ticker" return {"op":"subscribe","args":[{"instType":"USDT-FUTURES","channel":channel,"instId":BG_SYMBOL}]} async def okx_loop(self): while True: try: async with websockets.connect(OKX_WS_PUBLIC, ping_interval=20) as ws: await ws.send(json.dumps(self.okx_channel())) async for msg in ws: data = json.loads(msg) if data.get("event")=="subscribe": print("[OKX] subscribed") elif "data" in data: d = data["data"][0] self.okx_price = float(d["markPx"] if USE_MARK_PRICE else d["last"]) except Exception as e: print("[OKX WS] error:", e) await asyncio.sleep(WS_RETRY_DELAY) async def bg_loop(self): while True: try: async with websockets.connect(BG_WS_PUBLIC, ping_interval=20) as ws: await ws.send(json.dumps(self.bg_channel())) async for msg in ws: data = json.loads(msg) if data.get("event")=="subscribe": print("[Bitget] subscribed") elif "arg" in data and "data" in data: d = data["data"][0] if USE_MARK_PRICE: self.bg_price = float(d.get("markPrice") or d.get("price")) else: self.bg_price = float(d.get("last") or d.get("price")) except Exception as e: print("[Bitget WS] error:", e) await asyncio.sleep(WS_RETRY_DELAY) ######################## # ==== 价差日志 & 回测优化 ==== # ######################## def ensure_csv_header(path: str): p = pathlib.Path(path) if not p.exists(): with open(path, "w", newline="") as f: w = csv.writer(f) w.writerow(["ts_ms","okx","bg","spread"]) def log_spread(ts_ms: int, okx: float, bg: float): ensure_csv_header(CSV_LOG_PATH) with open(CSV_LOG_PATH, "a", newline="") as f: csv.writer(f).writerow([ts_ms, f"{okx:.4f}", f"{bg:.4f}", f"{okx-bg:.4f}"]) rolling_buf.append((ts_ms, okx, bg, okx - bg)) def load_recent_spreads(hours: int): now_ms = int(time.time() * 1000) cutoff = now_ms - hours * 3600 * 1000 data = [row for row in rolling_buf if row[0] >= cutoff] if data: return data try: out = [] with open(CSV_LOG_PATH, "r") as f: r = csv.DictReader(f) for row in r: ts = int(row["ts_ms"]) if ts >= cutoff: okx = float(row["okx"]); bg = float(row["bg"]) sp = float(row["spread"]) out.append((ts, okx, bg, sp)) return out except FileNotFoundError: return [] def simulate_pnl(spreads, open_eq: float, close_sp: float, fee_per_side: float = FEE_USD_PER_SIDE, slip: float = SLIPPAGE_USD): """历史spread回测:锁价开→阈值平。返回(总收益, 日收益序列)""" pos = False entry = None pnl = 0.0 day_pnl = {} for ts, _, _, sp in spreads: day = dt.datetime.utcfromtimestamp(ts/1000).date().isoformat() if not pos: if abs(sp) <= open_eq: pos = True entry = sp pnl -= (fee_per_side*2) # 同时两边开仓 pnl -= slip else: if abs(sp) >= close_sp: pnl += (abs(sp) - abs(entry)) pnl -= (fee_per_side*2) # 两边平仓 pnl -= slip pos = False entry = None day_pnl.setdefault(day, 0.0) day_pnl[day] = pnl # 累计→日度增量 days = sorted(day_pnl.keys()) daily = [] prev = 0.0 for d in days: daily.append(day_pnl[d]-prev) prev = day_pnl[d] return pnl, daily def score_pnl(total_pnl: float, daily_pnls): if not USE_SHARPE: return total_pnl if len(daily_pnls) < 2: return -1e9 mu = statistics.mean(daily_pnls) sd = statistics.pstdev(daily_pnls) or 1e-9 return (mu / sd) * math.sqrt(ANNUALIZATION_K) def grid_search_opt(spreads): """返回(best_open, best_close, best_score, best_total_pnl)""" best = (None, None, -1e18, 0.0) for o in OPEN_GRID: for c in CLOSE_GRID: if c <= o + 2.0: # 开/平阈值至少拉开2美元,避免抖动 continue total, daily = simulate_pnl(spreads, o, c) s = score_pnl(total, daily) if s > best[2]: best = (o, c, s, total) return best def clamp_step(current: float, target: float, step: float): if current is None: return target if target > current: return min(target, current + step) if target < current: return max(target, current - step) return current def maybe_reoptimize(state): """定期基于最近窗口重算阈值;仅在空仓时更新""" global OPEN_EQUALITY_USD, CLOSE_SPREAD_USD, last_opt_ts if state.has_position: return now = time.time() if now - last_opt_ts < OPT_INTERVAL_MIN * 60: return spreads = load_recent_spreads(ROLLING_HOURS) if len(spreads) < 500: # 数据太少不优化 return o, c, s, total = grid_search_opt(spreads) if o is None: return new_open = clamp_step(OPEN_EQUALITY_USD, o, MAX_STEP_USD) new_close = clamp_step(CLOSE_SPREAD_USD, c, MAX_STEP_USD) print(f"\n[OPT] {ROLLING_HOURS}h best_open={o:.2f}, best_close={c:.2f}, " f"score={s:.4f}, backtest_total={total:.2f} -> APPLY open={new_open:.2f}, close={new_close:.2f}") OPEN_EQUALITY_USD = round(new_open, 2) CLOSE_SPREAD_USD = round(new_close, 2) last_opt_ts = now ######################## # ==== 策略执行 ==== # ######################## class ArbState: def __init__(self): self.has_position = False self.entry_spread = None self.okx_side_open = OPEN_OKX_SIDE self.bg_side_open = OPEN_BG_SIDE async def main(): feed = PriceFeed() state = ArbState() tasks = [asyncio.create_task(feed.okx_loop()), asyncio.create_task(feed.bg_loop())] try: print(f"[INIT] USE_MARK_PRICE={USE_MARK_PRICE} | DRY_RUN={DRY_RUN}") print(f"[INIT] INIT OPEN_EQUALITY_USD={OPEN_EQUALITY_USD} | CLOSE_SPREAD_USD={CLOSE_SPREAD_USD}") while True: await asyncio.sleep(0.2) if feed.okx_price is None or feed.bg_price is None: continue spread = feed.okx_price - feed.bg_price # OKX - Bitget now = dt.datetime.now().strftime("%H:%M:%S") print(f"{now} P_okx={feed.okx_price:.2f} P_bg={feed.bg_price:.2f} " f"spread={spread:.2f} | open={OPEN_EQUALITY_USD:.2f} close={CLOSE_SPREAD_USD:.2f}", end="\r") # 记录价差(供回测优化) ts_ms = int(time.time()*1000) log_spread(ts_ms, feed.okx_price, feed.bg_price) # 无持仓 → 锁价开仓 if not state.has_position and abs(spread) <= OPEN_EQUALITY_USD: print(f"\n[OPEN] |spread|<=OPEN({OPEN_EQUALITY_USD:.2f}),尝试锁价开仓 spread={spread:.2f}") try: okx_res = okx_place_market(OKX_INST_ID, OKX_TD_MODE, state.okx_side_open, OKX_POS_SIDE, OKX_SZ) bg_res = bg_open(BG_SYMBOL, BG_PRODUCT, BG_MARGIN_COIN, state.bg_side_open, BG_SIZE) print("[OKX OPEN RES]", okx_res) print("[BG OPEN RES]", bg_res) state.has_position = True state.entry_spread = spread except Exception as e: print("[OPEN ERROR]", e) # 有持仓 → 触发平仓 if state.has_position and abs(spread) >= CLOSE_SPREAD_USD: print(f"\n[CLOSE] |spread|>=CLOSE({CLOSE_SPREAD_USD:.2f}),同时平仓 spread={spread:.2f}") try: okx_res = okx_close_market(OKX_INST_ID, OKX_TD_MODE, OKX_POS_SIDE, OKX_SZ) bg_res = bg_close(BG_SYMBOL, BG_PRODUCT, BG_MARGIN_COIN, state.bg_side_open, BG_SIZE) print("[OKX CLOSE RES]", okx_res) print("[BG CLOSE RES]", bg_res) pnl = (abs(spread) - abs(state.entry_spread or 0.0)) print(f"[PNL est] Δ|spread| ≈ {pnl:.2f} USD(未含费率/资金费/滑点)") state.has_position = False state.entry_spread = None except Exception as e: print("[CLOSE ERROR]", e) # 空仓时尝试在线重优化阈值 maybe_reoptimize(state) finally: for t in tasks: t.cancel() if __name__ == "__main__": asyncio.run(main()) 运行提示 pip install websockets requests(无第三方也能跑;可选 python-dotenv 已不需要)。 先 DRY_RUN=True 跑通数据和下单请求格式;再改 False 小仓验证。 想要更激进/保守,调整 OPEN_GRID/CLOSE_GRID 搜索范围、FEE_USD_PER_SIDE 成本估计、ROLLING_HOURS/OPT_INTERVAL_MIN 优化频率。 要不要我再给一个**“σ倍数阈值(OPEN=k1·σ,CLOSE=k2·σ)”的自适应版本,或把双向套利(当 OKX 更贵时自动反向)也一并集成进去?你更偏好哪一种优化目标:最大收益还是夏普比率**?
BTC+2.36%
ARB+17.32%
BGUSER-NXB07P6L
BGUSER-NXB07P6L
3天前
1
# -*- coding: utf-8 -*- import hmac, base64, hashlib, json, time, asyncio, datetime as dt import requests, websockets ######################## # ==== 配置:硬编码密钥(在本地替换占位符) ==== # ######################## OKX_API_KEY = "REPLACE_WITH_YOUR_OKX_API_KEY" OKX_API_SECRET = "REPLACE_WITH_YOUR_OKX_API_SECRET" OKX_API_PASSPHRASE = "REPLACE_WITH_YOUR_OKX_API_PASSPHRASE" BG_API_KEY = "REPLACE_WITH_YOUR_BITGET_API_KEY" BG_API_SECRET = "REPLACE_WITH_YOUR_BITGET_API_SECRET" BG_PASSPHRASE = "REPLACE_WITH_YOUR_BITGET_PASSPHRASE" ######################## # ==== 交易/策略参数 ==== # ######################## # 标的 OKX_INST_ID = "BTC-USDT-SWAP" # OKX 永续 BG_SYMBOL = "BTCUSDT" # Bitget USDT本位永续 BG_PRODUCT = "USDT-FUTURES" # Bitget 产品线 # 阈值 OPEN_EQUALITY_USD = 2.0 # |价差| <= 2 开仓锁价 CLOSE_SPREAD_USD = 18.0 # |价差| >= 18 平仓 USE_MARK_PRICE = True # True=标记价;False=最新成交价 # 手数/张数(先小量测试) OKX_SZ = "10" BG_SIZE = "10" # 开仓方向(默认 OKX 多 / Bitget 空;可改) OPEN_OKX_SIDE = "buy" # buy/sell OPEN_BG_SIDE = "sell" # buy/sell OKX_TD_MODE = "cross" # cross/isolated OKX_POS_SIDE = "long" if OPEN_OKX_SIDE=="buy" else "short" BG_MARGIN_COIN = "USDT" # REST & WS OKX_BASE = "https://www.okx.com" BG_BASE = "https://api.bitget.com" OKX_WS_PUBLIC = "wss://ws.okx.com:8443/ws/v5/public" BG_WS_PUBLIC = "wss://ws.bitget.com/v2/ws/public" # 运行控制 DRY_RUN = False # False=真下单(先小仓验证) REQUEST_TIMEOUT = 10 WS_RETRY_DELAY = 2 ######################## # ==== 工具函数 ==== # ######################## def iso_ts_ms_str(): return str(int(time.time() * 1000)) def okx_headers(method, path, body): ts = dt.datetime.utcnow().isoformat(timespec="milliseconds") + "Z" prehash = f"{ts}{method.upper()}{path}{body}" sign = base64.b64encode(hmac.new(OKX_API_SECRET.encode(), prehash.encode(), hashlib.sha256).digest()).decode() return { "OK-ACCESS-KEY": OKX_API_KEY, "OK-ACCESS-SIGN": sign, "OK-ACCESS-TIMESTAMP": ts, "OK-ACCESS-PASSPHRASE": OKX_API_PASSPHRASE, "Content-Type": "application/json" } def bg_sign(ts_ms:str, method:str, path:str, body:str, secret:str)->str: msg = f"{ts_ms}{method.upper()}{path}{body}".encode() sign = hmac.new(secret.encode(), msg, hashlib.sha256).digest() return base64.b64encode(sign).decode() def bg_headers(method, path, body): ts = iso_ts_ms_str() sign = bg_sign(ts, method, path, body, BG_API_SECRET) return { "ACCESS-KEY": BG_API_KEY, "ACCESS-SIGN": sign, "ACCESS-PASSPHRASE": BG_PASSPHRASE, "ACCESS-TIMESTAMP": ts, "Content-Type": "application/json" } ######################## # ==== 下单/平仓(OKX) ==== # ######################## def okx_place_market(instId, tdMode, side, posSide, sz): path = "/api/v5/trade/order" url = OKX_BASE + path body = { "instId": instId, "tdMode": tdMode, "side": side, # buy/sell "posSide": posSide, # long/short(对冲) "ordType": "market", "sz": str(sz) } data = json.dumps(body, separators=(",",":")) if DRY_RUN: print("[DRYRUN][OKX] place", data) return {"dryrun":True, "req":body} r = requests.post(url, headers=okx_headers("POST", path, data), data=data, timeout=REQUEST_TIMEOUT) r.raise_for_status() return r.json() def okx_close_market(instId, tdMode, posSide, sz): side = "sell" if posSide=="long" else "buy" return okx_place_market(instId, tdMode, side, posSide, sz) ######################## # ==== 下单/平仓(Bitget v2) ==== # ######################## def bg_place_market(symbol, productType, marginCoin, side, tradeSide, size): path = "/api/v2/mix/order/place-order" url = BG_BASE + path body = { "symbol": symbol, "productType": productType, # USDT-FUTURES "marginCoin": marginCoin, # USDT "side": side, # buy/sell "tradeSide": tradeSide, # open/close "orderType": "market", "size": str(size), "clientOid": f"arb_{int(time.time()*1000)}" } data = json.dumps(body, separators=(",",":")) if DRY_RUN: print("[DRYRUN][Bitget] place", data) return {"dryrun":True, "req":body} r = requests.post(url, headers=bg_headers("POST", path, data), data=data, timeout=REQUEST_TIMEOUT) r.raise_for_status() return r.json() def bg_open(symbol, productType, marginCoin, side, size): return bg_place_market(symbol, productType, marginCoin, side, "open", size) def bg_close(symbol, productType, marginCoin, side, size): opp_side = "buy" if side=="sell" else "sell" return bg_place_market(symbol, productType, marginCoin, opp_side, "close", size) ######################## # ==== 价格源(WS) ==== # ######################## class PriceFeed: def __init__(self): self.okx_price = None self.bg_price = None def okx_channel(self): if USE_MARK_PRICE: return {"op":"subscribe","args":[{"channel":"mark-price","instId":OKX_INST_ID}]} else: return {"op":"subscribe","args":[{"channel":"tickers","instId":OKX_INST_ID}]} def bg_channel(self): channel = "markPrice" if USE_MARK_PRICE else "ticker" return {"op":"subscribe","args":[{"instType":"USDT-FUTURES","channel":channel,"instId":BG_SYMBOL}]} async def okx_loop(self): while True: try: async with websockets.connect(OKX_WS_PUBLIC, ping_interval=20) as ws: await ws.send(json.dumps(self.okx_channel())) async for msg in ws: data = json.loads(msg) if data.get("event")=="subscribe": print("[OKX] subscribed") elif "data" in data: d = data["data"][0] self.okx_price = float(d["markPx"] if USE_MARK_PRICE else d["last"]) except Exception as e: print("[OKX WS] error:", e) await asyncio.sleep(WS_RETRY_DELAY) async def bg_loop(self): while True: try: async with websockets.connect(BG_WS_PUBLIC, ping_interval=20) as ws: await ws.send(json.dumps(self.bg_channel())) async for msg in ws: data = json.loads(msg) if data.get("event")=="subscribe": print("[Bitget] subscribed") elif "arg" in data and "data" in data: d = data["data"][0] if USE_MARK_PRICE: self.bg_price = float(d.get("markPrice") or d.get("price")) else: self.bg_price = float(d.get("last") or d.get("price")) except Exception as e: print("[Bitget WS] error:", e) await asyncio.sleep(WS_RETRY_DELAY) ######################## # ==== 策略执行 ==== # ######################## class ArbState: def __init__(self): self.has_position = False self.entry_spread = None self.okx_side_open = OPEN_OKX_SIDE self.bg_side_open = OPEN_BG_SIDE async def main(): feed = PriceFeed() state = ArbState() tasks = [asyncio.create_task(feed.okx_loop()), asyncio.create_task(feed.bg_loop())] try: while True: await asyncio.sleep(0.2) if feed.okx_price is None or feed.bg_price is None: continue spread = feed.okx_price - feed.bg_price # OKX - Bitget now = dt.datetime.now().strftime("%H:%M:%S") print(f"{now} P_okx={feed.okx_price:.2f} P_bg={feed.bg_price:.2f} spread={spread:.2f}", end="\r") # 无持仓 → 锁价开仓 if not state.has_position and abs(spread) <= OPEN_EQUALITY_USD: print("\n[OPEN] |spread|<=OPEN_EQUALITY_USD,尝试锁价开仓") try: okx_res = okx_place_market(OKX_INST_ID, OKX_TD_MODE, state.okx_side_open, OKX_POS_SIDE, OKX_SZ) bg_res = bg_open(BG_SYMBOL, BG_PRODUCT, BG_MARGIN_COIN, state.bg_side_open, BG_SIZE) print("[OKX OPEN RES]", okx_res) print("[BG OPEN RES]", bg_res) state.has_position = True state.entry_spread = spread except Exception as e: print("[OPEN ERROR]", e) # 有持仓 → 触发平仓 if state.has_position and abs(spread) >= CLOSE_SPREAD_USD: print(f"\n[CLOSE] |spread|>=CLOSE_SPREAD_USD,开始同时平仓 | spread={spread:.2f}") try: okx_res = okx_close_market(OKX_INST_ID, OKX_TD_MODE, OKX_POS_SIDE, OKX_SZ) bg_res = bg_close(BG_SYMBOL, BG_PRODUCT, BG_MARGIN_COIN, state.bg_side_open, BG_SIZE) print("[OKX CLOSE RES]", okx_res) print("[BG CLOSE RES]", bg_res) pnl = (spread - (state.entry_spread or 0.0)) print(f"[PNL est] Δspread = {pnl:.2f} USD(未含费率/资金费/滑点)") state.has_position = False state.entry_spread = None except Exception as e: print("[CLOSE ERROR]", e) finally: for t in tasks: t.cancel() if __name__ == "__main__": asyncio.run(main())
BTC+2.36%
ARB+17.32%
Builders
Builders
2025/08/08 06:26
🚀 BOB是什么? BOB是一个有使命的meme——没有预售,没有团队代币,流动性锁定。它完全由社区创建,基于快速且便宜的BSC。在一个充满骗局的世界中,Alpha#BOB#以真实的透明度和强烈的氛围脱颖而出。 📈 发展迅速: 数以千计的持有者 自发的热度,没有付费的网红 在广场和加密X中深受欢迎 这不仅仅是token——这是一个运动。 如果你错过了SHIB、PEPE或FLOKI……BOB可能是你的下一个机会,为信徒而生。 建设、相信,BOB👷 $BNB $OBOL $GHIBLI $ATH $UPC $ID $GAS $DAO $ICP $FUSE $ELF $COQ $IMT $LPT
ALPHA+1.37%
FLOKI+3.31%
塔林 Tastingo.eth
塔林 Tastingo.eth
2025/08/07 03:35
GM and yes I mean it. GM.skr is mine now. What is your seeker id Let's connect! 😃
ID+2.30%
BGUSER-86VTAYG2
BGUSER-86VTAYG2
2025/08/06 14:57
https://newshare.bwb.global/zh/fomoThursday?activity_id=436083&_newbar=true&_needChain=bnb&_chain_tags=bnb%2Cbase&channel=Copylink&inviteCode=w4kKEA
BNB+1.06%
ID+2.30%

交易

理财

ID可以在Bitget 交易所上进行交易,也可以在Bitget 钱包上托管。Bitget 交易所也是最先支持ID交易的中心化交易平台之一。
您可以在 Bitget 上交易 ID。

ID/USDT

现货

ID/USDT

杠杆

ID/USDT

U 本位合约