ARbit 价格

ARbit价格ARB

未上架
¥0.008439CNY
-0.00%1D
截至今日09:56(UTC),ARbit(ARB)的人民币价格为 ¥0.008439 CNY。
数据来源于第三方提供商。本页面和提供的信息不为任何特定的加密货币提供背书。想要交易已上架币种?  点击此处
注册
价格图表
ARbit兑CNY价格实时走势图(ARB/CNY)
最近更新时间2025-08-11 09:56:57(UTC+0)

今日ARbit实时价格CNY

今日ARbit实时价格为 ¥0.008439 CNY,当前市值为 ¥0.00。过去24小时内,ARbit价格跌幅为0.00%,24小时交易量为¥0.00。ARB/CNY(ARbit兑CNY)兑换率实时更新。
1ARbit的人民币价格是多少?
截至目前,ARbit(ARB)的人民币价格为 ¥0.008439 CNY。您现在可以用 1ARB 兑换 ¥0.008439,或用 ¥10 兑换 1,185.03 ARB。在过去24小时内, ARB兑换CNY的最高价格为 ¥0.008439 CNY,ARB兑换CNY的最低价格为 ¥0.008439 CNY。

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

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

ARbit市场信息

价格表现(24小时)
24小时
24小时最低价¥0.0124小时最高价¥0.01
历史最高价:
¥9.52
涨跌幅(24小时):
-0.00%
涨跌幅(7日):
-0.00%
涨跌幅(1年):
-4.17%
市值排名:
#6344
市值:
--
完全稀释市值:
--
24小时交易额:
--
流通量:
-- ARB
最大发行量:
--

ARbit (ARB) 简介

关于ARbit Token的深度解析

在过去的几年里,加密货币的普及深深地改变了全球金融景观。blockchain也因此获得了显著的声誉,同时也产生了新的投资种类,称为代币。其中一种黑马代币——ARbit(ARB)已经引起了市场的广泛关注。在本文中,我们将深入了解ARbit Token,以及它的重要性和价值。

ARbit Token概述

ARbit Token是利用blockchain技术建立的一种新型cryptocurrency,它创新地集成了增强现实(AR)技术,使用户有更好的币种使用体验。通过ARbit,用户可以全方位、无限制地享受到blockchain技术的便利。

ARbit 的核心功能

ARbit Token的主要功能是提供一个全新的虚拟购物平台。用户可以在此平台上使用AR技术,在虚拟世界中购买和出售商品或服务。此外,用户还可以利用ARbit进行数字货币的交易。

ARbit的历史价值和相对地位

尽管cryptocurrency市场上有许多不同的代币,但ARbit由于融合了AR和blockchain两项前沿技术,因此立即就在市场上占据了一席之地。此外,ARbit还因其稳定性和安全性被市场广泛认可。

ARbit的潜力和前景

由于ARbit独具一格的AR功能,使其具有极大的发展潜力。借助AR技术,ARbit不仅能提供一个生动而富有创新性的虚拟购物体验,还能引领blockchain在各种行业中的更广泛应用。因此,ARbit的前景可能是无比广阔的。

总的来说,ARbit Token可能是对blockchain和AR市场的一种革新性贡献。与此同时,它还让用户有机会在早期就参与到这两个前沿技术的发展之中,既能体验到骇客的乐趣,也能因投资而获得收益。通过了解ARbit,我们可以看出cryptocurrency未来的无限可能。

希望本文可以帮助理解加密货币,特别是ARbit Token的发展、意义和潜力。随着blockchain和AR等技术的不断发展,ARbit和其他cryptocurrency的价值和影响力必定会进一步提升。

只有了解这种全新的金融产品,我们才能更好地利用它、享受它带来的便利。因此,无论你是一个投资者,还是一个科技爱好者,都应该对cryptocurrency保持关注,并掌握它背后的理念和技术。

ARbit 的 AI 分析报告

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

ARbit价格历史(CNY)

过去一年,ARbit价格上涨了-4.17%。在此期间,兑CNY的最高价格为 ¥0.01938,兑CNY 的最低价格为 ¥0.003790。
时间涨跌幅(%)涨跌幅(%)最低价相应时间段内 {0} 的最低价。最高价 最高价
24h-0.00%¥0.008439¥0.008439
7d-0.00%¥0.007583¥0.008439
30d-0.25%¥0.007583¥0.008460
90d-40.96%¥0.006162¥0.01435
1y-4.17%¥0.003790¥0.01938
所有时间-87.06%¥0.001082(2016-01-20, 9年前)¥9.52(2023-07-20, 2年前)
ARbit价格历史数据(所有时间)

ARbit的最高价格是多少?

ARB 的历史最高价(ATH)折合 CNY 为¥9.52,录得时间为2023-07-20。与ARbit历史最高价相比,当前ARbit价格跌幅为99.91%。

ARbit的最低价格是多少?

ARB 的历史最低价(ATL)折合 CNY 为¥0.001082,录得时间为2016-01-20。与ARbit历史最低价相比,当前ARbit价格涨幅为679.60%。

ARbit价格预测

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

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

ARB 在2026的价格是多少?

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

ARB 在2031的价格是多少?

预计2031年ARB价格涨跌为+20.00%。到2031年底,预计ARB价格将达到 ¥0.01306,累计投资回报率为+54.82%。

热门活动

常见问题

ARbit 现价多少?

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

ARbit 的24小时成交量是多少?

过去24小时,ARbit 的成交量是 ¥0.00。

ARbit 的最高价是多少?

ARbit 的最高价是 ¥9.52。这个最高价是指 ARbit 上市以来的最高价格。

Bitget 上能买 ARbit 吗?

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

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

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

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

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

在哪里可以购买加密货币?

通过 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 在线购买 ARbit,都存在市场风险。Bitget 为您提供简单方便的 ARbit 购买方式,我们尽最大努力让我们的用户充分了解我们在交易所提供的每一种加密货币。但是,我们不对您的 ARbit 购买可能产生的结果负责。此页面和本网站包含的任何信息均不代表对任何特定加密货币的认可,任何价格数据均采集自公开互联网,不被视为来自Bitget的买卖要约。

ARB/CNY 价格计算器

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

ARB资料

ARbit评级
4.6
100 评级

标签

可挖矿
混合型 - PoW 和 PoS
合约:
--
相关链接:

Bitget 观点

MlionAI
MlionAI
4小时前
午间快讯 | 8月11日重要动态速览 7:00-12:00 关注焦点:PayPay、美股IPO、BNB巨额购入、代币解锁、劳工统计局改革信号 1️⃣ 软银旗下 PayPay 计划赴美IPO,预计募资超 20 亿美元。 2️⃣ 万斯呼吁马斯克在中期选举前重返 MAGA 阵营。 3️⃣ 高盛 重申美国不会对黄金加征关税,并维持原有价格预期。 4️⃣ 业内观点:若推出 韩元稳定币,需配套短期国债配置与制度完善。 5️⃣ 本周代币解锁预警:APT、ARB、AVAX 等将迎来大额解锁。 6️⃣ 特朗普政府拟任命资深批评人士执掌 劳工统计局,或释放改革信号。 7️⃣ 韩国金融委认定境外交易所 KCEX、QXALX 涉嫌非法经营,已移交调查。
ARB-1.43%
APT+0.17%
MlionAI
MlionAI
4小时前
午间快讯 | 8月11日重要动态速览
7:00-12:00 关注焦点:PayPay、美股IPO、BNB巨额购入、代币解锁、劳工统计局改革信号 1️⃣ 软银旗下 PayPay 计划赴美IPO,预计募资超 20 亿美元。 2️⃣ 万斯呼吁马斯克在中期选举前重返 MAGA 阵营。 3️⃣ 高盛 重申美国不会对黄金加征关税,并维持原有价格预期。 4️⃣ 上市公司 BNC 重磅出手,斥资约 1.6 亿美元买入 20 万枚 BNB。 5️⃣ 业内观点:若推出 韩元稳定币,需配套短期国债配置与制度完善。 6️⃣ 本周代币解锁预警:APT、ARB、AVAX 等将迎来大额解锁。 7️⃣ 特朗普政府拟任命资深批评人士执掌 劳工统计局,或释放改革信号。
ARB-1.43%
APT+0.17%
唐僧说币
唐僧说币
6小时前
L2狂欢抽干8亿血!$ETH 成提款机,巨鲸18.5万枚核弹今夜引爆? 兄弟们,我是唐僧!ETH现在就是高空走钢丝——巨鲸握着平衡杆,技术面刮妖风,一步踩错万丈深渊! 结合凌晨链上炸弹和日线危局,三分钟说透今日生死门! 一、最新链上方面致命消息! 1、巨鲸左右互搏露杀机!昨夜18.5万枚ETH(约8亿刀)突袭转入币安(压盘预备弹)! 同一巨鲸1小时内反手提走12万枚ETH(均价4320刀) 2、L2狂欢抽干ETH血!OP、ARB暴涨25%,但ETH主网资金单日净流出4.1亿刀(创月记录)唐僧预警:山寨吸血刀刀见骨,ETH成提款机! 3、链上4300-4320堆积8.7万ETH护盘单,但巨鲸8亿抛压悬顶,螳臂当车! 二、技术最新方面死亡三角! 1、缩量滞涨判死刑!价格钉死4346,实际成交量1.05M对比预估8.02M缩水87%,无量上涨等于主力画门,随时翻脸! 2、均线死叉亮屠刀!5日线下穿10日线死叉确认!成本线崩塌,散户割肉潮将至! 3、MACD断气倒计时!DIF> DEA,但红柱(74.72)比前日暴跌68%,日线动能彻底枯竭!4300防线薄如纸! 注意!巨鲸8亿炮弹入膛,死亡三角绞索勒颈,CPI数据倒计时——是狗庄砸穿地狱抄底,还是多头骨灰飞扬?  我是唐僧,顶级技术支持,只服务有格局有野心的人! $BTC $SOL
BTC+1.72%
ARB-1.43%
BGUSER-NXB07P6L
BGUSER-NXB07P6L
1天前
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+1.72%
ARB-1.43%
BGUSER-NXB07P6L
BGUSER-NXB07P6L
1天前
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+1.72%
ARB-1.43%