Add Continue Div and Cross Div
This commit is contained in:
+79
-50
@@ -52,6 +52,8 @@ class ChanKLU:
|
||||
self.candle_dir = Chan_K_DIR.CROSS if self.close == self.open else Chan_K_DIR.BULL if self.close > self.open else Chan_K_DIR.BEAR
|
||||
self.strength = 0 if self.candle_dir == Chan_K_DIR.CROSS else self.cal_klu_strength()
|
||||
|
||||
self.continue_div = False
|
||||
self.separate_div = False
|
||||
self.ema52 = 0
|
||||
self.ema24 = 0
|
||||
self.macd_slop = 0
|
||||
@@ -73,6 +75,8 @@ class ChanKLU:
|
||||
self.div_type = "none" # {bearish, bullish, hidden_bearish, hidden_bullish, none}
|
||||
self.div_score = 0.0 # 背离强度(0-100)
|
||||
#print(self.open, self.close, self.high, self.low, self.candle_dir, self.strength)
|
||||
def set_macd_state(self, state):
|
||||
self.macd_state = state
|
||||
def cal_klu_strength(self):
|
||||
strength = 0
|
||||
if range != 0:
|
||||
@@ -608,7 +612,9 @@ class ChanKLU:
|
||||
self.ma5 = float(item['ma5']) if 'ma5' in item and item['ma5'] else 0
|
||||
self.ma10 = float(item['ma10']) if 'ma10' in item and item['ma10'] else 0
|
||||
self.ma30 = float(item['ma30']) if 'ma30' in item and item['ma30'] else 0
|
||||
|
||||
self.ema52 = float(item['ema52']) if 'ema52' in item and item['ema52'] else 0
|
||||
self.ema24 = float(item['ema24']) if 'ema24' in item and item['ema24'] else 0
|
||||
|
||||
# 安全检查 ma250、ma50 和 ma200
|
||||
self.ma250 = float(item['ma250']) if 'ma250' in item and item['ma250'] else 0
|
||||
self.ma50 = float(item['ma50']) if 'ma50' in item and item['ma50'] else 0
|
||||
@@ -645,70 +651,93 @@ class ChanKLU:
|
||||
self.macd_state = Chan_MACD_STATE.UNKNOWN
|
||||
return self.macd_state
|
||||
|
||||
# 调试:当前值
|
||||
#print(f"DEBUG: MACD值检查 - 时间: {self.time}, MACD: {self.macd:.4f}, Signal: {self.signal:.4f}, 前一根Signal: {self.pre.signal:.4f}")
|
||||
|
||||
# 3) CROSS0 仅以 Signal 穿越零轴判定
|
||||
if self.pre.signal >= 0 and self.signal < 0:
|
||||
self.macd_state = Chan_MACD_STATE.CROSS0_DOWN
|
||||
#print(f"DEBUG: CROSS0触发(向下) - 时间: {self.time}, Signal: {self.pre.signal:.4f}->{self.signal:.4f}")
|
||||
return self.macd_state
|
||||
if self.pre.signal <= 0 and self.signal > 0:
|
||||
self.macd_state = Chan_MACD_STATE.CROSS0_UP
|
||||
#print(f"DEBUG: CROSS0触发(向上) - 时间: {self.time}, Signal: {self.pre.signal:.4f}->{self.signal:.4f}")
|
||||
return self.macd_state
|
||||
|
||||
# 4) 高位状态的位置状态, 高位,高位空,归零轴
|
||||
position_state = Chan_MACD_STATE.UNKNOWN
|
||||
if abs(self.macd) > 50:
|
||||
position_state = self._cal_position_state()
|
||||
if position_state != Chan_MACD_STATE.UNKNOWN:
|
||||
self.macd_state = position_state
|
||||
#print(f"DEBUG: 位置状态设置 - 时间: {self.time}, 状态: {self.macd_state}, MACD: {self.macd:.4f}, Signal: {self.signal:.4f}")
|
||||
return self.macd_state
|
||||
|
||||
# 5) 趋近零轴:任一线接近零轴即可,无限接近零轴,EMA52没有加
|
||||
# 6) 趋近零轴:任一线接近零轴即可,无限接近零轴,EMA52没有加
|
||||
NEAR0_EPS = 15
|
||||
if abs(self.macd) <= NEAR0_EPS or abs(self.signal) <= NEAR0_EPS:
|
||||
self.macd_state = Chan_MACD_STATE.NEAR0
|
||||
#print(f"DEBUG: 趋近零轴触发 - 时间: {self.time}, MACD: {self.macd:.4f}, Signal: {self.signal:.4f}")
|
||||
return self.macd_state
|
||||
# 6) 离开0轴开始上涨或者下跌阶段,高位之前的
|
||||
if self.macd_state == Chan_MACD_STATE.UNKNOWN:
|
||||
if self.macd > 0 and self.pre:
|
||||
if (self.pre.macd_state == Chan_MACD_STATE.NEAR0 or self.pre.macd_state == Chan_MACD_STATE.RZ_UP) and self.signal > self.pre.signal:
|
||||
self.macd_state = Chan_MACD_STATE.RZ_UP
|
||||
if self.macd > 0 and abs(self.low - self.ema52) <= NEAR0_EPS:
|
||||
self.macd_state = Chan_MACD_STATE.NEAR0
|
||||
return self.macd_state
|
||||
if self.macd < 0 and abs(self.high - self.ema52) <= NEAR0_EPS:
|
||||
self.macd_state = Chan_MACD_STATE.NEAR0
|
||||
return self.macd_state
|
||||
# 4) 穿零轴后离开零轴
|
||||
if self.pre.macd_state == Chan_MACD_STATE.CROSS0_UP and self.macd > self.pre.macd and self.signal < self.macdhist:
|
||||
self.macd_state = Chan_MACD_STATE.UP
|
||||
return self.macd_state
|
||||
if self.pre.macd_state == Chan_MACD_STATE.CROSS0_DOWN and self.macd < self.pre.macd and self.signal > self.macdhist:
|
||||
self.macd_state = Chan_MACD_STATE.DOWN
|
||||
return self.macd_state
|
||||
if self.pre.macd_state == Chan_MACD_STATE.UP and self.macd > self.pre.macd and self.signal > self.pre.signal:
|
||||
self.macd_state = Chan_MACD_STATE.UP
|
||||
return self.macd_state
|
||||
if self.pre.macd_state == Chan_MACD_STATE.DOWN and self.macd < self.pre.macd and self.signal < self.pre.signal:
|
||||
self.macd_state = Chan_MACD_STATE.DOWN
|
||||
return self.macd_state
|
||||
# 5) 高位状态的位置状态, 高位,高位空,归零轴
|
||||
if (self.pre.macd_state == Chan_MACD_STATE.UP or self.pre.macd_state == Chan_MACD_STATE.HIGH or self.pre.macd_state == Chan_MACD_STATE.RZ_UP) and self.macd > 0:
|
||||
if abs(self.pre.macd - self.macd) < 10:
|
||||
self.macd_state = Chan_MACD_STATE.HIGH
|
||||
return self.macd_state
|
||||
else:
|
||||
if self.macd > self.pre.macd and self.signal > self.pre.signal:
|
||||
self.macd_state = Chan_MACD_STATE.UP
|
||||
return self.macd_state
|
||||
elif self.macd < 0 and self.pre:
|
||||
if (self.pre.macd_state == Chan_MACD_STATE.NEAR0 or self.pre.macd_state == Chan_MACD_STATE.RZ_DOWN) and self.signal < self.pre.signal:
|
||||
self.macd_state = Chan_MACD_STATE.RZ_DOWN
|
||||
elif self.macd < self.pre.macd and self.signal < self.pre.signal:
|
||||
self.macd_state = Chan_MACD_STATE.RETURN_ZERO
|
||||
return self.macd_state
|
||||
# 7) 其余情况
|
||||
self.macd_state = Chan_MACD_STATE.UNKNOWN
|
||||
if (self.pre.macd_state == Chan_MACD_STATE.DOWN or self.pre.macd_state == Chan_MACD_STATE.HIGH or self.pre.macd_state == Chan_MACD_STATE.RZ_DOWN) and self.macd < 0:
|
||||
if abs(self.pre.macd - self.macd) < 10:
|
||||
self.macd_state = Chan_MACD_STATE.HIGH
|
||||
return self.macd_state
|
||||
else:
|
||||
if self.macd > self.pre.macd and self.signal > self.pre.signal:
|
||||
self.macd_state = Chan_MACD_STATE.RETURN_ZERO
|
||||
return self.macd_state
|
||||
elif self.macd < self.pre.macd and self.signal < self.pre.signal:
|
||||
self.macd_state = Chan_MACD_STATE.DOWN
|
||||
return self.macd_state
|
||||
|
||||
# 7) 离开0轴开始上涨或者下跌阶段,高位之前的
|
||||
if self.macd > 0 and self.pre:
|
||||
if (self.pre.macd_state == Chan_MACD_STATE.NEAR0 or self.pre.macd_state == Chan_MACD_STATE.RZ_UP) and (self.signal > self.pre.signal or self.close > self.ema52):
|
||||
self.macd_state = Chan_MACD_STATE.RZ_UP
|
||||
return self.macd_state
|
||||
elif self.macd < 0 and self.pre:
|
||||
if (self.pre.macd_state == Chan_MACD_STATE.NEAR0 or self.pre.macd_state == Chan_MACD_STATE.RZ_DOWN) and (self.signal < self.pre.signal or self.close < self.ema52):
|
||||
self.macd_state = Chan_MACD_STATE.RZ_DOWN
|
||||
return self.macd_state
|
||||
# 8) 归零轴走势
|
||||
if self.pre.macd_state == Chan_MACD_STATE.RETURN_ZERO:
|
||||
if self.macd > 0:
|
||||
if self.pre.macd > self.macd:
|
||||
self.macd_state = Chan_MACD_STATE.RETURN_ZERO
|
||||
return self.macd_state
|
||||
else:
|
||||
if self.pre.macd < self.macd:
|
||||
self.macd_state = Chan_MACD_STATE.RETURN_ZERO
|
||||
return self.macd_state
|
||||
# 9) 其余情况
|
||||
if self.pre.macd_state == Chan_MACD_STATE.UNKNOWN:
|
||||
if self.macd > 0 and self.close > self.ema52 and self.pre.pre and (self.pre.pre.macd_state == Chan_MACD_STATE.UP or self.pre.pre.macd_state == Chan_MACD_STATE.RZ_UP):
|
||||
self.macd_state = self.pre.pre.macd_state
|
||||
return self.macd_state
|
||||
elif self.macd < 0 and self.close < self.ema52 and self.pre.pre and (self.pre.pre.macd_state == Chan_MACD_STATE.DOWN or self.pre.pre.macd_state == Chan_MACD_STATE.RZ_DOWN):
|
||||
self.macd_state = self.pre.pre.macd_state
|
||||
return self.macd_state
|
||||
else:
|
||||
self.macd_state = Chan_MACD_STATE.UNKNOWN
|
||||
return self.macd_state
|
||||
return self.macd_state
|
||||
|
||||
def _cal_position_state(self):
|
||||
"""计算MACD位置状态:高位、高位空、归零轴"""
|
||||
if not hasattr(self, 'pre') or self.pre is None:
|
||||
return Chan_MACD_STATE.UNKNOWN
|
||||
pre_hist = abs(self.pre.macdhist)
|
||||
cur_hist = abs(self.macdhist)
|
||||
if self.next:
|
||||
next_hist = abs(self.next.macdhist)
|
||||
if cur_hist > pre_hist and cur_hist > next_hist:
|
||||
return Chan_MACD_STATE.HIGH
|
||||
if self.pre.macd_state == Chan_MACD_STATE.HIGH or self.pre.macd_state == Chan_MACD_STATE.HIGH_EMPTY:
|
||||
if self.macd > 0:
|
||||
if self.macd > self.signal:
|
||||
return Chan_MACD_STATE.HIGH_EMPTY
|
||||
else:
|
||||
return Chan_MACD_STATE.RETURN_ZERO
|
||||
elif self.macd < 0:
|
||||
if self.macd < self.signal:
|
||||
return Chan_MACD_STATE.HIGH_EMPTY
|
||||
else:
|
||||
return Chan_MACD_STATE.RETURN_ZERO
|
||||
return Chan_MACD_STATE.UNKNOWN
|
||||
def get_feature_data(self):
|
||||
features = dict()
|
||||
features['klu_close'] = self.close
|
||||
|
||||
Reference in New Issue
Block a user