use super::{布林带, 平滑异同移动平均线, 相对强弱指数, 随机指标};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum 指标值 {
MACD(平滑异同移动平均线),
RSI(相对强弱指数),
KDJ(随机指标),
BOLL(布林带),
均线(HashMap<String, f64>),
单值(HashMap<String, f64>),
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct 指标容器 {
pub _数据: HashMap<String, Option<指标值>>,
}
impl 指标容器 {
pub fn new() -> Self {
let mut _数据 = HashMap::new();
_数据.insert("macd".into(), None);
_数据.insert("rsi".into(), None);
_数据.insert("kdj".into(), None);
_数据.insert("boll".into(), None);
_数据.insert("均线".into(), Some(指标值::均线(HashMap::new())));
_数据.insert("单值".into(), Some(指标值::单值(HashMap::new())));
Self { _数据 }
}
pub fn 注册(&mut self, 名称: &str, 默认值: Option<指标值>) {
if !self._数据.contains_key(名称) {
self._数据.insert(名称.to_string(), 默认值);
}
}
pub fn 获取(&self, 名称: &str) -> Option<&指标值> {
self._数据.get(名称).and_then(|v| v.as_ref())
}
pub fn 设置(&mut self, 名称: &str, 值: 指标值) {
self._数据.insert(名称.to_string(), Some(值));
}
pub fn 包含(&self, 名称: &str) -> bool {
self._数据.contains_key(名称)
}
pub fn macd(&self) -> Option<&平滑异同移动平均线> {
match self._数据.get("macd")?.as_ref()? {
指标值::MACD(m) => Some(m),
_ => None,
}
}
pub fn macd_cloned(&self) -> Option<平滑异同移动平均线> {
self.macd().cloned()
}
pub fn set_macd(&mut self, m: 平滑异同移动平均线) {
self._数据.insert("macd".into(), Some(指标值::MACD(m)));
}
pub fn rsi(&self) -> Option<&相对强弱指数> {
match self._数据.get("rsi")?.as_ref()? {
指标值::RSI(r) => Some(r),
_ => None,
}
}
pub fn rsi_cloned(&self) -> Option<相对强弱指数> {
self.rsi().cloned()
}
pub fn set_rsi(&mut self, r: 相对强弱指数) {
self._数据.insert("rsi".into(), Some(指标值::RSI(r)));
}
pub fn kdj(&self) -> Option<&随机指标> {
match self._数据.get("kdj")?.as_ref()? {
指标值::KDJ(k) => Some(k),
_ => None,
}
}
pub fn kdj_cloned(&self) -> Option<随机指标> {
self.kdj().cloned()
}
pub fn set_kdj(&mut self, k: 随机指标) {
self._数据.insert("kdj".into(), Some(指标值::KDJ(k)));
}
pub fn boll(&self) -> Option<&布林带> {
match self._数据.get("boll")?.as_ref()? {
指标值::BOLL(b) => Some(b),
_ => None,
}
}
pub fn boll_cloned(&self) -> Option<布林带> {
self.boll().cloned()
}
pub fn set_boll(&mut self, b: 布林带) {
self._数据.insert("boll".into(), Some(指标值::BOLL(b)));
}
pub fn 均线(&self) -> Option<&HashMap<String, f64>> {
match self._数据.get("均线")?.as_ref()? {
指标值::均线(m) => Some(m),
_ => None,
}
}
pub fn 均线_mut(&mut self) -> Option<&mut HashMap<String, f64>> {
match self._数据.get_mut("均线")?.as_mut()? {
指标值::均线(m) => Some(m),
_ => None,
}
}
pub fn 单值(&self) -> Option<&HashMap<String, f64>> {
match self._数据.get("单值")?.as_ref()? {
指标值::单值(s) => Some(s),
_ => None,
}
}
}
impl std::fmt::Display for 指标容器 {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let keys: Vec<&str> = self
._数据
.iter()
.filter(|(_, v)| v.is_some())
.map(|(k, _)| k.as_str())
.collect();
write!(f, "指标容器({})", keys.join(", "))
}
}