添加识别中继分型
This commit is contained in:
+67
-5
@@ -439,6 +439,11 @@ def add_indicators(df):
|
||||
df['ema24'] = (ta.EMA(df, timeperiod=24)).fillna(0)
|
||||
df['ema52'] = (ta.EMA(df, timeperiod=52)).fillna(0)
|
||||
df['ema26'] = (ta.EMA(df, timeperiod=26)).fillna(0)
|
||||
df['ema13'] = (ta.EMA(df, timeperiod=13)).fillna(0)
|
||||
df['ema7'] = (ta.EMA(df, timeperiod=7)).fillna(0)
|
||||
df['ema104'] = (ta.EMA(df, timeperiod=104)).fillna(0)
|
||||
df['ema156'] = (ta.EMA(df, timeperiod=156)).fillna(0)
|
||||
df['ema208'] = (ta.EMA(df, timeperiod=208)).fillna(0)
|
||||
# 常用SMA 24/52
|
||||
try:
|
||||
df['sma24'] = (ta.SMA(df, timeperiod=24)).fillna(0)
|
||||
@@ -624,6 +629,16 @@ def analyze_chan(df, symbol=None, timeframe=None):
|
||||
# 如果分型强度小于1,设为0
|
||||
if fx_strength < 1:
|
||||
fx_strength = 0
|
||||
|
||||
# KLC 分型框(起止时间+高低价):
|
||||
# 仅使用 cal_fx_box 通过 display 条件后生成的 klc.fx_box。
|
||||
# 若无 fx_box,则前端不应绘制分型框。
|
||||
fx_box = getattr(klc, 'fx_box', None)
|
||||
box_start_time = getattr(fx_box, 'start_time', None) if fx_box else None
|
||||
box_end_time = getattr(fx_box, 'end_time', None) if fx_box else None
|
||||
box_high = getattr(fx_box, 'high', None) if fx_box else None
|
||||
box_low = getattr(fx_box, 'low', None) if fx_box else None
|
||||
|
||||
if klc.bb_out:
|
||||
klc_fx_info.append({
|
||||
'time': klc.end_time,
|
||||
@@ -632,10 +647,22 @@ def analyze_chan(df, symbol=None, timeframe=None):
|
||||
'is_bottom': klc.fx == Chan_FX_TYPE.BOTTOM,
|
||||
'fx_strength': fx_strength, # 分型强度分数 (0-100)
|
||||
'fx_strength_level': fx_strength_level, # 分型强度等级 (极强/强/中等/弱/极弱)
|
||||
'is_strong_fx': is_strong_fx # 是否为强分型
|
||||
'is_strong_fx': is_strong_fx, # 是否为强分型
|
||||
|
||||
# 虚线分型框信息(给前端画框用)
|
||||
'start_time': box_start_time,
|
||||
'end_time': box_end_time,
|
||||
'high': float(box_high) if box_high is not None else None,
|
||||
'low': float(box_low) if box_low is not None else None,
|
||||
})
|
||||
except Exception as e:
|
||||
# 如果出错,仍然添加基本信息,但分型强度为0
|
||||
fx_box = getattr(klc, 'fx_box', None)
|
||||
box_start_time = getattr(fx_box, 'start_time', None) if fx_box else None
|
||||
box_end_time = getattr(fx_box, 'end_time', None) if fx_box else None
|
||||
box_high = getattr(fx_box, 'high', None) if fx_box else None
|
||||
box_low = getattr(fx_box, 'low', None) if fx_box else None
|
||||
|
||||
klc_fx_info.append({
|
||||
'time': klc.end_time,
|
||||
'price': klc.low if klc.fx == Chan_FX_TYPE.BOTTOM else klc.high,
|
||||
@@ -643,7 +670,13 @@ def analyze_chan(df, symbol=None, timeframe=None):
|
||||
'is_bottom': klc.fx == Chan_FX_TYPE.BOTTOM,
|
||||
'fx_strength': 0,
|
||||
'fx_strength_level': "",
|
||||
'is_strong_fx': False
|
||||
'is_strong_fx': False,
|
||||
|
||||
# 虚线分型框信息(给前端画框用)
|
||||
'start_time': box_start_time,
|
||||
'end_time': box_end_time,
|
||||
'high': float(box_high) if box_high is not None else None,
|
||||
'low': float(box_low) if box_low is not None else None,
|
||||
})
|
||||
|
||||
|
||||
@@ -1391,12 +1424,17 @@ def analyze():
|
||||
# 添加K线分型信息
|
||||
'klc_fx_info': [{
|
||||
'time': format_time_safely(point['time'], client_tz),
|
||||
'start_time': format_time_safely(point['start_time'], client_tz),
|
||||
'end_time': format_time_safely(point['end_time'], client_tz),
|
||||
'price': float(point['price']),
|
||||
'fx_type': point['fx_type'],
|
||||
'is_bottom': bool(point['is_bottom']),
|
||||
'fx_strength': float(point['fx_strength']), # 分型强度分数
|
||||
'fx_strength_level': str(point['fx_strength_level']), # 分型强度等级
|
||||
'is_strong_fx': bool(point['is_strong_fx']) # 是否为强分型
|
||||
'is_strong_fx': bool(point['is_strong_fx']), # 是否为强分型
|
||||
# 分型框(虚线矩形)用到的高低价
|
||||
'high': float(point['high']) if point.get('high') is not None else None,
|
||||
'low': float(point['low']) if point.get('low') is not None else None
|
||||
} for point in analysis_result['klc_fx_info']],
|
||||
# 添加ChanMACD分析数据
|
||||
'chan_macd': serialize_chan_macd_data(analysis_result.get('chan_macd', {}), client_tz),
|
||||
@@ -1587,12 +1625,17 @@ def analyze():
|
||||
# 添加小周期分型信息
|
||||
result['element_klc_fx_info'] = [{
|
||||
'time': format_time_safely(point['time'], client_tz),
|
||||
'start_time': format_time_safely(point['start_time'], client_tz),
|
||||
'end_time': format_time_safely(point['end_time'], client_tz),
|
||||
'price': float(point['price']),
|
||||
'fx_type': point['fx_type'],
|
||||
'is_bottom': bool(point['is_bottom']),
|
||||
'fx_strength': float(point['fx_strength']), # 分型强度分数
|
||||
'fx_strength_level': str(point['fx_strength_level']), # 分型强度等级
|
||||
'is_strong_fx': bool(point['is_strong_fx']) # 是否为强分型
|
||||
'is_strong_fx': bool(point['is_strong_fx']), # 是否为强分型
|
||||
# 分型框(虚线矩形)用到的高低价
|
||||
'high': float(point['high']) if point.get('high') is not None else None,
|
||||
'low': float(point['low']) if point.get('low') is not None else None
|
||||
} for point in element_analysis['klc_fx_info']]
|
||||
|
||||
# 添加次周期ChanMACD分析数据
|
||||
@@ -1640,6 +1683,20 @@ def analyze():
|
||||
'direction': convert_direction(bi.dir),
|
||||
'macd_div': float(bi.macd_div) if hasattr(bi, 'macd_div') else 0
|
||||
} for bi in sub_sub_analysis['bi_list'] if not bi.end_klc]
|
||||
# 次次周期 KLC 列表
|
||||
result['sub_sub_klc_list'] = [{
|
||||
'date': klc.end_time if isinstance(klc.end_time, str) else klc.end_time.astimezone(client_tz).isoformat(),
|
||||
'open': float(klc.open),
|
||||
'high': float(klc.high),
|
||||
'low': float(klc.low),
|
||||
'close': float(klc.close),
|
||||
'volume': float(klc.volume) if hasattr(klc, 'volume') else 0,
|
||||
'direction': str(klc.dir).replace('Chan_KLINE_DIR.', ''),
|
||||
'fx_type': str(klc.fx).replace('Chan_FX_TYPE.', ''),
|
||||
'klc_fx_type': str(klc.klc_fx_type).replace('Chan_KLC_FX.', ''),
|
||||
'trend': str(klc.trend).replace('Chan_PRICE_TREND.', '')
|
||||
} for klc in sub_sub_analysis.get('klc_list', []) if hasattr(klc, 'end_time') and klc.end_time]
|
||||
|
||||
result['sub_sub_seg_list'] = [{
|
||||
'start_time': seg.start_bi.start_klc.end_time if isinstance(seg.start_bi.start_klc.end_time, str) else seg.start_bi.start_klc.end_time.astimezone(client_tz).isoformat(),
|
||||
'end_time': (seg.end_bi.end_klc.end_time if isinstance(seg.end_bi.end_klc.end_time, str) else seg.end_bi.end_klc.end_time.astimezone(client_tz).isoformat()) if seg.end_bi else None,
|
||||
@@ -1677,12 +1734,17 @@ def analyze():
|
||||
} for zs in sub_sub_analysis.get('bi_zs_list', []) if not getattr(zs, 'is_sure', False)]
|
||||
result['sub_sub_klc_fx_info'] = [{
|
||||
'time': format_time_safely(point['time'], client_tz),
|
||||
'start_time': format_time_safely(point['start_time'], client_tz),
|
||||
'end_time': format_time_safely(point['end_time'], client_tz),
|
||||
'price': float(point['price']),
|
||||
'fx_type': point['fx_type'],
|
||||
'is_bottom': bool(point['is_bottom']),
|
||||
'fx_strength': float(point['fx_strength']),
|
||||
'fx_strength_level': str(point['fx_strength_level']),
|
||||
'is_strong_fx': bool(point['is_strong_fx'])
|
||||
'is_strong_fx': bool(point['is_strong_fx']),
|
||||
# 分型框(虚线矩形)用到的高低价
|
||||
'high': float(point['high']) if point.get('high') is not None else None,
|
||||
'low': float(point['low']) if point.get('low') is not None else None
|
||||
} for point in sub_sub_analysis['klc_fx_info']]
|
||||
result['sub_sub_bsp_list'] = [{
|
||||
'time': format_time_safely(bsp.end_time, client_tz),
|
||||
|
||||
Reference in New Issue
Block a user