import pymysql import requests import time import schedule from datetime import datetime # MySQL连接函数 def connect_to_db(): return pymysql.connect( host="127.0.0.1", # 数据库主机 user="root", # 数据库用户名 password="2GS@bPYcgiMyL14A", # 数据库密码 database="binance_api", # 数据库名称 port=4423 # 数据库端口 ) # 执行SQL查询的函数 def execute_query(query, params=None): conn = connect_to_db() # 连接数据库 with conn.cursor() as cursor: cursor.execute(query, params) # 执行SQL语句 conn.commit() # 提交事务 conn.close() # 关闭数据库连接 # 北京时间转换函数 def bj_time(timestamp): # 将时间戳转换为北京时间 return datetime.utcfromtimestamp(timestamp / 1000).strftime('%Y-%m-%d %H:%M:%S') # Binance API客户端 class BinanceAPI: base_url = "https://fapi.binance.com" # Binance的基础API URL @staticmethod def get(endpoint, params=None): # 发送GET请求到Binance API response = requests.get(f"{BinanceAPI.base_url}{endpoint}", params=params) return response.json() # 返回JSON格式的响应数据 # 任务1:获取资金费率并插入数据库 def funding_rate(): # 获取BTC和ETH的资金费率数据 btc_data = BinanceAPI.get("/fapi/v1/fundingRate", {"symbol": "BTCUSDT"}) eth_data = BinanceAPI.get("/fapi/v1/fundingRate", {"symbol": "ETHUSDT"}) # 准备SQL插入语句 btc_sql = """INSERT INTO fundingrate(symbol, ts, fundingRate) VALUES ("BTCUSDT", %s, %s)""" eth_sql = """INSERT INTO fundingrate(symbol, ts, fundingRate) VALUES ("ETHUSDT", %s, %s)""" # 执行SQL插入操作 execute_query(btc_sql, (btc_data[-1]['fundingTime'], btc_data[-1]['fundingRate'])) execute_query(eth_sql, (eth_data[-1]['fundingTime'], eth_data[-1]['fundingRate'])) # 任务2:获取未平仓合约数并插入数据库 def open_interest(): # 获取BTC和ETH的未平仓合约数数据 btc_data = BinanceAPI.get("/fapi/v1/openInterest", {"symbol": "BTCUSDT"}) eth_data = BinanceAPI.get("/fapi/v1/openInterest", {"symbol": "ETHUSDT"}) # 准备SQL插入语句 btc_sql = """INSERT INTO openInterest(symbol, ts, openInterest) VALUES ("BTCUSDT", %s, %s)""" eth_sql = """INSERT INTO openInterest(symbol, ts, openInterest) VALUES ("ETHUSDT", %s, %s)""" # 执行SQL插入操作 execute_query(btc_sql, (btc_data['time'], btc_data['openInterest'])) execute_query(eth_sql, (eth_data['time'], eth_data['openInterest'])) # 任务3:获取长短比并插入数据库 def long_short_ratio(interval): # 获取BTC和ETH的长短比数据 btc_data = BinanceAPI.get("/futures/data/takerlongshortRatio", { "symbol": "BTCUSDT", "period": interval }) eth_data = BinanceAPI.get("/futures/data/takerlongshortRatio", { "symbol": "ETHUSDT", "period": interval }) # 准备SQL插入语句 btc_sql = f"""INSERT INTO longshortratio{interval}(symbol, ts, buyVol, sellVol, buySellRatio) VALUES ("BTCUSDT", %s, %s, %s, %s)""" eth_sql = f"""INSERT INTO longshortratio{interval}(symbol, ts, buyVol, sellVol, buySellRatio) VALUES ("ETHUSDT", %s, %s, %s, %s)""" # 执行SQL插入操作 execute_query(btc_sql, (btc_data[-1]['timestamp'], btc_data[-1]['buyVol'], btc_data[-1]['sellVol'], btc_data[-1]['buySellRatio'])) execute_query(eth_sql, (eth_data[-1]['timestamp'], eth_data[-1]['buyVol'], eth_data[-1]['sellVol'], eth_data[-1]['buySellRatio'])) # 定时任务调度 def schedule_jobs(): # 每天0点、8点和16点1分执行资金费率任务 schedule.every().day.at("00:01").do(funding_rate) schedule.every().day.at("08:01").do(funding_rate) schedule.every().day.at("16:01").do(funding_rate) # 每分钟的15秒执行未平仓合约数任务 schedule.every().minute.at(":15").do(open_interest) schedule.every().minute.at(":25").do(open_interest) schedule.every().minute.at(":35").do(open_interest) schedule.every().minute.at(":45").do(open_interest) schedule.every().minute.at(":55").do(open_interest) # 每分钟的15秒执行长短比任务,周期为5m, 15m, 30m等 intervals = ["5m", "15m", "30m", "1h", "2h", "4h", "6h", "12h", "1d"] for interval in intervals: schedule.every().minute.at(":15").do(long_short_ratio, interval=interval) # 启动任务调度 def run(): schedule_jobs() # 设置定时任务 while True: schedule.run_pending() # 执行所有待处理任务 time.sleep(1) # 每秒检查一次任务是否到期 if __name__ == "__main__": run() # 运行定时任务调度