refactor: 缠论引擎迁入 chan/ 分层解耦,指标外置
将核心结构、指标与分析拆到 chan/{core,indicators,analysis,pipeline};
根目录保留兼容 shim;strategies 改为从 chan 包导入;买卖点经 bsp_macd 与 MACD 接合。
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
"""按 bar idx 查询指标值。"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Any, Dict, Optional
|
||||
|
||||
import pandas as pd
|
||||
|
||||
|
||||
class IndicatorStore:
|
||||
"""以 DataFrame 列 + 行 idx 对齐的只读指标视图。"""
|
||||
|
||||
def __init__(self, df: pd.DataFrame):
|
||||
self._df = df
|
||||
|
||||
@property
|
||||
def dataframe(self) -> pd.DataFrame:
|
||||
return self._df
|
||||
|
||||
def __len__(self) -> int:
|
||||
return len(self._df)
|
||||
|
||||
def get(self, idx: int, name: str, default: Any = None) -> Any:
|
||||
if idx < 0 or idx >= len(self._df):
|
||||
return default
|
||||
if name not in self._df.columns:
|
||||
return default
|
||||
val = self._df.iloc[idx][name]
|
||||
if pd.isna(val):
|
||||
return default
|
||||
return val
|
||||
|
||||
def row(self, idx: int) -> Optional[Dict[str, Any]]:
|
||||
if idx < 0 or idx >= len(self._df):
|
||||
return None
|
||||
return self._df.iloc[idx].to_dict()
|
||||
|
||||
def series(self, name: str):
|
||||
if name not in self._df.columns:
|
||||
return None
|
||||
return self._df[name]
|
||||
Reference in New Issue
Block a user