第二版

This commit is contained in:
YuWuKunCheng
2026-05-25 11:07:08 +08:00
parent f92eef11fb
commit bf96517c9d
21 changed files with 1599 additions and 1002 deletions
+117 -69
View File
@@ -1,86 +1,134 @@
use crate::config::;
use crate::kline::bar::K线;
use crate::structure::dash_line::线;
use crate::types::;
use std::rc::Rc;
/// 背驰分析 — 判断进入段和离开段之间是否存在背驰
pub struct ;
impl {
/// MACD背驰 — 离开段MACD柱子面积小于进入段
pub fn MACD背驰(: &线, : &线, K线序列: &[Rc<K线>], : &str) -> bool {
// 获取进入段和离开段对应的K线
let _始 = ... as usize;
let _终 = ... as usize;
let _始 = ... as usize;
let _终 = ... as usize;
/// MACD背驰 — MACD柱状线面积背驰
/// 方式: "总"=阳+|阴|总面积, 其他=按进入段方向选阳或阴
pub fn MACD背驰(
: &线, : &线, K线序列: &[Rc<K线>], : &str
) -> bool {
let MACD =
Self::_获取MACD面积(K线序列, &...K线, &...K线);
let MACD =
Self::_获取MACD面积(K线序列, &...K线, &...K线);
if _终 >= K线序列.len() || _终 >= K线序列.len() {
return false;
}
// 计算面积(绝对值求和)
let = if == "" {
MACD.().abs()
} else if .() == :: {
MACD..abs()
} else {
MACD..abs()
};
let = if == "" {
MACD.().abs()
} else if .() == :: {
MACD..abs()
} else {
MACD..abs()
};
let MACD = Self::(&K线序列[_始..=_终], );
let MACD = Self::(&K线序列[_始..=_终], );
// 背驰条件: 离开段面积绝对值小于进入段
let = MACD. + MACD..abs();
let = MACD. + MACD..abs();
if < f64::EPSILON {
return false;
}
<
<
}
/// 斜率背驰 — 离开段斜率小于进入段
/// 斜率背驰 — 价格斜率背驰
pub fn (: &线, : &线) -> bool {
let = (.. - ..).abs()
/ (.. - ..).abs() as f64;
let = (.. - ..).abs()
/ (.. - ..).abs() as f64;
let dx = (.. - ..) as f64;
let dy = .. - ..;
let = dy / dx;
<
let dx = (.. - ..) as f64;
let dy = .. - ..;
let = dy / dx;
if .() == :: {
.() > .() && .abs() < .abs()
} else {
.() < .() && .abs() < .abs()
}
}
/// 测度背驰 — 价格测度背驰判断
/// 测度背驰 — 价格时间测度背驰
pub fn (: &线, : &线) -> bool {
let = (.. - ..).abs();
let = (.. - ..).abs();
<
let dx = (.. - ..) as f64;
let dy = .. - ..;
let = (dx * dx + dy * dy).sqrt();
let dx = (.. - ..) as f64;
let dy = .. - ..;
let = (dx * dx + dy * dy).sqrt();
if .() == :: {
.() > .() && .abs() < .abs()
} else {
.() < .() && .abs() < .abs()
}
}
/// 全量背驰 — MACD + 斜率 + 测度 三者全满足
pub fn (: &线, : &线, K序列: &[Rc<K线>]) -> bool {
Self::MACD背驰(, , K序列, "")
&& Self::(, )
&& Self::(, )
&& Self::(, )
}
/// 任意背驰 — 任一条件满足即可
pub fn (: &线, : &线, K序列: &[Rc<K线>]) -> bool {
Self::MACD背驰(, , K序列, "")
|| Self::(, )
|| Self::(, )
|| Self::(, )
}
/// 配置背驰 — 根据配置选择判断方式
pub fn (: &线, : &线, K序列: &[Rc<K线>], : &) -> bool {
let mut result = true;
if .线_MACD {
result = result && Self::MACD背驰(, , K序列, "");
pub fn (
: &线,
: &线,
K序列: &[Rc<K线>],
: &,
) -> bool {
match (
.线_MACD,
.线_测度,
.线_斜率,
) {
(true, true, true) => {
Self::MACD背驰(, , K序列, "")
&& Self::(, )
&& Self::(, )
}
(false, false, false) => false,
(true, false, true) => {
Self::MACD背驰(, , K序列, "") && Self::(, )
}
(false, true, false) => Self::(, ),
(true, false, false) => Self::MACD背驰(, , K序列, ""),
(false, true, true) => {
Self::(, ) && Self::(, )
}
(false, false, true) => Self::(, ),
(true, true, false) => {
Self::MACD背驰(, , K序列, "") && Self::(, )
}
}
if .线_斜率 {
result = result && Self::(, );
}
if .线_测度 {
result = result && Self::(, );
}
result
}
/// 任选背驰
/// 任选背驰 — 至少两个条件满足(多数投票)
pub fn (: &线, : &线, K序列: &[Rc<K线>]) -> bool {
Self::(, , K序列)
let = [
Self::MACD背驰(, , K序列, ""),
Self::(, ),
Self::(, ),
];
.iter().filter(|&&x| x).count() >= 2
}
/// 背驰模式 — 根据模式字符串选择判断方式
@@ -95,40 +143,34 @@ impl 背驰分析 {
"全量" => Self::(, , K序列),
"任意" => Self::(, , K序列),
"配置" => Self::(, , K序列, ),
"相对" => Self::(, ),
_ => Self::(, , K序列, ),
"相对" => Self::(, , K序列),
_ => false,
}
}
// ---- 内部辅助 ----
fn (K线序列: &[Rc<K线>], : &str) -> MACD面积 {
fn _获取MACD面积(K线序列: &[Rc<K线>], : &Rc<K线>, : &Rc<K线>) -> MACD面积 {
let _idx = K线序列.iter().position(|k| Rc::as_ptr(k) == Rc::as_ptr());
let _idx = K线序列.iter().position(|k| Rc::as_ptr(k) == Rc::as_ptr());
let mut = 0.0f64;
let mut = 0.0f64;
for k in K线序列 {
if let Some(ref macd) = k.macd {
let hist = macd.MACD柱;
match {
"" => {
if hist > 0.0 {
+= hist
}
}
"" => {
if hist < 0.0 {
+= hist
}
}
"" | _ => {
if hist >= 0.0 {
+= hist
} else {
+= hist
}
if let (Some(), Some()) = (_idx, _idx) {
let (, ) = if <= { (, ) } else { (, ) };
for k in &K线序列[..=] {
if let Some(ref macd) = k.macd {
let hist = macd.MACD柱;
if hist >= 0.0 {
+= hist;
} else {
+= hist;
}
}
}
}
MACD面积 { , }
}
}
@@ -137,3 +179,9 @@ struct MACD面积 {
: f64,
: f64,
}
impl MACD面积 {
fn (&self) -> f64 {
self. + self.
}
}