1.kline基类实现

2.source基类实现
3.时间转换工具datetime convert实现
4.使用binance restapi获取数据实现
5.binance获取数据单元测试
This commit is contained in:
2025-12-05 17:13:20 +08:00
parent b1ffcf9456
commit 9a3769f862
6 changed files with 433 additions and 0 deletions

View File

@@ -0,0 +1,21 @@
from abc import ABC, abstractmethod
import pandas as pd
class DataSource(ABC):
"""数据源基类"""
@abstractmethod
def try_connection(self):
"""尝试连接行情"""
pass
@abstractmethod
def get_historical_data(self, symbol: str, start_date: str, end_date: str, interval: str = "1d") :
"""获取历史数据"""
pass
@abstractmethod
def get_realtime_data(self, symbol: str) :
"""获取实时数据"""
pass

View File

@@ -0,0 +1,58 @@
import requests
import pandas as pd
from datetime import datetime
import os
from .base_source import DataSource
from binance_sdk_derivatives_trading_usds_futures.derivatives_trading_usds_futures import (
DerivativesTradingUsdsFutures,
ConfigurationRestAPI,
DERIVATIVES_TRADING_USDS_FUTURES_REST_API_PROD_URL,
)
from binance_sdk_derivatives_trading_usds_futures.rest_api.models import (
KlineCandlestickDataIntervalEnum, ContinuousContractKlineCandlestickDataContractTypeEnum,
)
class BinanceSource(DataSource):
def __init__(self, api_key: str, api_secret: str, base_url: str, timeout: int):
self.api_key = api_key
self.api_secret = api_secret
self.base_url = base_url
self.timeout = timeout
configuration_rest_api = ConfigurationRestAPI(
api_key=os.getenv("API_KEY", self.api_key),
api_secret=os.getenv("API_SECRET", self.api_secret),
base_path=os.getenv(
"BASE_PATH", self.base_url
),
timeout=timeout
)
self.client = DerivativesTradingUsdsFutures(config_rest_api=configuration_rest_api)
def try_connection(self):
try:
response = self.client.rest_api.test_connectivity()
rate_limits = response.rate_limits
print(f"exchange_information() rate limits: {rate_limits}")
data = response.data()
return data
except Exception as e:
print(f"test_connectivity() error: {e}")
return None
def get_realtime_data(self, symbol: str):
return None
def get_historical_data(self, symbol: str, interval: str = "1d",limit :int = None, start_time: int = None, end_time: int = None,):
response = self.client.rest_api.continuous_contract_kline_candlestick_data(
pair=symbol,
start_time=start_time,
end_time=end_time,
contract_type=ContinuousContractKlineCandlestickDataContractTypeEnum.PERPETUAL,
interval=KlineCandlestickDataIntervalEnum[f"INTERVAL_{interval}"].value,
limit=limit
)
return response.data()