from enum import Enum, auto from typing import Literal class Chan_DATA_SRC(Enum): BAO_STOCK = auto() CCXT = auto() CSV = auto() class Chan_ZS_DIR(Enum): UP = auto() DOWN = auto() class Chan_ZS_TYPE(Enum): """中枢类型分类""" NORMAL = auto() # 常规中枢:高低点无明显趋势,区间震荡 RISING = auto() # 上升中枢:高点抬高,低点也抬高,重心上移 FALLING = auto() # 下行中枢:高点降低,低点也降低,重心下移 CONVERGING = auto() # 收敛中枢:高点降低,低点抬高,区间收窄(三角收敛) DIVERGING = auto() # 扩散中枢:高点抬高,低点降低,区间扩大(喇叭口) class Chan_K_DIR(Enum): BULL = auto() BEAR = auto() CROSS = auto() class Chan_EMA_POS(Enum): """K线与任意EMA的位置关系(与趋势方向无关的客观分类,支持threshold容差)""" ABOVE = auto() # 完全在EMA上方(远离):low > ema + threshold NEAR_ABOVE = auto() # 在EMA上方但接近:ema < low <= ema + threshold CROSS_CLOSE_ABOVE = auto() # 跨越EMA,收盘在上方:close > ema, low <= ema(含threshold范围内触碰) ON_EMA = auto() # 收盘价在EMA附近:abs(close - ema) <= threshold CROSS_CLOSE_BELOW = auto() # 跨越EMA,收盘在下方:close < ema, high >= ema(含threshold范围内触碰) NEAR_BELOW = auto() # 在EMA下方但接近:ema - threshold <= high < ema BELOW = auto() # 完全在EMA下方(远离):high < ema - threshold UNKNOWN = auto() # 未知(EMA值无效) class Chan_EMA_SEMANTIC(Enum): """K线与EMA结合趋势方向的语义状态(用于交易判断)""" STRONG_TREND = auto() # 7: 顺势K线完全在EMA趋势侧(强势,远未及EMA) TREND_SIDE = auto() # 6: 完全在EMA趋势侧(正常趋势运行) RECOVER = auto() # 5: 逆势后穿越EMA回到趋势侧(收复EMA,趋势恢复) TOUCH_FAIL = auto() # 4: 逆势触碰EMA但未穿越(反弹/反抽力度不足) DEEP_COUNTER = auto() # 3: 完全在EMA逆势侧(深度回调/反抽) BREAK = auto() # 2: 穿越EMA,收盘在逆势侧(支撑/压力失败) TOUCH_HOLD = auto() # 1: 触碰EMA,收盘守住趋势侧(支撑/压力有效) WEAK_COUNTER = auto() # 8: 逆势K线完全在EMA逆势侧(弱势,远未到EMA) APPROACHING = auto() # 9: K线接近EMA但未触碰(即将测试支撑/压力) NEUTRAL = auto() # 0: 盘整/无法判断 class Chan_KL_TYPE(Enum): K_1S = auto() K_1M = auto() K_DAY = auto() K_WEEK = auto() K_MON = auto() K_YEAR = auto() K_5M = auto() K_15M = auto() K_30M = auto() K_60M = auto() K_1H = auto() K_2H = auto() K_4H = auto() K_6H = auto() K_8H = auto() K_12H = auto() K_1D = auto() K_3D = auto() K_3M = auto() K_QUARTER = auto() class Chan_KLINE_DIR(Enum): UP = auto() DOWN = auto() COMBINE = auto() INCLUDED = auto() class Chan_KLU_TYPE(Enum): BigBull = auto() MiddleBull = auto() SmallBull = auto() BigBear = auto() MiddleBear = auto() SmallBear = auto() Cross = auto() class Chan_KLU_PATTERN(Enum): # 单根K线形态 HAMMER = auto() # 锤子线 INVERTED_HAMMER = auto() # 倒锤子线 SHOOTING_STAR = auto() # 射击之星 HANGING_MAN = auto() # 上吊线 DOJI = auto() # 十字星 LONG_LEGGED_DOJI = auto() # 长腿十字星 GRAVESTONE_DOJI = auto() # 墓碑十字星 DRAGONFLY_DOJI = auto() # 蜻蜓十字星 MARUBOZU = auto() # 光头光脚 SPINNING_TOP = auto() # 纺锤线 # 双根K线形态 BULLISH_ENGULFING = auto() # 看涨吞没 BEARISH_ENGULFING = auto() # 看跌吞没 PIERCING_LINE = auto() # 刺透形态 DARK_CLOUD_COVER = auto() # 乌云盖顶 TWEEZER_TOP = auto() # 镊子顶 TWEEZER_BOTTOM = auto() # 镊子底 HARAMI = auto() # 孕线 BULLISH_HARAMI = auto() # 看涨孕线 BEARISH_HARAMI = auto() # 看跌孕线 # 三根K线形态 MORNING_STAR = auto() # 早晨之星 EVENING_STAR = auto() # 黄昏之星 THREE_WHITE_SOLDIERS = auto() # 红三兵 THREE_BLACK_CROWS = auto() # 三只乌鸦 THREE_INNER_UP = auto() # 上升三法 THREE_INNER_DOWN = auto() # 下降三法 ABANDONED_BABY = auto() # 弃婴形态 # 多根K线形态 DOUBLE_TOP = auto() # 双顶 DOUBLE_BOTTOM = auto() # 双底 TRIPLE_TOP = auto() # 三顶 TRIPLE_BOTTOM = auto() # 三底 HEAD_AND_SHOULDERS = auto() # 头肩顶 INVERSE_HEAD_SHOULDERS = auto() # 头肩底 ROUNDING_BOTTOM = auto() # 圆弧底 ROUNDING_TOP = auto() # 圆弧顶 # 缺口形态 BREAKAWAY_GAP = auto() # 突破缺口 RUNAWAY_GAP = auto() # 持续缺口 EXHAUSTION_GAP = auto() # 衰竭缺口 # 特殊形态 ISLAND_REVERSAL = auto() # 岛形反转 KEY_REVERSAL = auto() # 关键反转 INSIDE_BAR = auto() # 内包线 OUTSIDE_BAR = auto() # 外包线 # 趋势形态 HIGHER_HIGH = auto() # 更高高点 HIGHER_LOW = auto() # 更高低点 LOWER_HIGH = auto() # 更低高点 LOWER_LOW = auto() # 更低低点 # 支撑阻力形态 SUPPORT_BOUNCE = auto() # 支撑反弹 RESISTANCE_REJECTION = auto() # 阻力拒绝 BREAKOUT = auto() # 突破 BREAKDOWN = auto() # 跌破 # 成交量相关形态 VOLUME_SPIKE = auto() # 成交量激增 VOLUME_DECLINE = auto() # 成交量萎缩 # 未知/无形态 UNKNOWN = auto() # 未知形态 class Chan_FX_TYPE(Enum): BOTTOM = auto() TOP = auto() UNKNOWN = auto() UP = auto() DOWN = auto() TT = auto() BB = auto() PTOP = auto() PBOTTOM = auto() class Chan_PRICE_TREND(Enum): UP = auto() DOWN = auto() FLAT = auto() UNKNOWN = auto() class Chan_KLC_FX(Enum): TOP0 = auto() TOP1 = auto() TOP2 = auto() TOP3 = auto() TOP4 = auto() TOP5 = auto() TOP6 = auto() TOP7 = auto() TOP8 = auto() BOTTOM0 = auto() BOTTOM1 = auto() BOTTOM2 = auto() BOTTOM3 = auto() BOTTOM4 = auto() BOTTOM5 = auto() BOTTOM6 = auto() BOTTOM7 = auto() BOTTOM8 = auto() UNKNOWN = auto() # 统一的MACD状态枚举,包含所有可能的状态 class Chan_MACD_STATE(Enum): """MACD状态枚举 - 包含所有可能的状态""" # 穿越状态 CROSS0_UP = auto() # 穿零轴后快速向上,能量柱呈现一根比一根长的排列方式 CROSS0_DOWN = auto() # 穿零轴后快速向下,能量柱呈现一根比一根短的排列方式 CROSS_OS = auto() # 穿零轴后缠绕/粘合,黄白线沿着能量柱运行,黄白线在运行的过程中没有释放出反向能量柱 CROSS_REV = auto() # 穿零轴后倒挂,MACD黄白线在穿零轴的时候与零轴的距离比较近,同时黄白线沿着能量柱运行,在运行的过程中,能量柱衰减导致它跟黄白线之间形成夹角空位,同时黄白线产生交叉并释放反向能量柱。 # 趋势状态 NEAR0 = auto() NEAR0_52 = auto() # 价格在EMA52附近/价格接触EMA52并马上离开,需要观察离开强度 NEAR0_DIFF = auto() # MACD白线接近零轴,价格未到EMA52 NEAR0_PERFECT = auto() # MACD白线接近零轴和价格接触或短暂击穿EMA52,而MACD黄线不穿零轴,完美形态 NEAR0_24 = auto() # MACD黄白线接近零轴和价格在EMA24附近 # 位置状态 HIGH = auto() # 高位:MACD黄白线离开能量柱到高点,能量柱最大开始减弱 HIGH_EMPTY = auto() # 高位空:MACD黄白线处于高位,能量柱衰减,与黄白线形成空间夹角 RETURN_ZERO = auto() # 归零轴:能量柱呈现一根比一根短的排列方式 RZ_UP = auto() # 归零轴后的零轴上涨 RZ_DOWN = auto() # 归零轴后的零轴下跌 UP = auto() # 穿零轴后向上 DOWN = auto() # 穿零轴后向下 PEAK = auto() # 峰值:MACD白线处于高位 # 基础状态 UNKNOWN = auto() # 未知 START = auto() # 开始 class Chan_MACDSEG_DIR(Enum): ABOVE = auto() UNDER = auto() class Chan_MACDUNITTF_TYPE(Enum): START = auto() CROSS0 = auto() NEAR0 = auto() class Chan_MACDUNITTF_JUMP(Enum): CONTUNE = auto() DISCRETE = auto() class Chan_MACDUNITTF_DIV(Enum): CONTUNE = auto() DISCRETE = auto() UNDIV = auto() class Chan_MACDHISTSET_DIR(Enum): ABOVE = auto() UNDER = auto() class Chan_MACDUNITTF_DIR(Enum): ABOVE = auto() UNDER = auto() class Chan_MACDHIST_STATE(Enum): UP = auto() DOWN = auto() PEAK = auto() UNKNOWN = auto() class Chan_BI_DIR(Enum): UP = auto() DOWN = auto() class Chan_SEG_DIR(Enum): UP = auto() DOWN = auto() class Chan_BI_TYPE(Enum): UNKNOWN = auto() STRICT = auto() SUB_VALUE = auto() # 次高低点成笔 TIAOKONG_THRED = auto() DAHENG = auto() TUIBI = auto() UNSTRICT = auto() TIAOKONG_VALUE = auto() Chan_BSP_MAIN_TYPE = Literal['1', '2', '3'] class Chan_BSP_DIR(Enum): BUY = auto() SELL = auto() class Chan_BSP_TYPE(Enum): B1 = auto() B2 = auto() B3 = auto() S1 = auto() S2 = auto() S3 = auto() NONE = auto() """ class Chan_BSP_TYPE(Enum): T1 = '1' T1P = '1p' T2 = '2' T2S = '2s' T3A = '3a' # 中枢在1类后面 T3B = '3b' # 中枢在1类前面 T3 = '3' T3E ='3e' # T3退出点 QJT = 'qjt' # 区间套突破 QJT1 = 'qjt1' # 区间套一类买点 QJT2 = 'qjt2' # 区间套一类卖点 QJT3 = 'qjt3' # 区间套三类买点 def main_type(self) -> Chan_BSP_MAIN_TYPE: return self.value[0] # type: ignore """ class Chan_AUTYPE(Enum): QFQ = auto() HFQ = auto() NONE = auto() class Chan_TREND_TYPE(Enum): MEAN = "mean" MAX = "max" MIN = "min" class Chan_TREND_LINE_SIDE(Enum): INSIDE = auto() OUTSIDE = auto() class Chan_LEFT_SEG_METHOD(Enum): ALL = auto() PEAK = auto() class Chan_FX_CHECK_METHOD(Enum): STRICT = auto() LOSS = auto() HALF = auto() TOTALLY = auto() class Chan_SEG_TYPE(Enum): BI = auto() SEG = auto() class Chan_MACD_ALGO(Enum): AREA = auto() PEAK = auto() FULL_AREA = auto() DIFF = auto() SLOPE = auto() AMP = auto() VOLUMN = auto() AMOUNT = auto() VOLUMN_AVG = auto() AMOUNT_AVG = auto() TURNRATE_AVG = auto() RSI = auto() class Chan_DATA_FIELD: FIELD_TIME = "time_key" FIELD_OPEN = "open" FIELD_HIGH = "high" FIELD_LOW = "low" FIELD_CLOSE = "close" FIELD_VOLUME = "volume" # 成交量 FIELD_TURNOVER = "turnover" # 成交额 FIELD_TURNRATE = "turnover_rate" # 换手率 class Chan_KLC_STATE: """笔当下状态(缠论笔定理)。任意时刻必属其一。""" FX = auto() # 分型构造中(未确认顶/底) BI = auto() # 笔延伸中(分型已确认,笔在延伸) UP = auto() # 顶分型构造中 (1,0):向上笔末端 DOWN = auto() # 底分型构造中 (-1,0):向下笔末端 # 笔定理四状态:(Chan_BI_DIR, Chan_KLC_STATE)。笔方向用 Chan_BI_DIR,阶段用 Chan_KLC_STATE。 # (UP, BI) 向上笔延伸;(DOWN, BI) 向下笔延伸;(UP, UP) 向上笔顶分型构造;(DOWN, DOWN) 向下笔底分型构造 def bi_theorem_state(direction: Chan_BI_DIR, phase: Literal[0, 1]) -> tuple[Chan_BI_DIR, int]: """(direction, phase) -> (Chan_BI_DIR, Chan_KLC_STATE)。phase 0=分型构造中,1=笔延伸中。""" if phase == 1: return (direction, Chan_KLC_STATE.BI) return (direction, Chan_KLC_STATE.UP if direction == Chan_BI_DIR.UP else Chan_KLC_STATE.DOWN) # 笔定理状态转移:当前 (Chan_BI_DIR, Chan_KLC_STATE) 允许的下一状态列表 # (UP,BI) 只能 -> (UP,UP);(DOWN,BI) 只能 -> (DOWN,DOWN);(UP,UP) 可 -> (UP,BI)|(DOWN,BI);(DOWN,DOWN) 可 -> (DOWN,BI)|(UP,BI) Chan_BI_STATE_TRANSITIONS: dict[tuple[Chan_BI_DIR, int], list[tuple[Chan_BI_DIR, int]]] = { (Chan_BI_DIR.UP, Chan_KLC_STATE.BI): [(Chan_BI_DIR.UP, Chan_KLC_STATE.UP)], (Chan_BI_DIR.DOWN, Chan_KLC_STATE.BI): [(Chan_BI_DIR.DOWN, Chan_KLC_STATE.DOWN)], (Chan_BI_DIR.UP, Chan_KLC_STATE.UP): [(Chan_BI_DIR.UP, Chan_KLC_STATE.BI), (Chan_BI_DIR.DOWN, Chan_KLC_STATE.BI)], (Chan_BI_DIR.DOWN, Chan_KLC_STATE.DOWN): [(Chan_BI_DIR.DOWN, Chan_KLC_STATE.BI), (Chan_BI_DIR.UP, Chan_KLC_STATE.BI)], } Chan_TRADE_INFO_LST = [Chan_DATA_FIELD.FIELD_VOLUME, Chan_DATA_FIELD.FIELD_TURNOVER, Chan_DATA_FIELD.FIELD_TURNRATE]