"""
🤖 资金费率套利机器人 (Funding Rate Arb Bot)
策略：做多现货 + 做空合约 (1x)，无风险吃费率
运行：每 8 小时检查一次，自动执行
"""
import requests
import time
import os
from datetime import datetime

# ================= 配置区 =================
API_KEY = "你的OKX_API_KEY"
SECRET_KEY = "你的OKX_SECRET_KEY"
PASSPHRASE = "你的OKX_PASSPHRASE"
INST_ID = "BTC-USDT"  # 交易对
SWAP_ID = "BTC-USDT-SWAP"  # 合约名
MIN_RATE_THRESH = 0.0001  # 费率阈值 (0.01%) 才开仓
LEVERAGE = 1  # 合约杠杆 (必须1倍对冲)
# ===========================================

def get_funding_rate():
    """获取当前预估资金费率"""
    url = "https://www.okx.com/api/v5/public/funding-rate"
    params = {"instId": SWAP_ID}
    try:
        resp = requests.get(url, params=params, timeout=5)
        data = resp.json()
        if data['code'] == '0':
            return float(data['data'][0]['fundingRate'])
    except:
        pass
    return None

def get_balance(ccy):
    """获取账户余额"""
    # 需调用 OKX /api/v5/account/balance 接口
    # 此处省略签名代码，实际部署时需补全
    return 1000.0  # 模拟余额

def place_order(side, inst_id, size, order_type="market"):
    """下单 (现货或合约)"""
    # 需调用 OKX /api/v5/trade/order 接口
    # 此处省略签名代码
    print(f"  [模拟下单] {side} {inst_id} 数量 {size}")
    return True

def close_position(inst_id):
    """平仓"""
    # 需调用 OKX /api/v5/trade/close-position 接口
    print(f"  [模拟平仓] {inst_id}")
    return True

def run_arb_cycle():
    """执行一轮套利逻辑"""
    print(f"\n⏰ [{datetime.now()}] 开始检查资金费率...")
    
    rate = get_funding_rate()
    if rate is None:
        print("❌ 获取费率失败，跳过本轮。")
        return
    
    print(f"📊 当前费率: {rate*100:.4f}%")
    
    # 简单逻辑：费率 > 阈值 -> 开仓; 费率 < 0 -> 平仓/反向
    if rate > MIN_RATE_THRESH:
        print(f"✅ 费率为正 ({rate*100:.4f}%), 执行套利: 做多现货 + 做空合约")
        
        # 1. 计算仓位 (假设全仓)
        cash = get_balance("USDT")
        price = float(requests.get("https://www.okx.com/api/v5/market/ticker?instId="+INST_ID).json()['data'][0]['last'])
        size = cash / price  # 能买多少 BTC
        
        # 2. 开现货多单
        if place_order("buy", INST_ID, size):
            print("  ✅ 现货多单已开")
        
        # 3. 开合约空单 (1x)
        if place_order("sell", SWAP_ID, size):
            print("  ✅ 合约空单已开 (1x 杠杆)")
            
        print(f"💰 预计 8 小时后收益: {size * price * rate:.2f} USDT")
        
    elif rate < -MIN_RATE_THRESH:
        print(f"⚠️ 费率为负 ({rate*100:.4f}%), 空仓或反向套利 (做多合约 + 做空现货)")
        # 此处可添加反向逻辑，或简单空仓
        close_position(INST_ID)
        close_position(SWAP_ID)
        
    else:
        print(f"⏸️ 费率过低 ({rate*100:.4f}%), 观望。")

if __name__ == "__main__":
    print("🤖 资金费率套利机器人启动...")
    print(f"交易对: {INST_ID}")
    print(f"费率阈值: {MIN_RATE_THRESH*100}%")
    
    # 第一次立即运行
    run_arb_cycle()
    
    # 之后每 8 小时 (28800 秒) 运行一次
    # 注意：实盘建议使用 systemd 定时任务或 cron，而不是死循环
    print("\n💤 进入休眠，将在 8 小时后再次运行...")
    # time.sleep(28800) 