Files
chanlun.rs/chanlun/src/structure/fractal_obj.rs
T

174 lines
5.8 KiB
Rust
Raw Normal View History

2026-05-25 02:16:35 +08:00
use crate::kline::chan_kline::缠论K线;
use crate::types::分型结构;
use crate::types::相对方向;
use std::rc::Rc;
/// 分型 — 由三根缠K构成(可能缺左或右)
#[derive(Debug, Clone)]
pub struct 分型 {
pub : Option<Rc<缠论K线>>,
pub : Rc<缠论K线>,
pub : Option<Rc<缠论K线>>,
pub 结构: 分型结构,
pub 时间戳: i64,
pub 分型特征值: f64,
}
impl 分型 {
pub fn new(: Option<Rc<缠论K线>>, : Rc<缠论K线>, : Option<Rc<缠论K线>>) -> Self {
let 结构 = .分型.unwrap_or(分型结构::);
let 时间戳 = .时间戳;
let 分型特征值 = .分型特征值;
Self {
,
,
,
结构,
时间戳,
分型特征值,
}
}
/// 左中右三组关系
pub fn 关系组(&self) -> Option<(相对方向, 相对方向, 相对方向)> {
let = self..as_ref()?;
let = self..as_ref()?;
Some((
相对方向::分析(., ., self.., self..),
相对方向::分析(self.., self.., ., .),
相对方向::分析(., ., ., .),
))
}
/// 分型强度
pub fn 强度(&self) -> f64 {
match self.结构 {
分型结构:: | 分型结构:: => {
if let Some(ref ) = self. {
self.. - .
} else {
0.0
}
}
分型结构:: | 分型结构:: => {
if let Some(ref ) = self. {
. - self..
} else {
0.0
}
}
分型结构:: => 0.0,
}
}
/// MACD柱子分型匹配
pub fn MACD柱子分型匹配(&self) -> bool {
match self.结构 {
分型结构:: | 分型结构:: => {
if let Some(ref ) = self. {
.MACD柱子匹配()
} else {
false
}
}
分型结构:: | 分型结构:: => {
if let Some(ref ) = self. {
.MACD柱子匹配()
} else {
false
}
}
分型结构:: => false,
}
}
/// 判断两个分型是否匹配
pub fn 判断分型(: &分型, : &分型, 模式: &str) -> bool {
match 模式 {
"中" => ..序号 == ..序号,
_ => false,
}
}
/// 从缠K序列中获取以指定缠K为中元素的分型
pub fn 从缠K序列中获取分型(K线序列: &[Rc<缠论K线>], : &Rc<缠论K线>) -> Option<Self> {
let idx = K线序列.iter().position(|k| Rc::as_ptr(k) == Rc::as_ptr())?;
let = if idx > 0 {
Some(Rc::clone(&K线序列[idx - 1]))
} else {
None
};
let = if idx + 1 < K线序列.len() {
Some(Rc::clone(&K线序列[idx + 1]))
} else {
None
};
Some(Self::new(, Rc::clone(), ))
}
/// 向分型序列中添加新分型
pub fn 向序列中添加(分型序列: &mut Vec<Rc<分型>>, 当前分型: Rc<分型>) {
if let Some(前一个) = 分型序列.last() {
if 前一个.时间戳 == 当前分型.时间戳 {
// 同一时间戳: 比较强度,保留更强的
match 当前分型.结构 {
分型结构:: | 分型结构:: => {
if 当前分型.分型特征值 >= 前一个.分型特征值 {
分型序列.pop();
分型序列.push(当前分型);
}
return;
}
分型结构:: | 分型结构:: => {
if 当前分型.分型特征值 <= 前一个.分型特征值 {
分型序列.pop();
分型序列.push(当前分型);
}
return;
}
分型结构:: => {}
}
}
// 相同结构只保留更强的
if 前一个.结构 == 当前分型.结构 {
if (当前分型.结构 == 分型结构:: || 当前分型.结构 == 分型结构::)
&& 当前分型.分型特征值 >= 前一个.分型特征值
{
分型序列.pop();
分型序列.push(当前分型);
} else if (当前分型.结构 == 分型结构:: || 当前分型.结构 == 分型结构::)
&& 当前分型.分型特征值 <= 前一个.分型特征值
{
分型序列.pop();
分型序列.push(当前分型);
}
return;
}
}
分型序列.push(当前分型);
}
}
impl crate::types::fractal::有高低 for 分型 {
fn (&self) -> f64 {
self..
}
fn (&self) -> f64 {
self..
}
}
impl std::fmt::Display for 分型 {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}<{}, {}, None: {}, None: {}>",
self..分型.unwrap_or(crate::types::分型结构::),
self.时间戳,
crate::utils::format_f64_g(self.分型特征值),
if self..is_none() { "True" } else { "False" },
if self..is_none() { "True" } else { "False" },
)
}
}