coinbus-data/coinbus/Binance_fapi.py

119 lines
4.7 KiB
Python
Raw Normal View History

2025-08-22 07:18:56 +00:00
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() # 运行定时任务调度