Skip to content

Commit

Permalink
feature: 增加csv数据源
Browse files Browse the repository at this point in the history
  • Loading branch information
Vespa314 committed Nov 20, 2023
1 parent e2cec9e commit 6ef6dae
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 1 deletion.
5 changes: 4 additions & 1 deletion Chan.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,12 @@ def GetStockAPI(src):
if src == DATA_SRC.BAO_STOCK:
from DataAPI.BaoStockAPI import CBaoStock
_dict[DATA_SRC.BAO_STOCK] = CBaoStock
if src == DATA_SRC.CCXT:
elif src == DATA_SRC.CCXT:
from DataAPI.ccxt import CCXT
_dict[DATA_SRC.CCXT] = CCXT
elif src == DATA_SRC.CSV:
from DataAPI.csvAPI import CSV_API
_dict[DATA_SRC.CSV] = CSV_API
if src in _dict:
return _dict[src]
if src.find("custom:") < 0:
Expand Down
1 change: 1 addition & 0 deletions Common/CEnum.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
class DATA_SRC(Enum):
BAO_STOCK = auto()
CCXT = auto()
CSV = auto()


class KL_TYPE(Enum):
Expand Down
1 change: 1 addition & 0 deletions Common/ChanException.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class ErrCode(IntEnum):
UNKNOWN_DB_TYPE = 15
FEATURE_ERROR = 16
CONFIG_ERROR = 17
SRC_DATA_FORMAT_ERROR = 18
_CHAN_ERR_END = 99

# Trade Error
Expand Down
86 changes: 86 additions & 0 deletions DataAPI/csvAPI.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
import os

from Common.CEnum import DATA_FIELD, KL_TYPE
from Common.ChanException import CChanException, ErrCode
from Common.CTime import CTime
from Common.func_util import str2float
from KLine.KLine_Unit import CKLine_Unit

from .CommonStockAPI import CCommonStockApi


def create_item_dict(data, column_name):
for i in range(len(data)):
data[i] = parse_time_column(data[i]) if column_name[i] == DATA_FIELD.FIELD_TIME else str2float(data[i])
return dict(zip(column_name, data))


def parse_time_column(inp):
# 20210902113000000
# 2021-09-13
if len(inp) == 10:
year = int(inp[:4])
month = int(inp[5:7])
day = int(inp[8:10])
hour = minute = 0
elif len(inp) == 17:
year = int(inp[:4])
month = int(inp[4:6])
day = int(inp[6:8])
hour = int(inp[8:10])
minute = int(inp[10:12])
elif len(inp) == 19:
year = int(inp[:4])
month = int(inp[5:7])
day = int(inp[8:10])
hour = int(inp[11:13])
minute = int(inp[14:16])
else:
raise Exception(f"unknown time column from baostock:{inp}")
return CTime(year, month, day, hour, minute)


class CSV_API(CCommonStockApi):
def __init__(self, code, k_type=KL_TYPE.K_DAY, begin_date=None, end_date=None, autype=None):
self.headers_exist = True # 第一行是否是标题,如果是数据,设置为False
self.columns = [
DATA_FIELD.FIELD_TIME,
DATA_FIELD.FIELD_OPEN,
DATA_FIELD.FIELD_HIGH,
DATA_FIELD.FIELD_LOW,
DATA_FIELD.FIELD_CLOSE,
# DATA_FIELD.FIELD_VOLUME,
# DATA_FIELD.FIELD_TURNOVER,
# DATA_FIELD.FIELD_TURNRATE,
] # 每一列字段
self.time_column_idx = self.columns.index(DATA_FIELD.FIELD_TIME)
super(CSV_API, self).__init__(code, k_type, begin_date, end_date, autype)

def get_kl_data(self):
cur_path = os.path.dirname(os.path.realpath(__file__))
file_path = f"{cur_path}/../{self.code}.csv"
if not os.path.exists(file_path):
raise CChanException(f"file not exist: {file_path}", ErrCode.SRC_DATA_NOT_FOUND)

for line_number, line in enumerate(open(file_path, 'r')):
if self.headers_exist and line_number == 0:
continue
data = line.split(",")
if len(data) != len(self.columns):
raise CChanException(f"file format error: {file_path}", ErrCode.SRC_DATA_FORMAT_ERROR)
if self.begin_date is not None and data[self.time_column_idx] < self.begin_date:
continue
if self.end_date is not None and data[self.time_column_idx] > self.end_date:
continue
yield CKLine_Unit(create_item_dict(data, self.columns))

def SetBasciInfo(self):
pass

@classmethod
def do_init(cls):
pass

@classmethod
def do_close(cls):
pass
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -527,6 +527,7 @@ else: # 绘制动画
- DATA_SRC.FUTU:富途
- DATA_SRC.BAO_STOCK:BaoStock(默认)
- DATA_SRC.CCXT:ccxt
- DATA_SRC.CSV: csv(具体可以看内部实现)
- "custom:文件名:类名":自定义解析器
- 框架默认提供一个 demo 为:"custom: OfflineDataAPI.CStockFileReader"
- 自己开发参考下文『自定义开发-数据接入』
Expand Down

0 comments on commit 6ef6dae

Please sign in to comment.